从firefox扩展中的加载脚本传递对象

时间:2012-04-19 18:39:28

标签: javascript firefox-addon xul

我正在开发一个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未定义的错误。我正在使用的代码的详细信息如下:

在叠加层的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));
})();

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果您希望在经典的Firefox扩展程序中使用内容脚本,那么mozIJSSubScriptLoader是错误的工具 - “内容脚本”将保留高级权限并可能导致安全问题。您可以使用message manager代替(忽略关于进程分离的讨论,它与桌面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);