Правильно ли я нашел участок кода, отвечающий за всплывающую подсказку над вкладкой?
Да, но как видно в приведённом коде, над вкладкой подсказка только имя вкладки trg.label
Теперь для нового ucf_hookClicks.js в блоке Tag подсказка выключается так: [F.C]: "", … другие подсказки
Обновил демо-профиль, более 600 изменений в файлах, исправил несколько ошибок, сделал доработки согласно пожеланиям, дополнил встроенную справку (доступную в UserMenu по правому клику на unified-extensions), улучшил совместимость.
Отредактировано Dobrov (05-09-2024 01:47:19)
Отсутствует
Предположил по словосочетанию на скрине колёсико/ролик.
ХитрО
---
Да, но как видно в приведённом коде, над вкладкой подсказка только имя вкладки trg.label
Возможно ли добавить в неё Preview страницы, чтобы пользоваться только подсказками из пакета UCF?
Отсутствует
Возможно ли добавить в неё Preview страницы, чтобы пользоваться только подсказками из пакета UCF?
Нет. Предпросмотр вкладок по наведению и по Ctrl+Tab делается браузером. Проси Dumby или ищи расширение, мой скрипт, отображающий подсказки, предназначен для другого — описание в первой строке.
Отсутствует
iG0R здесь есть TST TabPreview.mjs
но включение эскизов работает на 128 без скрипта: browser.tabs.hoverPreview.enabled = true
_zt нечего скрывать чужой труд, это не ваш скрипт, вы сами попрошайничаете:
И, пожалуйста, переделайте в mjs jsm-ки: … TST TabPreview
Отредактировано Dobrov (05-09-2024 14:59:09)
Отсутствует
Можно ли с помощью UCF добавить в контекстное меню, вызываемое кликом правой кнопки мыши на странице, добавить свой пункт?
Возможно есть какой-то готовый шаблон (без излишеств) для создания кастомного пункта/кнопки?
Firefox 128 (64-bit) on windows 10 (64-bit).
Отсутствует
Den199
в шапке Контекстное меню "Открыть ссылку в…"
Если клик не по ссылке, берёт адрес страницы. Код действий можно вбить произвольный и пункты меню назвать как нужно…
Отсутствует
Dumby, приветствую!
На руборде в личной переписке с одним товарищем рассуждали о способах очистки буфера обмена. Нашли три.
1)
let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
clipboard.copyString("");
2) из глубин omni.ja
// This clears the logical clipboard, doesn't remove data.
Services.clipboard.emptyClipboard(Ci.nsIClipboard.kGlobalClipboard);
3) строчку закомментарил я, у меня с ней не работает. И что здесь лишнего?
let emptyStr = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
let trans = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
// trans.init(getLoadContext());
trans.clearAllData();
trans.addDataFlavor("utiputi");
trans.setTransferData("utiputi", emptyStr);
Services.clipboard.setData(trans, null, Ci.nsIClipboard.kGlobalClipboard);
---
Понимаю, что вопрос глупый и всё же: какой способ, на твой взгляд, правильней для очистки (удаления) данных буфера обмена?
Отсутствует
способах очистки буфера обмена.
Системная очистка не подойдет? http://clipdiary.com/rus/clear-clipboard/
Отсутствует
какой способ, на твой взгляд, правильней для очистки (удаления) данных буфера обмена?
Всё ещё склоняюсь избегать обсуждения вопроса "правильности".
Скажу так: утилита InsideClipboard показывает мне, что
Способ 1) пишет в буфер два формата
CF_TEXT — один нулевой байт и CF_UNICODETEXT — два нулевых байта.
Способ 2) очищает буфер полностью.
Способ 3) пишет в буфер один формат "utiputi" — два нулевых байта,
что, для данной задачи, является избыточным.
Если убрать всё лишнее, то есть оставить только
Services.clipboard.setData(
Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable),
null,
Ci.nsIClipboard.kGlobalClipboard
);
то результат будет такой же, как и у способа 2)
Отсутствует
замечу: в МакОС (вставка по ^+Y) и Линукс (колёсико мыши) есть второй буфер обмена
Интересно. Я в этих системах в такие системные дебри работы с буфером не забирался. Всё было проще и утилитарнее: в макОС графика и вёрстка, в линукс скрипты на перле - вытащить данные из баз и конвертнуть в Excel для Windows.
fuchsfan
Спасибо. Можно nircmd.exe clipboard clear
Всё ещё склоняюсь избегать обсуждения вопроса "правильности".
Я помню. Спасибо.
Меня зацепил комментарий к 2-му способу.
// This clears the logical clipboard, doesn't remove data.
/* Это очищает логический буфер обмена, но не удаляет данные. */
Скопировал --> очистил 2-м способом. И так 100500+ раз. Буфер чистый, но данные в памяти остались. Т.е. память занята и свободная уменьшается по мере копирования. Мне стало интересно, может ли это привести к падению системы или браузера из-за отсутствия свободной памяти? Чисто гипотетически и теоретически.
Практически, наверное, можно посмотреть на память, если впихнуть что-то в браузер на 100 Мб и проделать раз 10...
Хотелось узнать мнение коллег, но это флуд в теме.
Отсутствует
в tor browser в файле Tor Browser\Browser\browser\omni.ja\defaults\preferences\000-tor-browser.js
есть такая строчка:
из-за locked я не могу в user.js задать эту настройку. менять omni.ja - это плохой вариант.
мне нужно, чтобы настройка всегда была равна false. как это сделать? как я понимаю, нужно создать Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefService)
и дальше чета с ним сделать...
леса живет в лису?
Отсутствует
мне нужно, чтобы настройка всегда была равна false
Я попробовал в Tor Browser 13.5.5 добавить в config-prefs.js
pref("privacy.resistFingerprinting", false, locked);
и мне, как about:config, так и консоль с кода
Services.prefs.getBoolPref("privacy.resistFingerprinting");
показывают false
Отсутствует
Dumby
Возвращаясь к напечатанному №1760, просто для информации.
В WinXP была утилита для просмотра буфера обмена clipbrd.exe, до сих пор иногда пользуюсь. На третий способ показывает
try { CustomizableUI.createWidget({ id: "add-additional-clearbuffer-button", label: "Очистить буфер", tooltiptext: "Очистить буфер обмена", onCreated: btn => btn.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1gQUDhI4eCDW3QAAAoFJREFUOMuNkl1Ik2EUx//ned69m9pc2nTMULPyI/yoFBLxojWxjLBuwktRRqYEkh9dpmE3kauboIHdRHUl3ZhQYClEhZkhQ1fiCCTLL3Qudc2923yfLpprIGr/q8PhOb9znv85hD10s6M9K9GQWMpIPAIQD2BRVanmRnvHewCQdivutncdYkx8AIShurpGl2JMZVpdvPLQcfc+gFPbAN322wwAA0Q+ES4TidaGK9fjA4EAJEmCEAKMsSS93qB//MTRUFfb1EORTjnERA8EOYlEfYTHbLbmuHAoxMPhMMLhEIxGE1yusVBaWsbgwJv+3LrapsPUbe8yMyZena28VDTwug+NV1tJVVV4PEuQZS00Gg18vnX4fGsAcbinXGGL5Rz6+ntfeJY99YwIjQDStVqZMjOyKBgMIhAIYHr6G+bnZ7Gx4YckafDj5wzW1rywWs/zkZF3qndl+SKASgkkqmy25sRfXg8URcHQ0EtUVFxAgvMLJlvaMBnj0QqAaYAAyCYAv0+XOSQCSgjgsqyDxVIFp/MTxsY+Yq6lDeXWjB03pCqbGH47nCIl7NPD7/cJIkZCCAgh/v43okOD36G4J+DKLQIAFEyNQ5tTCPfxVACARMQWOefmzU0Bzjmys49hddWLLYTinoA2pxAlQkShinsiGjNVVUeJmIiL00Gj0cBkMiM52Rh9sNU5VrE5SZblI73Pn87sNyRlEmN0INkIzjn+V4xz/sDv33AsLMzOFZ8oDWYfzYPb/TU6b8HU+Lai2BxtBfZ7XXeIRG3xydIUszkdn/PypXJrxq4mjo4v/QNETjoXhDOMxDVTa2dBWflBhNeDO46/DRCrZ0AngFt7WND7B7pB9xb6bPwiAAAAAElFTkSuQmCC", onCommand: function(event) { // https://forum.mozilla-russia.org/viewtopic.php?pid=811013#p811013 // 1) // let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); // clipboard.copyString(""); // 2) // Services.clipboard.emptyClipboard(Ci.nsIClipboard.kGlobalClipboard); // 3) Services.clipboard.setData( Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable), null, Ci.nsIClipboard.kGlobalClipboard ); var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); alertsService.showAlertNotification("chrome://browser/skin/customizableui/whimsy.png", "Clipboard", "Буфер обмена очищен!"); setTimeout(() => alertsService.closeAlert(), 2000); } }); } catch(e) {}
Отсутствует
Dumby
Виталий недавно исправлял (для FF128), а в 131 опять сломали.
Консоль пишет: TypeError: engine[0] is undefined
Если не трудно, поправьте пожалуйста.
// // Заменить значок Google-поисковика (FF128) ..... // Services.search.getEnginesByExtensionID("google@search.mozilla.org").then(engine => engine[0].getIconURL = async () => "chrome://user_chrome_files/content/icon/google.ico" );
«The Truth Is Out There»
Отсутствует
unter_officer
Поисковые расширения медленно, но верно отключают...
Но вы можете попробовать вместо ID использовать Name
```Diff - Services.search.getEnginesByExtensionID("google@search.mozilla.org") + Services.search.getEngineByName("Google") ```
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
утилита для просмотра буфера обмена clipbrd.exe
О, интересная штука. Показывает даже то, чего не показывает InsideClipboard
После применения способов 1) ... там чисто.
Ну где же чисто, когда нет
data:image/png;base64,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
Вот после применения способа 2) — совершенно чисто.
На третий способ показывает
Действительно, торчат DataObject и Ole Private Data
Кстати, поискал коммент «This clears the logical clipboard, doesn't remove data».
Есть такой в PlacesController. В idl'ке — нечто похожее:
* This empties the clipboard and notifies the clipboard owner.
* This empties the "logical" clipboard. It does not clear the native clipboard.
Но что-то мне сомнительно, выглядит как раз наоборот.
Если я правильно понял, там используется OleSetClipboard(null), и если запускаю
(url => { var {ctypes} = ChromeUtils.importESModule(url); var ole32 = ctypes.open("ole32.dll"); ole32.declare("OleSetClipboard", ctypes.winapi_abi, ctypes.long, ctypes.voidptr_t)(null); ole32.close(); })("resource://gre/modules/ctypes.sys.mjs");
то clipbrd.exe также показывает, что очистка полная.
Так вот, там, в PlacesController, в следующей функции, используется способ 3)
но формат-пустышку всё таки добавляют, и такое объяснение:
// Empty transferables may cause crashes, so just add an unknown type.
Ремарка почтенного возраста, например, в Firefox 28 она уже есть,
возможно устарела, но всё равно стрёмно.
А раз очистка ещё и не полная, то я склоняюсь к предпочтению способа 2)
вместо ID использовать Name
вместо ExtensionID использовать Name или Id
(async icon => { await Services.search.promiseInitialized; icon = Promise.resolve(icon); Services.search.getEngineById("google") .wrappedJSObject.getIconURL = () => icon; })("chrome://user_chrome_files/content/icon/google.ico");
В Firefox 131 немного покусали UCF.
Bug 1896764 - onViewToolbarsPopupShowing and ToolbarContextMenu should move out of browser.js
То есть, создание ToolbarContextMenu переместили в модуль,
и onViewToolbarsPopupShowing() туда же, из окна в этот ToolbarContextMenu.
В результате, в тулбарском контекстном меню
пропали пункты переключения нижнего и вертикального тулбаров.
У себя пока сделал так, перенёс часть кода из toolbars.js в UcfPrefs.mjs
/* var newStrFn; if (toolbarcreate) { window.addEventListener("toolbarvisibilitychange", this); window.addEventListener("unload", () => this.destructor(), { once: true }); let oVTC = window.onViewToolbarCommand; if (typeof oVTC === "function") { let strFn = `${oVTC}`, regExr = /(BrowserUsageTelemetry\s*\.\s*recordToolbarVisibility\s*\(\s*toolbarId.+?\)\s*\;)/g; if (regExr.test(strFn)) { newStrFn = `window.onViewToolbarCommand = ${strFn.replace(/^(async\s)?.*?\(/, `$1function ${oVTC.name}(`) .replace(regExr, 'if (!/ucf-additional-.+?-bar/.test(toolbarId)) { $1 }')};`; } } } if (externalToolbars) { let oVTPS = window.onViewToolbarsPopupShowing; if (typeof oVTPS === "function") { let strFn = `${oVTPS}`, regExr = /toolbarNodes\s*=\s*gNavToolbox\s*\.\s*querySelectorAll\s*\(\s*\"\s*toolbar\s*\"\s*\)/g; if (regExr.test(strFn)) { newStrFn = `${newStrFn}${"\n"}window.onViewToolbarsPopupShowing = ${strFn.replace(/^(async\s)?.*?\(/, `$1function ${oVTPS.name}(`) .replace(regExr, 'toolbarNodes = Array.from(document.querySelectorAll("toolbar[toolbarname]"))')};`; } } } if (!newStrFn) return; UcfPrefs.setSubToolbars(newStrFn); ChromeUtils.compileScript("resource://ucf_on_view_toolbars").then(script => script.executeInGlobal(window)); */ toolbarcreate && UcfPrefs.handleToolbars(window, externalToolbars);
/* setSubToolbars(newStrFn) { this.setSubToolbars = () => {}; Services.io.getProtocolHandler("resource") .QueryInterface(Ci.nsIResProtocolHandler) .setSubstitution("ucf_on_view_toolbars", Services.io.newURI(`data:charset=utf-8,${encodeURIComponent(newStrFn)}`)); }, */ handleToolbars: function handleToolbars(win, externalToolbars) { if ((handleToolbars.wins ??= new Set()).add(win).size > 1) return; var rph = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler); var resURL = (code, sfx = "") => { var subst = "ucf_on_view_toolbars" + sfx rph.setSubstitution(subst, Services.io.newURI("data:charset=utf-8," + encodeURIComponent(code))); return "resource://" + subst; } var script = 'window.addEventListener("toolbarvisibilitychange", ucf_toolbars);\n' + 'window.addEventListener("unload", () => ucf_toolbars.destructor(), {once: true});'; var oVTC = win.onViewToolbarCommand; if (typeof oVTC === "function") { var strFn = `${oVTC}`, regExr = /(BrowserUsageTelemetry\s*\.\s*recordToolbarVisibility\s*\(\s*toolbarId.+?\)\s*\;)/g; if (regExr.test(strFn)) { script += `\nwindow.onViewToolbarCommand = ${strFn.replace(/^(async\s)?.*?\(/, `$1function ${oVTC.name}(`) .replace(regExr, 'if (!/ucf-additional-.+?-bar/.test(toolbarId)) { $1 }')};`; } } if (externalToolbars) { var tcm = win.ToolbarContextMenu; var navToolbars = 'gNavToolbox.querySelectorAll("toolbar")'; var oVTPS = tcm.onViewToolbarsPopupShowing || win.onViewToolbarsPopupShowing; if (typeof oVTPS == "function" && (strFn = String(oVTPS)).includes(navToolbars)) { strFn = strFn.replace(navToolbars, 'Array.from(document.querySelectorAll("toolbar[toolbarname]"))'); if (strFn.startsWith("f")) script += "\n" + strFn; else { var key = "temp_ToolbarContextMenu"; var code = `Object.assign(${key}, {${strFn.replace("gNavToolbox", "window: lazy")}});`; globalThis[key] = tcm; ChromeUtils.compileScript(resURL(code, "_mjs")) .then(ps => ps.executeInGlobal(globalThis), Cu.reportError) .finally(() => delete globalThis[key]); } } } var func; ChromeUtils.compileScript(resURL(script)).then( ps => func = win => ps.executeInGlobal(win), ex => func = () => Cu.reportError(ex) ).finally(() => { this.handleToolbars = func; for(var win of handleToolbars.wins) try {func(win);} catch(ex) {Cu.reportError(ex);} }); },
Отсутствует
вместо ExtensionID использовать Name или Id
Dumby, большое спасибо.
«The Truth Is Out There»
Отсутствует
Dumby
Возможно ли сделать скрипт, который решал бы такие задачи?
1. При добавлении закладки (Ctrl+D) не появлялось подобное окно.
2. Закладка всегда(!) сохранялась бы на Панедь закладок, даже если аналогичная заклака уже существует в какй либо папке закладок или на Панели закладок.
3. Если закладка уже существует в какой либо папке закладок или на Панели закладок, то при сохранении новой аналогичной закладки, существующая закладка из той папки закладок или с Панели закладок не удалялась.
P.S. Надеюсь, не очень путанно описал свою хотелку.
«The Truth Is Out There»
Отсутствует
unter_officer - именно делает скрипт ucf_hookClicks.js из демо-профиля.
Как обычно, ответ стандартный – «Читайте шапку!» вторая строка справки из шапки:
…Добавить закладку без запроса…
вот код функции, можете вырезать его в ваш скрипт, только подсказка берётся отсюда…
Отсутствует