Firefox에서 이미 이를 위한 API를 제공하는데, 이에 대한 문서가 충분하지 않아 기록을 합니다.
새 탭으로 열기
Firefox에서 새 탭을 열기 위해서는 다음의 API를 이용 합니다.
대충 보시면 이해가 가실 것이고, 여기서 확인할 것은 aPostData와 aDocument, aReferrer 입니다. 일반적으로 새탭만 제어를 할 경우라면 aEvent와 aThirdPartyFixup은 false 값을 사용하시면 됩니다.
Post data를 제어하기 위해서는 aPostData 인자를 이용하는데, openNewTabWith는 aPostData 가 null 일 경우 Get Method를 이용하게 되며, aPostData 값이 존재할 경우, Post Method로 탭을 열게 됩니다. 간단하게 사용하는 예를 보도록 하겠습니다.
위의 예는 간단하게 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 이슈로 막는 듯 싶습니다.
그런데, 우리는 가짜 referrer를 처리하기 위함인데, 이렇게 되면 referrer 처리를 할 수가 없게 됩니다. 그런데 코드를 잘 보다 보니
요런 라인이 보입니다. 즉 마지막 인자에 string으로 원하는 referrer를 넣어주면 되는 것입니다. 즉, 두번째 인자인 aDocument를 null로 처리하고, 여섯번째 인자에 원하는 url을 referrer로 넣어 주시면 해결이 됩니다.
이렇게 하면 새 탭으로 referrer 처리와 Post data의 제어를 할 수 있게 되었습니다만, 한가지 문제가 또 있습니다. openNewTabWith API를 사용하게 되면 새 탭이 background에서 뜨게 됩니다. 탭을 띄우고 새로 open된 탭이 foreground로 오게 하고 싶은데, 이게 안되는 것이죠. openNewTabWith은 background/foreground 제어를 할 수 있는 인자가 없기 때문입니다. 그래서 이를 위해서 API를 하나 더 깊게 들어가서 사용하는 수 밖에 없습니다. 위의 예제에 대해서 탭이 foreground로 뜨게 하는 코드의 예제를 보여 드립니다.
와 같이 하시면 tab이 foreground로 뜨게 됩니다. loadOneTab에 대해서는 직접 찾아 보시기 바랍니다. :-)
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에 대해서는 직접 찾아 보시기 바랍니다. :-)