我正在开发一个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));
})();
请帮我解决这个问题。
答案 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);