所以我收集了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来说太难了。
有人有解决方案吗?
答案 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
});
};