タブの開閉と切り替えを検出し、Firefox拡張機能から関連するURLを取得するには、どのXPCOMインターフェイスを使用する必要がありますか?JSでタブを管理するコードのインスタンスを見たことがありますが、C ++からはどうでしょうか?
質問する
2462 次
1 に答える
5
nsIObserverServiceを使用して、タブイベントをC++コンポーネントに再ルーティングする小さなJSコンポーネントを作成できます。
C ++コードでは、このスニペットを使用して、タブイベントの再ルーティングに使用されるユーザー定義イベントのオブザーバーとしてコンポーネントを登録できます。
NS_IMETHODIMP MyCppComponent::Observe(nsISupports *aSubject,
const char *aTopic,
const PRUnichar *aData)
{
if( !strcmp( aTopic, "xpcom-startup" ) )
{
nsCOMPtr<nsIObserverService> observerService =
do_GetService( "@mozilla.org/observer-service;1" );
observerService->AddObserver( this, "my-tab-open", false );
observerService->AddObserver( this, "my-tab-close", false );
observerService->AddObserver( this, "my-tab-select", false );
}
else if( !strcmp( aTopic, "my-tab-open" ) )
{
/* . . . */
}
else if( !strcmp( aTopic, "my-tab-close" ) )
{
/* . . . */
}
else if( !strcmp( aTopic, "my-tab-select" ) )
{
/* . . . */
}
/* . . . */
}
また、ヘルパーJSコンポーネントでは、タブイベントをサブスクライブする必要があります。イベントハンドラーでは、必要なデータを抽出し、ユーザー定義のイベントを発生させてC++コードを実行できます。
function tabOpened(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-open", "some data");
}
function tabClosed(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-close", "some data");
}
function tabSelected(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-select", "some data");
}
function contentWndLoad(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
var browser = getMostRecentBrowserWindow().getBrowser();
browser.tabContainer.addEventListener("TabOpen", tabOpened, false);
browser.tabContainer.addEventListener("TabClose", tabClosed, false);
browser.tabContainer.addEventListener("TabSelect", tabSelected, false);
}
MyJsComponent.prototype = {
/* . . . */
observe: function(aSubject, aTopic, aData) {
switch(aTopic) {
case "xpcom-startup":
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.addObserver(this, "toplevel-window-ready", false);
break;
case "toplevel-window-ready":
aSubject.addEventListener("load", contentWndLoad, false);
break;
}
}
/* . . . */
}
また、特定のケースを処理するために追加する必要のある追加のコードがいくつかあります。たとえば、ユーザーがブラウザウィンドウを閉じると、そのウィンドウで開いているタブのTabCloseイベントを受信しません...そして、必要がなくなったときにオブザーバーの登録を解除することを忘れないでください。
于 2009-11-20T00:10:33.077 に答える