요즘 Translate To Korean을 rewrite 하고 있습니다. 이번 작업에서 두가지를 처리하려고 하는데 하나는 GET으로 정보를 전달 하던 것을 POST method를 이용할 수 있도록 하는 것과, referer로 막는 것을 방지하기 위하여 referer를 처리할 수 있도록 하고 있습니다.
Firefox에서 새 탭을 열기 위해서는 다음의 API를 이용 합니다.
openNewTabWith (aURL, aDocument, aPostData, aEvent, aThridPartyFixup, aReferrer)
aURL : connected url
aDocument : 현재 url
aPostData : Post data or null
aEvent : browser event
aThirdPartyFixup : send event to Third Party
aReferrer : user defined referrer
대충 보시면 이해가 가실 것이고, 여기서 확인할 것은
aPostData와 aDocument, aReferrer 입니다. 일반적으로 새탭만 제어를 할 경우라면
aEvent와
aThirdPartyFixup은 false 값을 사용하시면 됩니다.
Post data를 제어하기 위해서는
aPostData 인자를 이용하는데,
openNewTabWith는
aPostData 가 null 일 경우 Get Method를 이용하게 되며,
aPostData 값이 존재할 경우, Post Method로 탭을 열게 됩니다. 간단하게 사용하는 예를 보도록 하겠습니다.
var url = 'http://some.domain.com/action';
var referer = 'http://some.doamin.com';
var post = 'first=1&second=2&third=3&text=' + encodeURIComponent (somtext);
if ( method == 'Get' ) {
url += '?' + post;
post = null;
} else {
post = getPostStream (post, null, null, 'application/x-www-form-urlencode');
}
openNewTabWith (url, null, post, false, false, makeURI(referrer));
위의 예는 간단하게 openNewTabWith로 POST/GET method를 제어 하는 예제 입니다. post data의 경우
getPostStream API를 이용하여 처리를 해 주어야 하는 점이 key point 입니다. Post 방식에는 application/x-www-form-urlencode 방식 외에 multipart/form-data 를 이용할 수 있고, 저의 경우 multipart/form-data를 선호하는데, 이 방법을 어떻게 처리해야 하는지에 대해서는 아직 저도 알아내지 못했습니다. :-)
다음은 referrer 처리에 대해서 말해 보고자 합니다.
openNewTabWith의 referrer는 2번째 인자인
aDocument 입니다. 그런데
openNewTabWith API 내부에서
aDocument를 현재 브라우저 창의 URL로 제한을 하고 있습니다. 코드상에서는 security 이슈로 막는 듯 싶습니다.
if (aDocument)
urlSecurityCheck(url, aDocument);
그런데, 우리는 가짜 referrer를 처리하기 위함인데, 이렇게 되면 referrer 처리를 할 수가 없게 됩니다. 그런데 코드를 잘 보다 보니
var referrerURI = aDocument ? aDocument.documentURIObject : aReferrer;
요런 라인이 보입니다. 즉 마지막 인자에 string으로 원하는 referrer를 넣어주면 되는 것입니다. 즉, 두번째 인자인
aDocument를 null로 처리하고, 여섯번째 인자에 원하는 url을 referrer로 넣어 주시면 해결이 됩니다.
이렇게 하면 새 탭으로 referrer 처리와 Post data의 제어를 할 수 있게 되었습니다만, 한가지 문제가 또 있습니다.
openNewTabWith API를 사용하게 되면 새 탭이 background에서 뜨게 됩니다. 탭을 띄우고 새로 open된 탭이 foreground로 오게 하고 싶은데, 이게 안되는 것이죠.
openNewTabWith은 background/foreground 제어를 할 수 있는 인자가 없기 때문입니다. 그래서 이를 위해서 API를 하나 더 깊게 들어가서 사용하는 수 밖에 없습니다. 위의 예제에 대해서 탭이 foreground로 뜨게 하는 코드의 예제를 보여 드립니다.
var url = 'http://some.domain.com/action';
var referer = 'http://some.doamin.com';
var post = 'first=1&second=2&third=3&text=' + encodeURIComponent (somtext);
if ( method == 'Get' ) {
url += '?' + post;
post = null;
} else {
post = getPostStream (post, null, null, 'application/x-www-form-urlencode');
}
gBrowser.loadOneTab (url, makeURI(referrer), 'UTF-8', post, false, false);
와 같이 하시면 tab이 foreground로 뜨게 됩니다.
loadOneTab에 대해서는 직접 찾아 보시기 바랍니다. :-)
Comments List
한분의 노력으로 이렇게 결실을 맺게 되어 정말 축하할일이네요..
종종 오지만 많은걸 배우고..이렇게나마 댓글로 응원합니다.
이런 축하글들이 많이 올라오고, 도움을 주고 받는다면 더 좋은 한글 지원 addon들이 많이 나오지 않을까요..
고생많이 하셨습니다.
정말 축하합니다.