编辑:在macOS Sierra版本10.12.2,Firefox 51.0.1,MacBook Air(13英寸,2015年初)上遇到问题。尝试使用相同版本的Firefox运行我的东芝Satellite P50TA。它可以工作。
我正在查看firefox Web扩展教程https://github.com/mdn/webextensions-examples/tree/master,特别是tabs-tabs-tabs。
/// Zoom constants. Define Max, Min, increment and default values
const ZOOM_INCREMENT = 0.2;
const MAX_ZOOM = 3;
const MIN_ZOOM = 0.3;
const DEFAULT_ZOOM = 1;
function firstUnpinnedTab(tabs) {
for (var tab of tabs) {
if (!tab.pinned) {
return tab.index;
}
}
}
/**
* listTabs to switch to
*/
function listTabs() {
getCurrentWindowTabs().then((tabs) => {
let tabsList = document.getElementById('tabs-list');
let currentTabs = document.createDocumentFragment();
let limit = 5;
let counter = 0;
tabsList.textContent = '';
for (let tab of tabs) {
if (!tab.active && counter <= limit) {
let tabLink = document.createElement('a');
tabLink.textContent = tab.title || tab.id;
tabLink.setAttribute('href', tab.id);
tabLink.classList.add('switch-tabs');
currentTabs.appendChild(tabLink);
}
counter += 1;
}
tabsList.appendChild(currentTabs);
});
}
document.addEventListener("DOMContentLoaded", listTabs);
function getCurrentWindowTabs() {
return browser.tabs.query({currentWindow: true});
}
document.addEventListener("click", function(e) {
function callOnActiveTab(callback) {
getCurrentWindowTabs().then((tabs) => {
for (var tab of tabs) {
if (tab.active) {
callback(tab, tabs);
}
}
});
}
if (e.target.id === "tabs-move-beginning") {
callOnActiveTab((tab, tabs) => {
var index = 0;
if (!tab.pinned) {
index = firstUnpinnedTab(tabs);
}
console.log(`moving ${tab.id} to ${index}`)
browser.tabs.move([tab.id], {index});
});
}
if (e.target.id === "tabs-move-end") {
callOnActiveTab((tab, tabs) => {
var index = -1;
if (tab.pinned) {
var lastPinnedTab = Math.max(0, firstUnpinnedTab(tabs) - 1);
index = lastPinnedTab;
}
browser.tabs.move([tab.id], {index});
});
}
else if (e.target.id === "tabs-duplicate") {
callOnActiveTab((tab) => {
browser.tabs.duplicate(tab.id);
});
}
else if (e.target.id === "tabs-reload") {
callOnActiveTab((tab) => {
browser.tabs.reload(tab.id);
});
}
else if (e.target.id === "tabs-remove") {
callOnActiveTab((tab) => {
browser.tabs.remove(tab.id);
});
}
else if (e.target.id === "tabs-create") {
browser.tabs.create({url: "https://developer.mozilla.org/en-US/Add-ons/WebExtensions"});
}
else if (e.target.id === "tabs-alertinfo") {
callOnActiveTab((tab) => {
let props = "";
for (let item in tab) {
props += `${ item } = ${ tab[item] } \n`;
}
alert(props);
});
}
else if (e.target.id === "tabs-add-zoom") {
callOnActiveTab((tab) => {
var gettingZoom = browser.tabs.getZoom(tab.id);
gettingZoom.then((zoomFactor) => {
//the maximum zoomFactor is 3, it can't go higher
if (zoomFactor >= MAX_ZOOM) {
alert("Tab zoom factor is already at max!");
} else {
var newZoomFactor = zoomFactor + ZOOM_INCREMENT;
//if the newZoomFactor is set to higher than the max accepted
//it won't change, and will never alert that it's at maximum
newZoomFactor = newZoomFactor > MAX_ZOOM ? MAX_ZOOM : newZoomFactor;
browser.tabs.setZoom(tab.id, newZoomFactor);
}
});
});
}
else if (e.target.id === "tabs-decrease-zoom") {
callOnActiveTab((tab) => {
var gettingZoom = browser.tabs.getZoom(tab.id);
gettingZoom.then((zoomFactor) => {
//the minimum zoomFactor is 0.3, it can't go lower
if (zoomFactor <= MIN_ZOOM) {
alert("Tab zoom factor is already at minimum!");
} else {
var newZoomFactor = zoomFactor - ZOOM_INCREMENT;
//if the newZoomFactor is set to lower than the min accepted
//it won't change, and will never alert that it's at minimum
newZoomFactor = newZoomFactor < MIN_ZOOM ? MIN_ZOOM : newZoomFactor;
browser.tabs.setZoom(tab.id, newZoomFactor);
}
});
});
}
else if (e.target.id === "tabs-default-zoom") {
callOnActiveTab((tab) => {
var gettingZoom = browser.tabs.getZoom(tab.id);
gettingZoom.then((zoomFactor) => {
if (zoomFactor == DEFAULT_ZOOM) {
alert("Tab zoom is already at the default zoom factor");
} else {
browser.tabs.setZoom(tab.id, DEFAULT_ZOOM);
}
});
});
}
// Currently (11/2/2016) only supported by Chrome
else if (e.target.id === "tabs-highlight") { // highlights current tab and next tab (cycles back to first tab if current tab is the last one)
callOnActiveTab((tab, tabs) => {
next = (tab.index+1) % tabs.length;
browser.tabs.highlight({tabs:[tab.index, next]});
});
}
else if (e.target.classList.contains('switch-tabs')) {
var tabId = +e.target.getAttribute('href');
chrome.tabs.query({
currentWindow: true
}, function(tabs) {
for (var tab of tabs) {
if (tab.id === tabId) {
chrome.tabs.update(tabId, {
active: true
});
}
}
});
}
e.preventDefault();
});
//onRemoved listener. fired when tab is removed
browser.tabs.onRemoved.addListener(function(tabId, removeInfo){
console.log(`The tab with id: ${tabId}, is closing`);
if(removeInfo.isWindowClosing) {
console.log(`Its window is also closing.`);
} else {
console.log(`Its window is not closing`);
}
});
//onMoved listener. fired when tab is moved into the same window
browser.tabs.onMoved.addListener(function(tabId, moveInfo){
var startIndex = moveInfo.fromIndex;
var endIndex = moveInfo.toIndex;
console.log(`Tab with id: ${tabId} moved from index: ${startIndex} to index: ${endIndex}`);
});
所有缩放方法都不起作用,浏览器控制台会记录FullZoom.setZoom不是函数的注释。这似乎与Firefox 51.0.1的更新有关。我自己尝试编写简单的Web扩展,使用cookie来记住使用onUpdated事件设置的缩放设置。
该功能仍然出现在api中 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/setZoom