有什么方法可以跟踪某个页面何时在 Firefox 中被添加书签或下载?我的意思是在添加书签或下载页面时会触发任何事件吗?我正在使用 Add-on SDK 来开发 Add-on。
如果没有,那么请建议我一些解决方法。
有什么方法可以跟踪某个页面何时在 Firefox 中被添加书签或下载?我的意思是在添加书签或下载页面时会触发任何事件吗?我正在使用 Add-on SDK 来开发 Add-on。
如果没有,那么请建议我一些解决方法。
浏览器窗口具有在用户添加书签或下载页面时触发的<command>
元素。前者有ID Browser:AddBookmarkAs
,后者有Browser:SavePage
。Add-on SDK 本身并不允许您访问它们,因此您需要使用该chrome
软件包直接访问 XPCOM。像这样的东西:
// Add listener to all existing browser windows
var {Cc, Ci} = require("chrome");
var mediator = Cc["@mozilla.org/appshell/window-mediator;1"]
.getService(Ci.nsIWindowMediator);
var enumerator = mediator.getEnumerator("navigator:browser");
while (enumerator.hasMoreElements())
listenToWindow(enumerator.getNext().QueryInterface(Ci.nsIDOMWindow));
// Get notified when new browser windows open
var observers = require("observer-service");
observers.add("chrome-document-global-created", function(window)
{
if (window instanceof Ci.nsIDOMWindow && window.location.href == "chrome://browser/content/browser.xul")
listenToWindow(window);
});
function listenToWindow(window)
{
window.document
.getElementById("Browser:AddBookmarkAs")
.addEventListener("command", onBookmark, false);
window.document
.getElementById("Browser:SavePage")
.addEventListener("command", onSavePage, false);
}
此代码未经测试,因此可能存在小问题,但总体概念应该是正确的。
编辑window-utils
:实际上,如果您使用内部包,这似乎更简单。但是不确定这个包提供的 API 是否稳定。
var windows = require("window-utils");
for (window in windows.browserWindowIterator)
listenToWindow(window);
var observers = require("observer-service");
observers.add("chrome-document-global-created", function(window)
{
if (window instanceof Ci.nsIDOMWindow && windows.isBrowser(window))
listenToWindow(window);
});
这一切都在插件 sdk 文档中。虽然我必须承认我没有第一次看到它。
https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/tutorials/event-targets.html
以下示例来自文档。
请注意,我必须将 Cr 添加到 require 才能使其工作
以及在 generateQI() 调用中用 Ci 替换 Components.interfaces。
var {Cc, Ci, Cu, Cr} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
var bookmarkService = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]
.getService(Ci.nsINavBookmarksService);
var bookmarkObserver = {
onItemAdded: function(aItemId, aFolder, aIndex) {
console.log("added ", bookmarkService.getBookmarkURI(aItemId).spec);
},
onItemVisited: function(aItemId, aVisitID, time) {
console.log("visited ", bookmarkService.getBookmarkURI(aItemId).spec);
},
QueryInterface: XPCOMUtils.generateQI([Ci.nsINavBookmarkObserver])
};
exports.main = function() {
bookmarkService.addObserver(bookmarkObserver, false);
};
exports.onUnload = function() {
bookmarkService.removeObserver(bookmarkObserver);
}