2

有什么方法可以跟踪某个页面何时在 Firefox 中被添加书签或下载?我的意思是在添加书签或下载页面时会触发任何事件吗?我正在使用 Add-on SDK 来开发 Add-on。

如果没有,那么请建议我一些解决方法。

4

2 回答 2

4

浏览器窗口具有在用户添加书签或下载页面时触发的<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);
});
于 2011-10-12T10:20:07.260 回答
1

这一切都在插件 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);
}
于 2013-08-21T16:37:37.313 回答