2011-10-07 34 views
2

有什么办法当一个页面被书签或在Firefox下载跟踪?我 的意思是有没有被触发的书签或 下载页面中的任何事件?我正在使用Add-on SDK来开发附加组件。事件监听器要知道当一个页面书签/下载

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

+0

不,不在附加SDK中。顺便说一句,-1在新闻组中提问并立即在此发布 - 请耐心等待新闻组中的答案。 –

+0

@WladimirPalant,我感到非常抱歉是这个不耐烦,但其实我还挺期限下工作,我不知道在这里张贴将同一个人的目标为,关于谷歌组。 关于这个问题。如果附加SDK没有为此提供任何功能,是否有任何解决方法? 玩XP​​COM..will它会吗?如果是,那么请指引我正确的资源 – Shatu

+1

引用了谷歌组线程:http://groups.google.com/group/mozilla-labs-jetpack/browse_thread/thread/3a16d2ad8a49f3b2 – Nickolay

回答

4

浏览器窗口中有<command> elements是被触发,当用户的书签或下载的页面。前者有ID Browser:AddBookmarkAs,后者Browser:SavePage。附加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); 
}); 
+0

你的代码不会抛出任何异常。但它仍然没有工作。基本上'onBookmark'和'onSavePage'函数没有被调用。所以大多数事件不会在书签和下载时触发​​。 – Shatu

1

这一切都在插件sdk文档中。虽然我必须承认我第一次没有看到它。

https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/tutorials/event-targets.html

下面的例子是从文档。

注意,我不得不铬添加到需要使其由词在generateQI()调用工作

以及替代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); 
}