попробуй заменить на item.addEventListener("command", cmd);
Я так переделал, и всё работает: item.onclick = cmd
Менюшка в оконном скрипте потому, что там весь основной код – перехват кликов и прочие функции.
Помогите решить задачу:
Кнопка не видит функции, прописанные перед CustomizableUI.createWidget(… ?
на первой строке меню ошибка: Uncaught ReferenceError is not defined
Если убрать «var», то код работает, но мусорит переменными в окно браузера.
[spoiler=Как «пробросить» нужные функции, которых много ? (BrowserReloadEx и прочие)][code](async id => { // UserMenu
var BrowserReloadEx = (skip) =>{ // ошибка –> Uncaught ReferenceError is not defined
if(parseInt(Services.appinfo.version) < 126)
skip ? BrowserReloadSkipCache() : BrowserReload();
else
skip ? BrowserCommands.reloadSkipCache() : BrowserCommands.reload();
},
G = { v: "permissions.default.image",
Pref(key,set){key = [key];
var t = Services.prefs.getPrefType(key[0]), m = {b:"Bool",n:"Int",s:"String"};
t = m[t == 128 ? "b" : t == 64 ? "n" : t == 32 ? "s" : ""];
if (!t) t = m[set != undefined ? (typeof set)[0] : (typeof key[1])[0]];
if (t) if (set != undefined)
Services.prefs[`set${t}Pref`](key[0],set)
el
Bug 1880914
этот баг закрыт и он 2020 года.
P.S. тут вообще-то обсуждение скриптов, кнопок… Нужно отдельную тему создать для багов и особенностей версий Firefox!
и каким образом оконный скрипт увидит globalThis background скрипта (если UcfPrefs.customSandbox не использовать)
globalThis[Symbol.for('UcfGlob')] = this.UcfGlob; - общие функции в scriptsbackground:
UcfGlob = Cu.getGlobalForObject(Cu)[Symbol.for("UcfGlob")]; // код оконного скрипта из scriptschrome:
Поэтому, создавать виджет в окне, в общем случае, не рекомендуется.
……проще всего, в SystemGlobal, но там CustomizableUI надо импортировать.
Хорошо бы, конечно, в сандбоксе UCF, но в окне нет туда прямых ссылок.
Vitaliy V.
В новой версии можно проще общие объекты подключать к UCF вместо браузера?
У меня пока так: в скрипте scriptsbackground: общий объект для вызова из scriptschrome: кода
globalThis[Symbol.for('UcfGlob')] = this.UcfGlob; //общие функции
И почему CustomStylesScripts.mjs расположен отдельно? Ведь после добавления скриптов его надо править (пока не будет GUI-менеджера подключенных скриптов/стилей)
Вообще, в ReadMe не хватает описания функций UserChromeFiles, т.е. нет авторской рекламы! :)
И если убраны файлы стилей, то хотя бы сохранить их закомментированными в stylesall: [ // For all documents
{ path: "custom_styles_all_agent.css", type: "AGENT_SHEET"},
следует понимать, что если в настройку писать больше четырёх килобайт — получим Warning в консоль.
Dumby – спасибо за изменяемое пользователем меню, потестирую!
Наверное, код станет проще без диалога настройки, если объект меню хранить в опции в виде base64.
Для изменения меню создавать временный файл через atob(MyMenuSource) и править его в редакторе по-умолчанию.
Только непонятно, как отследить, что редактор сохранил и закрыл файл ??? Затем файл надо перевести в btoa(……) и запомнить новое содержимое в опции.
Т.е когда редактор по-умолчанию является многовкладочным типа SublimeText и при закрытии файла сам не закрывается…
раз заявлено стремление в сторону «Пригодиться многим», то в таких вопросах неплохо, хотя бы, отдавать себе отчёт.
java API браузеров сложна для меня, только чужие примеры переделываю. Не нашёл статей, где можно последовательно изучить API браузеров с нуля, от developer.mozilla.org толку мало.
…Ну и может совет, как лучше запускать для теста другие профили?
Профили могут требовать и разные версии браузеров.
[spoiler=Ява код не нужен, проще VBS ярлык запускать в Windows:][code]Set WshShell = CreateObject("WScript.Shell")
CurrPath = CreateObject("Scripting.FileSystemObject").GetFile(WScript.ScriptFullName).ParentFolder
ProfileDir = CurrPath & "\ProfileDobrov"
ProfileUser = "C:\UserTarget\MozillaFirefox\ProfileDobrovRAM"
ProfileCD = CurrPath & "\ProfileDobrov"
RamDir = "R:\UserTarget\MozillaFirefox\ProfileDobrov"
If CreateObject("Scripting.FileSystemObject").FolderExists(RamDir) Then
' CurrPath = FirefoxDir
WshShell.Run "cmd /c @echo " & chr(007), 0, false
End If
If CreateObject("Scripting.FileSystemObject").FolderExists(ProfileUser) Then
ProfileDir = ProfileUser
End If
If CreateObject("Scripting.FileSystemObject").FolderExists(ProfileCD) Then
ProfileDir = ProfileCD
End If
' result = WshShell.Popup(ProfileDir, 3, "FireFox", vbQuestion)
WshShell.Ru
Dumby спасибо, сделал! Вот ещё хотелка для любителей ярлыков любых прог: :)
В кнопке «Меню пользователя» создавать последний пункт меню из опции, загружаемой из about:config.
т.е. для последней строки должно быть изменяемое свойство объекта, которое можно править каким либо образом.
Нужно по правому клику открыть диалог правки последней строки меню с её свойствами – т.е. данными в MenuItem{………}.
имя MenuItem не менять (для обращения из другой части кода), а имя строки меню и всё содержимое сделать изменяемым.
Если сложно, то можно не включать функционал upd() – автообновляемая строка меню с renderedOnce.
Но в идеале перед открытием меню из about:config лучше брать весь объект MyMenu, но не представляю, как это сделать…
Пригодиться многим: возможность вбить код, делающий то, что нужно юзеру. После правки строка меню должна измениться.
[spoiler=Меню пользователя - заготовка][code](a
Dumby =>
Я переделал код, но не получается вставить второй блок текста с другим стилем.
второй текст получается сразу слитно за первым, с тем же размером шрифта и без переноса…
var header = wary.appendChild(document.createElement("div")); header.append(head); var txt = header.appendChild(new Text());
Dumby – исчезающая панель не пашет в UCF scriptsbackground [System Principal] (custom_script.js) :(
но код без win. работает нормально в режиме scriptschrome: document [ChromeOnly]
[spoiler=Ошибка на строке: var header = div.appendChild(doc.createElement("div")).appendChild(new Text());][code]// ChromeUtils.domProcessChild.childID || ({…………………………
getwin(){ //self = Services.obs.addObserver(self = this, topic); //в custom_script.js
return this.ownerGlobal || Services.wm.getMostRecentWindow("navigator:browser");
},
ask(head, run, info = "", sec = 3, x, y = 58, win = self.getwin()){ // x < 0 отсчёт смещения справа
var doc = win.document, wary = doc.createXULElement("panel"), popupset = doc.getElementById("mainPopupSet");
wary.setAttribute("onpopupshown", "move()"); wary.setAttribute("onpopuphidden", "this.remove()");
var div = wary.appendChild(doc.createElement("div"));
var header = div.appendChild(doc.createElement("div")).appendChild(new Text());
var txt = div.append
Dumby спасибо! Но перенос строки не пашет!
И желательно добавить ниже мелким шрифтом текст пояснения, например: выполнение команды «format C:»
нашёл только такой способ:
// var tn = box.appendChild(new Text()); const div = document.createElement("div"); var tn = box.appendChild(div); div.insertAdjacentHTML("afterbegin", '<p>afterbegin - В начало элемента</p>'); div.insertAdjacentHTML("beforeend", '<p>beforeend - В конец элемента</p>');
Dumby придумай исчезающий диалог !
Идея такая: при опасных действиях (перезапуск браузера и т.п.) открываем диалог с текстом предупреждения или панель или подсказку.
Диалог или панель должны исчезнуть через пару секунд, не выполняя опасную команду.
Если юзер кликнул по кнопке «Да» или по форме/панели/предупреждению с текстом, то выполняем опасное действие.
VORON - надо прописать скрипты в CustomStylesScripts.mjs.
В демо-профиле всё уже сделано, читайте шапку темы.
Оптимизировал скрипты ucf_hookClicks SingleHTML.mjs ClickPicSave.mjs в части глобальных функций.
Клики мыши работают на кнопке "Новая вкладка" и пустой панели (Закрыть вкладки слева/справа от активной), при ошибках сохранения страниц/картинок urlbar мигает красным.
В меню пользователя (правый клик на кнопке Дополнения) «Заметки» запускает свой софт для каждой системы (для Linux не вписал, т.к. нет стандарта да и пользователей только 2%)
Попробовал (на 124) воспроизвести — не получилось.
Отбой, картинка запишется в путь Загрузок по-умолчанию, если запись в другую папку не удалась, например, прав на запись не хватило.
Dumby спасибо!
ещё проблемку со скриптом ClickPicSave.jsm не смог исправить…
Сохраняет только в папку Загрузки по-умолчанию, хотя в настройках выбран другой путь, который запоминается в data["browser.download.dir"].set
[spoiler=ClickPicSave.mjs][code]// by Dumby сохранить картинку колёсиком или перетащив вправо; DBL поиск похожих
export {MouseImgSaverChild, MouseImgSaverParent}; // forum.mozilla-russia.org/viewtopic.php?pid=800469#p800469
var u = {get it() {
delete this.it;
return this.it = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
}};
["E10SUtils", "PrivateBrowsingUtils"].forEach(name => Object.defineProperty(u, name, {
configurable: true, enumerable: true, get() {
var url = `resource://gre/modules/${name}.`;
try {var exp = ChromeUtils.importESModule(url + "sys.mjs");}
catch {exp = ChromeUtils.import(url + "jsm");}
delete this[name];
return this[name] = exp[name];
}
}));
class MouseImgSaverChild extends JSWindowActorChild {
handleEvent(e) { //к
Vitaliy V. - спасибо! При публикации кодов иногда не хватает их краткого описания!
Вопрос: иногда файл пишется в папку с запретом записи или нет места в этой папке.
Как запустить свой код (т.е. предупреждение в лог) при ошибке записи файла?
IOUtils.writeUTF8(dir, data); //нужна проверка на ошибки записи
Vitaliy V.
пресловутый вопрос про вкладки снизу в несколько строк под #nav-bar -
можно сделать вкладки снизу без скрипта, только стилем, учитывая панель меню?
В стиле aris-t2 включаю tabs_multiple_lines.css и в Linux (наверное и в винде) остаётся незакрытой панель меню, появляющаяся лишь при нажатии Alt.
Когда панель меню скрыта, на её месте остаётся пустая панель при подключенном стиле многострочные Вкладки снизу.
[spoiler=Решение для вкладок снизу от Vitaliy V. — стиль и скрипт Firefox 78+][code]@-moz-document url("chrome://browser/content/browser.xhtml") {
/* FIX aris-t2 tabs_below_navigation_toolbar_alt.css */
#main-window[tabsintitlebar][sizemode="maximized"] * #titlebar, #main-window[tabsintitlebar][sizemode="maximized"] #navigator-toolbox #TabsToolbar, #main-window[uidensity=compact][tabsintitlebar][sizemode="maximized"] #navigator-toolbox #TabsToolbar,
#main-window[tabsintitlebar][sizemode="maximized"] #navigator-toolbox #toolbar-menubar[autohide
Vitaliy V. а что делает этот скрипт?
Подключил, но при поиске из строки адреса ничего не изменилось…
Переделал под UCF 2024 коллекцию скриптов и Демо-профиль из шапки темы.
Исправил ошибки в ucf_hookClicks, ClickPicSave.mjs, SingleHTML.mjs, когда не создавались подпапки сохранения картинок.
Для Firefox версий ниже 115 предназначена папка UCF_Firefox 78+, которая и в новых Firefox пока работает.
p.s. форум часто недоступен – 504 Gateway Time-out
Как заметил b0ttle, в новом профиле проблема, что стили/скрипты всегда отключены и нужно открывать опции UCF, затем сбрасывать startupCache (винда иногда глючит и нужно вручную удалять startupCache).
Удобней в UcfPrefs.mjs для совместимости с UserScripts по-умолчанию включить стили и скрипты «Для докум. окна браузера», ведь таких скриптов большинство и нужно, чтоб у начинающего юзера они сразу заработали на чистом профиле.
и ещё не понял, цитата "Проще разные CSS держать" так а что мешает это сделать? в одном файле будет @media (-moz-platform: macos) в другом linux и т.д. и в разные папки можно положить
Нужен Firefox 99+ для @media (-moz-platform:… , у меня как всегда нестандарт - на работе Астра Linux 1.6, где Firefox 84.
если избыток места по ширине, то по высоте для доп. панели как раз и хорошо сделать автоскрытие, мне например неудобно пользоваться верт. панелью
Мне удобна только вертикальная панель, она часто скрыта, там р
…Тестируйте обновление UCF
У меня появляющаяся дополнительная панель перекрывает и верхнюю часть страницы.
Надо-бы брать высоту дополнительной панели под #nav-bar из высоты панели вкладок.
Но хватит одной вертикальной панели, т.к. избыток места на всех мониторах щас тока по ширине.
Вопрос: чем заменить Services.wm.getMostRecentWindow("navigator:browser") на что-то попроще?
Хочу вызывать функцию globalThis[Symbol…… из другого js-кода без аргументов, но выдаёт ошибку win.gBrowser is undefined, если запускать так:
Cu.getGlobalForObject(Cu)[Symbol.for("SingleHTML")]();
пробовал разные варианты, пока в SingleHTML.mjs вписал такой второй аргумент по-умолчанию:
SingleHTML(to = false, win = this.ownerGlobal || Services.wm.getMostRecentWindow("navigator:browser")) {…
unter_officer - код универсальный, вы прочитали середину, но не увидели команду вызова в начале!
Добавить в любую кнопку: Cu.getGlobalForObject(Cu)[Symbol.for("SingleHTML")](true,window);
Кроме того, SingleHTML.mjs позволяет 1) сохранять страницу с выбором папки или автоматически.
2) сохранять в любые папки/подпапки, используя имя вкладки или домен. Пишем "Сайт||Фото|" в extensions.user_chrome_files.savedirs:
сохранение Html/Pics. [Загрузки]/"_Html/subdir|_Pics/subdir" «subdir: пусто | 0 имя страницы | 1 домен»
3) пути/имена страниц меняются на лету из кнопки настроек скрипта ucf_hookClicks.js или правкой extensions.user_chrome_files.savedirs.
Vitaliy V. может сможешь решить давнюю проблему скрипта SingleHTML.mjs ?
Этот код не сохраняет SVG-графику, но работает быстрее, чем дополнение SingleFile и сохраняет страницу более компактно.
https://meteo7.ru/forec
unter_officer на предыдущей странице SingleHTML.mjs сохраняет страницу или выделенное.
vending_machine, vitalii201 - это всё не то.
Пока пользуюсь ImageAssistant, но это расширение только сохраняет все картинки.