从Firefox Addon面板中获取当前URL

时间:2011-10-21 23:16:40

标签: 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; 
    

    错误:访问属性'document'的权限被拒绝

  • 尝试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来说太难了。

有人有解决方案吗?

2 个答案:

答案 0 :(得分:2)

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

var url = gBrowser.contentDocument.location;

答案 1 :(得分:1)

我猜“Firefox Addon面板”是指Addon SDK的panel模块?

如果是这样,您可能会尝试在content script中使用这些代码段。相反,您必须将事件发送到主插件的代码(example),并在主插件的代码中使用tabs module

require("tabs").activeTab.url

[更新]完整的测试用例,对我有用:

// 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
  });  
};