我應該使用哪些XPCOM界面來檢測選項卡的打開,關閉和切換,並從Firefox擴展中獲取關聯的URL? 我已經看到了管理JS中選項卡的代碼的實例,但從C++中怎麼樣?使用C++ XPCOM擴展訪問Firefox上的選項卡
3
A
回答
5
您可以編寫一個小的JS組件,使用nsIObserverService將選項卡事件重新路由到您的C++組件。
在C++代碼中,您可以使用此片段將組件註冊爲用戶定義的用於重新路由選項卡事件的事件的觀察者。
NS_IMETHODIMP MyCppComponent::Observe(nsISupports *aSubject,
const char *aTopic,
const PRUnichar *aData)
{
if(!strcmp(aTopic, "xpcom-startup"))
{
nsCOMPtr<nsIObserverService> observerService =
do_GetService("@mozilla.org/observer-service;1");
observerService->AddObserver(this, "my-tab-open", false);
observerService->AddObserver(this, "my-tab-close", false);
observerService->AddObserver(this, "my-tab-select", false);
}
else if(!strcmp(aTopic, "my-tab-open"))
{
/* . . . */
}
else if(!strcmp(aTopic, "my-tab-close"))
{
/* . . . */
}
else if(!strcmp(aTopic, "my-tab-select"))
{
/* . . . */
}
/* . . . */
}
而在輔助JS部件你應該訂閱標籤事件和事件處理程序可以提取所希望的數據,並提高用戶定義的事件來執行C++代碼。
function tabOpened(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-open", "some data");
}
function tabClosed(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-close", "some data");
}
function tabSelected(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-select", "some data");
}
function contentWndLoad(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
var browser = getMostRecentBrowserWindow().getBrowser();
browser.tabContainer.addEventListener("TabOpen", tabOpened, false);
browser.tabContainer.addEventListener("TabClose", tabClosed, false);
browser.tabContainer.addEventListener("TabSelect", tabSelected, false);
}
MyJsComponent.prototype = {
/* . . . */
observe: function(aSubject, aTopic, aData) {
switch(aTopic) {
case "xpcom-startup":
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.addObserver(this, "toplevel-window-ready", false);
break;
case "toplevel-window-ready":
aSubject.addEventListener("load", contentWndLoad, false);
break;
}
}
/* . . . */
}
還有一些額外的代碼,你應該添加來處理特定情況。例如,當用戶關閉瀏覽器窗口時,您將不會收到該窗口中打開的選項卡的TabClose事件...並且當您不再需要時,請不要忘記註銷觀察者。
+0
好的,這正是我所需要的,示例代碼將爲我節省很多時間! 非常感謝! –
相關問題
- 1. 在Firefox擴展切換選項卡
- 2. 我的Firefox擴展無法使用。什麼是使用C++ XPCOM組件的Firefox擴展(XPI文件)的結構?
- 3. 使用C++在nsIWebProgressListener :: OnStateChange中訪問Firefox選項卡元素
- 4. Firefox擴展訪問DOM(使用jQuery)
- 5. 移植XPCOM Firefox擴展到Chrome擴展與NPAPI插件
- 6. Firefox的插件SDK選項卡訪問
- 7. 使用來自Firefox擴展的Web Workers的XPCOM
- 8. Firefox擴展,訪問文檔
- 9. 訪問在Firefox擴展
- 10. 編寫使用XPCOM組件的Firefox擴展?
- 11. Ajax選項卡擴展器控制選項卡上點擊
- 12. Firefox擴展,使通知框出現在所有選項卡
- 13. Chrome擴展 - 選項卡數
- 14. 擴展JQuery UI選項卡
- 15. 從Chrome擴展程序訪問當前選項卡DOM對象
- 16. Chrome擴展:訪問html背景選項卡
- 17. Firefox XPCOM setTimeout問題
- 18. 關閉只有一個特定的選項卡與Firefox擴展
- 19. Firefox擴展中的GMail訪問
- 20. 與XulRunner v.34鏈接來創建Firefox的XPCOM擴展
- 21. 更改選項卡的網址javascript firefox擴展
- 22. 從XPCOM組件訪問Firefox緩存
- 23. 從Firefox擴展中訪問iFrame的dom
- 24. 檢測選項卡關閉(關閉後)從Firefox擴展
- 25. firefox擴展,jQuery和訪問文檔
- 26. 在Firefox擴展中捕捉關閉選項卡事件
- 27. 從Thunderbird擴展中調用Firefox XPCOM組件
- 28. 如何訪問Firefox擴展資源
- 29. 通過Firefox擴展在特定位置打開選項卡
- 30. 從Firefox擴展中重定向當前選項卡
爲什麼?你絕對應該從JS做到這一點。 – Nickolay