- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我应该使用什么 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;
}
}
/* . . . */
}
您还应该添加一些额外的代码来处理特定情况。例如,当用户关闭浏览器窗口时,您不会收到该窗口中打开的选项卡的 TabClose 事件……并且当您不再需要观察者时,不要忘记注销它们。
关于c++ - 使用 C++ XPCOM 扩展访问 Firefox 上的选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1754417/
我无法理解 XPCOM。它与 COM 有何不同?是什么让它跨平台? 它是一个带有一组库的框架,你可以用它来完成一些工作吗? 另外,组件对象模型是否意味着每个功能都在组件中实现,因此我们可以在不知道详细
我使用 C++ 开发了一个 xpcom 组件。我的组件中有 GetHWND() 方法。我还使用 javascript 开发了另一个 xpcom 组件。我想在 javascript xpcom 组件中使
我正在阅读有关 XPCOM 组件的开发。我遇到了这些称为白名单数据和黑名单数据的术语,我试图在谷歌上找到但无法找到......我不知道它与编程有什么关系所以如果我把问题放在错误的地方请原谅我.. 最佳
我正在尝试制作一个 Firefox 扩展。为什么当我想使用 document.body.innerHTML = data; 时在新打开的选项卡中,它不起作用。这是我的代码: function chan
我正在开发一个 Firefox 扩展,它使用 PyXPCOM 来运行进程。我想要一个进度表,在进程启动时显示并向用户提供反馈。 在 javascript 中,我调用了线程管理器来在 Python 中运
我目前正在开发一个 firefox 插件,它是一个使用 TCP 套接字连接到服务器的客户端。 在我的小测试中,一切正常,客户端(ff 附加组件)连接到服务器(用 Java 设计)并发送一条消息,但之后
1-有没有XPCOM PHPStorm 可用于代码完成的 stub 文件 (javascript)? 2- 有什么方法可以促进 PHPStorm 中的 FireFox 插件开发吗? 3- 如何将 Fi
我正在学习 XPCOM 上的 XUL 学校入门类(class)。我在访问组件时遇到问题。无论我尝试访问什么组件,例如(来自 MDN): // xpconnect to cookiemanager //
我不知道如何将图像复制到剪贴板。我的代码如下所示: var image = "data:image/png;base64,..." var io = Components.classe
我想实现类似于 Timer 组件的观察者模式。不是按时间到期调用回调,而是从系统事件(如创建新文件或收到新电子邮件等)调用作为主题观察者的回调。我尝试在组件 XPCOM 中使用 nsIObserver
我的一个 XPCOM 组件使用了其他 XPCOM 组件。当我测试它时,我发现它的依赖关系很麻烦。然后我想到使用依赖注入(inject)在我的构造函数中传递其他组件。我没有成功。是否可以将其他组件的引用
我正在开发我的第一个 XPCOM 组件。很遗憾,我无法注册成功。 建筑没问题。这是生成文件 CXX = g++ CPPFLAGS += -fno-rtti \ -fexcept
背景 在低于 12.0 的 XULRunner 版本中,它可以工作,但是当我尝试将它移植到 12.0 或更高版本时,它会导致应用程序崩溃。主要原因是在 sdk v12 或更新版本的开发者中删除了 xp
我想使用 c++ XPCOM 组件创建一个 Firefox 扩展,该组件又使用 javascript XPCOM 组件。是否有任何框架允许 C++ XPCOM 组件/firefox 扩展的测试驱动开发
?oes Chrome 有相当于 XPCOM 的吗? 最佳答案 不,它没有。扩展和插件只能通过各自的 API 与浏览器交互。 关于google-chrome - Chrome 和 XPCOM,我们在S
如何使用 XPCOM 在浏览器中导入 cookie?这是我读过的文档。 https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Refe
有谁知道最新版本的 Firefox/Gecko 的可用 XPJS 或 XPCOM in JS 文档在哪里?示例代码/教程也很棒。 我需要编写自己的组件,但没有 .IDL(没有 C++ 编译接口(int
我是 XPCOM 开发的菜鸟。在用 C++ 编写 XPCOM 代码的过程中,我需要创建附加类以便在我的 XPCOM 组件中使用。我需要为这些类创建另一个 XPCOM 组件吗?我不能只在头文件中添加新类
我正在构建我的 C++ XPCOM 以使用 Gecko sdk 24 进行扩展,但出现以下错误: Error 15 error LNK2001: unresolved external sym
我正在开发一个必须使用一些 RegExp 函数的 XPCOM C++ 组件 XPCOM C++ 是否内置了对 RegExp 的支持? 最佳答案 计划用于 Firefox 1.0,但在 long thr
我是一名优秀的程序员,十分优秀!