0

我正在开发一个 Firefox 扩展程序,用于从当前选项卡中的网页检索数据。当用户单击覆盖工具栏按钮时,我正在将脚本加载到网页中,该按钮进行一些处理并从网页获取信息。我想在弹出窗口中显示该信息。

我正在使用以下 api 加载脚本:

var loader = Components.classes[ "@mozilla.org/moz/jssubscript-loader;1" ].getService( Components.interfaces.mozIJSSubScriptLoader );
loader.loadSubScript("chrome://dynamonote/content/contentscript.js");

我需要发送在 contentscript.js 中创建的对象并将其显示在 popup.html 中,当用户单击工具栏图标时会显示该对象。

我在执行代码时收到 gBrowser is not defined 错误。我正在使用的代码的详细信息如下:

在叠加层的 onCommand 中,我调用了以下函数:

var Popup = {
    showPopup: function() {
        window.open("chrome://dynamonote/content/popup.html", "dynamonote", "chrome");
    }
};

这将显示一个弹出窗口。在页面加载时调用的 popup.html 的 init 函数中,我正在执行以下代码:

        function loadContentScript() {
            Components.utils.reportError("loadContentScript() called");
            gBrowser.selectedBrowser.messageManager.loadFrameScript("chrome://dynamonote/content/contentscript.js", true);
            gBrowser.selectedBrowser.messageManager.addMessageListener("foomessage", onMessage);
            Components.utils.reportError("loadContentScript() executed");
        }

以下代码在 contentscript.js 文件中执行:

(function() {
    Components.utils.reportError("-- content script -- ");
    var doc = content.document;

    //Do something here

    var data = {
        "time": new Date().toLocaleString()
    };
    Components.utils.reportError("-- content script -- found something");
        sendSyncMessage("foomessage", onMessage(data));
})();

这个你能帮我吗。

4

1 回答 1

1

如果您想要经典 Firefox 扩展中的内容脚本,那么mozIJSSubScriptLoader工具是错误的 - “内容脚本”将保留高级权限并可能导致安全问题。您可以改用消息管理器(忽略有关进程分离的讨论,它与桌面 Firefox 无关)。因此,要将脚本加载到当前选定的选项卡中,您将使用以下代码:

gBrowser.selectedBrowser.messageManager
        .loadFrameScript("chrome://dynamonote/content/contentscript.js", true);
gBrowser.selectedBrowser.messageManager.addMessageListener("foomessage", onMessage);

function onMessage(obj)
{
  alert("Received object from content script: " + obj.toSource());
}

请注意,当不再需要该消息侦听器时,您应该删除它。并且要发回消息,内容脚本将使用如下代码:

sendAsyncMessage("foomessage", obj);
于 2012-04-19T19:56:32.797 回答