Полезная информация

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№175103-09-2024 23:06:01

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 129.0

Re: UCF - ваши кнопки, скрипты…

iG0R пишет

Кстати, а как Вы узнали, что я использую старый профиль (от 30.12.2023)?

Предположил по словосочетанию на скрине колёсико/ролик.:)

Отсутствует

 

№175204-09-2024 02:53:27

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

iG0R пишет

Правильно ли я нашел участок кода, отвечающий за всплывающую подсказку над вкладкой?

Да, но как видно в приведённом коде, над вкладкой подсказка только имя вкладки trg.label
Теперь для нового ucf_hookClicks.js в блоке Tag подсказка выключается так: [F.C]: "", … другие подсказки



Обновил демо-профиль, более 600 изменений в файлах, исправил несколько ошибок, сделал доработки согласно пожеланиям, дополнил встроенную справку (доступную в UserMenu по правому клику на unified-extensions), улучшил совместимость.

Отредактировано Dobrov (05-09-2024 01:47:19)

Отсутствует

 

№175304-09-2024 17:41:21

iG0R
Участник
 
Группа: Members
Зарегистрирован: 15-08-2015
Сообщений: 48
UA: Firefox 129.0

Re: UCF - ваши кнопки, скрипты…

xrun1 пишет

Предположил по словосочетанию на скрине колёсико/ролик.:)

ХитрО :)
---

Dobrov пишет

Да, но как видно в приведённом коде, над вкладкой подсказка только имя вкладки trg.label

Возможно ли добавить в неё Preview страницы, чтобы пользоваться только подсказками из пакета UCF?

Отсутствует

 

№175404-09-2024 23:32:14

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: unknown 0.0

Re: UCF - ваши кнопки, скрипты…

iG0R пишет

Возможно ли добавить в неё Preview страницы, чтобы пользоваться только подсказками из пакета UCF?

Нет. Предпросмотр вкладок по наведению и по Ctrl+Tab делается браузером. Проси Dumby или ищи расширение, мой скрипт, отображающий подсказки, предназначен для другого — описание в первой строке.

Отсутствует

 

№175505-09-2024 09:07:56

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

iG0R
А у меня есть такой скрипт, но тебе не дам, ищи сам. )

скрытый текст
2024.09.05_091051.png

Отредактировано _zt (05-09-2024 09:12:59)

Отсутствует

 

№175605-09-2024 14:27:42

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

iG0R здесь есть TST TabPreview.mjs
но включение эскизов работает на [firefox] 128 без скрипта: browser.tabs.hoverPreview.enabled = true


_zt нечего скрывать чужой труд, это не ваш скрипт, вы сами попрошайничаете:
И, пожалуйста, переделайте в mjs jsm-ки: … TST TabPreview

Отредактировано Dobrov (05-09-2024 14:59:09)

Отсутствует

 

№175705-09-2024 18:20:38

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

Dobrov
Сам то понял на что ссылку дал? :)

Отсутствует

 

№175820-09-2024 09:43:47

Den199
Участник
 
Группа: Members
Зарегистрирован: 26-06-2024
Сообщений: 7
UA: Firefox 132.0

Re: UCF - ваши кнопки, скрипты…

Можно ли с помощью UCF добавить в контекстное меню, вызываемое кликом правой кнопки мыши на странице, добавить свой пункт?
Возможно есть какой-то готовый шаблон (без излишеств) для создания кастомного пункта/кнопки?


Firefox 128 (64-bit) on windows 10 (64-bit).

Отсутствует

 

№175920-09-2024 13:33:21

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

Den199
в шапке Контекстное меню "Открыть ссылку в…"
Если клик не по ссылке, берёт адрес страницы. Код действий можно вбить произвольный и пункты меню назвать как нужно…

Отсутствует

 

№176024-09-2024 16:25:18

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 130.0

Re: UCF - ваши кнопки, скрипты…

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);
---
Понимаю, что вопрос глупый и всё же: какой способ, на твой взгляд, правильней для очистки (удаления) данных буфера обмена?

Отсутствует

 

№176125-09-2024 02:16:21

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

xrun1
замечу: в МакОС (вставка по ^+Y) и Линукс (колёсико мыши) есть второй буфер обмена, работающий штатно, без сторонних приложений.

Отсутствует

 

№176225-09-2024 08:42:04

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

xrun1 пишет

способах очистки буфера обмена.

Системная очистка не подойдет? http://clipdiary.com/rus/clear-clipboard/

Отсутствует

 

№176325-09-2024 17:16:12

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

xrun1 пишет

какой способ, на твой взгляд, правильней для очистки (удаления) данных буфера обмена?

Всё ещё склоняюсь избегать обсуждения вопроса "правильности".
Скажу так: утилита 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)

Отсутствует

 

№176426-09-2024 02:34:17

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 130.0

Re: UCF - ваши кнопки, скрипты…

Dobrov пишет

замечу: в МакОС (вставка по ^+Y) и Линукс (колёсико мыши) есть второй буфер обмена

Интересно. Я в этих системах в такие системные дебри работы с буфером не забирался. Всё было проще и утилитарнее: в макОС графика и вёрстка, в линукс скрипты на перле - вытащить данные из баз и конвертнуть в Excel для Windows.
fuchsfan
Спасибо. Можно nircmd.exe clipboard clear

