打開記事本,檔名:UndoCloseTabBtn,附檔名:.uc.js
// ==UserScript== // @namespace UndoCloseTabBtn.uc.js // @description 恢復已關閉分頁de可移動按鈕 // @charset UTF-8 // @Compatibility FF29+ // ==/UserScript== (function() { var buttonAttrs = { id: "undoclosetab-button", label: "恢復已關閉的分頁", tooltiptext: "\u64A4\u9500\u5173\u95ED\u6807\u7B7E\u9875", class: "toolbarbutton-1 chromeclass-toolbar-additional", removable: "true", type: "menu-button", //點擊按鈕恢復最後一次關閉的分頁,如果想左鍵恢復最後一次關閉的分頁,右鍵打開已關閉分頁列表, // 那麼改為(context: "_child",) image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAatJREFUeNpi/P//PwMlgImBQsACIrRNbMHOuHb2CCNMQsvYxgFIJQCxPRALAPFBIJ4AVHMApgbkerALWFhYwBgG9Mwd5gP5+4E4HogVgFgAiP1BYiA5ZBcwgkwxtnGFBYQgEK8HYgcCLl9w7uieRJBesLVMUNsZGZkP/v//Vw+mSkFZ7VWQv99NEHvHrj2K165ckIFKJZjYe2wE0hvAOpmZWeGuh4WrnYPTza7agiVA5nYQP9LP2T6roi373OkTSiA+v6BgPtwAFlYWFPclJCSdSInwmcbIyLgYSfjsyUs3OS5dONMK4vz6+cscHo0gFyDjxYsXW9h7hy+y8wpDSSQ37jxYCVPDw8v3Fx6NyDGAD6xevdYJplZJWeUx3IC9G5cux6WJkXEZnP3v378mZhZmMNvSzHg73ACgX6MI2e4ZljgfGEMSIBeoqmk+ifB1mgM3gBDwiUybD02VDHz8fF+r8lOmAy29Dk8H+EBgbOZ+WMLi5eP/mp2euFFcRHACA3J6xgeOnr06JbOs+R0Iv/vwaTpQvTyKXkIGgDS8+fCpD4SBbC40OQaAAAMAZs+cq1JeSBMAAAAASUVORK5CYII=", command: "History:UndoCloseTab" }; var uCTBtn = $C('toolbarbutton', buttonAttrs); var popup = uCTBtn.appendChild($C("menupopup", { oncommand: "event.stopPropagation();", onpopupshowing: "this.parentNode.populateUndoSubmenu();", context: "", tooltip: "bhTooltip", popupsinherittooltip: "true" })); uCTBtn._getClosedTabCount = HistoryMenu.prototype._getClosedTabCount; uCTBtn.populateUndoSubmenu = eval("(" + HistoryMenu.prototype.populateUndoSubmenu.toString().replace(/._rootElt.*/, "") + ")"); // 來自 User Agent Overrider 擴展 const log = function() { dump(Array.slice(arguments).join(' ') + '\n'); }; const trace = function(error) { log(error); log(error.stack); }; const ToolbarManager = (function() { /** * Remember the button position. * This function Modity from addon-sdk file lib/sdk/widget.js, and * function BrowserWindow.prototype._insertNodeInToolbar */ let layoutWidget = function(document, button, isFirstRun) { // Add to the customization palette let toolbox = document.getElementById('navigator-toolbox'); toolbox.palette.appendChild(button); // Search for widget toolbar by reading toolbar's currentset attribute let container = null; let toolbars = document.getElementsByTagName('toolbar'); let id = button.getAttribute('id'); for (let i = 0; i < toolbars.length; i += 1) { let toolbar = toolbars[i]; if (toolbar.getAttribute('currentset').indexOf(id) !== -1) { container = toolbar; } } // if widget isn't in any toolbar, default add it next to searchbar if (!container) { if (isFirstRun) { container = document.getElementById('nav-bar'); } else { return; } } // Now retrieve a reference to the next toolbar item // by reading currentset attribute on the toolbar let nextNode = null; let currentSet = container.getAttribute('currentset'); let ids = (currentSet === '__empty') ? [] : currentSet.split(','); let idx = ids.indexOf(id); if (idx !== -1) { for (let i = idx; i < ids.length; i += 1) { nextNode = document.getElementById(ids[i]); if (nextNode) { break; } } } // Finally insert our widget in the right toolbar and in the right position container.insertItem(id, nextNode, null, false); // Update DOM in order to save position // in this toolbar. But only do this the first time we add it to the toolbar if (ids.indexOf(id) === -1) { container.setAttribute('currentset', container.currentSet); document.persist(container.id, 'currentset'); } }; let addWidget = function(window, widget, isFirstRun) { try { layoutWidget(window.document, widget, isFirstRun); } catch(error) { trace(error); } }; let removeWidget = function(window, widgetId) { try { let widget = window.document.getElementById(widgetId); widget.parentNode.removeChild(widget); } catch (error) { trace(error); } }; let exports = { addWidget: addWidget, removeWidget: removeWidget, }; return exports; })(); ToolbarManager.addWidget(window, uCTBtn, false); document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ #undoclosetab-button menuitem {max-width: 240px;}\ ') + '"'), document.documentElement); function $C(name, attr) { var el = document.createElement(name); if (attr) Object.keys(attr).forEach(function(n) el.setAttribute(n, attr[n])); return el; } })(); |