Dumby никак не могу заальтернативить код из вашего поста №160, чтобы слушало не PlacesToolbarItems, а contentAreaContextMenu - то, в котором присутствует групповуха context-navigation. Оно же в gBrowser?
Отредактировано dinn (27-10-2024 12:32:30)
Отсутствует
никак не могу заальтернативить код из вашего поста №160, чтобы слушало не PlacesToolbarItems, а contentAreaContextMenu
Странно, у меня работает простая замена одного на другое.
Заменил, рестарт, жму кнопку, чтобы очистить буфер,
открываю #contentAreaContextMenu, затем закрываю,
и в консоли — прописанный лог «popup closing».
При закрытии субменю, кстати, тоже.
А если скопировать в буфер текст, то,
при закрытии меню, кнопка вновь обретает visibility
то, в котором присутствует групповуха context-navigation
Да, там есть <menugroup> с таким id
Но это не характеризует его совершенно однозначно.
Например, если посмотреть по адресу
view-source:chrome://browser/content/webext-panels.xhtml
то там тоже есть #contentAreaContextMenu с #context-navigation
Надеюсь, имеется в виду то, которое в документе окна браузера.
Оно же в gBrowser?
Не смог понять вопрос.
Оно не «в», и не «вовне», это просто разные вещи.
gBrowser — это js-объект создаваемый скриптом
chrome://browser/content/tabbrowser/tabbrowser.js
А #contentAreaContextMenu — это XULPopupElement <menupopup>
Отсутствует
Странно, у меня работает простая замена одного на другое
Да я лопухнулся, заменил еще событие на contextmenu. Исправил, теперь пашет
Давеча смотрел скрипт и не мог понять, куда нужно зайти, чтобы прослушка сработала, т.е. gContextMenu.shouldDisplay = false
Переделал с render как смог
(async (id, url) => { if (location != url) return; var menuitem = document.createXULElement("menuitem"); document.getElementById(id).append(menuitem); var hidden = () => { var hs = nsContextMenu.contentData; return hs.context.link || hs.context.onImage || hs.context.onTextInput || hs.selectionInfo.text; } menuitem.hidden = true; menuitem.render = () => { if (hidden()) return; menuitem.hidden = false; menuitem.id = "context-closetab"; menuitem.label = "Close Tab"; menuitem.setAttribute('oncommand', 'BrowserCommands.closeTabOrWindow();'); delete menuitem.render; menuitem.render(); menuitem.render = () => menuitem.hidden = hidden(); } })("contentAreaContextMenu", "chrome://browser/content/browser.xhtml");
А потом решил сделать версию с запиханием в context-navigation, чтобы не мудрить с hidden. Короче не придумаешь и вроде все норм пашет или есть подводное течение?
(async (id, url) => { if (location != url) return; let menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('id', 'context-closetab'); menuitem.className = 'menuitem-iconic'; menuitem.setAttribute('image', 'chrome://global/skin/icons/close.svg'); menuitem.setAttribute('tooltiptext', 'Close tab'); menuitem.setAttribute('oncommand', 'BrowserCommands.closeTabOrWindow();'); document.getElementById(id).prepend(menuitem); })("context-navigation", "chrome://browser/content/browser.xhtml");
Отсутствует
куда нужно зайти, чтобы прослушка сработала, т.е. gContextMenu.shouldDisplay = false
Нее, загадку, что бы это могло значить, мне не разгадать.
Давеча смотрел скрипт
Переделал
Под label "Close Tab" чуть больше подходит gBrowser.removeCurrentTab()
ведь BrowserCommands.closeTabOrWindow() закрывает и выбранные вкладки, если есть.
Посмотри в консоли, набрав BrowserCommands.closeTabOrWindow + "";
там код несложный и хорошо прокомментирован.
решил сделать версию с запиханием в context-navigation, чтобы не мудрить с hidden
Этот menugroup скрывается чуть в больших случаях, чем заказано в коде «с render»,
например, ещё onCanvas, onVideo, onAudio. Если это подходит, то решение хорошее.
есть подводное течение?
Ну, разве что есть мета, где выбрасывают все «on…» атрибуты.
Среди причин: «adding a restrictive CSP to browser windows».
Если сделают — атрибут 'oncommand' работать, наверно, перестанет.
Отсутствует
Посмотри в консоли, набрав BrowserCommands.closeTabOrWindow + "";
ценный совет, а то я совсем забыл, что тело функции можно посмотреть из консоли
Если сделают — атрибут 'oncommand' работать, наверно, перестанет
Сделал без on, попутно еще к крестику добавил плюсик, но BrowserCommands.openTab() не впечатлило, а вот так вроде самое оно
func: () => gBrowser.addAdjacentNewTab(gBrowser.selectedTab) + gURLBar.focus(),
Отредактировано dinn (02-11-2024 19:18:51)
Отсутствует
Есть Скрипт Firefox userChrome.js для добавления второй боковой панели с веб-панелями, как в Vivaldi/Floorp/Zen.
Сам скрипт заточен под загрузчик fx-autoconfig, но желающие могут протестировать и на других. Можно создать рядом с second_sidebar.uc.mjs файл с названием например second_sidebar.uc.js
// ==UserScript== // @name Firefox Second Sidebar // @author aminought // @include main // @homepageURL https://github.com/aminought/firefox-second-sidebar/tree/master // @description A Firefox userChrome.js script for adding a second sidebar with web panels like in Vivaldi/Floorp/Zen. // ==/UserScript== if (location.href.startsWith("chrome://browser/content/browser.x")) { (async url => { (await ChromeUtils.compileScript(`data:,"use strict";import("${url}").catch(console.error)`)).executeInGlobal(window); })(Services.io.newURI(Components.stack.filename).resolve("second_sidebar.uc.mjs")); }
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Dumby как мониторить вкладки на добавление (наличие) атрибута hidden = true? При этом выводить алерт или удалять атрибут. Прослушка TabHide не катит, т.к. редко кто скрывает вкладку через браузный hideTab()
Отредактировано dinn (05-11-2024 18:28:43)
Отсутствует
как мониторить вкладки на добавление (наличие) атрибута hidden = true? При этом выводить алерт или удалять атрибут. Прослушка TabHide не катит
Звучит как возможность попробовать MutationObserver.
Как-то так, наверно (но, поосторожнее там с alert'ом)
(url => { if (location != url) return; var labelify = record => record.target.label; var tabAndHidden = record => record.target.matches("tab.tabbrowser-tab[hidden=true]"); (new MutationObserver(mutations => { var hiddenTabsRecords = mutations.filter(tabAndHidden); hiddenTabsRecords.length && alert( '"true" hidden attribute on tab(s) detected.\n\n' + hiddenTabsRecords.map(labelify).join("\n") ); })) .observe( gBrowser.selectedTab.parentNode, {subtree: true, attributes: true, attributeFilter: ["hidden"]} ); })("chrome://browser/content/browser.xhtml");
Отсутствует
Dumby потестировал ваш код на паре случаев, когда сам брауз скрывает вкладки:
1 открытие исходного кода страницы в новом окне
2 кнопка Firefox View
Напрашивается не исключение для about:blank, а задержка с правильно подобранным значением для alert, чтобы видеть актуальное, а не переходное состояние label и url для hidden tabs.
Правильно ли я все сделал?
(url => { if (location != url) return; var adr = record => record.target.linkedBrowser.currentURI.spec; var labelify = record => record.target.label; var tabAndHidden = record => record.target.matches("tab.tabbrowser-tab[hidden=true]"); (new MutationObserver(mutations => { var hiddenTabsRecords = mutations.filter(tabAndHidden); hiddenTabsRecords.length && setTimeout(() => { alert( '"true" hidden attribute on tab(s) detected.\n\n' + hiddenTabsRecords.map(labelify).join("\n") + '\n\n' + hiddenTabsRecords.map(adr) ); }, 155); })) .observe( gBrowser.selectedTab.parentNode, {subtree: true, attributes: true, attributeFilter: ["hidden"]} ); })("chrome://browser/content/browser.xhtml");
Отсутствует
1 открытие исходного кода страницы в новом окне
А, тут надо настройку view_source.tab поперёк дефолта переключить.
Мог бы напомнить, а то пока дошло...
2 кнопка Firefox View
Да, это был целевой кейс при рассмотрении.
когда сам брауз скрывает вкладки
Ещё он должен так делать по заказу WebExtensions (типа такого).
Правильно ли я все сделал?
Как не знал, что есть «правильно», так и не буду знать никогда.
Однако, ни SyntaxError'а, ни какой-то вопиющей неправильности я не вижу.
Мне лишь только кажется, что функцию для setTimeout()
лучше вынести наружу, чтобы она не создавалась каждый раз новая.
Впрочем, это довольно субъективно.
(url => { if (location != url) return; var tabAndHidden = record => record.target.matches("tab.tabbrowser-tab[hidden=true]"); var info = record => record.target.label + "\n" + record.target.linkedBrowser.currentURI.spec; var notify = records => alert('"true" hidden attribute on tab(s) detected.\n\n' + records.map(info).join("\n\n")); (new MutationObserver(mutations => { var hiddenTabsRecords = mutations.filter(tabAndHidden); hiddenTabsRecords.length && setTimeout(notify, 155, hiddenTabsRecords); })) .observe( gBrowser.selectedTab.parentNode, {subtree: true, attributes: true, attributeFilter: ["hidden"]} ); })("chrome://browser/content/browser.xhtml");
Отсутствует
Dumby средства этого целевого кейса позволяют нам скрыть вкладку без отображения ее по кнопке список всех вкладок, что совсем не радует. Хорошо хоть в инспекторе видно, что скрыта
Отсутствует
Dumby
В FF132 скрипт для запуска внешних программ мешает запоминать масштаб страниц. Выставляю масштаб на этом сайте 110%, а после перезагрузки опять 100%. Если его удалить, то всё ОК.
загрузчик метода Aris-t2.
В userChrome.js прописано так:
Вот сам скрипт:
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
var {console} = Cu.import("resource://gre/modules/Console.jsm", {});
try {
CustomizableUI.createWidget({
id: "add-Notepad-app",
label: "Notepad",
tooltiptext: "Запуск редактора Notepad",
onCreated: btn => btn.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAABuElEQVQ4T42T3UoCURSFe5BexHeI6KIewqAg7F+HySgqiiIjLwpSCBKUgkwEbYxJm4nM/JvoR0vJiMlEBC0kvFjNOUzZmA4tWMy52Ovbex/OdLUTwzAGYqvVOtB6/v6yLNutlreI6TJsRO1YEJaxdmHDvLAE9mwO8+dLGDoZBSPMYpgfg3F7EASmppqa4sxiqniDSzmFyEsUx88RHD1x8OR92H3cx3Z2D4spG5whJ7xeL9SYKqV7OC9AKt7pAsa4aRQKBXAcpwVYQqyYLeV0AStpO5ycE6VyqQWgdOdyPA2ni7cdAabAJNJSGu+fH1qAKTguktC3o3LyD2Bd2sLh1SHK5TKImgCl+37miAZ+O/xyoQFYTmeQTCbxWipqJxgMDIuksJ2Dz2EKsF874Iq4KICEmwClu+PGRYs62ft0jImgBZIk4T6b0QJ6VvtEMp6eN6934Jf8kGUZlUqF7k9EAeR1kdvVs1ndPZFIQH571U7Qe9DvNoZG0MkjJ5PwC34ajsfjP+EfQDv5fD4a+G0SzuYe/geIxWKo1WoaV6tVNBoNdXugXq+3+RdUeTyeAZ7n3XpWwm6GYQxfSZKfb4uO/HAAAAAASUVORK5CYII=",
onCommand: function(event) {
var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath("E:\\Software\\Просмотр\\Notepad++ 7.7 Final Portable\\notepad++.exe");
if (file.exists()) file.launch();
}
});
} catch(e) {}
Отсутствует
Dumby
А можно поправить скрипт для загрузчика метода Aris-t2. Закрытие вкладки = переход на предыдущую посещенную
Под вторым спойлером.
Отсутствует
rubel
Ну, эпопея с выкидыванием «on…» атрибутов показывает,
что удаление листенеров (именно) по причине выгрузки окна
не рассматривается как необходимость.
А очистка set'а табов, даже не знаю, оставил, на всякий случай.
location == "chrome://browser/content/browser.xhtml" && (async () => { await delayedStartupPromise; var set = new Set([gBrowser.selectedTab]); var bt = gBrowser._blurTab; gBrowser._blurTab = tab => { if (!tab.selected) return; set.delete(tab); var res; for(var t of set) t.hidden || (res = t); res ? gBrowser.selectedTab = res : bt.call(gBrowser, tab); } for(var args of [ ["TabClose", e => set.delete(e.target)], ["TabSelect", e => set.add(e.target, set.delete(e.target))] ]) gBrowser.tabContainer.addEventListener(...args); window.addEventListener("unload", () => set.clear(), {once: true}); })();
Отсутствует
Dumby
А можно кнопку Перезагрузка браузера от UCF сделать для загрузчика метода Aris-t2.
Отсутствует
А можно кнопку Перезагрузка браузера от UCF сделать для загрузчика метода Aris-t2.
Она работает, как минимум в v128.4.0. Она в гамбургере, может, ты ее не нашел? И еще, кнопок перезапуска "на рынке" как грязи поздней осенью.
Отсутствует
Поделитесь пожалуйста, а лодырь у вас какой?
Так это та, что по вашей ссылке https://forum.mozilla-russia.org/viewto … 44#p811444 Загрузчик от Aris-t2.
Отредактировано fuchsfan (16-11-2024 10:43:54)
Отсутствует