繁体   English   中英

侦听Firefox附加SDK中的固定/取消固定选项卡事件

[英]Listen to pin/unpin tab events in Firefox Add-on SDK

我正在编写Firefox附加SDK扩展。 我希望在固定或取消固定任何标签时收到通知。 不幸的是, sdk/tabs模块不提供此类事件。 是否有一些低级API提供了用于固定/取消固定标签的事件?

没有Firefox附加SDK 低级API ,该API提供了一种侦听被固定或未固定的选项卡的方法。 “附加SDK低级API”是API的非常具体的列表,仅在附加SDK中定义。 您的请求不仅限于特定于附加SDK的API,而且还限于在附加SDK中起作用的所有Firefox API,几乎是所有Firefox API,但WebExtensions除外。

您可以通过侦听您感兴趣的window的XUL <tabs>元素上的TabPinnedTabUnpinned事件来获取此类事件。 您可以使用getTabContainer(window)获得XUL <tabs>元素。 如果要在所有浏览器窗口中获取所有此类事件,则需要将事件添加到每个浏览器窗口的tabContainer (XUL <tabs>元素)中。 您可以在“ MDN事件参考”页面中查看选项卡特定事件的列表。

以下是基于Firefox附加SDK的扩展,它将在所有窗口中侦听TabPinnedTabUnpinned事件。

index.js

var sdkWinUtils = require('sdk/window/utils');
var sdkTabsUtils = require('sdk/tabs/utils');
var sdkWindows = require("sdk/windows");

//For testing, open the Browser Console
sdkWinUtils.getMostRecentBrowserWindow()
           .document.getElementById('menu_browserConsole').doCommand();

function tabPinned(event) {
  let tabId = sdkTabsUtils.getTabId(event.target);
  console.log('Pinned Tab ID:',tabId);
}

function tabUnpinned(event) {
  let tabId = sdkTabsUtils.getTabId(event.target);
  console.log('Unpinned Tab ID:',tabId);
}

function addTabPinUnpinListenersInWindow(win){
    //win can be either a browserWindow provided by the 
    //    sdkWindows.browserWindows.on('open',);
    //  event, or nsIDOMWindow instances provided in the array from
    //    sdkWinUtils.windows()
    //  We can distinguish between the two by using 
    //    sdkWinUtils.isBrowser(win)
    let container;
    if(sdkWinUtils.isBrowser(win)){
        container = sdkTabsUtils.getTabContainer(win);
    }else{
        let { viewFor } = require("sdk/view/core");
        container = sdkTabsUtils.getTabContainer(viewFor(win));
    }
    container.addEventListener("TabPinned", tabPinned, false);
    container.addEventListener("TabUnpinned", tabUnpinned, false);
}

function removeTabPinUnpinListenersInWindow(win){
    let container = sdkTabsUtils.getTabContainer(win);
    container.removeEventListener("TabPinned", tabPinned, false);
    container.removeEventListener("TabUnpinned", tabUnpinned, false);
}

function forEachOpenWindow(func){
    let allWindows = sdkWinUtils.windows('navigator:browser', {includePrivate:true});
    for(let win of allWindows){
        func(win);
    }
}

function forEachOpenWindowAndAllNewWindows(func){
    forEachOpenWindow(func);
    //Listen for new windows opening and add tab pin/unpin listeners:
    sdkWindows.browserWindows.on('open',func);
}

function removeAllListeners(){
    //To be called upon shutdown for add-on upgrade/disable/removal
    //Remove new window open listener
    sdkWindows.browserWindows.off('open',addTabPinUnpinListenersInWindow);
    //Remove tab pin/unpin listeners
    forEachOpenWindow(removeTabPinUnpinListenersInWindow);
}

//Add listeners to all open windows and all which open
forEachOpenWindowAndAllNewWindows(addTabPinUnpinListenersInWindow);

//Clean up if Firefox is not shutting down (e.g. the add-on is disabled by user).
exports.onUnload = reason => {
    if(reason !== 'shutdown'){
        //The add-on is being unloaded and it is not because Firefox is sutting down.
        removeAllListeners();
    }
};

package.json

{
    "title": "Listen to tab pin/unpin",
    "name": "listen-to-tab-pin-unpin",
    "version": "0.0.1",
    "description": "Output to console when a tab is pinned or unpinned.",
    "main": "index.js",
    "author": "Makyen",
    "permissions": {"private-browsing": true},
    "engines": {
        "firefox": ">=38.0a1",
        "fennec": ">=38.0a1"
    },
    "license": "MIT",
    "keywords": [
        "jetpack"
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM