2

Firefox でページがブックマークまたはダウンロードされたときを追跡する方法はありますか? ページのブックマークまたはダウンロード時にトリガーされるイベントはありますか? Add-on の開発に Add-on SDK を使用しています。

そうでない場合は、いくつかの回避策を教えてください。

4

2 に答える 2

4

ブラウザー ウィンドウには、ユーザーがページをブックマークまたはダウンロードしたときにトリガーされる<command>要素があります。前者には IDBrowser:AddBookmarkAsがあり、後者には ID がありますBrowser:SavePage。アドオン 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 に答える