【问题标题】:Event Listeners to know when a page is Bookmarked/Downloaded事件监听器知道页面何时被书签/下载
【发布时间】:2011-10-07 21:43:33
【问题描述】:

在 Firefox 中是否有任何方法可以跟踪页面何时被收藏或下载?一世 意味着是否有任何事件触发书签或 下载页面?我正在使用 Add-on SDK 来开发 Add-on。

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

【问题讨论】:

  • 不,不在附加 SDK 中。顺便说一句,-1 表示在新闻组中提出问题并立即将其发布在此处 - 请耐心等待新闻组中的答案。
  • @WladimirPalant,我非常抱歉这么不耐烦,但实际上我有点在截止日期前工作,我不知道在这里发布它会针对与 Google 网上论坛相同的人。关于这个问题。如果附加 SDK 不为此提供任何功能,是否有任何解决方法?玩XPCOM ..会吗?如果是,请指导我找到适当的资源
  • @Nickolay,感谢您的标签:)

标签: firefox firefox-addon xpcom firefox-addon-sdk


【解决方案1】:

浏览器窗口有<command> elements,当用户添加书签或下载页面时触发。前者的 ID 为Browser:AddBookmarkAs,后者的 ID 为Browser:SavePage。 Add-on SDK 本身并不允许您访问它们,因此您需要使用chrome package 直接访问 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);
});

【讨论】:

  • 您的代码不会引发任何异常。但它仍然无法正常工作。基本上没有调用onBookmarkonSavePage 函数。所以大多数事件不会在书签和下载时触发​​。
【解决方案2】:

这一切都在插件 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);
}

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多