Garalf
Норм. Благодарю. Тут еще упал скрипт
(async sep => { if (!sep) return; var key = "hasRemoveTransaction"; var g = Cu.import("resource://gre/modules/PlacesTransactions.jsm", {}); /* if (!g[key]) { Services.scriptloader.loadSubScript( `data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g ); var raws = g[key]; */ var raws = g.TransactionsHistory?.proxifiedToRaw; if (raws) g = raws; if (!g[key]) { if (!raws) { Services.scriptloader.loadSubScript( `data:,this.${key}=TransactionsHistory.proxifiedToRaw;`, g ); raws = g[key]; } g[key] = entry => { for(var tr of entry) if (raws.get(tr) instanceof PlacesTransactions.Remove) return true; } } var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ closemenu: "single", class: "menuitem-iconic", id: "placesCmd_undoRemove", label: "Восстановить удалённое", oncommand: "PlacesTransactions.undo().catch(Cu.reportError);", image: "data:image/svg+xml;charset=utf-8;base64,PCEtLSBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljDQogICAtIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXMNCiAgIC0gZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gLS0+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiIGZpbGw9IiMwMEVBM0EiIGZpbGwtb3BhY2l0eT0iY29udGV4dC1maWxsLW9wYWNpdHkiPg0KICA8cGF0aCBkPSJNMTMgMEgzYTMgMyAwIDAgMC0zIDN2OGEzIDMgMCAwIDAgMyAzaDRsLS4zLjRhMSAxIDAgMSAwIDEuNiAxLjJsMS41LTJhMSAxIDAgMCAwIDAtMS4ybC0xLjUtMmExIDEgMCAwIDAtMS42IDEuMmwuMy40SDNhMSAxIDAgMCAxLTEtMVY1aDEydjZhMSAxIDAgMCAxLTEgMSAxIDEgMCAwIDAgMCAyIDMgMyAwIDAgMCAzLTNWM2EzIDMgMCAwIDAtMy0zek0yIDRWM2ExIDEgMCAwIDEgMS0xaDEwYTEgMSAwIDAgMSAxIDF2MXoiLz4NCjwvc3ZnPg0K", })) menuitem.setAttribute(...args); var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden"); var {set} = desc; desc.set = () => { var entry = PlacesTransactions.topUndoEntry; set.call(menuitem, !entry || !g[key](entry)); } Object.defineProperty(menuitem, "hidden", desc); sep.before(menuitem); })(document.getElementById("placesContext_deleteSeparator"));
Отсутствует
Этот скрипт
Так, я повторю ещё раз.
Без никакого скрипта вообще.
Итак, STR, окно браузера, панель закладок в нём.
ПКМ по закладке на этой панели —> «Удалить закладку».
Закладка удаляется, исчезает, как и ожидалось.
Теперь, вызываем окно консоли (Ctrl+Shift+J)
и запускаем с него PlacesTransactions.undo()
Восторг! Закладка возвращается.
В точности туда же, где и была.
А теперь(!), не сходя с места,
снова ПКМ по этой закладке —> «Удалить закладку».
И... тишина.
Закладка просто молча не удаляется.
Почему так происходит — я не знаю.
Тем не менее — веский повод отказаться от этого кода как такового.
Увы.
Отсутствует
Dumby
Очень надо,шикарная кнопа была
Отредактировано green25 (06-03-2025 09:05:28)
Отсутствует
Почему так происходит — я не знаю.
Тем не менее — веский повод отказаться от этого кода как такового.
Мне очень много приходится работать с закладками, поэтому для меня эта кнопка очень нужная.
Что касается работоспособности на FF136.
Вы мне сами вот ЗДЕСЬ подсказали как эту кнопочку реанимировать, за что вам огромное спасибо:
Вроде этот код был признан непригодным к использованию,
из-за загадочного глюка, возникающего после вызова PlacesTransactions.undo()Но, если абстрагироваться от этого, то что тут сложного?
Там, где устанавливаются атрибуты, изымаем oncommandА вместо этого, далее, пишем строку, добавляющую листенер
menuitem.addEventListener("command", () => PlacesTransactions.undo().catch(Cu.reportError));
И все дела.
Я воспользовался вашим советом и несмотря на глюк продолжаю пользоваться этой кнопочкой.
Отредактировано unter_officer (06-03-2025 09:31:45)
«The Truth Is Out There»
Отсутствует
Отсутствует
несмотря на глюк продолжаю пользоваться этой кнопочкой
Аналогично. Я остался на UCF "version, date year-month-day: 2024-10-31" и на 136 код работает без правки.
И... тишина.
Закладка просто молча не удаляется.
Удаляем и восстанавливаем соседнюю закладку. И повторно удаляем проблемную. Это не повод отказываться от скрипта!
Отсутствует
Удаляем и восстанавливаем соседнюю закладку. И повторно удаляем проблемную. Это не повод отказываться от скрипта!
Можно сделать немного по другому. ПКМ на нужной закладке -> Измениить.
В открывшемся окне "Отмена". И после этого закладку снова можно удалить.
Да, это лишние телодвижения, но такой вариант тоже работает.
Аналогично. Я остался на UCF "version, date year-month-day: 2024-10-31" и на 136 код работает без правки.
Я UCF обновил до крайней версии и исправил код скрипта.
Тем более, что там править то совсем чуть-чуть.
Отредактировано unter_officer (06-03-2025 12:31:04)
«The Truth Is Out There»
Отсутствует
Можно посмотреть ?
// (async sep => { if (!sep) return; var key = "hasRemoveTransaction"; var raws = UcfPrefs.dbg.ref("lazy", PlacesTransactions.undo).TransactionsHistory.proxifiedToRaw; raws[key] ??= entry => { for(var transaction of entry) { if (raws.get(transaction) instanceof PlacesTransactions.Remove) return true; } } var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ closemenu: "single", class: "menuitem-iconic", id: "placesCmd_undoRemove", label: "Восстановить удалённое", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAEd0lEQVRIx53Ve2yW5RkG8N/7ft8Hxa/9CgjSSDnMA4xVTUMQWzadhzhnjSCC0y0jSjom+JdGp844ZhSjHLJsowaNZoCCHOWglXGoQbo2fBW3obDNUBfXKpsUVhxn6OHdH8+31GXGmL3/3M913ffzPNed93qeBxvmI8umCNjyPFEDSRJw40qKa9jyHSbdzY77Ar+9FTvZ+nHAb9T7P76YcwlOktlBdJia2SSthfRvaR/Mync5tp85Q2mbEHJ/X0bqRTpOBJyehog3C3j1HV9RQP91xG9T8z2SofyphMELWH4zW5s40s7kQ/T0cnYfXfPD1OgM0TlGzSN1DZkzxG1EdURjaa9HCfddEupfuSkIfHXJ5wVENA8Iw9QcRnbzXj31++g8w+WVZHMhXzaKhu2MGMtd36f5CTrn8WAJyf001KCYpA6dDBtLlOfoYuI6kgp6XuLsbhQRfw39ovDPx7/JgYS1b3NkCxcvoPgTevIULyFVTm4jyinp4uRJiirYt5BMLc15kvE0lnCsgZaE2wdx6LVCo9/ghQn4LhdFxEOonELv8ogVV9Iyjd9fx8T1FE2nq5XSQWQuJbsmrJH9JclMsldhFsW3EU0iuxsb6f9zTA3dHj1J1yPsKaPrIOtnkn6KDY2cvYF/vkfmINGuiPdnUD6Pd/7Mur/x0RCqXqTfj+m5glyO1B8ovR1pijeil6KvBw8V1QaB/QYWzNgSYu+TmMm5GVhKT47OBWR28kgnvxvKS/OjvuMGuTSr72FtBR/WctNe4l+H3GUt7DxB2TKe+CmnF5IZRzSZzFmS4wy9n2QGY2eR3Mx193DqAao+4vh04lZS2/EkQyqo7cWux4Kjwf4gKF3N5hEs+QsLlwVuVRPLP2FeTSh95hZSpSx6OOAkwWCWLSEqYWVz4JtLqd3GiuX0/oS6XKjd/BQbF6SRJynij4eJKpl7WSg8cCdzxjHjH3QuIsaorQx7NCx8QQdxCYM2kzxL423BbGN6SP+I6tmcO86hahqu4MA2To3mX+eTxbA2er6VJjcA/Yl2kOzlrutJxrDraaI1XH09j3fQVk7pcG5sCgIOttLVzejpmMPrnxJvYnIZXelwxGHTCOaX0PorsmUMOC/wpeNofg4fjg9EW3+k6CzcYJ99M7h6fSfxFFJrMZzFm0I+fzXxlTQ1EHf3eSlJyI3mlYGs/yEPx4F7/NkQ11zEymFhnDoY9RnwcHmIZ34Q1CcTkBD9FSM58gu8SmUHbmVuJbYRt2AiE/cwZT/tG3h+Gh29lH3A+VPZ+zMq1rHwcq6tY1U31ReQXPgFt3M+/9+xJRvM9f5S3NnX6btLqfqYt1p44xQrFnH0aX6zmBXIj+Hae0N95qG+ea/PJjrB7tV47csE7CzEJqKXyTcW8CquaibfwTOX0FjPLSfYk+G8XWyb+rlTUcndVUQjWXOK+FiBn/QfQen/FVBVVdhoc4FIkczqM5WBvPMWp4fQMpzFHeEN2NCFCcyNSH2b1AiSl3nhVnrnkjpNkqP9jrBvdzX8G2rIlxvMK3a7AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==", })) menuitem.setAttribute(...args); menuitem.addEventListener("command", () => PlacesTransactions.undo().catch(Cu.reportError)); var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden"); var {set} = desc; desc.set = () => { var entry = PlacesTransactions.topUndoEntry; set.call(menuitem, !entry || !raws[key](entry)); } Object.defineProperty(menuitem, "disabled", {}); Object.defineProperty(menuitem, "hidden", desc); sep.before(menuitem); })(document.getElementById("placesContext_deleteSeparator"));
«The Truth Is Out There»
Отсутствует
Какае еще манипуляии нужны, в 115 не работает.
Если не ошибаюсь, в 115 должен работать код без всяких правок (проверить сейчас не могу).
Вам давали на него ссылку: https://forum.mozilla-russia.org/viewto … 99#p808799
P.S.
Проверил на FF 115.21.0 ESR.
Работает, как не исправленный вариант скрипта, так и исправленный.
Версия UCF крайняя.
Отредактировано unter_officer (06-03-2025 14:17:33)
«The Truth Is Out There»
Отсутствует
Dumby
С преддыдущей просьбой не парьтесь . Косяк или баг в XPIDatabase.jsm...Рихтанул и все..
Как отключить обновление на конкретный аддон ,через ID ? Версию менять нельзя ,падает зараза...
Что с этим не так? (115)
var cancel = true; Services.obs.addObserver(function wfp(win, topic) { Services.obs.removeObserver(wfp, topic); var sd = win.gSanitizePromptDialog, {sanitize} = sd; sd.sanitize = e => cancel = sanitize.call(sd, e); }, "widget-first-paint");
Отредактировано green25 (11-03-2025 15:58:12)
Отсутствует
В 115 не работает
#toolbar-menubar toolbarpaletteitem[place="toolbar"][id^="wrapper-customizableui-special-spring"],
#toolbar-menubar > toolbarspring {
max-width: none !important;
cursor: default !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :-moz-any(toolbarspring,spacer,[id^="wrapper-customizableui-special-spring"]) {
flex-grow: 1 !important;
}
Нужен код "Очистить список закрытых вкладок"
Отредактировано green25 (12-03-2025 13:22:18)
Отсутствует
Кто знает , что за шняга в Storage при выходе to-be-removed ? Кеш аддонов ? Можно загасить ?
С куками связано. Куки на сессию и нет этой папки. как по умолчанию сделать ? "Разрешить на сессию" - в разрешениях
Или так ,но по умолчанию ,никак префку не могу найти
Отредактировано green25 (14-03-2025 23:23:28)
Отсутствует
Dumby посмотри пожалуйста эту кнопку может где пропустил изменения
if(true) return; // Disabled by Disable Initialization button // https://forum.mozilla-russia.org/viewtopic.php?id=56040 // http://infocatcher.ucoz.net/js/cb/cbEditorToggleOnTop.js // https://github.com/Infocatcher/Custom_Buttons/tree/master/CB_Editor_Toggle_on_Top // Custom Buttons Editor: Toggle on Top button for Custom Buttons // (code for "initialization" section) // (c) Infocatcher 2012-2015 // version 0.1.11 - 2015-06-04 // Hotkey: Ctrl+T const watcherId = "customButtonsToggleOnTop_" + this.id; var {Components} = window; // Prevent garbage collection in Firefox 3.6 and older var storage = (function() { if(!("Services" in window)) // Firefox 3.6 and older return Application.storage; // Simple replacement for Application.storage // See https://bugzilla.mozilla.org/show_bug.cgi?id=1090880 var global = Components.utils.getGlobalForObject(Components.utils); // Ensure, that we have global object (because window.Services may be overwritten) // var global = Components.utils.import("resource://gre/modules/Services.jsm", {}); var ns = "_cbEditorToggleOnTopStorage"; // Note: Firefox 57+ returns NonSyntacticVariablesObject w/o .Object property var storage = global[ns] || (global[ns] = Components.utils.getGlobalForObject(global).Object.create(null)); return { get: function(key, defaultVal) { if(key in storage) return storage[key]; return defaultVal; }, set: function(key, val) { if(key === null) delete storage[key]; else storage[key] = val; } }; })(); var watcher = storage.get(watcherId, null); if(!watcher) { watcher = { btnPos: 0, // 0 - at top right window corner, 1 - at end of tabs, 2 - before dialog buttons spacer btnStyle: "button", // "button" or "toolbarbutton" btnChecked: true, // use "checked" style: true or false // Fogue icons, http://p.yusukekamiyamane.com/ // http://www.iconfinder.com/icondetails/12276/16/gps_location_pin_icon icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjAx4SevkwAAAjxJREFUKM+FUk1oE0EU/mZnRU0U6cFLIT1KKkkNpIcSWwUvVty2l142hZpDoQcPgYQKQkUEz6V6sHgR/KGQQwleQg/xEKRRsIEmga4NoZa2oRGKpJaWmp2Z52UX12Dxg4838+D73ps3jzUYQycIgDc7l0oNAkgqpZ4n5uc/NgHsEEHDKZB/X5OJRGJcSplemJ6+6SZPFStvJ0Ta4eEhTNMcE0I8fDsxcQsAdPwHc6nUoBRCOz4+Rr1eR39//+18Pn/h/cjIGea+eS6VegLgKoBfRPRdKbXGOf8GIBmPx8cty0Kz2YTf74ff70cmkynpNSIAwP7+/t2ZmZnowcGBPDo6+rm1tdWo1Wo7pmnesSwLtm2jWCx+EkJwKSUnoln2wWnv9eTkMBE9TafT0b29PbTbbXDO0Wq1YNs2lpaWVpVSj8ZyuWXhaPg953CtXK6v9fVtr6ys9A4NDXU3Gg24JoVC4fPJycnjsVxu2TtMzgCUAVQAUKVSrwDtzc3NQCQS6d7d3XU7EK1W62twY+ML84i1N4zB5TvgYrVaPTs1NRXNZDKlrq4u+Hw+BAKBy1LK6zYA2xE+6/gqzhgbXl9fnw+FQrPBYPCHlBKjo6NRIjpPRD3kEdbcJWGMgTF2Y3Fx8UE4HE4yxl70WtYCEc1ms9kS51wDcM4r/FOS87BhGK90XTc0TeNuPgggFosNG4axOjAw8PJKxwIxAD26rt9XShWVUtvOWosO2h1RAJAMwCUAPseInGG6UTlm6l/8DZ+nFuAjSdH0AAAAAElFTkSuQmCC", iconPinned: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjIpwH1VRwAAAgdJREFUKM+FkkFoU0EQhr/dtxFSquLBS8CAICISQci1oBWLKaaINL300psXDxH0ItSD4L21UKgUxV4aWnKyiIGaQwio2IQ0PQQpBaEhoaEk0dSQNsnb9WAepg+LPwz/7DD/7O7MiJIQuGEAV3QIiNowV4f0HlA0BskJsI8fo75YLHIEjw3ccIInivVxX1IqcXFu7l4Lnhq4BaD4P4Y6INsHB+zlcpwfH7+zG48PavCIvj8/B64CRxoqXdg8Bd+BqG9xMVJNpaiUy5zxehkcGCC2uppV28Y44rs3V1aCFIt2p15v/MzlSj/S6eKlmZnRairFoW2zmUx+boHVBsvAtEj+fV5Iw4vbS0tBe2uLw04H2+ulUy5zaNu8X17OdOGZgkTX3TADCRumP0xNZY3fz6/9fSr5PNVGg6/x+BfdE/Y3wxJAHtj6wzt5aHsSiQv+4WFfbWcHu9VCeDzdRq32DdgQfZMQom9JjDGngcn19fWF2shI9vrYWNBqNjFCND8mk+8MTDq5s65RWUKIUKFQmA0EAtP3pawdra0xGokE0dqrwe8kvgS2e1cjpURKORyLxTaUUg+UUuciUvIWQq8hU5uYMPOQmQcuu7fAsqxr4XD4jVIqLKW0nPgV4AmEFiDzCF65hQLwK6Ueaq0/aa13e2vddVnHxV3AFsBZYKBXyPSa6bDuFdP/st/BfOD54p3eIQAAAABJRU5ErkJggg==", boxId: "cbToggleOnTopBox", btnId: "cbToggleOnTopButton", onTopAttr: "cbOnTop", naAttr: "cbOnTopNA", styleId: "cbToggleOnTopStyle", get btnTip() { 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]; if(locale == "ru") return "Поверх всех окон (Ctrl+T)"; return "Always on top (Ctrl+T)"; }, REASON_STARTUP: 1, REASON_SHUTDOWN: 2, REASON_WINDOW_LOADED: 3, REASON_WINDOW_CLOSED: 4, get obs() { delete this.obs; return this.obs = Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService); }, get ww() { delete this.ww; return this.ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"] .getService(Components.interfaces.nsIWindowWatcher); }, get wm() { delete this.wm; return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); }, init: function(reason) { this.obs.addObserver(this, "quit-application-granted", false); var ws = this.wm.getEnumerator(null); while(ws.hasMoreElements()) this.initWindow(ws.getNext(), reason); this.ww.registerNotification(this); }, destroy: function(reason) { // this.obs.removeObserver(this, "quit-application-granted"); var ws = this.wm.getEnumerator(null); while(ws.hasMoreElements()) this.destroyWindow(ws.getNext(), reason); this.ww.unregisterNotification(this); }, checkOnTopAttr: function(window) { if(this.version < 71) return this.checkOnTopAttr = function() {} var attr = this.onTopAttr; var id = window.document.documentElement.id; // var xs = Cu.import("resource://gre/modules/Services.jsm", {}) // .Services.xulStore; (this.checkOnTopAttr = function(window) { var de = window.document.documentElement; if(de.hasAttribute(attr)) return; var url = window.location.href; // if(xs.hasValue(url, id, attr)) // de.setAttribute(attr, xs.getValue(url, id, attr)); })(window); }, initWindow: function(window, reason) { if(!this.isTargetWindow(window)) return; window.addEventListener("keypress", this, true); if(this.hasSizeModeChangeEvent) window.addEventListener("sizemodechange", this, false); else { window.addEventListener("resize", this, false); // Can detect only maximize/restore this.legacySizeModeChange(window); } this.checkOnTopAttr(window); var document = window.document; this.removeStyle(document); this.addStyle(document); var box = document.getElementById(this.boxId); box && box.parentNode.removeChild(box); box = document.createElementNS(xulns, "hbox"); box.id = this.boxId; var btn = document.createElementNS(xulns, this.btnStyle); btn.id = this.btnId; if(this.btnChecked) { btn.setAttribute("type", "checkbox"); btn.setAttribute("autoCheck", "false"); } btn.tooltipText = this.btnTip; btn.addEventListener("command", this, false); box.appendChild(btn); switch(this.btnPos) { default: box.setAttribute("cbOnTopFloat", "true"); document.documentElement.appendChild(box); break; case 1: if(this.platformVersion >= 72) box.setAttribute("pack", "end"); else box.setAttribute("align", "right"); let tabbox = document.getElementById("custombuttons-editbutton-tabbox"); let tabs = tabbox.getElementsByTagName("tabs")[0]; tabs.parentNode.insertBefore(box, tabs); box.style.marginBottom = -(btn.boxObject || btn.getBoundingClientRect()).height + "px"; break; case 2: box.setAttribute("align", "center"); let btnBox = document.documentElement.getButton("accept").parentNode; let insPos = btnBox.firstChild; for(let node = insPos; node; node = node.nextSibling) { if(node.localName == "spacer") { insPos = node; break; } } btnBox.insertBefore(box, insPos); } this.checkWindowStatus(window, box); //this.setOnTop(btn); }, destroyWindow: function(window, reason) { if(reason == this.REASON_WINDOW_CLOSED) window.removeEventListener("DOMContentLoaded", this, false); // Window can be closed before DOMContentLoaded if(!this.isTargetWindow(window)) return; window.removeEventListener("keypress", this, true); if(this.hasSizeModeChangeEvent) window.removeEventListener("sizemodechange", this, false); else window.removeEventListener("resize", this, false); var document = window.document; var btn = this.shadow(document).getElementById(this.btnId); btn.removeEventListener("command", this, false); if(reason == this.REASON_SHUTDOWN) { let box = btn.parentNode; box.parentNode.removeChild(box); this.removeStyle(document); let xulWin = this.getXulWin(window); xulWin.zLevel = xulWin.normalZ; } }, isTargetWindow: function(window) { return window.location.href.substr(0, 41) == "chrome://custombuttons/content/editor.xul"; }, observe: function(subject, topic, data) { if(topic == "quit-application-granted") this.destroy(); else if(topic == "domwindowopened") subject.addEventListener("DOMContentLoaded", this, false); else if(topic == "domwindowclosed") this.destroyWindow(subject, this.REASON_WINDOW_CLOSED); }, handleEvent: function(e) { var trg = e.originalTarget || e.target; var window; switch(e.type) { case "DOMContentLoaded": window = trg.defaultView; window.removeEventListener("DOMContentLoaded", this, false); this.initWindow(window, this.REASON_WINDOW_LOADED); break; case "keypress": if( !( (e.ctrlKey || e.metaKey) && !e.altKey && !e.shiftKey && String.fromCharCode(e.charCode).toLowerCase() == "t" ) ) break; e.preventDefault(); e.stopPropagation(); case "command": window = trg.ownerDocument.defaultView.top; this.toggleOnTop(window); break; case "sizemodechange": case "resize": window = trg; this.checkWindowStatus(window); } }, version: 0, get hasSizeModeChangeEvent() { var appinfo = "Services" in window && Services.appinfo; delete this.hasSizeModeChangeEvent; return this.hasSizeModeChangeEvent = appinfo && ( appinfo.name == "Pale Moon" || (this.version = parseFloat(appinfo.platformVersion)) >= 8 ); }, legacySizeModeChange: function(window) { var lastState = window.windowState; window.setInterval(function(window, _this) { var state = window.windowState; if(state != lastState) _this.checkWindowStatus(window); lastState = state; }, 150, window, this); }, checkWindowStatus: function(window, box) { if(!box) box = this.shadow(window.document).getElementById(this.boxId); var na = String(window.windowState != window.STATE_NORMAL); if(box.getAttribute(this.naAttr) == na) return; box.setAttribute(this.naAttr, na); //LOG("Set n/a: " + na); this.setOnTop(box.firstChild); }, addStyle: function(document) { var style = '\ %box%[cbOnTopFloat] {\n\ display: block !important;\n\ position: fixed !important;\n\ top: 0 !important;\n\ right: 0 !important;\n\ }\n\ %btn%, %btn% * {\n\ margin: 0 !important;\n\ padding: 0 !important;\n\ }\n\ %btn% > .button-box > .button-icon {\n\ margin: -3px -1px !important;\n\ }\n\ toolbarbutton%btn% {\n\ padding: 0 2px !important;\n\ }\n\ %btn% {\n\ position: relative !important;\n\ z-index: 2147483647 !important;\n\ list-style-image: url("%icon%") !important;\n\ -moz-user-focus: ignore !important;\n\ min-height: 0 !important;\n\ min-width: 0 !important;\n\ }\n\ %btn%[%onTopAttr%="true"] {\n\ list-style-image: url("%iconPinned%") !important;\n\ }\n\ %box%[%naAttr%="true"] image {\n\ opacity: 0.75 !important;\n\ }' .replace(/%box%/g, "#" + this.boxId) .replace(/%btn%/g, "#" + this.btnId) .replace(/%onTopAttr%/g, this.onTopAttr) .replace(/%icon%/g, this.icon) .replace(/%iconPinned%/g, this.iconPinned) .replace(/%naAttr%/g, this.naAttr); if(this.shadow(document, style)) return; document.insertBefore(document.createProcessingInstruction( "xml-stylesheet", 'id="' + this.styleId + '" href="' + "data:text/css," + encodeURIComponent(style) + '" type="text/css"' ), document.documentElement); }, removeStyle: function(document) { if(this.shadow(document, false)) return; var mark = 'id="' + this.styleId + '"'; for(var child = document.documentElement; child = child.previousSibling; ) { if( child.nodeType == child.PROCESSING_INSTRUCTION_NODE && child.data.substr(0, mark.length) == mark ) { document.removeChild(child); break; } } }, shadow: function(document, arg) { var sr = document.documentElement.shadowRoot; if(this.btnPos != 2 || !sr) return (this.shadow = function(document, arg) { return arg === undefined ? document : false; })(document, arg); if(arg === undefined) return sr; var st = sr.querySelector("style"), id = this.styleId; if(arg) { st.append(arg); st.lastChild[id] = true; } else { var tn = Array.from(st.childNodes).find(function(node) { return id in node; }); tn && tn.remove(); } return true; }, getXulWin: function(window) { return ( window.docShell && window.docShell instanceof Components.interfaces.nsIDocShell ? window.docShell : window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShellTreeItem) ) .treeOwner .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIXULWindow || Ci.nsIAppWindow); }, setOnTop: function(btn, toggle) { var document = btn.ownerDocument; var root = document.documentElement; var onTop = root.getAttribute(this.onTopAttr) == "true"; if(toggle) { onTop = !onTop; root.setAttribute(this.onTopAttr, onTop); if(root.id) { if("persist" in document) document.persist(root.id, this.onTopAttr); else // Firefox 63+ Services.xulStore.persist(root, this.onTopAttr); } } else if(!onTop) // Just opened or restored window always have zLevel == normalZ return; var window = document.defaultView; var state = window.windowState; // Strange glitches with minimized "raisedZ" window... var restore = onTop && state == window.STATE_MINIMIZED; if(restore || state == window.STATE_NORMAL) { if(restore) onTop = false; let xulWin = this.getXulWin(window); xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ; //LOG("Set on top: " + onTop); } this.checkButton(btn, onTop); }, toggleOnTop: function(window) { this.setOnTop(this.shadow(window.document).getElementById(this.btnId), true); }, checkButton: function(btn, onTop) { btn.setAttribute(this.onTopAttr, onTop); this.btnChecked && btn.setAttribute("checked", onTop); } }; storage.set(watcherId, watcher); watcher.init(watcher.REASON_STARTUP); } function destructor(reason) { if(reason == "update" || reason == "delete") { watcher.destroy(watcher.REASON_SHUTDOWN); storage.set(watcherId, null); } } if( typeof addDestructor == "function" // Custom Buttons 0.0.5.6pre4+ && addDestructor != ("addDestructor" in window && window.addDestructor) ) addDestructor(destructor, this); else this.onDestroy = destructor;
На форуме
может где пропустил изменения
Дает ошибку в строке - xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;
Да, пропустил. Вот это:
Bug 1902315 - Remove popup and window z-level fiction from our codebase. (Firefox 129+)
Не одно и тоже, но есть флаг "alwaysontop", однако,
здесь — кот не валялся, а перезагружать окно — сам понимаешь ...
Отсутствует