收听Firefox插件SDK中的pin/unpin选项卡事件

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

本文关键字:unpin 选项 事件 pin Firefox 插件 SDK 中的 收听      更新时间:2023-09-26

我正在编写一个Firefox插件SDK扩展。当任何标签被固定或取消固定时,我想要得到通知。不幸的是,sdk/tabs模块不提供这样的事件。是否有一些低级API提供固定/取消固定标签的事件?

没有Firefox Add-on SDK Low-Level API提供一种方法来监听标签被固定或取消固定。"附加SDK低级api"是一个非常具体的api列表,这些api仅在附加SDK中定义。您没有将请求限制为仅针对附加组件SDK特定的api,而是限制为在附加组件SDK中运行的所有Firefox api,这几乎是所有Firefox api,除了WebExtensions。

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

下面是一个基于Firefox插件SDK的扩展,它将监听所有windows中的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"
    ]
}