egorsemenov06
Так всё то же самое
[spoiler][code]/*
onCreated(btn) {
btn.setAttribute("image", "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><path style='fill:none;stroke:context-fill rgb(39, 174, 129);stroke-opacity:context-fill-opacity;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;' d='M12.9 15.3H3.2c-.88 0-1.6-.6-1.6-1.4v-2.7c0-.4.33-.6.74-.6h1.72c.7 0 1.25-.64 1.25-1.2 0-.64-.55-1.15-1.25-1.15H2.34c-.41 0-.74-.32-.74-.68V5.84c0-.81.72-1.48 1.6-1.48h2.36V3.13c0-1.21.93-2.297 2.21-2.419C9.23.57 10.5 1.62 10.5 2.98v1.38h2.4c.9 0 1.5.67 1.5 1.48v8.06c0 .8-.6 1.4-1.5 1.4z'/></svg>");
*/
get icon() {
var icon = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><path style='fill:none;stroke:context-fill rgb(39, 174, 129);stroke-opacity:context-fill-opacity;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;' d='M12.9
egorsemenov06
[spoiler][code]/*
btn.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEX///8/Pz8BAQF8fHwJCQkCAgIJCQl8fHx9fX0AAABJSUkBAQENDQ0wMDBVVVUAAABra2t0dHR7e3thYWEBAQEAAAAAAAABAQEAAAAgICABAQEBAQH8/Pzw8PDp6en39/fj4+Pe3t41V9I/YeWKioqDg4N9fX0jRa8wUrVoaGhkhuxWeNx1dXVCZMhvb28kRqsqTL4KidXxAAAAHHRSTlMAAABndwAAAAA0blVZcm1naWhNa6hrcJ8AAKRU4jk/3gAAAHVJREFUeF6FyMUCwjAUBdEbaQupUMOjqMv/fx1dQN6yZ3aDcWnyw6ezoRWNYc15kqKQZCFlgTKQQwgllL/dn5f3+bPb+6P3CpWNw56srdCZOMzDmA61i8O9nKvRaHLVukEryFKIFtnkj7ENYxmNdd5v+5xj1BcJ/w9Kj6K7ZAAAAABJRU5ErkJggg==";
*/
btn.image = this.icon;
},
get icon() {
var icon = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><path style='fill:context-fill rgb(142, 142, 152);fill-opacity:context-fill-opacity;' d='M0 6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V6zm13 .25v.5c0 .138.112.25.25.25h.5a.25.25 0 0 0 .25-.25v-.5a.25.25 0 0 0-.25-.25h-.5a.2
ожидается открытие последнего использованного меню
Что-то я не припомню, чтобы после confirm'а
вообще ожидалось открытие каких-либо меню.
Но, раз ожидается, возможно, так подойдёт
/* if (conf && !Services.prompt.confirm(null, this.label, "Перезапустить браузер?")) return; */ if (conf) { node.ownerGlobal.event.preventDefault(); if (!Services.prompt.confirm(null, this.label, "Перезапустить браузер?")) { var popup = node.closest("menupopup"); return popup.openPopup(popup.parentNode); } }
управления куками не вызывается, вообще [nightly] падает
Хмм, у меня, с этого окна — не падает.
127.0a1 (2024-04-17) (32-разрядный), но, правда, у меня и кук нет.
Однако, какой-то crash-жести, определённо, завезли целый вагон.
Поэтому, я пока пребываю в состоянии «да шло бы оно всё ...».
Еще fileToBase64 не открывает обзор файлов
[censored]
picker.init(win,
picker.init(win.browsingContext,
тут вообще-то обсуждение скриптов
Это оно и было, разве нет?
он 2020 года
Откуда ты такое взял?
2024-02-19 15:29 PST
Bug 1541233 - Stop loading userContent.css or userChrome.css by default unless a preference is set
Status: RESOLVED FIXED
Milestone: mozilla69
подскажи где ошибка
Консоль подскажет.
Может content заменить на window
вставка спец. символов
raf, вроде, помогает, если ты об этом
/* addEventListener("popupshowing", function ps() { */ addEventListener("popupshowing", async function ps() { /* popup.append(df); */ popup.append(df); await new Promise(requestAnimationFrame);
Т.е. в папке chrome две папки UserChromeFiles ?
Да-да, именно две.
Новоначальный (if any) — разворачивает обе две.
Обновляющийся — заменяет только вторую.
или можно вообще убрать
Не надо ничего нигде убирать.
Идея была услышана, рассмотрена, прикинута, и отвергнута.
Это совершенно нормально, на то оно и обсуждение.
Продолжаем так, как оно есть сейчас,
ещё не хватало чего-то поперёк здорового консерватизма.
вот убрал 1 иконку
Другое дело.
Но, fp.init(window, в трёх местах торчат,
хотя было сказано, что в 125, уже нужно
fp.init(window.browsingContext,
так что нет, не принимается.
Обновил, добавил UcfPrefs.customSandbox, в случае если отключены в настройках фоновые скрипты
вызов UcfPrefs.customSandbox создает песочницу но при этом скрипты если подключены в CustomStylesScripts.mjs не загружаются.
О, замечательно!
Я-то разогнался, словно сандбокс-скриптинг всегда enabled,
а это, конечно же, может быть и не так.
оставил там только то что нужно для редактирования
Кстати, был, когда-то, вообще ультимативный проект.
Обновлять UCF — это тот ещё головняк, поэтому,
идея была в том, чтобы вырезать весь интерналс в отдельную папку.
То есть, в папке user_chrome_files — только пользовательский стафф.
Включая там сугубый пользовательский user_chrome.manifest, для всяких override директив.
UCF'ские иконки, вроде, тоже рассматривались как пользовательские,
поскольку есть любители ещё старых, тёплых, ламповых svg'шек.
А рядом с этой пользовательской папкой user_chrome_files
другая — (условно) user_chrome_files_internal
Там — ве
Затем файл надо перевести в btoa(……) и запомнить новое содержимое в опции.
То есть, содержимое файла как бинарную строку, а не как текст,
ведь btoa() его есть не будет, попробуй с консоли btoa("меню");
Тогда надо ещё делать метод конвертирования настройки в текст,
в смысле не для создания файла,
и метод перегона текста в бинарную строку для для создания файла,
если настройка не существует.
объект меню хранить в опции в виде base64
А зачем? Он от этого только больше станет.
Если имеется в виду, что он будет одной длинной строкой,
то проще заменять переводы строк на что-нибудь другое, и обратно.
Или JSON.stringify() <—> JSON.parse(), правда тогда ненужных слэшей насыпет.
В base64, возможно, лучше если только в gzip, но не всегда, и это заморочно.
Только непонятно, как отследить, что редактор сохранил и закрыл файл ???
Я не знаю что такое «закрыл файл».
Это типа он берёт его в оборот монопольно,
и других к нему даже не подпустит, п
заготовка
[spoiler]Опять CustomizableUI.createWidget() в оконном коде торчит.
Без никаких проверок — в следующем окне будет ошибка.
И дело даже не столько в мусоре в консоли, а в том, что ошибка оборвёт
исполнение кода в обёртке, и последующее определение объекта G не состоится.
Да, я понимаю, ты одноокошечник. И я одноокошечник.
Но раз заявлено стремление в сторону «Пригодиться многим»,
то в таких вопросах неплохо, хотя бы, отдавать себе отчёт.
И даже если проверку делать, то виджет, рождённый в каком-то окне,
зависит от существования этого окна. Если его закрыть, то в другом окне
виджет может перестать работать. Прежде всего, всякий promise async await,
но не только, бывает, что и синхронный код перестаёт работать.
Поэтому, создавать виджет в окне, в общем случае, не рекомендуется.
Лучше, чтобы он рождался в чём-то стабильном, существующем всегда
(но, тогда уже без выкрутасов типа F.nul).
Здесь, проще всего, в SystemGlobal, но там CustomizableUI надо имп
…второй текст получается сразу слитно за первым, с тем же размером шрифта и без переноса…
Ну, переносу-то с чего не работать, должен работать.
А то, что с тем же размером шрифта — так ничего удивительного.
Ты в элемент header добавил вторую текстовую ноду,
откуда для неё другой размер шрифта возьмётся?
Это вот header ещё можно не создавать, а просто написать div.append(head);
Но txt должен быть элементом, чтобы на него другой стиль прицепить.
Ошибка на строке: var header = div.appendChild(doc.createElement("div")).appendChild(new Text());
new win.Text()
Но, если панель создаётся каждый раз новая,
то иметь ссылки на текстовые ноды большого смысла нет.
То есть, можно создать header просто как div, и написать header.append(head);
перенос строки не пашет
white-space: pre-wrap; или типа того.
createElement("div")
Можно и div
[spoiler][code]var ask = (...args) => {
var popup = document.createXULElement("panel");
var popupset = document.getElementById("mainPopupSet");
popup.setAttribute("onpopupshown", "move();");
popup.setAttribute("onpopuphidden", "this.remove()");
var div = popup.appendChild(document.createElement("div"));
div.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px; white-space: pre-wrap;";
var header = div.appendChild(document.createElement("div")).appendChild(new Text());
var footer = div.appendChild(header.parentNode.cloneNode(true));
footer.style.cssText = "font-size: 16px; font-style: italic; margin-top: 1em;";
footer = footer.firstChild;
var hide = () => {
popup.hidePopup();
popup.onclick = null;
}
var {style} = popup;
popup.move = () => {
var sc = window.screen;
var pr = popup.getOute
Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель
Нашёл кого спросить. Ну, допустим, <panel>'ь
[spoiler][code]var ask = (...args) => {
var popup = document.createXULElement("panel");
var popupset = document.getElementById("mainPopupSet");
popup.setAttribute("onpopupshown", "move();");
popup.setAttribute("onpopuphidden", "this.remove()");
var box = popup.appendChild(document.createXULElement("box"));
box.style.cssText = "font-size: 32px; margin: 1em 2em 1.3em 2em; font-weight: bold; max-width: 680px;";
var tn = box.appendChild(new Text());
var hide = () => {
popup.hidePopup();
popup.onclick = null;
}
var {style} = popup;
popup.move = () => {
var sc = window.screen;
var pr = popup.getOuterScreenRect();
popup.moveTo((sc.width - pr.width) / 2, (sc.height - pr.height) / 2.7);
style.opacity = "1";
}
(ask = (text, onclick, timeout = 2e3
…Для чего код? Показать пароль под звездочками в контекстном меню? Вроде такая функция встроена в контекстном меню.
Ну, видимо, есть непреодолимое желание,
чтобы именно по двойному клику.
Но, кстати да, с пунктом контекстного меню,
получается, не гармонирует, переделал как в нём.
Можно Вас попросить
Попросить-то можно, ...
[spoiler][code](frag => {
var g = Cu.getGlobalForObject(Cu);
var ID = `CB${_id.slice(20)}:PasswordTypeToggler`;
var u = code => "data:," + encodeURIComponent(code);
if (!(ID in g)) {
var processURL = u(`(id => globalThis[id] = ${frag})("${ID}");`);
Services.ppmm.loadProcessScript(processURL, true);
g[ID].processURL = processURL;
Services.mm.loadFrameScript(g[ID].frameURL = u(`globalThis["${ID}"].init(this);`), true);
}
addDestructor(reason => {
if (reason[5] != "e" || !(ID in g)) return;
Services.mm.removeDelayedFrameScript(g[ID].frameURL);
Services.mm.loadFrameScript(u(`globalThis["${ID}"].destroy(this);`), false);
Services.ppmm.removeDelayedProcessScript(g[ID].processURL);
Services.ppmm.loadProcessScript(u(`globalThis["${ID}"].forget();`), false);
});
})(`\
{
dblclick(e) {
var trg = e.target, ed = trg.editor;
if (ed instanceof Ci.nsIEditor && ed.flags & ed.eEditorPasswordMask)
trg.rev
Сохраняет только в папку Загрузки по-умолчанию, хотя в настройках выбран другой путь
Попробовал (на 124) воспроизвести — не получилось.
который запоминается в data["browser.download.dir"].set
В data["browser.download.dir"].set ничего не запоминается.
Это геттер, который каждый раз вычисляет путь заново.
Dobrov
IOUtils.writeUTF8(…).catch(log);
или
try {await IOUtils.writeUTF8(…);} catch(ex) {log(ex);}
А оно только активацию дает, открывает так же - в конце других дочерних.
Это слегка сомнительно.
Возможно, речь идёт об инспирации перемещения вкладки аддоном Tree Style Tab.
Попробовал проверить с ним, и, вкладка с картинкой открывается как надо,
но затем, действительно, сразу перепрыгивает за последнюю дочернюю.
Тогда модифицировал код так, чтобы он на какое-то время менял настройку TST
«Если вкладка открывается из существующей вкладки, открыть ее как -»
на «First Child of the parent tab».
И перепрыгивание вкладки с картинкой прекратилось.
Будет ли это полезно — не ясно, расклад ведь неизвестен.
[spoiler][code](async extra => ChromeUtils.defineLazyGetter(
document.getElementById("context-viewimage"), "gContextMenu", () => {
var func = win => {
var cfg = win.configs, key = "autoAttachOnOpenedWithOwner";
var was = cfg[key];
cfg[key] = 6; // kNEWTAB_OPEN_AS_CHILD_TOP
win.setTimeout(() => cfg[key] = was, 500);
}
var url = `data:,(${encodeURICom
как изменить скрипт из расширения
Из какого ещё «расширения»?
Видно же, что скрипт насквозь гуглячий.
Как-то так, наверно
var q = {active: true}; browser.contextMenus.create({ title: "Открыть изображение", contexts: ["image"], onclick: async data => browser.tabs.create({ url: data.srcUrl, index: (await browser.tabs.query(q))[0].index + 1 }) });
как заставить родной пункт контекстного меню [firefox], #context-viewimage, открывать изображения в новой активной вкладке и рядом с родителем?
Может так подойдёт
[spoiler][code](async extra => ChromeUtils.defineLazyGetter(
document.getElementById("context-viewimage"), "gContextMenu", () => {
var vm = eval(
`(function ${nsContextMenu.prototype.viewMedia})`
.replace('"tab";', extra)
.replace(/referrerInfo,/g, "$& forceForeground,")
);
return {viewMedia: e => vm.call(gContextMenu, e)};
}
))("$& var forceForeground = true; gBrowser.clearRelatedTabs();");[/
появляющаяся дополнительная панель перекрывает и верхнюю часть страницы.
Не только страницы, а вообще.
Сайдбар. Какой-нибудь devtools, если «Закрепить справа» (или слева).
А если поставить галку [✔] Размещение под панелью навигации,
то перекрывает Панель закладок (if any).
Это, надо полагать, так и задумано.
Добавлено: упс, уже 57-я страница.
как в нее добавить иконку
Если не стилем, то, где-то перед menuitem.render();
// menuitem.className = "menuitem-iconic"; menuitem.image = "chrome://browser/content/robot.ico";