Dumby пишет

Всё ещё склоняюсь избегать обсуждения вопроса "правильности".

Я помню. Спасибо.
Меня зацепил комментарий к 2-му способу.

скрытый текст

// This clears the logical clipboard, doesn't remove data.
/* Это очищает логический буфер обмена, но не удаляет данные. */

Скопировал --> очистил 2-м способом. И так 100500+ раз. Буфер чистый, но данные в памяти остались. Т.е. память занята и свободная уменьшается по мере копирования. Мне стало интересно, может ли это привести к падению системы или браузера из-за отсутствия свободной памяти? Чисто гипотетически и теоретически.
Практически, наверное, можно посмотреть на память, если впихнуть что-то в браузер на 100 Мб и проделать раз 10...
Хотелось узнать мнение коллег, но это флуд в теме.:(

Отсутствует

 

№176527-09-2024 22:09:34

CoolCmd
Участник
 
Группа: Members
Зарегистрирован: 29-09-2008
Сообщений: 688
UA: Firefox 130.0

Re: UCF - ваши кнопки, скрипты…

в tor browser в файле Tor Browser\Browser\browser\omni.ja\defaults\preferences\000-tor-browser.js
есть такая строчка:

Выделить код

Код:

pref("privacy.resistFingerprinting", true, locked);

из-за locked я не могу в user.js задать эту настройку. менять omni.ja - это плохой вариант.
мне нужно, чтобы настройка всегда была равна false. как это сделать? как я понимаю, нужно создать Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefService)
и дальше чета с ним сделать...


леса живет в лису?

Отсутствует

 

№176628-09-2024 09:32:16

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

CoolCmd пишет

мне нужно, чтобы настройка всегда была равна false

Я попробовал в Tor Browser 13.5.5 добавить в config-prefs.js
pref("privacy.resistFingerprinting", false, locked);


и мне, как about:config, так и консоль с кода
Services.prefs.getBoolPref("privacy.resistFingerprinting");
показывают false

Отсутствует

 

№176728-09-2024 11:17:02

CoolCmd
Участник
 
Группа: Members
Зарегистрирован: 29-09-2008
Сообщений: 688
UA: Firefox 130.0

Re: UCF - ваши кнопки, скрипты…

Dumby спасибо, работает


леса живет в лису?

Отсутствует

 

№176828-09-2024 13:55:14

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 130.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Возвращаясь к напечатанному №1760, просто для информации.
В WinXP была утилита для просмотра буфера обмена clipbrd.exe, до сих пор иногда пользуюсь. На третий способ показывает

скрытый текст
Image005_2024-09-27_17-38.png

После применения способов 1), 2) или "nircmd.exe clipboard clear" там чисто.
кнопка

Выделить код

Код:

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) {}

Отсутствует

 

№176901-10-2024 12:45:28

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 127.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Виталий недавно исправлял (для FF128), а в [firefox] 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»

Отсутствует

 

№177001-10-2024 13:43:59

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 306
UA: Google 2.1

Re: UCF - ваши кнопки, скрипты…

unter_officer
Поисковые расширения медленно, но верно отключают...
Но вы можете попробовать вместо ID использовать Name

скрытый текст

Выделить код

Код:

```Diff
- Services.search.getEnginesByExtensionID("google@search.mozilla.org") 
+ Services.search.getEngineByName("Google")

```


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№177102-10-2024 09:50:52

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

xrun1 пишет

утилита для просмотра буфера обмена 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)

Farby пишет

вместо 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

toolbars.js

Выделить код

Код:

/*
        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);


UcfPrefs.mjs

Выделить код

Код:

/*
    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);}
        });
    },

Отсутствует

 

№177202-10-2024 12:24:40

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 131.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

вместо ExtensionID использовать Name или Id

Dumby, большое спасибо.


«The Truth Is Out There»

Отсутствует

 

№177302-10-2024 19:04:37

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 131.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Спасибо за развёрнутый ответ. Я тоже поковырялся и пришёл к второму способу.

Отсутствует

 

№177404-10-2024 14:39:53

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 131.0

Re: UCF - ваши кнопки, скрипты…

Dumby
Возможно ли сделать скрипт, который решал бы такие задачи?
1. При добавлении закладки (Ctrl+D) не появлялось подобное окно.
dobavit_zakladku.png
2. Закладка всегда(!) сохранялась бы на Панедь закладок, даже если аналогичная заклака уже существует в какй либо папке закладок или на Панели закладок.
3. Если закладка уже существует в какой либо папке закладок или на Панели закладок, то при сохранении новой аналогичной закладки, существующая закладка из той папки закладок или с Панели закладок не удалялась.


P.S. Надеюсь, не очень путанно описал свою хотелку.


«The Truth Is Out There»

Отсутствует

 

№177505-10-2024 01:06:53

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 475
UA: Firefox 128.0

Re: UCF - ваши кнопки, скрипты…

unter_officer - именно делает скрипт ucf_hookClicks.js из демо-профиля.
Как обычно, ответ стандартный – «Читайте шапку!» вторая строка справки из шапки:
…Добавить закладку без запроса…


вот код функции, можете вырезать его в ваш скрипт, только подсказка берётся отсюда

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]