从Firefox插件面板中获取当前URL

从Firefox插件面板中获取当前URL,firefox,firefox-addon,Firefox,Firefox Addon,因此,我收集了5种不同的方法来实现这一点,其中没有一种是在一个面板内工作的。Firefox在阻止访问基本任务方面非常有效 以下是我尝试过的: 尝试1: var url = window.top.getBrowser().selectedBrowser.contentWindow.location.href; 错误:window.top.getBrowser不是函数 尝试2: var url = window.content.document.location; 错误:访问属性“文档”的权

因此,我收集了5种不同的方法来实现这一点,其中没有一种是在一个面板内工作的。Firefox在阻止访问基本任务方面非常有效

以下是我尝试过的:

  • 尝试1:

    var url = window.top.getBrowser().selectedBrowser.contentWindow.location.href;
    
    错误:window.top.getBrowser不是函数

  • 尝试2:

    var url = window.content.document.location; 
    
    错误:访问属性“文档”的权限被拒绝

  • 尝试3:

    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                   .getInterface(Components.interfaces.nsIWebNavigation)
                   .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                   .rootTreeItem
                   .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                   .getInterface(Components.interfaces.nsIDOMWindow);
    var url = mainWindow.getBrowser().selectedBrowser.contentWindow.location.href;
    
    错误:拒绝为类UnnamedClass的对象创建包装的权限

  • 尝试4:

    var url = window.content.location.href;
    
    错误:访问属性“href”的权限被拒绝

  • 尝试5:

    var currentWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
    var currBrowser = currentWindow.getBrowser();
    var url = currBrowser.currentURI.spec;
    
    错误:获取属性XPCComponents.classes的权限被拒绝

为Chrome编写此代码是轻而易举的事。不知道为什么这对FF来说如此困难

有人找到解决方案了吗?

我猜“Firefox插件面板”指的是插件SDK的模块

如果是这样的话,您可能正试图在一个特定的环境中使用这些片段。相反,您必须向主加载项的代码()发送事件,并在主加载项的代码中使用:

[更新]完整的测试用例,适用于我:

// http://stackoverflow.com/questions/7856282/get-current-url-from-within-a-firefox-addon-panel
exports.main = function() {
  var panel = require("panel").Panel({
    contentURL: "data:text/html,<input type=button value='click me' id='b'>",
    contentScript: "document.getElementById('b').onclick = " +
                   "function() {" +
                   "  self.port.emit('myEvent');" +
                   "}"
  });
  panel.port.on("myEvent", function() {
    console.log(require("tabs").activeTab.url)
  })
  require("widget").Widget({
    id: "my-panel",
    contentURL: "http://www.google.com/favicon.ico",
    label: "Test Widget",
    panel: panel
  });  
};
//http://stackoverflow.com/questions/7856282/get-current-url-from-within-a-firefox-addon-panel
exports.main=函数(){
var面板=需要(“面板”)。面板({
contentURL:“数据:文本/html,”,
contentScript:“document.getElementById('b')。onclick=”+
“函数(){”+
“self.port.emit('myEvent');”+
"}"
});
panel.port.on(“myEvent”,function()){
log(需要(“选项卡”).activeTab.url)
})
require(“widget”).widget({
id:“我的小组”,
内容URL:“http://www.google.com/favicon.ico",
标签:“测试小部件”,
面板:面板
});  
};

我认为您可以使用firefox本地对象:

var url = gBrowser.contentDocument.location;

&您是否尝试过
警告
URL???错误消息显示您正在运行未经授权的代码(尝试3通常是正确的方法)。不允许非特权代码访问浏览器的用户界面,句号。如果你解释你是如何运行这段代码的,有人可能会告诉你为什么它是非特权的。是的,它确实指的是面板模块。但是,您提供的这行代码会导致与content-proxy.js文件相关的大量错误,即使我将其放在主插件的代码中。你能告诉我你将如何使用它来获取当前的url吗?@ChrisKohout:更具体地描述“一系列错误”可以帮助你现在回答;如果没有它,我将不得不在插件生成器中尝试我的代码(稍后)。谢谢,我感谢您的努力。因此,我将您的“self.port.emit('myEvent');”添加到我的内容页url中(因为其中包含我需要用url填充的textarea),但这会生成一个“self.port未定义”错误。@ChrisKohout:我不知道您的代码有什么问题(您没有重新定义“self”,是吗?),但您可以用我发布的代码检查差异(如果它对您有效)来解决它。不,只是:self.port.emit('myEvent');它需要自动执行(不是在按钮中),所以我也在body onLoad中尝试了它,没有骰子。
var url = gBrowser.contentDocument.location;