我正在开发一个firefox扩展,直到现在我正在使用XUL browser来控制用户浏览网站并保存访问过的网页,但是浏览器是有限的,我试过一个简单的谷歌搜索,当我点击某些结果时,它将不会显示在浏览器中。
一个想法是将xul应用程序移动到Dialog并控制实际的firefox选项卡。 但我不知道该怎么做。
答案 0 :(得分:1)
(根据你的评论......)
要创建记录TAB'load'事件的插件,请创建一个bootstrapped(无重启)插件:
要构建插件,只需将两个文件放在ZIP文件的顶级(无文件夹!)中,文件扩展名为.xpi
。要安装插件,请导航至about:addons
,然后从工具菜单中点击Install from file
,找到您的XPI,打开它,然后在短暂延迟后选择Install
。
在install.rdf
中输入以下内容:
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>youraddonname@yourdomain</em:id>
<em:type>2</em:type>
<em:name>Name of your addon</em:name>
<em:version>1.0</em:version>
<em:bootstrap>true</em:bootstrap>
<em:description>Describe your addon.</em:description>
<em:creator>Your name</em:creator>
<!-- Firefox Desktop -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>4.0.*</em:minVersion>
<em:maxVersion>29.0.*</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>
您需要在bootstrap.js
:
startup()
- 在您安装插件时以及浏览器启动时调用。shutdown()
- 在卸载插件时以及浏览器关闭时调用。您应该从startup()
调用所有“特权”代码。为了卫生,您可以(也可能应该)实施install()
和uninstall()
功能。
首先在bootstrap.js
中实施以下代码:
const Cc = Components.classes;
const Ci = Components.interfaces;
let consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService);
let wm = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
function LOG(msg) {
consoleService.logStringMessage("EXTENSION: "+msg);
}
function startup() {
try {
LOG("starting up...");
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
WindowListener.setupBrowserUI(chromeWindow);
}
wm.addListener(WindowListener);
LOG("done startup.");
} catch (e) {
LOG("error starting up: "+e);
}
}
function shutdown() {
try {
LOG("shutting down...");
let windows = wm.getEnumerator("navigator:browser");
while (windows.hasMoreElements()) {
let chromeWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow);
WindowListener.tearDownBrowserUI(chromeWindow);
}
wm.addListener(WindowListener);
LOG("done shutdown.");
} catch (e) {
LOG("error shutting down: "+e);
}
}
基本上,每个电流和电流都会调用WindowListener.setupBrowserUI()
。您的网络浏览器的未来窗口。 WindowListener
定义如下:
var WindowListener = {
setupBrowserUI: function(chromeWindow) {
chromeWindow.gBrowser.addEventListener('load', my_load_handler, true);
},
tearDownBrowserUI: function(chromeWindow) {
chromeWindow.gBrowser.removeEventListener('load', my_load_handler, true);
},
onOpenWindow: function(xulWindow) {
let chromeWindow = xulWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
chromeWindow.addEventListener("load", function listener() {
chromeWindow.removeEventListener("load", listener, false);
var domDocument = chromeWindow.document.documentElement;
var windowType = domDocument.getAttribute("windowtype");
if (windowType == "navigator:browser")
WindowListener.setupBrowserUI(chromeWindow);
}, false);
},
onCloseWindow: function(chromeWindow) { },
onWindowTitleChange: function(chromeWindow, newTitle) { }
};
为OpenWindow
事件设置事件监听器,然后在每个ChromeWindow的load
中为TabBrowser
事件安装事件监听器。 load
事件处理程序定义为:
var my_load_handler = function (evt) {
try {
var browserEnumerator = wm.getEnumerator("navigator:browser");
while (browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
var domWindow = currentBrowser.contentWindow.wrappedJSObject;
if (!domWindow.hasOwnProperty('__logged_this_window__')) {
LOG("TAB loaded:");
LOG(" URL: "+domWindow.location.href);
LOG(" TITLE: "+domWindow.title)
domWindow.__logged_this_window__ = 1;
}
}
}
} catch (e) {
LOG(e);
}
}
基本上,如果Firefox中的任何load
元素都有TabBrowser
个事件,那么该函数将会运行。它将枚举所有Firefox窗口以及所有这些窗口的选项卡(Browser
元素)。诀窍是当页面重新加载“内容”DomWindow
上的所有自定义属性都丢失时,我们检查是否存在自定义属性。如果没有,那么我们会记录TAB内容页面的详细信息。