在 Firefox Add-on SDK 中监听 pin/unpin 选项卡事件
Listen to pin/unpin tab events in Firefox Add-on SDK
我正在编写 Firefox 附加 SDK 扩展。我想在固定或取消固定任何选项卡时收到通知。不幸的是,sdk/tabs
模块不提供此类事件。是否有一些低级 API 为 pinning/unpinning 选项卡提供事件?
没有 Firefox Add-on SDK Low-Level API 可以提供一种方法来侦听被固定或取消固定的标签。 "Add-on SDK Low-Level APIs" 是一个非常具体的 API 列表,仅在附加 SDK 中定义。您没有将您的请求限制为仅针对附加 SDK 特定的 API,而是针对在附加 SDK 中运行的所有 Firefox API,这几乎是所有 Firefox API,WebExtensions 除外。
您可以通过侦听 TabPinned
and TabUnpinned
events on the XUL <tabs>
element for the window
in which you are interested. You can get the XUL <tabs>
element by using getTabContainer(window)
. If you want to get all such events within all browser windows, you will need to add the events to the tabContainer
, the XUL <tabs>
element, for each browser window. You can see a list of the tab specific events in the MDN Event Reference page.
来获取此类事件
以下是一个基于 Firefox Add-on SDK 的扩展,它将侦听所有 windows.
中的 TabPinned
和 TabUnpinned
事件
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"
]
}
我正在编写 Firefox 附加 SDK 扩展。我想在固定或取消固定任何选项卡时收到通知。不幸的是,sdk/tabs
模块不提供此类事件。是否有一些低级 API 为 pinning/unpinning 选项卡提供事件?
没有 Firefox Add-on SDK Low-Level API 可以提供一种方法来侦听被固定或取消固定的标签。 "Add-on SDK Low-Level APIs" 是一个非常具体的 API 列表,仅在附加 SDK 中定义。您没有将您的请求限制为仅针对附加 SDK 特定的 API,而是针对在附加 SDK 中运行的所有 Firefox API,这几乎是所有 Firefox API,WebExtensions 除外。
您可以通过侦听 TabPinned
and TabUnpinned
events on the XUL <tabs>
element for the window
in which you are interested. You can get the XUL <tabs>
element by using getTabContainer(window)
. If you want to get all such events within all browser windows, you will need to add the events to the tabContainer
, the XUL <tabs>
element, for each browser window. You can see a list of the tab specific events in the MDN Event Reference page.
以下是一个基于 Firefox Add-on SDK 的扩展,它将侦听所有 windows.
中的TabPinned
和 TabUnpinned
事件
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"
]
}