gpt4 book ai didi

c++ - 使用 C++ XPCOM 扩展访问 Firefox 上的选项卡

转载 作者:太空狗 更新时间:2023-10-29 20:49:05 24 4
gpt4 key购买 nike

我应该使用什么 XPCOM 接口(interface)来检测选项卡的打开、关闭和切换,并从 firefox 扩展中获取它们的关联 URL?我在 JS 中看到过管理选项卡的代码实例,但在 C++ 中呢?

最佳答案

您可以编写小型 JS 组件,使用 nsIObserverService 将选项卡事件重新路由到您的 C++ 组件。

在 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;
}
}

/* . . . */
}

您还应该添加一些额外的代码来处理特定情况。例如,当用户关闭浏览器窗口时,您不会收到该窗口中打开的选项卡的 TabClos​​e 事件……并且当您不再需要观察者时,不要忘记注销它们。

关于c++ - 使用 C++ XPCOM 扩展访问 Firefox 上的选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1754417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com