Bug 1702013 - Re-introduce "view image info" in the context menu behind a hidden (about:config) pref and enable that pref by default in devedition
Status: RESOLVED FIXED
Milestone: 89 Branch
browser.menu.showViewImageInfo
чтобы при таком октрытии (с буфера при нажатии ПКМ на +) вкладки загружались
[spoiler][code](async (sel, self) => ({
icon: "circle",
colors: [
"mediumseagreen",
"silver",
"crimson",
"blue",
"peru",
],
initColors() {
var colorName = "ucf-gen";
var css = "@-moz-document url(about:preferences#containers),"
+ " url-prefix(chrome://browser/content/browser.x) {\n";
this.colors.forEach((color, ind) => {
var [ic, tc] = color.split(/\s*\|\s*/);
css += `\t.identity-color-${colorName}${ind} {\n`
+ `\t\t--identity-tab-color: ${tc || ic};\n`
+ `\t\t--identity-icon-color: ${ic};\n\t}\n`
});
var url = "data:text/css;charset=utf-8," + encodeURIComponent(css + "}");
var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET);
var len = this.colors.length;
var pref = "ucf.openInGeneratedContainer.lastColor";
var ind = Math.
Stkvsky
Хмм, странно. Завёл Firefox 78.9.0esr,
развернул ucf 2021-2-14, добавил код в custom_script.js
Поставил Copy Tab Links 0.0.3, открыл и выделил несколько вкладок,
ПКМ по вкладке — в пункте «Copy Tab Links», в субменю, выбрал «Copy URLs».
Теперь ПКМ на кнопке [+] (#tabs-newtab-button) — и вкладки открылись,
с теми адесами, которые были скопированы у выделенных вкладок.
И атрибут "usercontextid" есть, и у вкладок, и у связннных браузеров,
и цветная индикация присутствует, ну, то есть, открылись в контейнере.
Даже не знаю что и предложить. Разве что попробовать
закрыть браузер, и очистить startupCache вручную, вдруг заклинило.
Ну и, может, в консоль посмотреть на предмет подсказок.
Новый проверочный профиль можно собрать, но это, скорее, на интерес.
вставлял в инциализацию
При чём здесь инциализация? Это тот же самый что и раньше
контейнерский код для custom_script.js, только чуть модифицированый.
Ну не собирать же отдельный для этого.
Что может быть не так?
Наверно, по скупому набору слов, не смог угадать что требуется.
Выпрашивать подробности настроения нет, полагаю, что если бы
было желание, то и скриншот был бы сразу, и номер версии Firefox,
и рассказ, что из себя представляет «список вкладкок с буфера»
и как он в этом буфере появляется.
А так — попробовал наугад. Нет так нет, забудем.
Save+Alert
[spoiler][code](async (id, func) => {
await window.delayedStartupPromise;
var btn = document.getElementById("downloads-button");
if (!btn) return;
var save = () => {
var {wm} = Services, find = w => !w.closed && w.toolbar.visible;
var as = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
var obs = class {
constructor(path, alertName) {
this.fp = path;
this.an = alertName;
}
noop() {}
win = Cu.getWeakReference(window).get;
observe(s, topic) {switch(topic) {
case "alertshow":
(this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer))
.initWithCallback(this, 5e3, Ci.nsITimer.TYPE_ONE_SHOT_LOW_PRIORITY);
break;
case "alertclickcallback":
var win = this.win();
if (!win || win.closed) win = Array.from(wm.getEnumerator("navigator:browser")).find(find);
if (win) {
win.gBrowser.selectedTab = win.gBrowser.addTrustedTab(win.PathUtils.toFileURI(this.fp));
Dobrov
Для начала, убери оболчку от другого кода, неуместно вообще.
ведь текст Загрузок может меняться?
Без понятия. Если у тебя меняется, тогда напиши
при каких обстоятельствах это можно увидеть.
btn.tooltipText = btn.tooltipText +
btn.tooltipText = GetDynamicShortcutTooltipText(btn.id) +
код, открывающий папку Загрузки
Downloads.getSystemDownloadsDirectory()
.then(path => FileUtils.File(path).launch(), Cu.reportError);
не закрывает найденную вкладку: строка for( var tab of gBrowser.tabs)
e.view.gBrowser
Добавил этот код в custom_script.js
custom_script_win.js
Dobrov
Ещё раз — метод switchToTab() из метода command()
следует вызывать так: this.switchToTab(аргументы);
ну как this.eyedropper(trg);
Не могу исправить ошибку - код напрямую в кнопке работает, а обёрнутый в функцию нет!
По тем кускам непонятно, может this.switchToTab('about:config', e);
Не могу пункт добавить(копировать url кнопки)
[spoiler][code]((id, g, iconizer) => addDestructor(r => r[5] == "e" && id in g && g[id].destroy()) + addEventListener("showing", {
//------------------------------------------------------------------
"Копировать имя_i": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4jY2TTUhUURiGn5tD0Sp00iAwXM1iFu4kWkUZg/9MoZQhdoUCV7ooItq4atFORRGkuLMwoc0kNBGKDLSwFpEIQgspqGUUNsjI3HvPX4s7I3Nn7oW+1fn5vvd8z3vOsYiIgXuPneFMr21ZVmh9+m7GisoPxcTsM2d46on5c1gy9bHgvDVR+afqJzNzy870xIgNUJGGkqf4XVEAuJ4XeWCiNpibX3MGr/XYPd0pADxlOK0MQgf7Xw++sfJq0zRiJQAWcgWndHRkr28UWcrlAfCVwa8KrK4XOPxbYqz/MsnWcyfFi7lCIPD9x0/70YNRykKz+eELQkny74sIJbnQmqQ71UVhe+cES2hoP9uC63mBgO/7dF7s4NexZPRmBqlBaMPHnc+kL7UTh1VxqwKuGxjkaUP+zRZCSVqwKJeP2dvdj8SqGZuod9hXhr6hGwgNL5ZfEoc1PnaL
command(e)
Ну и нет никакого «window is not defined».
SidebarUI.hide() — не зачищен, return — не на своём месте,
и что, разве на Mac #menu_eyedropper есть,
пока субменю «Веб-разработка» не откроешь?
Кстати, когда-то спрашивали про пипетку,
код сохранился, вот — вписал, на всякий случай.
[spoiler][code]...
eyedropper(trg) {
var obj = ChromeUtils.import("resource://devtools/shared/Loader.jsm")
.require("devtools/client/menus").menuitems
.find(menuitem => menuitem.id == "menu_eyedropper");
(this.eyedropper = target => obj.oncommand({target}))(trg);
},
command(e) {
var trg = e.target;
if (trg.btn) {
if (e.shiftKey) e.altKey
? this.eyedropper(trg) // Shift+Alt — Пипетка
: e.view.PlacesCommandHook.showPlacesOrganizer("History"); // Shift — Библиотека (журнал)
else if (e.altKey)
trg.ownerDocument.getElementById("key_browserConsole").doCommand(); // Alt — Консоль браузера
else {
var bar = trg.ownerDocument.get
Можно ли указать чтобы разных цветов были?
Допустим в коде, в массиве colors: [...], перебор по кругу.
[spoiler][code](async (sel, self) => ({
icon: "circle",
colors: [
"mediumseagreen",
"silver",
"crimson",
"blue",
"peru",
],
initColors() {
var colorName = "ucf-gen";
var css = "@-moz-document url(about:preferences#containers),"
+ " url-prefix(chrome://browser/content/browser.x) {\n";
this.colors.forEach((color, ind) => {
var [ic, tc] = color.split(/\s*\|\s*/);
css += `\t.identity-color-${colorName}${ind} {\n`
+ `\t\t--identity-tab-color: ${tc || ic};\n`
+ `\t\t--identity-icon-color: ${ic};\n\t}\n`
});
var url = "data:text/css;charset=utf-8," + encodeURIComponent(css + "}");
var sss = Cc["@mozilla.org/content/style-sheet-service;1"]
.getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET);
var len = this.colors.length;
var pref = "ucf.openInGeneratedContainer.las
Здравствуйте. Можно ли адаптировать кнопку
"При повторном открытии боковой панели закладок, все открытые папки автоматически сворачиваются"
для 87 версии Fierfox?
То, что кавычках, не совсем точно.
Этот код просто отключал запоминание состояния развёрнутости.
Поэтому, перед установкой, следует открыть боковую панель закладок,
и свернуть все папки вручную (ну, или, может, оставить, если какие нужно).
(sb => { var gv = () => sb.contentDocument ?.getElementById("bookmarks-view")?.view; var func = function(row) { var node = this._rows[row]; node.containerOpen = !node.containerOpen; } var set = () => { var view = gv(); if (view) view.toggleOpenState = func; } set(); addEventListener("pageshow", set, false, sb); addDestructor(() => { var view = gv(); if (view) delete view.toggleOpenState; }); })(document.getElementById("sidebar"));
а можно две поправки внести?
…
Чтобы контейнер не выбирать из списка, а
в контекстном меню папки закладок "Открыть всё в контейнере"
Для custom_script.js
[spoiler][code](async (sel, self) => ({
init(topic) {
Services.obs.addObserver(self = this, topic);
Services.obs.addObserver(function quit(s, t) {
Services.obs.removeObserver(mm, topic);
Services.obs.removeObserver(quit, t);
}, "quit-application-granted");
},
observe(doc) {
var list = doc.querySelectorAll(sel);
list.length && new this.listener(Array.from(list));
},
listener: class {
constructor(list) {
var popup = this.popup = (this.list = list)[0].parentNode;
popup.addEventListener("popupshowing", this);
popup.ownerGlobal.addEventListener("unload",
() => popup.removeEventListener("popupshowing", this)
, {once: true});
}
get shouldHide() {
return (this.ind = this.list.findIndex(this.find)) == -1;
}
find(node) {
return !node.hidden && !node.disabled;
}
handleEvent() {
if (this.shouldHide) return;
var doc = this.popup.owne
Как вернуть "белый" цвет для строк, подсвеченых курсором?
Наверно можно стилем.
Дописать вызов регистрации стиля в onCreated(), и, далее, сам метод.
Как-то так
... onCreated(btn) { ... this.addSheet(btn); }, addSheet(btn) { var cb = Array.isArray(btn._destructors); var id = cb ? btn.id : "QuickToggleAboutConfigSettings"; var css = `#${id} menu[_moz-menuactive] { color: unset /*white*/ !important; }`; var args = [ "data:text/css;charset=utf-8," + encodeURIComponent(css), Ci.nsIDOMWindowUtils.USER_SHEET ]; if (cb) var destructor = function() { this.removeSheetUsingURIString(...args); } var add = b => b.ownerGlobal.windowUtils.loadSheetUsingURIString(...args); (this.addSheet = !cb ? add : btn => { add(btn); btn._destructors.push({destructor, context: btn.ownerGlobal.windowUtils}); })(btn); },
PlacesCommandHook is not defined
e.view.PlacesComma
…А то там тишина...
Тоже особо сказать нечего.
Для многострочности вкладок мне известен только этот проект.
Ещё Tab Mix Plus, но там (пока?) не готово.
А как сделать, чтобы строка меню стала зелёной, если "преф не существует"?
Можно в upd() дописать, если цвет внешним стилем не приколочен
(без if (...) если не только для этой настройки, а для всех)
... if (pref.pref == "general.useragent.override") exists ? node.style.removeProperty("color") : node.style.setProperty("color", "green", "important");
Второй вопрос: как выполнить команду меню: "Показать все закладки"
PlacesCommandHook.showPlacesOrganizer('BookmarksToolbar') // это не работает…
Работает. И в 84.0.2, и в 89.0a1
А команда пункта меню "Показать все закладки" запускает
PlacesCommandHook.sh
параметр не меняется, почему-то тип general.useragent.override всегда логический, а не строковый…
Не вижу такого.
Но могло раньше (как-то) прописаться как логическое,
тогда следует сбросить (удалить) настройку и перезапуститься.
После этого должно быть нормально.
А tooltipText нельзя на значок ?
чтобы вкладки контейнера после добавления закрывались все
[spoiler][code](async id => {
var menuitem = document.createXULElement("menuitem");
document.getElementById(id).after(menuitem);
typeof addDestructor == "function"
&& addDestructor(() => menuitem.remove());
menuitem.render = function() {
this.id = "context_bookmarkContainer";
this.label = "Добавить контейнер в закладки";
this.setAttribute("oncommand", "bookmark()");
var bm = PlacesUtils.bookmarks, attr = "usercontextid";
var {toolbarGuid: parentGuid, TYPE_FOLDER: type} = bm;
this.b
В aboutaddons.html пункт я ввел и в popup его видно, но хочу и туда, можно просто значок , label не обязательно.
Ну, код на «значок» как бы не рассчитан.
И что значит «я ввел»? Типа теперь и я ввести должен?
Ладно, попробую что-нибудь сочинить.
[spoiler][code]((id, g, css) => {
addDestructor(r => r[5] == "e" && g[id]?.destroy(true));
if (g[id]) return;
var btnActions = ["update-check", "preferences", "toggle-disabled", "remove", "install-update"];
var noLabs = ["update-check", ];
var icons = {
"update-check": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAACVUlEQVQ4jXWT30vTYRTGP3Mb+ZbiXmm6DGUO0pkQGQR2URBdKZWWIHRlFHYhXnQRdVUEBUn/gBddFZERaalUoAUhYUglVIjO5TKbjMDtq2vDQ9t8u0jnr3Xgvfuch/M87zk2rTX/K+u05QROUMBVlrmkn+lvWxlHzsbjVj4uzlHFFec15/7UYCrFU6xcrF0ptbn5jNVADS9o47yvxed24yZRnchLz6dbpUSUlMhHNavSa3zeNskMIZzYOQChPyGmolNIXGz+Tn/lvu59d6jhtdVkZX1vm0AFVFSKpZfPNHKQ3SSBPsxCfMEWi8Rwtbkq5L3UqnH1OCtgNVleqRaf+MUjXrH0Sx2TUuklQAt+
gBrowser.docShell.allowJavascript = !gBrowser.docShell.allowJavascript;
gBrowser.selectedBrowser.messageManager.loadFrameScript(
"data:,docShell.allowJavascript=!docShell.allowJavascript", false
);
mokujin
Так получше?
function sortTabs3() { var num = gBrowser._numPinnedTabs; var tabs = gBrowser.visibleTabs.slice(num); var re = /^https?$/; var sortVal = tab => { var res, uri = tab.linkedBrowser.currentURI; if (re.test(uri.scheme)) try { res = Services.eTLD.getBaseDomain(uri); } catch(ex) { res = uri.asciiHost; } return res ? res + uri.path : "\uffff" + uri.spec; } tabs.sort((a, b) => sortVal(a).localeCompare(sortVal(b))); for(var tab of tabs) gBrowser.moveTabTo(tab, num++); }
Но, не удобно потому что при перезагрузке браузера введенное в поиск значение стирается
Вы не знаете как сделать чтобы после перезапуска значение не стиралось?
Наверно потому, что текстовое поле находится в Shadow DOM.
Можно попробовать добавить зеркальный input для SessionStore.
Например так, в custom_script.js
[spoiler][code](async meds => {
var url = "chrome://global/content/config.js";
var code = Cu.readUTF8URI(Services.io.newURI(url)) + meds;
var newURL = "data:application/javascript;charset=utf-8," + encodeURIComponent(code);
var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup);
globalThis[Symbol("aboutconfig meds")] = ams.registerChrome(
Cc["@mozilla.org/network/protocol;1?name=resource"]
.getService(Ci.nsIResProtocolHandler).getSubstitution("gre"),
[["override", url, newURL]]
);
})(`
addEventListener("DOMContentLoaded", () => {
var input = document.createElement("input");
input.style.cssText = \`
Подправте кнопку Reload user{Chrome, Content}
Уже давно не работает Reload userContent по ПКМ
Ну, попробую, так, разве что чисто формально, это весьма сложно тестировать.
[spoiler][code](obj => {
this.onclick = obj.click.bind(obj);
this.oncontextmenu = obj.contextmenu.bind(obj);
this.tooltipText = "L: Reload userChrome.css\nM: CB Menu\nR: Reload userContent.css";
})({
async click(e) {
if (e.button == 1) return gShowPopup(self);
if (e.button || !this.chromeSheet) return;
await this.reload(this.chromeSheet);
this.restyle(0);
},
re: /^(?:web.*|file|extension|privilegedabout)$/,
get url() {
delete this.url;
return this.url = `chrome://extensions/content/dummy.x${
parseInt(Services.appinfo.platformVersion) >= 74 ? "htm" : "u"
}l`;
},
async contextmenu(e) {
if (e.ctrlKey || e.shiftKey || e.detail != 1 || !this.contentSheetURL) return;
e.preventDefault();
var count = Services.ppmm.childCount, one = count == 1;
var data = await this.re
у вас случаем нет способа вернуть старый вид about:config?
Вид? В смысле выпиленный древесный? Ну, можно файло куда-нибудь переложить.
Такие проекты есть, но основная проблема в локализации,
поэтому её просто берут одну, и хардкодят прямо внутрь xhtml и js.
Могу попробовать сделать перерисовку из CB,
однако там свои проблемы: движуха L10nRegistry —> Rust.
Вобщем, берём zip-архив, извлекаем папку aboutconfig, и кладём её в папку user_chrome_files.
Доступ к странице по адресу chrome://user_chrome_files/content/aboutconfig/config.xhtml
Vitaliy V.
Извиняюсь за Windows-контекст STR, но я просто обратить внимание.
В Firefox 88 завезли баг :usch:
Bug 1691860 - Make context menu separator hiding more robust
STR:
1. ПКМ на изображении.
2. ПКМ на простой (без изображения, без ничего) ссылке.
AR:
В контекстном меню торчит два подряд сепаратора
#context-sep-copylink и #context-sep-setbackground
То есть, видимо, "нам" предлагается вызывать this.contextMenu.showHideSeparators();
Так тоже, вроде, на первый взгляд, работает
[spoiler][code](async cmd => {
var menuitem = document.createXULElement("menuitem");
document.getElementById("context-sendimage").after(menuitem);
menuitem.render = function() {
this.id = "context-viewimageinfo";
this.setAttribute("oncommand", cmd);
this.label = "Информация об изображении";
(this.render = function() {
var {context, browser} = nsContextMenu.contentData || {};
this.hidden = !context?.onImage ||
browse
Записал видео там показаны две проблемы.
Да, весьма наглядно. Но это проблемы старой, неправленной кнопки.
Вот скриншот с видео. Видишь createElement? А должен быть createXULElement.
Раз тулбары колбасит при добавлении кнопки, значит инициализация кнопок не отключена.
Тогда, ещё раз:
1. Копируем длинную custombutton-ссылку из этого поста в буфер обмена.
2. Кликаем правой клавишей мыши по кнопке из видео,
в открывшемся контекстном меню жмём пункт «Обновить кнопку».
Ну, я хотел при изменении прокси-сервера затенять иконку, а при дефолтном прокси возвращать цвет.
То есть, нужно в пятом элементе массива вызвать код или функцию, которая поменяет цвет иконки:
[spoiler]
Нет, ни разу не «то есть». Вообще никак не связанные вещи.
Прокси может быть переключён как угодно, прямо в about:config,
через лисий UI, любым сторо