в 115`ом перестала работать jsm`ка, может и раньше, но у меня получилось так
/* write(path, html) { if (typeof IOUtils != "object") { var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm"); var IOUtils = {writeUTF8: (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt))}; } (this.write = IOUtils.writeUTF8 || IOUtils.writeAtomicUTF8)(path, html); */ async write(path, html) { try { // if (typeof IOUtils != "object") don`t access to... var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm"); var OSFile = {writeUTF8: (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt))}; } catch {} (this.write = await IOUtils.writeUTF8 || OSFile.writeAtomicUTF8)(path, html);
Отредактировано Farby (30-06-2023 17:41:33)
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
может и раньше
Вряд ли. Дело в том, что функция написана неправильно,
из-за непонимания того, как работает var. Вроде бы основы, но из неочевидных.
Из-за этой var-записи typeof IOUtils всегда был "undefined", поэтому всегда использовался osfile.jsm
А в 115 его удалили: Bug 1776480 - Remove OS.File, и косяк вылез наружу.
Лучше, наверно, было бы так написать
//..... write(path, html) { if (typeof IOUtils == "object") var write = IOUtils.writeUTF8 || IOUtils.writeAtomicUTF8; // Fx 85+ || 82-84 if (!write) { // Fx 79-81 var {OS} = ChromeUtils.import("resource://gre/modules/osfile.jsm"); write = (path, txt) => OS.File.writeAtomic(path, new TextEncoder().encode(txt)); } (this.write = write)(path, html); }
Отсутствует
Из-за этой var-записи typeof IOUtils всегда был "undefined"
Спасибо за объяснения, а то уже начал думать что у меня лыжи не едут или асфальт не красивый!
Добавлено 01-07-2023 09:34:38
О, забыл и за код конечно!
Отредактировано Farby (01-07-2023 09:34:38)
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Есть такая кнопка
// Убрать замыливание последних букв и вернуть многоточие в названии вкладок. // https://forum.mozilla-russia.org/viewtopic.php?pid=749234#p749234 ((func, destroy) => { [...gBrowser.tabs].forEach(func); addEventListener("TabOpen", func, false, gBrowser.tabContainer); addEventListener("TabAttrModified", func, false, gBrowser.tabContainer); addDestructor(() => [...gBrowser.tabs].forEach(destroy)); })(e => { var tab = e.target || e; var lab = tab.textLabel; if (!lab.hasAttribute("crop")) { lab.setAttribute("crop", "end"); lab.setAttribute("flex", "1"); } else if (lab.value == tab.label) return; lab.setAttribute("value", tab.label); }, tab => { var lab = tab.textLabel; for(var attr of ["crop", "flex", "value"]) lab.removeAttribute(attr); });
На форуме
Viatcheslav
Перестало работать в 109.
На мой запрос Dumby посоветовал сделать это стилем: https://forum.mozilla-russia.org/viewto … 93#p803493
«The Truth Is Out There»
Отсутствует
На мой запрос Dumby посоветовал сделать это стилем: https://forum.mozilla-russia.org/viewto … 93#p803493
У меня в таком виде не завелось...
.tab-label-container { mask: none !important; } .tab-secondary-label { overflow: hidden !important; } .tab-secondary-label > .tab-icon-sound-label, .tab-label-container > .tab-label { display: inline-block; max-width: 100% !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; min-width: 0 !important; line-height: 1.25em !important; height: 1.25em !important; margin: 0 !important; } .tab-close-button { padding: 5px !important; width: 20px !important; height: 20px !important; } .tab-close-button:not(:hover) { padding-inline-start: 0 !important; width: 15px !important; }
На форуме
в 115 перестала работать кнопка Undo Close Tab
// Undo Close Tabs button for Custom Buttons
// (code for "initialization" section)
// (c) Infocatcher 2009-2021
// version 0.3.3.3 - 2021-09-04
var options = {
menuTemplate: [
"closedWindows",
"separator",
"restoreClosedWindows",
"clearClosedWindows",
"separator",
"closedTabs",
"separator",
"restoreClosedTabs",
"clearClosedTabs",
"separator",
"clearAll",
"separator",
"restoreLastSession",
"separator",
"buttonMenu"
],
showInTabContextMenu: false,
/*
menuTemplateTabContext: [ // like menuTemplate
"closedTabs",
"separator",
"restoreClosedTabs",
"clearClosedTabs"
],
*/
windowItemTemplate: "(%count) %title",
windowSelectedTabPrefix: "*",
buttonTipTemplate: ["header", "title", "url", "closedAt"],
itemTipTemplate: ["title", "url", "closedAt"],
hideRestoreAllForSingleEntry: false,
allowDeleteEntries: true,
accesskeys: { // Empty string ("") to disable or string with possible values ("0123...", "abcd...")
closedTabs: "",
closedWindows: ""
},
accesskeySeparator: " ", // <accesskey><separator><label>
openMenuOnMouseover: false,
useMenu: false,
rightClickToUndoCloseTab: false // Useful with "useMenu: true"
};
function _localize(sid) {
var strings = {
en: {
restoreTab: "Restore the most recently closed tab",
restoreAllTabs: "Restore all tabs",
restoreAllTabsAccesskey: "t",
clearTabsHistory: "Clear history of closed tabs",
clearTabsHistoryAccesskey: "b",
restoreAllWindows: "Restore all windows",
restoreAllWindowsAccesskey: "w",
clearWindowsHistory: "Clear history of closed windows",
clearWindowsHistoryAccesskey: "d",
clearAllHistory: "Clear all history",
clearAllHistoryAccesskey: "C",
restoreLastSession: "Restore last session",
restoreLastSessionAccesskey: "s",
deleteUndoEntry: "Delete",
buttonMenu: "Button menu",
buttonMenuAccesskey: "m",
tabContextMenu: "Recently Closed Tabs",
tabContextMenuAccesskey: "y",
itemTip: "%ago ago, %date",
day: "d"
},
ru: {
restoreTab: "Восстановить последнюю закрытую вкладку",
restoreAllTabs: "Восстановить все вкладки",
restoreAllTabsAccesskey: "л",
clearTabsHistory: "Очистить историю закрытых вкладок",
clearTabsHistoryAccesskey: "д",
restoreAllWindows: "Восстановить все окна",
restoreAllWindowsAccesskey: "о",
clearWindowsHistory: "Очистить историю закрытых окон",
clearWindowsHistoryAccesskey: "н",
clearAllHistory: "Очистить всю историю",
clearAllHistoryAccesskey: "ч",
restoreLastSession: "Восстановить последнюю сессию",
restoreLastSessionAccesskey: "с",
deleteUndoEntry: "Удалить",
buttonMenu: "Меню кнопки",
buttonMenuAccesskey: "М",
tabContextMenu: "Недавно закрытые вкладки",
tabContextMenuAccesskey: "о",
itemTip: "%ago назад, %date",
day: "д"
}
};
var locale = (function() {
if("Services" in window && "locale" in Services) {
var locales = Services.locale.requestedLocales // Firefox 64+
|| Services.locale.getRequestedLocales && Services.locale.getRequestedLocales();
if(locales)
return locales[0];
}
var prefs = "Services" in window && Services.prefs
|| Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
function pref(name, type) {
return prefs.getPrefType(name) != prefs.PREF_INVALID ? prefs["get" + type + "Pref"](name) : undefined;
}
if(!pref("intl.locale.matchOS", "Bool")) { // Also see https://bugzilla.mozilla.org/show_bug.cgi?id=1414390
var locale = pref("general.useragent.locale", "Char");
if(locale && locale.substr(0, 9) != "chrome://")
return locale;
}
return Components.classes["@mozilla.org/chrome/chrome-registry;1"]
.getService(Components.interfaces.nsIXULChromeRegistry)
.getSelectedLocale("global");
})().match(/^[a-z]*/)[0];
_localize = function(sid) {
return strings[locale] && strings[locale][sid] || strings.en[sid] || sid;
};
return _localize.apply(this, arguments);
}
var JSON = "JSON" in window
? {
parse: function(arg) {
return typeof arg == "string"
? (JSON = window.JSON).parse(arg)
: (this.parse = function(obj) {
return obj;
}) && arg;
}
}
: "nsIJSON" in Components.interfaces
? {
parse: function(s) {
return Components.classes["@mozilla.org/dom/json;1"]
.createInstance(Components.interfaces.nsIJSON)
.decode(s);
}
}
: {
parse: function(s) {
return Components.utils.evalInSandbox("(" + s + ")", new Components.utils.Sandbox("about:blank"));
}
};
this.onclick = function(e) {
if(e.target != this)
return;
if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey))
this.undoCloseTabsList.clearAllLists();
else if(
e.button == 0
|| e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey
&& this.undoCloseTabsList.options.rightClickToUndoCloseTab
) {
if(
e.button == 0 && !this.undoCloseTabsList.options.useMenu
|| e.button == 2 && this.undoCloseTabsList.options.rightClickToUndoCloseTab
) {
if(this.undoCloseTabsList.closedTabCount)
this.undoCloseTabsList.undoCloseTab();
else
this.undoCloseTabsList.drawUndoList() && this.undoCloseTabsList.showMenu(e);
}
// Allow use "command" section only from hotkey:
e.preventDefault();
e.stopPropagation();
}
};
if(!this.hasOwnProperty("defaultContextId"))
this.defaultContextId = this.getAttribute("context") || "custombuttons-contextpopup";
this.onmousedown = function(e) {
if(e.target != this)
return;
if(this.undoCloseTabsList.options.useMenu) {
if(e.button == 0)
this.undoCloseTabsList.drawUndoList();
}
else if(e.button == 2) {
var showCbMenu = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || !this.undoCloseTabsList.drawUndoList();
this.setAttribute(
"context",
showCbMenu
? this.defaultContextId
: this.undoCloseTabsList.mpId
);
}
};
this.onmouseover = function(e) {
if(e.target != this)
return;
if(!this.disabled)
this.undoCloseTabsList.updUI();
this.undoCloseTabsList.options.useMenu && Array.prototype.some.call(
this.parentNode.getElementsByTagName("*"),
function(node) {
if(
node != this
&& node.namespaceURI == xulns
// See https://github.com/Infocatcher/Custom_Buttons/issues/28
//&& node.boxObject
//&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
&& "open" in node
&& node.open
&& node.getElementsByTagName("menupopup").length
&& this.undoCloseTabsList.drawUndoList()
) {
node.open = false;
this.open = true;
return true;
}
return false;
},
this
);
if(
this.undoCloseTabsList.options.openMenuOnMouseover
&& this.undoCloseTabsList.drawUndoList()
)
this.undoCloseTabsList.openMenu();
};
this.undoCloseTabsList = {
button: this,
options: options,
mpId: this.id + "-context",
cmId: this.id + "-contextSub",
tcmId: this.id + "-tabContextMenu",
tipId: this.id + "-tooltip",
errPrefix: "[Custom Buttons :: Undo Close Tabs List]: ",
get mp() {
var btn = this.button;
var mp = btn.getElementsByTagName("menupopup");
mp = mp.length && mp[0];
mp && mp.parentNode.removeChild(mp);
mp = this.createElement("menupopup", {
id: this.mpId,
onclick: "this.parentNode.undoCloseTabsList.checkForMiddleClick(event);",
onpopupshowing: "if(event.target == this) document.popupNode = this.parentNode;",
onpopuphidden: "if(event.target == this) document.popupNode = null;"
});
if(this.cm)
mp.setAttribute("context", this.cmId);
var tb = btn.parentNode;
if(
this.options.useMenu
&& tb.getAttribute("orient") == "vertical"
) {
// https://addons.mozilla.org/firefox/addon/vertical-toolbar/
var isRight = tb.parentNode.getAttribute("placement") == "right";
mp.setAttribute("position", isRight ? "start_before" : "end_before");
}
delete this.mp;
return this.mp = btn.appendChild(mp);
},
get useCentextMenu() {
delete this.useCentextMenu;
return this.useCentextMenu = this.options.allowDeleteEntries
&& ("forgetClosedTab" in this.ss || "forgetClosedWindow" in this.ss);
},
get cm() {
delete this.cm;
if(!this.useCentextMenu)
return this.cm = null;
var cm = document.getElementById(this.cmId);
cm && cm.parentNode.removeChild(cm);
cm = this.createElement("menupopup", {
id: this.cmId,
onpopupshowing: "return this.undoCloseTabsList.canDeleteUndoEntry(this.triggerNode || document.popupNode);"
});
var mi = this.createElement("menuitem", {
oncommand: "this.parentNode.undoCloseTabsList.deleteUndoEntry(this.parentNode.triggerNode || document.popupNode);",
label: _localize("deleteUndoEntry"),
closemenu: "single"
});
cm.appendChild(mi);
cm.undoCloseTabsList = this;
return this.cm = document.getElementById("mainPopupSet").appendChild(cm);
},
get cbMenu() {
var cbPopup = document.getElementById(this.button.defaultContextId);
if(!cbPopup) {
Components.utils.reportError(this.errPrefix + "cb menu not found");
return this.cbMenu = null;
}
cbPopup = cbPopup.cloneNode(true);
var id = "-" + this.button.id.match(/\d*$/)[0] + "-cloned";
cbPopup.id += id;
Array.prototype.slice.call(cbPopup.getElementsByAttribute("id", "*")).forEach(function(node) {
node.id += id;
});
var menu = this.createElement("menu", {
label: _localize("buttonMenu"),
accesskey: _localize("buttonMenuAccesskey")
});
menu.appendChild(cbPopup);
cbPopup.setAttribute(
"onpopupshowing",
'\
var btn = document.popupNode = this.parentNode.parentNode.parentNode\n\
.undoCloseTabsList.button;\n\
custombutton.setContextMenuVisibility(btn);'
);
delete this.cbMenu;
return this.cbMenu = menu;
},
get ss() {
delete this.ss;
return this.ss = "nsISessionStore" in Components.interfaces
? (
Components.classes["@mozilla.org/browser/sessionstore;1"]
|| Components.classes["@mozilla.org/suite/sessionstore;1"]
).getService(Components.interfaces.nsISessionStore)
: SessionStore; // Firefox 61+ https://bugzilla.mozilla.org/show_bug.cgi?id=1450559
},
get appInfo() {
delete this.appInfo;
return this.appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULAppInfo);
},
get appVersion() {
delete this.appVersion;
return this.appVersion = parseFloat(this.appInfo.version);
},
get platformVersion() {
delete this.platformVersion;
return this.platformVersion = parseFloat(this.appInfo.platformVersion);
},
get appName() {
delete this.appName;
return this.appName = this.appInfo.name;
},
init: function() {
window.addEventListener("TabClose", this, false);
window.addEventListener("SSTabRestoring", this, false);
window.addEventListener("unload", this, false);
if(this.appName == "SeaMonkey") // No SSTab* events in SeaMonkey
window.addEventListener("TabOpen", this, false);
setTimeout(function(_this) {
_this.mp.addEventListener("DOMMenuItemActive", _this, false);
_this.mp.addEventListener("DOMMenuItemInactive", _this, false);
_this.initTooltip();
}, 50, this);
this.addPbExitObserver(true);
this.updUIGlobal();
if(this.options.showInTabContextMenu) setTimeout(function(_this) {
_this.initTabContext();
}, 100, this);
},
initTabContext: function() {
var origMi = this.tabContextUndoClose;
if(!origMi) {
LOG("Can't find \"Undo Close Tab\" item in tab context menu");
return;
}
var menu = document.getElementById(this.tcmId);
menu && menu.parentNode.removeChild(menu); // For SeaMonkey
menu = this.createElement("menu", {
id: this.tcmId,
label: _localize("tabContextMenu"),
accesskey: _localize("tabContextMenuAccesskey"),
tooltip: this.tipId,
popupsinherittooltip: "true"
});
menu.undoCloseTabsList = this;
menu.onclick = function(e) {
if(e.target != this)
return;
if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey)) {
if(this.undoCloseTabsList.closedTabCount) {
this.undoCloseTabsList.undoCloseTab();
closeMenus(this);
}
}
};
var origMp = this.mp;
var mp = origMp.cloneNode(true);
mp.id = this.button.id + "-tabContext";
var _this = this;
function drawUndoList() {
var ok = false;
var opts = _this.options;
var origTemplate = opts.menuTemplate;
opts.menuTemplate = opts.menuTemplateTabContext || origTemplate;
_this.mp = mp;
try {
ok = _this.drawUndoList();
}
catch(e) {
Components.utils.reportError(e);
}
opts.menuTemplate = origTemplate;
_this.mp = origMp;
return ok;
}
function updMenu() {
if(drawUndoList())
menu.removeAttribute("disabled");
else
menu.setAttribute("disabled", "true");
}
mp._updatePopup = function(e) {
if(e.target != this)
return;
document.popupNode = _this.button;
drawUndoList();
};
mp.setAttribute("onpopupshowing", "this._updatePopup(event);");
mp.onclick = function(e) {
_this.checkForMiddleClick(e, updMenu);
};
menu.appendChild(mp);
addEventListener("popupshown", function(e) {
if(e.target == e.currentTarget)
setTimeout(updMenu, 0); // Pseudo async
}, false, origMi.parentNode);
addEventListener("DOMMenuItemActive", this, false, mp);
addEventListener("DOMMenuItemInactive", this, false, mp);
origMi.parentNode.insertBefore(menu, origMi.nextSibling);
origMi.setAttribute("hidden", "true");
},
initTooltip: function() {
var tip = document.getElementById(this.tipId);
tip && tip.parentNode.removeChild(tip);
tip = this.tip = this.createElement("tooltip", {
id: this.tipId,
orient: "vertical",
onpopupshowing: "return this.undoCloseTabsList.updTooltip(this, this.triggerNode || document.tooltipNode);",
onpopuphiding: "this.cancelUpdateTimer();"
});
tip.undoCloseTabsList = this;
tip._updateTimer = 0;
tip.initUpdateTimer = function(fn, context) {
if(this._updateTimer)
clearInterval(this._updateTimer);
this._updateTimer = setInterval(function() {
fn.call(context);
}, 1000);
};
tip.cancelUpdateTimer = function() {
if(this._updateTimer) {
clearInterval(this._updateTimer);
this._updateTimer = 0;
}
};
var btn = this.button;
btn.removeAttribute("tooltiptext");
btn.setAttribute("tooltip", this.tipId);
btn.setAttribute("popupsinherittooltip", "true");
document.getElementById("mainPopupSet").appendChild(tip);
if(this.appVersion >= 61 && "getAnonymousElementByAttribute" in document) {
var label = document.getAnonymousElementByAttribute(tip, "class", "tooltip-label");
label && label.remove();
}
},
_hasPbExitObserver: false,
addPbExitObserver: function(add) {
if(add == this._hasPbExitObserver || !("Services" in window))
return;
this._hasPbExitObserver = add;
if(add)
Services.obs.addObserver(this, "last-pb-context-exited", false);
else
Services.obs.removeObserver(this, "last-pb-context-exited");
},
destroy: function() {
window.removeEventListener("TabClose", this, false);
window.removeEventListener("SSTabRestoring", this, false);
window.removeEventListener("unload", this, false);
if(this.appName == "SeaMonkey")
window.removeEventListener("TabOpen", this, false);
this.mp.removeEventListener("DOMMenuItemActive", this, false);
this.mp.removeEventListener("DOMMenuItemInactive", this, false);
this.addPbExitObserver(false);
var menu = document.getElementById(this.tcmId);
if(menu) {
menu.parentNode.removeChild(menu);
this.tabContextUndoClose.removeAttribute("hidden");
}
var tip = this.tip;
tip && tip.parentNode && tip.parentNode.removeChild(tip);
},
handleEvent: function(e) {
switch(e.type) {
case "TabClose":
case "SSTabRestoring":
case "TabOpen":
setTimeout(function(_this) {
_this.updUI();
}, 0, this);
break;
case "DOMMenuItemActive":
case "DOMMenuItemInactive":
if(!("XULBrowserWindow" in window))
break;
XULBrowserWindow.setOverLink(
e.type == "DOMMenuItemActive"
? (e.target.getAttribute("cb_urlDecoded") || "")
.replace(/ \n/g, ", ")
: "",
null
);
break;
case "unload":
this.updUIGlobal();
this.destroy();
}
},
observe: function(subject, topic, data) {
if(topic == "last-pb-context-exited") {
setTimeout(function(_this) {
_this.updUI();
}, 25, this);
}
},
createElement: function(name, attrs) {
var node = document.createElementNS(xulns, name);
if(attrs) for(var attrName in attrs) if(attrs.hasOwnProperty(attrName))
node.setAttribute(attrName, attrs[attrName]);
return node;
},
get tabContextUndoClose() {
return document.getElementById("context_undoCloseTab")
|| document.getElementById("tabContextUndoCloseTab") // Firefox 2.0
|| document.getAnonymousElementByAttribute(gBrowser, "tbattr", "tabbrowser-undoclosetab"); // SeaMonkey
},
get closedWindowCount() {
if(!("getClosedWindowCount" in this.ss)) {
delete this.closedWindowCount;
return this.closedWindowCount = 0;
}
this.__defineGetter__("closedWindowCount", function() {
return this.ss.getClosedWindowCount();
});
return this.closedWindowCount;
},
get closedTabCount() {
return this.ss.getClosedTabCount(window);
},
undoCloseTab: function(i) {
if("undoCloseTab" in window) // Firefox 2.0+
undoCloseTab(i);
else // SeaMonkey
gBrowser.undoCloseTab(i);
},
clearUndoTabsList: function() {
var closedTabCount = this.closedTabCount;
if(!closedTabCount)
return;
if("forgetClosedTab" in this.ss) // Gecko 1.9.2+
while(closedTabCount--)
this.ss.forgetClosedTab(window, 0);
else {
// Doesn't work in SeaMonkey
const pName = "browser.sessionstore.max_tabs_undo";
let val = cbu.getPrefs(pName);
cbu.setPrefs(pName, 0);
cbu.setPrefs(pName, val);
}
this.updUIGlobal();
},
clearUndoWindowsList: function() {
var closedWindowCount = this.closedWindowCount;
if(!closedWindowCount)
return;
if("forgetClosedWindow" in this.ss) // Gecko 1.9.2+
while(closedWindowCount--)
this.ss.forgetClosedWindow(0);
else
this.ss.setWindowState(window, '{"windows":[{}],"_closedWindows":[]}', false);
this.updUIGlobal();
},
clearAllLists: function() {
this.clearUndoTabsList();
this.clearUndoWindowsList();
},
canDeleteUndoEntry: function(mi) {
switch(mi.getAttribute("cb_type")) {
case "tab": return "forgetClosedTab" in this.ss;
case "window": return "forgetClosedWindow" in this.ss;
}
return false;
},
deleteUndoEntry: function(mi) {
var i = +mi.getAttribute("cb_index");
if(mi.getAttribute("cb_type") == "window") {
this.ss.forgetClosedWindow(i);
this.updUIGlobal();
}
else {
this.ss.forgetClosedTab(window, i);
this.updUI();
}
this.drawUndoList();
},
showMenu: function(e, isContext, mp) {
var btn = this.button;
document.popupNode = btn.ownerDocument.popupNode = btn;
if(!mp)
mp = this.mp;
if("openPopupAtScreen" in mp)
mp.openPopupAtScreen(e.screenX, e.screenY, isContext);
else
mp.showPopup(btn, e.screenX, e.screenY, isContext ? "context" : "popup", null, null);
},
openMenu: function() {
var mp = this.mp;
if("openPopup" in mp)
mp.openPopup(this.button, "after_start");
else
mp.showPopup(this.button, -1, -1, "popup", "bottomleft", "topleft");
},
drawUndoList: function() {
var mp = this.mp;
var wc = this.closedWindowCount;
var tc = this.closedTabCount;
var ss = this.ss;
var canRestoreLastSession = "restoreLastSession" in ss && ss.canRestoreLastSession
if(!wc && !tc && !canRestoreLastSession) {
mp.textContent = "";
mp.hidePopup();
return false;
}
this._undoWindowItems = wc && JSON.parse(ss.getClosedWindowData());
this._undoTabItems = tc && JSON.parse(ss.getClosedTabData(window));
var df = document.createDocumentFragment();
this.options.menuTemplate.forEach(function(sid, indx, arr) {
switch(sid) {
case "closedWindows":
wc && this.addUndoWindowsList(df);
break;
case "restoreClosedWindows":
wc > this.options.hideRestoreAllForSingleEntry
&& df.appendChild(this.createElement("menuitem", {
label: _localize("restoreAllWindows"),
accesskey: _localize("restoreAllWindowsAccesskey"),
oncommand: "for(var i = 0; i < " + this._undoWindowItems.length + "; ++i) undoCloseWindow();"
}));
break;
case "clearClosedWindows":
wc && df.appendChild(this.createElement("menuitem", {
label: _localize("clearWindowsHistory"),
accesskey: _localize("clearWindowsHistoryAccesskey"),
oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoWindowsList();"
}));
break;
case "closedTabs":
tc && this.addUndoTabsList(df);
break;
case "restoreClosedTabs":
tc > this.options.hideRestoreAllForSingleEntry
&& df.appendChild(this.createElement("menuitem", {
label: _localize("restoreAllTabs"),
accesskey: _localize("restoreAllTabsAccesskey"),
oncommand: "for(var i = 0; i < " + this._undoTabItems.length + "; ++i) this.parentNode.parentNode.undoCloseTabsList.undoCloseTab();"
}));
break;
case "clearClosedTabs":
tc && df.appendChild(this.createElement("menuitem", {
label: _localize("clearTabsHistory"),
accesskey: _localize("clearTabsHistoryAccesskey"),
oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoTabsList();"
}));
break;
case "clearAll":
(
wc && tc
|| wc && arr.indexOf("clearClosedWindows") == -1
|| tc && arr.indexOf("clearClosedTabs") == -1
)
&& df.appendChild(this.createElement("menuitem", {
label: _localize("clearAllHistory"),
accesskey: _localize("clearAllHistoryAccesskey"),
oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearAllLists();"
}));
break;
case "restoreLastSession": // Gecko 2.0+
canRestoreLastSession && df.appendChild(this.createElement("menuitem", {
label: _localize("restoreLastSession"),
accesskey: _localize("restoreLastSessionAccesskey"),
oncommand: "this.parentNode.parentNode.undoCloseTabsList.ss.restoreLastSession();"
}));
break;
case "buttonMenu":
let cbMenu = this.cbMenu;
if(cbMenu)
df.appendChild(cbMenu);
break;
case "separator":
if(df.hasChildNodes() && df.lastChild.localName != "menuseparator")
df.appendChild(document.createElementNS(xulns, "menuseparator"));
break;
default:
Components.utils.reportError(this.errPrefix + 'Invalid template entry: "' + sid + '"');
}
}, this);
while(df.hasChildNodes() && df.lastChild.localName == "menuseparator")
df.removeChild(df.lastChild);
this._undoWindowItems = this._undoTabItems = null;
mp.textContent = "";
if(!df.hasChildNodes()) {
mp.hidePopup();
return false;
}
mp.appendChild(df);
return true;
},
addUndoWindowsList: function(undoPopup) {
// Based on code from chrome://browser/content/browser.js
// Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre
var keys = this.options.accesskeys.closedWindows;
this._undoWindowItems.forEach(function(undoItem, i) {
var tabs = undoItem.tabs;
var [key, keyPrefix] = this.getKey(keys, i);
var title = undoItem.title;
var selected = undoItem.selected;
var selectedTab = tabs[selected && selected - 1];
var urls = [];
tabs.forEach(function(tab) {
if(!tab.entries || !tab.entries.length) // Can be [] for about:blank
return;
var url = this.convertURI(tab.entries[tab.index - 1].url, 120);
var selectedPrefix = tab == selectedTab && tabs.length > 1
? this.options.windowSelectedTabPrefix
: "";
urls.push(selectedPrefix + url);
}, this);
var url = urls.join(" \n");
var mi = this.createElement("menuitem", {
label: keyPrefix + this.options.windowItemTemplate
.replace("%title", title)
.replace("%count", tabs.length),
accesskey: key,
"class": "menuitem-iconic bookmark-item menuitem-with-favicon",
oncommand: "undoCloseWindow(" + i + ");",
cb_url: url,
cb_urlDecoded: this.convertURI(url),
cb_closedAt: undoItem.closedAt || 0,
cb_index: i,
cb_type: "window"
});
if(this.cm)
mi.setAttribute("context", this.cmId);
var icon = selectedTab.image || selectedTab.attributes && selectedTab.attributes.image;
if(icon)
mi.setAttribute("image", this.cachedIcon(icon));
if(i == 0)
mi.setAttribute("key", "key_undoCloseWindow");
undoPopup.appendChild(mi);
}, this);
},
addUndoTabsList: function(undoPopup) {
// Based on code from chrome://browser/content/browser.js
// Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre
var keys = this.options.accesskeys.closedTabs;
this._undoTabItems.forEach(function(undoItem, i) {
var state = undoItem.state;
var [key, keyPrefix] = this.getKey(keys, i);
var title = undoItem.title;
var url = state && state.entries && state.entries[state.index - 1].url || "";
var mi = this.createElement("menuitem", {
label: keyPrefix + title,
accesskey: key,
class: "menuitem-iconic bookmark-item menuitem-with-favicon",
oncommand: "this.parentNode.parentNode.undoCloseTabsList.undoCloseTab(" + i + ");",
cb_url: url,
cb_urlDecoded: this.convertURI(url),
cb_closedAt: undoItem.closedAt || 0,
cb_index: i,
cb_type: "tab"
});
if(
state
&& "attributes" in state
&& "privateTab-isPrivate" in state.attributes
) // https://addons.mozilla.org/addon/private-tab/
mi.setAttribute("privateTab-isPrivate", "true");
if(this.cm)
mi.setAttribute("context", this.cmId);
var image = undoItem.image // Firefox
|| state && state.attributes && state.attributes.image // SeaMonkey
|| state && state.xultab
&& /(?:^| )image=(\S+)/.test(state.xultab)
&& decodeURI(RegExp.$1); // Only Firefox 2.0 ?
if(image)
mi.setAttribute("image", this.cachedIcon(image));
if(i == 0)
mi.setAttribute("key", "key_undoCloseTab");
undoPopup.appendChild(mi);
}, this);
},
getKey: function(keys, i) {
var key = keys && keys.charAt(i % keys.length);
var keyPrefix = keys && (key + this.options.accesskeySeparator);
return [key, keyPrefix];
},
checkForMiddleClick: function(e, upd) {
var mi = e.target;
if(
"doCommand" in mi
&& e.button == 1
&& mi.parentNode == e.currentTarget
) {
mi.doCommand();
if(upd)
upd();
else
this.drawUndoList();
}
},
crop: function(s, crop) {
if(crop == undefined)
crop = 500;
if(s.length <= crop)
return s;
var start = Math.round(crop*0.6);
return s.substr(0, start) + "…" + s.substr(start - crop);
},
convertURI: function(uri, crop) {
if(!uri || uri.indexOf("\n") != -1)
return uri;
uri = this.losslessDecodeURI(uri);
return this.crop(uri, crop);
},
losslessDecodeURI: function(uri) {
if(uri) try {
return this._losslessDecodeURI(uri);
}
catch(e) {
Components.utils.reportError(e);
}
return uri;
},
get _losslessDecodeURI() {
var ldu;
if("losslessDecodeURI" in window)
ldu = losslessDecodeURI;
else if("UrlbarInput" in window) // Firefox 75+
ldu = Components.utils.import("resource:///modules/UrlbarInput.jsm", {}).losslessDecodeURI;
delete this._losslessDecodeURI;
return this._losslessDecodeURI = ldu
? function(uri) {
return ldu(makeURI(uri));
}
: decodeURI;
},
cachedIcon: function(src) {
src = src.replace(/[&#]-moz-resolution=\d+,\d+$/, ""); // Firefox 22+
if(
!/^https?.test(src)
// IDN, see https://bugzilla.mozilla.org/show_bug.cgi?id=311045
|| /^https?:\/\/[^.:\/]+\.[^a-z0-9-]+(?:\/|$)/.test(src) && this.platformVersion < 46
|| this.appName == "SeaMonkey" && this.appVersion <= 2
|| this.appName == "Firefox" && this.appVersion <= 3.5
)
return src;
return "moz-anno:favicon:" + src; // https://bugzilla.mozilla.org/show_bug.cgi?id=467828
},
updUI: function() {
var tabsCount = this.closedTabCount;
var dis = !tabsCount && !this.closedWindowCount;
if(
dis
&& this.options.useMenu
&& this.options.menuTemplate.indexOf("restoreLastSession") != -1
&& "restoreLastSession" in this.ss && this.ss.canRestoreLastSession
)
dis = false;
this.button.disabled = dis;
},
updTooltip: function(tip, tn) {
var template, header, title, url, closedAt;
if(tn == this.button) {
template = this.options.buttonTipTemplate;
header = _localize("restoreTab");
let undoTabItems = JSON.parse(this.ss.getClosedTabData(window));
if(undoTabItems.length) {
let lastItem = undoTabItems[0];
title = lastItem.title;
url = lastItem.state && lastItem.state.entries
&& lastItem.state.entries[lastItem.state.index - 1].url;
closedAt = lastItem.closedAt || 0;
}
}
else if(tn.hasAttribute("cb_index")) {
template = this.options.itemTipTemplate;
title = tn.getAttribute("label");
url = tn.getAttribute("cb_url");
closedAt = +tn.getAttribute("cb_closedAt");
}
else {
return false;
}
var tipData = this.getTooltipData(template, header, title, url, closedAt);
tip.textContent = "";
tip.appendChild(tipData);
if(closedAt && template.indexOf("closedAt") != -1) {
tip.initUpdateTimer(function() {
var tipData = this.getTooltipData(template, header, title, url, closedAt);
if(tipData.textContent != tip.textContent) {
tip.textContent = "";
tip.appendChild(tipData);
}
}, this);
}
return tip.hasChildNodes();
},
getTooltipData: function(template, header, title, url, closedAt) {
var df = document.createDocumentFragment();
var hasHeader = header && template.indexOf("header") != -1;
function item(key, val) {
var lbl = document.createElementNS(xulns, "label");
lbl.className = "cb-" + key + " tooltip-label";
lbl.textContent = val;
lbl.setAttribute("maxwidth", "450"); // Trick to restore right border for long lines
if(key == "closedAt" || hasHeader && key != "header")
lbl.style.color = "grayText";
return df.appendChild(lbl);
}
template.forEach(function(key) {
switch(key) {
case "header":
if(header)
item(key, header);
break;
case "title":
if(title && title != url)
item(key, title);
break;
case "url":
if(url)
item(key, this.convertURI(url));
break;
case "closedAt":
if(!closedAt)
break;
let dt = Math.round(Math.max(0, Date.now() - closedAt)/1000);
let days = Math.floor(dt/24/3600);
dt -= days*24*3600;
let d = new Date((dt + new Date(dt).getTimezoneOffset()*60)*1000);
let m = d.getMinutes();
let ts = d.getHours() + ":" + (m > 9 ? m : "0" + m);
if(days)
ts = days + _localize("day") + " " + ts;
let tsTip = _localize("itemTip")
.replace("%ago", ts)
.replace("%date", new Date(closedAt).toLocaleString());
item(key, tsTip);
}
}, this);
return df;
},
get wm() {
delete this.wm;
return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
},
updUIGlobal: function() {
var isSeaMonkey = this.appName == "SeaMonkey";
var ws = this.wm.getEnumerator(isSeaMonkey ? null : "navigator:browser");
const id = this.button.id;
while(ws.hasMoreElements()) {
let win = ws.getNext();
if(isSeaMonkey && !this.isBrowserWindow(win))
continue;
let btn = win.document.getElementById(id);
if(btn && "undoCloseTabsList" in btn) {
let ucl = btn.undoCloseTabsList;
ucl.ensureSessionsInitialized(ucl.updUI, ucl);
}
}
},
isBrowserWindow: function(win) {
var loc = window.location.href;
return loc == "chrome://browser/content/browser.xul"
|| loc == "chrome://navigator/content/navigator.xul";
},
ensureSessionsInitialized: function(callback, context) {
var _this = this;
var stopTime = Date.now() + 3e3;
(function ensureInitialized() {
try {
_this.ss.getClosedTabCount(window);
callback.call(context);
return;
}
catch(e) {
if(Date.now() > stopTime) {
Components.utils.reportError(
_this.errPrefix
+ "Can't initialize: nsISessionStore.getClosedTabCount() failed"
);
Components.utils.reportError(e);
return;
}
}
setTimeout(ensureInitialized, 50);
})();
}
};
if(!this.undoCloseTabsList.options.useMenu && this.undoCloseTabsList.useCentextMenu) {
this.oncontextmenu = function(e) {
if(
e.target != this
|| e.ctrlKey || e.shiftKey || e.altKey || e.metaKey
|| !this.undoCloseTabsList.mp.hasChildNodes()
)
return;
e.preventDefault();
this.undoCloseTabsList.showMenu(e); // Show menu without "context" flag
};
}
if(this.undoCloseTabsList.options.rightClickToUndoCloseTab) {
this.oncontextmenu = function(e) {
if(e.target == this && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)
e.preventDefault();
};
}
this.disabled = true;
setTimeout(function(_this) {
_this.undoCloseTabsList.init();
}, 0, this);
//===================
// Styles
// Used icons from Undo Closed Tabs Button extension
// Styles can't override hardcoded icon
/*
if( // Remove icon only if nsIStyleSheetService works on-the-fly (Firefox 3.0+)
!Components.ID("{41d979dc-ea03-4235-86ff-1e3c090c5630}")
.equals(Components.interfaces.nsIStyleSheetService)
) {
let icon = this.icon
|| this.ownerDocument.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon");
if(icon)
icon.src = "";
else
this.image = "";
}
*/
var cssStr = '\
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
@-moz-document url("%windowURL%") {\n\
%button% {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAEEUlEQVRIS9XVbWxTVRgA4Pfce3tv27t2bbNuXbfCBuyzAZ2MEdkkLH5gJvEH8TOZEo0JFdgmbgjTgEHUGQXGMJEMmDJMiNvQjS9BJhH8MY3IfsB0rnTraCcbm13b2+/1fni2xAVuxOHAH57+adNz3uee9z3vuQj+44FmG79VksglAIoMgBhCSLpdnFkBkiQxl2OQgRdbJhjoKkQofM+ALklSGSNwf1iAjbXNZ3MdI+MB+7vPF989IEnoZwBVQhCWBgVhW13b+WX5KXpFR7fDe/ntZ8wYiONUiXLojlKEU4LGANgRDpZHBH7r9iPnilZaM4jKFTlQ/P5XvHV+6o5si7HzuWUL+hzngSstRfxf0DSwa9cHa3GgWgmQTv4UNMMggyWTMuYtYepOXCKfKMiGZ4tyQEMDjPrDcGVoDI780As3/AGhJIVs2vTk6pqkJAhOFn8KaG1tpV1u53h5+RpGr7s1/uTxCIgk6g/EiaqmM2i5NRseL7SCgwMg8Wo9A5CsBLjPADDki8CbbRdgQiI631n/2NOFANwUUF9frxPECVf1628gn893Sx55IIhxBavcffIi1fO7H15atRJiAoD8XBI4UmYCwOIkCdY3fyuyrGrHZ+UldXJAwoDn5hThQESYpNXXQpJuw4HTiuzM+fBAfu7UFIQ/0wN/nfydrEKwSCdARfMZftVSa6kcEPx+v0NeA7wlKowYXX+AT604+DWTmT4XcufhFsN6r9MJ/gAHiVotpBmNoNNoIctAw8Xf7FKMjx2TA7zX6/3p7860SBCKEGJSBrj4PIyozMkm0KhZsDv7hTUP5Xt+HfFpuvqGVBZTKizEuOePEYiL0V/kQJzjuG9u1zS8RDAhRFv6/FFr5YFTaopicJGRt932yDmJQLQ3JpY9+lEHVZCTB6PecTAmEMNyIIZr8MU/3U8iSSo5RGfZPZGFFftPaU0a9dgxW+mXBEGQtJJ5xbq1hUo3mdENzxjYyoq65UAUA5/MdAGKiFQHSGbB1WEPDZGIq3COYRQD1I/XPJttn39PKRlWYpUgfvraU2/JgXAwGHxvRkAUEd6JAteYJAUhioNLwaigLN1z8sNQLA5mQyK//YWHr8zRaV9EjY2NikDAuwkQ2oL7IIRH9UzATf9PPuBUS4gIKY92u/Zf5zhixaKsAa1BXzOhhrNoz96d21JNaavT0tO9xQ+W5GDg5X8BTE/lCSIBUcqW3kGX3XW1Jz7sdtVXrn31EGpo2Nm0bl1VHt7maTw7Eo1GL8wGwPcOiRSKMpIgUpzOAd2JjqOdNTW1B1HDx7ttlRs2mnCDHZ5NYPkalmXnut3uxe3tbZeqqzd/h/bt21tgs1WocYP13AtAr9cnDg4Omo8fb7leVbXFdUfvg7uB///An8idyhRIYoVPAAAAAElFTkSuQmCC") !important;\n\
}\n\
%button%:hover {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAECUlEQVRIS9XVe2xTVRgA8O/ce3tv310fa8P6AOoapwznYtXFzchQJNEYNTHEODSaYLK4jsEaGcQnEpAQu8r+WLJMMmOMIQXnNgeKYTJjfBGzMEGTztVubcGmD9q1t+263t7r2Qxka8DhwD88//SP2/P97vd95zsXwX+80ErjC4JAjE4BvWEN5BFCwvXirAjAwWkfgIVjwczK4Sc7QtlbBpwRBLG+ADVcDnbu+fjUHZMX4+mJA00NNw8IAvoZQKIEsLOp4pv7PaMP2jRKanjclzi/99kKDBSuVaobKhEuCYoCyKIZaMjOcW+89clIXe1qA9H80Hp4uqu/UGszvlNl1J/eVF/pjY9CurERcVcyugq4XAdf5gXowP2SL00XAUkzSGteSxuq7LIDw2Miu9UET9y7DhgSwHcpAhN/RuHrC34QeJ57wED17nryqQ6dDtj5jBYAj8dDB4L+WNNzz0uUStWS+PPHI4so5EtzRNuRL9Hday1QX22D6RkOSLxbShGgZAgwKSiYjsTgo2/GQCGTfbXP8egWO0BqAXC73WVFfi7gbN+Fkskkv1jggCAui2Ri1/BZ6pfpGGy+7x7IFnjA2f69rvziSDopBUY5Cd1ffMtXmfX7+rY2vFsKCBiILwbwfiJL0tIpVihz9J4UlWvL4TaTaWnwRZaMJkFOzMFnP5zjmhprG0uB4szMzGTpkcMImQFG7csUV7X2nmA0ZRow6w2Amw/BSARmZ3MgFotBi8srk0iAERHweygkVBoUg6UAl0gkzl7rTPMEIcogxuBPcVbHByckKrkKJIwYwtFw8cUN1bFfLyaU33uDEp1KDQatDkLRCNy+SnGhFCikUqlT1xsaTiCYDKLNE+n8ndt7Tkp5QKhcKkoMtTwyUgREx7LcY5tdg5TNtBoSbBos5ZJLpUAe9+DoP91PHEmKWUTbJpP59Y7uIYVBKY0NNm/8lCAIkqBE22re9lB6rR7FUwl45fH7x0qBWQx0L3cB8oiUpkmm0h9JiIRsNlBrUkcxQI14w7udx34kxIwE9wLxfW3P7CkFsizL7l8W4HnEk6RovvlksTiLgwvJXEG6sXP4YJ4rQoVGxe3d+vC41ax8AfX09IhS7OXXEBDteA4yeDmXAxY9n3/BhUnApvjoOX9vPJODhnXWKbVWsyMlhdOo8/1Dr1tMa7YYjRWpurp6KwZe+hfA1b/iAyAHmvZ4g0Ff0PtbLhzwH25pbulDne5DPa2OnXfhNAeLON1CofDdSgB875Akw2zCKZn8f0xKhz4fGH21veMIch9+b9uO7U4LHrAPVxK4dI9MJrMGAoHqgYHj405nxxnU1eWqaW1tV+ABO38rALVaXRYK+Q39/Z5wW9vuwA19D24G/v8DfwHJNM8naEZRUgAAAABJRU5ErkJggg==") !important;\n\
}\n\
%button%[disabled="true"] {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADCklEQVRIS9WVz0sbQRTHZ3Y32awxYkOIMaQQjBJ026zVVLCeCpX2H2jpqaceSjGnUpBcKj0IpVA81UtLT4VCoYdepJcapBYKGjfNbwNqTGJsbGKi5pdmd/s2tEVCjBrroQMLw8x77/Pem+/MYnTOA59zfHQmwPj4+AWCIG5OTk6+OyrRpgFOp7MTgn6pVCpdLS0t9MTExH49SFMACNaFMZ7v6enRRSKRiiRJnbCWbQgAI8LjWbyBMaFtdC7r67GLwWD4CQRnLBYL4XK5yoIgbKpUqkB7e9u3oSHrlMViz/2J8bcCnl/8TJCUmVJQW0cB0ls/W91u3gqDNBqNVTNoEcrlcmhnZwdtJDdEiqSEUql0zeFwLMj7VYDf728t7xdTV/oHFeBQrAdIJpPkzMwMA5ljnU5XNwfoAgI7tLKyUhJF0T42NuavApaWltolJEQBQGWz2Xw971gsRvM8r+nr68NKpbKhulOplBSNRldBYWwtgNze3o4d5b28vKxdW1vTQRWEQqFoCIEqCtC26VoAARV4GnkCxJRIJExms5mEgeLxuJDP5wmKokSNRkNotVosw/f29hDYLdQCMABcx91ukKYV2mAxGAykDBgZGflUKBQYCHoVMlebTCYMypLh8VoA2t3d/XAcQN4Ph8P2TCbTC1NxeHj4rbwGFYzOuma1jIphoCKUTqdjtQAJAK9PApBtoF3Xi8WimeO4N78Bt+fm5vRqtZqGivIHBwePawEiaPr5SQFVncPNBHmK8hza4giFQx0KSlGB4D/0en13LUAAgPM0gMO2cKhTcA40yNMN79Moy7IZ7PV6OyrC/iuMkZ2zDSgB8KBZADwXz4KhgIAkKQECe2SzDS5ij8c9beg03tK0tpUZhtHANb93BsAU+KvyhXwlHl+f7+cG7uPvPv7FZZazQv9eQi+Fcrm82SyApmk9nIkK/B8GAr6vNlv/U+wL+O6yvawR1PC+2cCH/QBAwlNyJxTyhViW+4gjEa+lu/sSA0ar/wIgCwu+rmAwmIN3K9rUD+c0ifz/gF/LJ4uAUJQHTwAAAABJRU5ErkJggg==") !important;\n\
}\n\
toolbar[iconsize="small"] %button% {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPElEQVQ4T2NkIBL8//+fEQj+oytnJEY/UDPXzPOPTdINZQ+jG0LQgPvv/wvsvf9k54FzN432X39S9rQ3oR/ZUrgBvb29akxMf7mQJcWVNYTeCWvOfvrijVK9nymDRevqKwqsfxdYiLDNqUgP+whSCzZg4sS+dkYmxlx2NrYfMAM4efiYXonr8Z27/4q52NeGQZiLlYGd4Q/D9iuPGDafu/3/zZevvocrwraCDZgwoWd/QECwtbi4xD8QHxRS178xsPq2LmfKC/FlEBAUYfgDFORlZWCQ52FgUOP5zVCz9sjfiw/eKMENCAwMMeXl5XsMc8FPJhbOjv235A5fe8zoZWvLwMTIxPD45UsGPm5uBiVxQQZN7u8MnVtPXUN2gbGAgOAJpDBg/MrIKtCy/bLRsVtPmXi4uBj+/fn2+9vPvyycHJyMLgZaDAcvXPoFN8A/IMhIUEBoLUoIA+Ps4382qfotZ112nL3JVOyieyjdQYfXuGWtgbCgCOOnzx//IrvAgJ9fYDKWdMH4mYlduX/HOa0AHamD3Jyc5v5TtptzsrMzeBmrXWKcNGkS399/Pw8GBoTIA71QgSNhwaL7/9zjdzN6d10wdDdR/5XrbWbNOHvOjA18fHwmTo6ubECQQChlcnBzR5y9/yT4wcVTb1+/fW7DuGjR3EXR0QlfgMn16N+/fy8TMoCJiUkCiK0PHNqvduXSuTrGNWtWugcHh737+PHjHUKaYfL8/Pyip04dV7tw4dBhgnmBkKEUGwAAgK/XtUYSNDQAAAAASUVORK5CYII=") !important;\n\
}\n\
toolbar[iconsize="small"] %button%:hover {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRElEQVQ4T2NkIBr8Z2RgYPyPrhwoSBj8//+fbfXt11phqqIXGRhRDSFoAFAzz8KLzzdvP3nZ+titFwWPe+OnIVsJN6BnSo88ww8GTmRJBRUV/jeSuvOOXL6nVeJuxBA3Z+cZWfY/M0x1BZc3+Pp+A6kFGzBxYm8T0GnFrKwsP2AGsHPyMH2RNebdfukxc6KLOYMAFzvDq3fvGC49fMFw+dGL/z9+/nQ7UBm+B2zAhIk9+3x9A2ylJKX/gfigkLr9jZHVt305Y4i9JQMbJy/Dn3//GbhZmRiEuVgYWP9+ZVh19MLfHz9/y0MMmNCz39cvwEJQQOgBzAU/mdg4m3dflTty7TGjkYYm2KmvP3xg4OLgYBDm42H48/09w/UnLy8hG2AuLCRyFCkMGL8ysAo0brtoeOzmEyZ2NjYGFsY/v7///sfCzMTCKCEiyvDo+dNfcAP8/AJNhYSEV6GEMCMj0BA2yaqNZ1x3nr/FlO+kfSTbSY/bqHmtAQ8PH+OPH9/+ohggKCjUhyVVMH5hYlfs3XFeO1BH8hAHB4d50NTt5pzs7AyuhioXGWfO7OD/9p35EDAQFcVExYuxJat///6BLWJiYvo/59jtjN5dF418zDV/ZbpZWDDOnTtzI7+AoLGDvSM3KytbFKF0ycHNHXnx/tPgW+dPvnn99qk948LF8+bFRMV/Aqa4Y9+/f79G0AAODjGgUywOHdivefHipUbGVetWOYUGhr778OEDPAoJGSIgICB87Ngh5bNnL54gmBcIGUaxAQAqY9puYCzN/wAAAABJRU5ErkJggg==") !important;\n\
}\n\
toolbar[iconsize="small"] %button%[disabled="true"] {\n\
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB70lEQVQ4T2NkoBAwEqu/vLzcjpOT81pDQ8MbZD1EGVBZWZn579+/qUxMTBXt7e1dGAbcv3+f4/2n9z6M//7zoLvo7NlzXh8+fPQTFxdnfwEEvPy8R+RlpWd4evruBakFu+DCpfNLONg4/NjZ2X4jG3D16jWup0+fsRsZGTGysLAwvH79muH9+/cMQHMY2NjY8jMzMyfBDNivrKhs+f8/wy+YAb9+/WJcs2YNj66uLgMvLy+Kw75//85w6dKl74yMjNZwAxQVlEz//f13D1nlgwcPBG/evCmloqLCBFQMth1oMwMfHx/Dx48f/z99+vQssgHGDP8ZjqCHwd27d+UfP36szs7ODvLGO2BAcgNdwCEhIcH46NGjt8gGGP3/938VtmgFBrIB0N8mcnJyB1VVVbkOHjxgzMnJxfT169cnCAPklQyApk/AlS6ePXumJSQk9ACoxuHKlStmQPonUG0e4+XLl8X//v29V0lJWQoYKaWEEtaXL1/SgX43AQbJWhMT01DGq9ev7ODm4tKWEJdi+/PnTxwhA4CpMfz161e+79+/e/f7919Pxtu3b85RUlJ5+////8PAwLlPyAAODg5BoPONXr16YfDmzbtWxseP79vLyCgAY+j9Q0KaYfJAVwgCA1DpzZs3p4nKC/gMptgAAO1G2FJifkXnAAAAAElFTkSuQmCC") !important;\n\
}\n\
}'
.replace(/%windowURL%/g, window.location.href)
.replace(/%button%/g, "#" + this.id);
var cssURI = this.cssURI = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
var sss = this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
.getService(Components.interfaces.nsIStyleSheetService);
if(!sss.sheetRegistered(cssURI, sss.USER_SHEET))
sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);
this.onDestroy = function(reason) {
this.undoCloseTabsList.destroy();
if(reason == "destructor") // May happens before "unload"
this.undoCloseTabsList.updUIGlobal();
if(reason == "update" || reason == "delete") {
let sss = this.sss;
let cssURI = this.cssURI;
if(sss.sheetRegistered(cssURI, sss.USER_SHEET))
sss.unregisterSheet(cssURI, sss.USER_SHEET);
}
};
if(this.undoCloseTabsList.options.useMenu) {
this.type = "menu";
this.orient = "horizontal";
}
Отсутствует
в 115 перестала работать кнопка Undo Close Tab
И кнопка Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019
// всплывающая подсказка ....
var favicon = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png";
Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
.showAlertNotification(favicon, "Добавил в папку " + folderTitle + ":", docTitle);
setTimeout(()=> { document.getElementById("bookmarksMenuPopup").hidePopup() }, 50);
});
Отсутствует
vending_machine у меня такой код
// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. ............................................................. addEventListener("dblclick", async e => { if (e.button) return; var trg = e.target, node = trg._placesNode || trg._placesView?._resultNode; if (!node || !PlacesUtils.nodeIsFolder(node)) return; var parentGuid = PlacesUtils.getConcreteItemGuid(node); try { await PlacesTransactions.NewBookmark({ //index: 0, parentGuid, url: gBrowser.currentURI.spec, title: gBrowser.selectedTab.label.substr(3, 50) }).transact(); var msg = `Добавил в папку ${ PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title}) }:`; var popupIconURL = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png" } catch(ex) { msg = "ERROR! " + ex.message; popupIconURL = "chrome://global/skin/icons/warning.svg"; } var n = PopupNotifications.show( gBrowser.selectedBrowser, "PDES-popup", msg, null, null, null, {popupIconURL, hideClose: true} ); setTimeout(() => n.remove(), 2e3); });
Отсутствует
vending_machine у меня такой код
скрытый текстВыделить кодКод:
// Двойным левым кликом на папке закладок добавлять закладку в папку закладок, от 06.06.2019. ............................................................. addEventListener("dblclick", async e => { if (e.button) return; var trg = e.target, node = trg._placesNode || trg._placesView?._resultNode; if (!node || !PlacesUtils.nodeIsFolder(node)) return; var parentGuid = PlacesUtils.getConcreteItemGuid(node); try { await PlacesTransactions.NewBookmark({ //index: 0, parentGuid, url: gBrowser.currentURI.spec, title: gBrowser.selectedTab.label.substr(3, 50) }).transact(); var msg = `Добавил в папку ${ PlacesUtils.bookmarks.getLocalizedTitle({guid: parentGuid, title: node.title}) }:`; var popupIconURL = gBrowser.selectedTab.image || "chrome://global/skin/icons/Portrait.png" } catch(ex) { msg = "ERROR! " + ex.message; popupIconURL = "chrome://global/skin/icons/warning.svg"; } var n = PopupNotifications.show( gBrowser.selectedBrowser, "PDES-popup", msg, null, null, null, {popupIconURL, hideClose: true} ); setTimeout(() => n.remove(), 2e3); });
Да, этот работает, спасибо
Отсутствует
А так ли они нужны эти точки?
Каждому своё...
#tabbrowser-tabs .tab-label-container[textoverflow][labeldirection="ltr"]:not([pinned]) {
mask-image: none !important; /* !!! del.fadein */
}
В таком виде не работает
На форуме
Не работает у вас, у меня работает и на чистом профиле работает. Делайте выводы.
Да, сделал - стили лучше подключать через userChrome.css
Через UCF непонятным образом что-то работает, что-то нет, ну да ладно
Прошу прощение за оффтоп
На форуме
Viatcheslav
Я сам через ucf подключаю только то, что не работает в userChrome, т.е. требует особых прав. Так себе обоснование, но как пример - скрытие вкладок через скрипт ucf (не стиль напрямую, а скрипт запускающий стиль) происходит с задержкой, т.е. окно запускается с вкладками, а потом (через долю секунды) они исчезают, скрытие вкладок через userChrome вообще вкладки не отображает при запуске.
Отсутствует
Dumby спасибо, еще вопрос, посмотришь Инспектор DOM под 115
Отсутствует
Dumby все работает, спасибо
Отсутствует
Отсутствует
Dumby еще вопрос есть кнопка
// Показывать количество открытых табов , от 10.05.2019. ................................ (function () { self.onclick = function(e) { if ( e.button == 0 ) return PanelUI.showSubView('allTabsMenu-allTabsView', this); }; // Стиль для счётчика и меню .... var uri = makeURI('data:text/css,'+ encodeURIComponent('\ %button% { -moz-appearance: none !important; border: 0 !important; margin-right: -4px !important; }\ %button% {color: #4800FF !important;}\ %button% .toolbarbutton-icon {width: -0px !important;}\ %button% .toolbarbutton-text {\ display: flex !important; margin-left: -8px !important; color: #4800FF !important; font-weight: bold !important;\ }\ %button% {\ flex-direction: row !important;\ }\ '.replace(/%button%/g, "#" + _id) )); const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); addDestructor(function() { sss.unregisterSheet(uri, sss.AGENT_SHEET) }); // Считать и показывать количество вкладок .... function count() { try { window.clearTimeout( tabTimeout ) } catch(e) {}; tabTimeout = window.setTimeout(function() { self.label = (gBrowser.selectedTab._tPos + 1) + '/' + gBrowser.visibleTabs.length; }, 50 ); }; count(); // Отслеживать открытие, закрытие вкладок и переключение групп вкладок .... var tabs = gBrowser.tabContainer; addEventListener("TabOpen", count, false, tabs ); addEventListener("TabClose", count, false, tabs ); addEventListener("TabSelect", count, false, tabs); function getChangeTabGroup() { addEventListener("TabHide", function c(e) { count(); setTimeout(function() { getChangeTabGroup() }, 50 ) removeEventListener( e.type, c, false, tabs ); }, false, tabs ); }; getChangeTabGroup(); })()
Отредактировано Andrey_Krropotkin (07-07-2023 13:13:02)
Отсутствует
Что он делает - Инспектор DOM? Есть attributes-inspector, но он некоторые бордюры не видит. DOM для таких случаев подойдет, или нет? Если не трудно, можете дать ссылку на настройку конфига. Так бы сам проверил.
Отредактировано b0ttle (07-07-2023 17:05:48)
Отсутствует
Есть attributes-inspector, но он некоторые бордюры не видит.
Так он и не обновлялся уже сколько. Мод
data:text/html;charset=utf-8,<!DOCTYPE html>%0A<html><head>%0A%09<title>Attributes Inspector (mod)</title>%0A%09<meta http-equiv="Content-Type" content="text/html; charset=utf-8">%0A%0A%09<script type="module">%0A%0A%09%09var url = "data:application/octet-stream;base64,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";%0A%0A%09%09var response = await fetch(url);%0A%09%09var stream = response.body.pipeThrough(new DecompressionStream("gzip"));%0A%09%09pre.append(await new Response(stream).text());%0A%0A%09</script>%0A%0A</head><body><pre id="pre"></pre></body></html>
Отсутствует