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");
Отсутствует