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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№1460115-05-2020 14:35:01

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 76.0

Re: Custom Buttons

Dumby

Что с ней не так?

У меня не показывала адрес  закладки при наведении на звездочку. ХЗ что произошло, но теперь всё работает. Сорри.

Совсем недавно Андрей спрашивал.

Спасибо.

Сколько можно одну и ту же xul-xhtml тему мусолить?

Спасибо.

Отредактировано voqabuhe (15-05-2020 14:35:26)

Отсутствует

 

№1460215-05-2020 15:15:09

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 76.0

Re: Custom Buttons

есть такие коды для CB, прекрасно работающие на FF 52 esr
можно ли адаптировать их для user_chrome_files на последнем FF 76?

код №1

Выделить код

Код:

// ЕСЛИ ТЕКУЩАЯ ВКЛАДКА ПУСТАЯ, ТО ОТКРЫВАТЬ ЗАКЛАДКИ ПО СКМ В ТЕКУЩЕЙ ВКЛАДКЕ

function openBookmark(e) {
    var type = e.type;
    var target = e.originalTarget;
    var bookMenu = target.parentNode;

    // стоп, если не закладка из меню закладок
    if ( target.localName !== "menuitem" || !target._placesNode ) return;

         // если левый клик открыть закладку в новой вкладке
         if ( type == 'click' && e.button == 1 ) {
              e.preventDefault();
              e.stopPropagation();
              var itemUri = target._placesNode.uri; // получить адрес закладки
              var bookmarklet = ( itemUri.substr(0, 11) == "javascript:");
              if ( !gBrowser.webProgress.isLoadingDocument &&
                  ( "isBlankPageURL" in window ? isBlankPageURL(content.location.href)
            : content.location.href == "about:blank" )
) { gBrowser.loadURI( itemUri ); }
else { gBrowser.selectedTab = gBrowser.addTab( itemUri ); };
  };
};

addEventListener("click", openBookmark, true, window );

код №2

Выделить код

Код:

// FindBar, листание результатов поиска колесиком мыши (FindBar, Mouse Scroll find)
addEventListener("wheel", (e, findbar = gBrowser.selectedTab._findBar) =>
    findbar && findbar.matches(":hover") && e.deltaY && findbar.onFindAgainCommand(e.deltaY < 0)
, false, gBrowser);

Отредактировано Inko7 (15-05-2020 15:19:35)

Отсутствует

 

№1460316-05-2020 08:31:06

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

Re: Custom Buttons

Inko7

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

Выделить код

Код:

try {({
	init(tabpanels) {
		var dsp = e => this[e.type](e);
		addEventListener("click", dsp, true);
		tabpanels.addEventListener("wheel", dsp);
		addEventListener("unload", () => {
			removeEventListener("click", dsp, true);
			tabpanels.removeEventListener("wheel", dsp);
		}, {once: true});
	},
	click(e) {
		var url = e.button == 1
			&& e.target.nodeName == "menuitem"
			&& e.target._placesNode?.uri;
		if (url)
			e.stopPropagation(),
			isBlankPageURL(gBrowser.currentURI.spec) &&
			!gBrowser.webProgress.isLoadingDocument
				? gBrowser.loadURI(url, this.p)
				: gBrowser.selectedTab = gBrowser.addTab(url, this.p);
	},
	p: {triggeringPrincipal: document.nodePrincipal},
	wheel(e) {
		var findbar = gBrowser.selectedTab._findBar;
		findbar?.matches(":hover") && e.deltaY
			&& findbar.onFindAgainCommand(e.deltaY < 0);
	}
}).init(document.getElementById("tabbrowser-tabpanels"))}
catch(ex) {Cu.reportError(ex);}

Отсутствует

 

№1460416-05-2020 10:07:42

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 76.0

Re: Custom Buttons

Dumby
пробовал помещать этот код и в custom_script.js и в custom_script_win.js - эффекта не увидел

уточню по работе этих кодов

#1 - если текущая вкладка "пустая" (у меня это базовая домашняя страница FF), то при нажатии СКМ по папкам в меню закладок или на панели закладок, открываются все закладки, но не используя текущую вкдадку, а все в новых вкладках ==> код позволяет использовать  "пустую" вкладку
#2 - во время поиска по странице, при наведении мыши на панель поиска, прокручивать найденные результаты на странице колесиком мышки

Отредактировано Inko7 (16-05-2020 13:02:05)

Отсутствует

 

№1460516-05-2020 12:04:37

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 76.0

Re: Custom Buttons

Dumby
Эту бы кнопку в скрипт "Нет псевосессиям"

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

Выделить код

Код:

/*Initialization Code*/
((topic, id) => {
    var obs, getObserver = () => {
        for(var o of Services.obs.enumerateObservers(topic)) {
            var res = o.wrappedJSObject;
            if (res && id in res) return res;
        }
    }
    addDestructor(reason => {
        if (reason[5] != "e") return;
        var obs = getObserver();
        obs && obs.destroy();
    });
    (obs = getObserver()) || Services.obs.addObserver(obs = {
        [id]: true, __proto__: null, destroyed: false,
        destroy() {
            Services.obs.removeObserver(this, topic);
            this.destroyed = true;
        },
        get wins() {
            return Array.from(Services.wm.getEnumerator("navigator:browser"))
                .filter(win => win.toolbar.visible);
        },
        observe(cancelQuit, t, data) {
            data != "restart" && !cancelQuit.data && this.onQuit(true);
        },
        handleEvent() {
            this.destroyed || this.onQuit();
        },
        onQuit(fromObs) {
            var {wins} = this, multi = wins.length > 1;

            if (multi) return fromObs && this.destroy();
            this.destroy();

            var {tabs} = wins[0].gBrowser;
            if (tabs.length > 1 ) return;

            var es = JSON.parse(SessionStore.getTabState(tabs[0])).entries;
            es.length == 1 && wins[0].isBlankPageURL(es[0].url) && this.erase();
        },
        erase() {
            Services.obs.notifyObservers(null, "browser:purge-session-history");
            Cu.import("resource:///modules/sessionstore/SessionFile.jsm", {})
                .SessionFileInternal.write = () => {};
        }
    }, topic, false);
    addEventListener("DOMWindowClose", obs);
})("quit-application-requested", `${_id}:quitApplicationRequestedObserver1`);

Отсутствует

 

№1460616-05-2020 17:01:48

kazarin
Участник
 
Группа: Members
Зарегистрирован: 23-11-2016
Сообщений: 85
UA: Firefox 56.0

Re: Custom Buttons

del

Отредактировано kazarin (20-05-2020 01:06:32)

Отсутствует

 

№1460717-05-2020 15:43:43

katana
Участник
 
Группа: Members
Зарегистрирован: 04-09-2019
Сообщений: 25
UA: Firefox 76.0

Re: Custom Buttons

В ночном похоже отвалился CB?

Отсутствует

 

№1460818-05-2020 15:56:28

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

Re: Custom Buttons

Dumby.
Вы когда-то по моей просьбе написали вот такой код:

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

Выделить код

Код:

// Убрать замыливание последних букв и вернуть многоточие в названии вкладок.
// https://forum.mozilla-russia.org/viewtopic.php?pid=749234#p749234
((func, destroy) => {
    [...gBrowser.tabs].forEach(func);
    addEventListener("TabOpen", func, false, gBrowser.tabContainer);
    addEventListener("TabAttrModified", func, false, gBrowser.tabContainer);
    addDestructor(() => [...gBrowser.tabs].forEach(destroy));
})(e => {
    var tab = e.target || e;
    var lab = document.getAnonymousElementByAttribute(tab, "class", "tab-text tab-label");
    if (!lab.hasAttribute("crop")) {
        lab.setAttribute("crop", "end");
        lab.setAttribute("flex", "1");
    }
    else if (lab.value == tab.label) return;
    lab.setAttribute("value", tab.label);
}, tab => {
    var lab = document.getAnonymousElementByAttribute(tab, "class", "tab-text tab-label");
    for(var attr of ["crop", "flex", "value"]) lab.removeAttribute(attr);
});


Возможно ли его переделать под последнюю версию [firefox] ?


«The Truth Is Out There»

Отсутствует

 

№1460920-05-2020 10:53:35

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

Re: Custom Buttons

Inko7 пишет

при нажатии СКМ по папкам в меню закладок или на панели закладок
==> код позволяет

И как же такое может быть, ведь это будет <menu> или <toolbarbutton>,
а в коде написано
if ( target.localName !== "menuitem" || !target._placesNode ) return;


solombala пишет

Эту бы кнопку в скрипт

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

Выделить код

Код:

try {Services.obs.addObserver(function qar(cancelQuit, topic, data) {
	if (cancelQuit.data) return;
	Services.obs.removeObserver(qar, topic);
	if (data == "restart") return;

	var wins = Array.from(Services.wm.getEnumerator("navigator:browser")).filter(
		win => win.toolbar.visible && !win.PrivateBrowsingUtils.isWindowPrivate(win)
	);
	if (wins.length > 1) return;
	var [win] = wins, {tabs} = win.gBrowser;
	if (tabs.length > 1 ) return;

	var es = JSON.parse(win.SessionStore.getTabState(tabs[0])).entries;
	if (es.length == 1 && win.isBlankPageURL(es[0].url))
		Services.obs.notifyObservers(null, "browser:purge-session-history"),
		Cu.import("resource:///modules/sessionstore/SessionFile.jsm", {})
			.SessionFileInternal.write = () => {};

}, "quit-application-requested", false);} catch(ex) {Cu.reportError(ex);}

katana пишет

В ночном похоже отвалился CB?

Было дело. Bug 1558635


unter_officer пишет

Возможно ли его переделать под последнюю версию [firefox] ?

Ну, <label> вкладки нынче предлагается получать так: var lab = tab.textLabel;
соответственно, можно попробовать заменить в коде (в двух местах).

Отсутствует

 

№1461020-05-2020 14:39:51

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

Re: Custom Buttons

Dumby пишет

Ну, <label> вкладки нынче предлагается получать так: var lab = tab.textLabel;
соответственно, можно попробовать заменить в коде (в двух местах).

Спасибо, все получилось.


Есть ещё просьба по одной из ваших кнопок.

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

Выделить код

Код:

((main, parts) => this._handleClick = () => {
    var df = MozXULElement.parseXULToFragment(`
        <menupopup>
            <menuitem class="menuitem-iconic"
                image="data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                label="Сохранить всю страницу как PNG"
                value="all"/>
    
            <menuitem class="menuitem-iconic"
                image="data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAiAcFBa4KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwoJCa8KCQmvCgkJrwsJCaECAQE/BQMDAAAAAJUgICD4V1ZW/2FhYf5hYWH/YmFh/2BgYP9fX1//X19f/19fX/9gYGD/YmFh/2FhYf9gYGD+ZmVl/1RSUuIVFBQtCgkJy1paWv+Li4v9h4eH/oiIiP6FhYX+i4uL/pKSkv6Sk5P+kpKS/ouLi/6FhYX+iIiI/oiIiP6Hh4f7lZaW/25tbYQNDQ3OcHBw/5KSkv6Li4v/i4uL/5mZmf+EhIT/ZGRk/1tbWv9kZGT/hISE/5mZmf+Li4v/jY2N/4yMjPyWl5f/iomJjQ4NDc13d3f/m5ub/pWVlf+goKD/XFxc/ygoKP8fHyD/GBsb/yAhIv8pKSn/W1tb/6CgoP+Wlpb/lpaW/J6env+Jh4eMDg4OzX1+fv+ioqL+qqqq/1hYWP8ZGRn/Ghwb/x4dHP8mIh//FhQR/xUWF/8aGhr/WFhY/6urq/+cnJz8pKSk/4qJiYwPDg7Ng4OD/7W1tf6MjIz/Ghoa/xYYGP8uKCb/ZEAo/5xyOP++saL/RD45/xISE/8bGxv/jY2N/6+vr/ypqan/ioiIjA8PD82IiIj/xMTE/l1cXP8LDAz/JiId/1o3LP9ADgD/mGog//Dt6P/VysX/Ih4Z/wsMDf9eXl7/v7+//K6urv+KiYmMEA8PzY+Pj//Kysr+SEhH/wEDBv9MPi7/hlES/3dCAP+VZAn/tJVO/7eVXf9OQTL/AAIE/0pJSf/FxcX8tLS0/4qJiYwQEBDNm5ub/9/e3/5SUlL/AAAA/0M7Mf/aya7/ybiO/5RmEf9aIAD/cjkX/z80KP8AAAD/U1JS/9nZ2fzAwMD/i4qKjBEREc2oqKn/8O/w/oeGhv8AAAD/DAsK/6qkof/17uj/nW8l/14eCf9hPTr/ExUU/wAAAP+Hh4f/6urq/MzMzf+Mi4uMERERzbCwsv/r6uz+3Nzd/yoqKv8AAAD/ExEP/2heU/9yWjv/UD0u/xcXFv8AAAD/Kioq/93d3v/l5eb81NTV/4yLi4wSERHNuLm5/+/v8P7z8/P/xsbG/yAgIP8AAAD/AQEB/wAAAP8BAQH/AAAA/yAgIP/Gxsb/9PT0/+np6vzb29v/jIuLjBIREc2+vb7/+Pj5/uvr7P/7+/v/4ODg/3Nyc/8uLi7/Hh4d/y0sLP9zc3P/4ODg//v7+//s7O3/8/P0/OHg4f+Mi4uLFBMTyMPDw//////7+Pj4/ff29v38/Pz9/////fr6+v3u7u79+vr6/f////38/Pz99/b2/fn5+f37+/v53t7e/5KSko4GBgZ7m5yc//j4+P/w8fH/8fLy//Dw8P/u7u7/8vLy//X19f/y8vL/7u7u//Dw8P/x8vL/8vLy/uXl5f/BwcH+k5GRUAAAAAQeHR1yb25uxn59fcZ9fHzGfXx8xn18fMZ9e3vGfHt7xn17e8Z9fHzGfXx8xn18fMZ9fHzGgH9/xYmIiGVaV1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                label="Сохранить видимую часть страницы как PNG"
                value="page"/>
    
            <menuitem class="menuitem-iconic"
                image="data:image/x-icon;base64,AAABAAEAIBkAAAEAIAAMDQAAFgAAACgAAAAgAAAAMgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD29fT/2tra/8jIyP/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8XFxf/FxcX/xcXF/8jIyP/a2tr/9vX0/+zs7P/ak0b/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/9qTRv/s7Oz/7Ozs/+J9Dv/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+/6SdmP/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/+vn4//z7+v/6+fj/4n0O/+zs7P/s7Oz/4n0O//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r//Pv6//z7+v/8+/r/aFtT//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//j39v/ifQ7/7Ozs/+zs7P/ifQ7/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P9oW1P/7+zq/+/s6v/v7Or/8O3r//Dt6//w7ev/8O3r//Dt6//w7ev/8O3r/+/s6v/w7ev/9fTy/+J9Dv/s7Oz/7Ozs/+J9Dv/49/b/+Pf2//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4/2hbU//q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/y8O//4n0O/+zs7P/s7Oz/4n0O//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/+Pf2//j39v/49/b/aFtT/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe//Dt6//ifQ7/7Ozs/+zs7P/ifQ7/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P/29fT/9vX0//b19P9oW1P/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/7uro/+J9Dv/s7Oz/7Ozs/+J9Dv/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx//Ty8f/08vH/9PLx/2hbU//x7+3/8vDv//Hv7f/x7+3/8e/t//Lw7//x7+3/8e/t//Lw7//x7+3/8vDv//Hv7f/29fT/4n0O/+zs7P/s7Oz/4n0O//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//8vDv//Lw7//y8O//aFtT/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/6igmP+ooJj/qKCY/8vGwf/ifQ7/7Ozs/+zs7P/ifQ7/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f/x7+3/8e/t//Hv7f9nWlL/aFtT/2hbU/9nWlL/Z1pS/2hbU/9oW1P/Z1pS/2daUv9oW1P/aFtT/2hbU/9nWlL/pJyX/+J9Dv/s7Oz/7Ozs/+J9Dv/w7ev/8O3r//Dt6//w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Hv7f/w7ev/8O3r//Dt6//x7+3/8O3r//Dt6//w7ev/8e/t//Dt6//w7ev/8O3r//Dt6//w7ev/4n0O/+zs7P/s7Oz/4n0O/+/s6v/v7Or/7uro/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/v7Or/7+zq/+/s6v/u6uj/7+zq/+/s6v/ifQ7/7Ozs/+zs7P/ifQ7/7uro/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7uro/+zo5v/u6uj/7uro/+7q6P/s6Ob/7uro/+7q6P/u6uj/7Ojm/+7q6P/u6uj/7Ojm/+J9Dv/s7Oz/7Ozs/+J9Dv/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/7Ojm/+zo5v/s6Ob/4n0O/+zs7P/s7Oz/4n0O/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/q5uT/6ubk/+rm5P/ifQ7/7Ozs/+zs7P/ifQ7/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+nl4v/p5eL/6eXi/+J9Dv/s7Oz/7Ozs/+J9Dv/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/5uHe/+bh3v/m4d7/6eXi/+bh3v/m4d7/5uHe/+nl4v/m4d7/5uHe/+bh3v/p5eL/4n0O/+zs7P/s7Oz/4n0O/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/m4d7/5uHe/+bh3v/ifQ7/7Ozs/+zs7P/ifQ7/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+bh3v/k39z/5uHe/+Tf3P/m4d7/5N/c/+J9Dv/s7Oz/7Ozs/+J9Dv/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/i3Nn/4tzZ/+Lc2f/k39z/4n0O/+zs7P/s7Oz/4n0O/+Lc2f/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/h29j/4dvY/+Hb2P/ifQ7/7Ozs/+zs7P/ifQ7/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+DZ1v/g2db/4NnW/+J9Dv/s7Oz/9fTy/+J9Dv/8+/r/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/+vn4//r5+P/6+fj/4n0O//X08v/8+/r/6KFU/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ifQ7/4n0O/+J9Dv/ooVT//Pv6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                label="Сохранить выбранный элемент страницы как PNG"
                value="click"/>
    
            <menuitem class="menuitem-iconic"
                image="data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAADDn2Hfz5pE/8eVQP7IlkH/yJZB/8iWQf/IlUH/yJVA/8iVQP/IlED/yJQ//8iUP//IlD//yJM+/8iTPv/Hkj3/nI1w//bDbP//8OH//+zW///s1///69b//+rV///p1P//59L//+XQ///izf//38n//9vG///ZxP//1b///dG////Prf/KlkX/88N4/v37///99Pj//fT6//vy9v/68fT/+u/y//rt8P/66u3/+ufq//rl6P/64eT/+93h//3a3//71d7//9LK/86XR//0xHb//vv////18///9fT///f5///4////9f7///P8///v+f//7Pb//+nz///m8f//4eb//9vZ//3Y2v//1Mb/zphH//TGd//+/////Pj1///7///Q58r/m9aV/6TZnv+i15r/otWY/6LTlv+j0pb/mc6M/9DXuf//3+P//Nnc///Wyf/OmUf/9MZ3//7////8+/j//////53WnP+Y5pn/rvGv/6PvpP+e7p//me6b/5nvm/95533/mM+L///j7f/629z//9jL/86ZR//0xnf//v////z9+v//////qtup/8Xzxf/a/tn/z/vO/8n7yf/D+sL/xPvD/6Hzo/+j05b//+Tu//re3///2cz/zplI//XGeP/+/////P36//////+n26f/uvC6/9T71P/K+Mr/xvjG/8D3wP+/+L//nfCf/6LTlf//5u//+t/g///cz//OmUj/9MZ3//7////8/fr//////6rcqv/G9MX/3//f/9n92f/V/NX/0PzQ/9H+0P+s9a7/pdSY///o8f/64OL//9zP/86aSP/0xnf//v////z9+f//////ndid/5TjlP+v7q//qeyp/6jsqf+k7KX/p+6n/4Tlh/+Z0Y7//+r0//rh4v//3tH/zppI//TGd//+/////v77///////Y8Nj/p9+n/6/jr/+t4a3/rd2p/67bpv+u2ab/p9Wc/9jgx///6Oz//OPl///e0f/Omkj/9MV1//7//////fr///78///+/f///////////////////P////j////0+///8fn//+vu///m4v/94+P//97P/86ZSP/zx3v//v/////+/f///////f////v////7////+/////v+///7+///+/f///vz/P/98Pr//+33//3p9///5OL/zppL//a1Sv/0xoL/9cR7//XEfP/1xHz/9cR8//XEfP/1xH3/9cR8//XCev/1wXr/9b94//W9d//1u3X/87l0//y6bP/Llj7/+pMA/vWBAP/1gwD/9YMA//WDAP/1gwD/9YMA//WDAP/1gwD/9YQA//WEAP/1hAD/9YQA//WEAP/zhAH//okA/8qLIv3xpzP/4ptV/+OdU//jnVP/451T/+OdU//jnVP/451T/+OdU//jnVL/451S/+OdUv/jnVL/451S/+GdVf/qnUf/2aRJ/9q0c9/8yn7/98V5/vjGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6//jGev/4xnr/+MZ6/vrIe/+jj2y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
                label="Сохранить выбранную область страницы как PNG"
                value="clipping"/>
        </menupopup>
    `);
    var popup = df.firstChild;
    popup.setAttribute("context", "");
    popup.setAttribute("oncommand", "handleCommand(event);");
    popup.handleCommand = e => {
        var name = _id + ":DataURLReady";
        main = main.replace("%MESSAGE_NAME%", name);

        var urls = {}, configurable = true, enumerable = true;
        Object.entries(parts).forEach(([key, part]) => Object.defineProperty(urls, key, {
            configurable, enumerable, get() {
                var value = `data:;charset=utf-8,({${
                    encodeURIComponent(main + part)
                }%0A}).init("${key}")`;
                Object.defineProperty(urls, key, {configurable, enumerable, value});
                return value;
        }}));
        var getTabLabel = () => {
            var label = gBrowser.selectedTab.label;      
            var label = label.replace(/[:+.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");
            return label.substring(0, 50);
        }
        var listener = msg => {
            var fp = makeFilePicker();
            fp.init(window, "Сохранить как…", fp.modeSave);
            fp.appendFilter("", "*.png");
            fp.defaultString = getTabLabel() + ".png";   
            fp.open(res => res == fp.returnCancel || !fp.file || makeWebBrowserPersist().saveURI(
                Services.io.newURI(msg.data), document.nodePrincipal,
                null, null, null, null, null, fp.file, null
            ));
        }
        messageManager.addMessageListener(name, listener);
        addDestructor(() => messageManager.removeMessageListener(name, listener));

        (popup.handleCommand = e => gBrowser.selectedBrowser.messageManager
            .loadFrameScript(urls[e.target.value], false)
        )(e);
    }
    this.append(df);
    (this._handleClick = () => popup.openPopup(this, "after_start"))();
})(`
    init(cmd) {
        cmd.startsWith("c")
            ? this[cmd].init(this[cmd].parent = this)
            : this[cmd]();
    },
    capture(win, x, y, width, height) {
        var canvas = win.document.createElementNS("${xhtmlns}", "canvas");
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        var tryDraw = ind => {
            try {ctx.drawWindow(win, x, y, canvas.width, canvas.height, "white")}
            catch(ex) {canvas.height = ind * canvas.width; tryDraw(--ind);}
        }
        tryDraw(17);
        sendAsyncMessage("%MESSAGE_NAME%", canvas.toDataURL("image/png"));
    },
    `, {

    all: `all() {
        var win = content;
        this.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
    }`,
    page: `page() {
        var win = content, doc = win.document, body = doc.body, html = doc.documentElement;
        var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft;
        var scrY = (body.scrollTop || html.scrollTop) - html.clientTop;
        this.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
    }`,
    clipping: `clipping: {
        handleEvent(e) {
            if (e.button) return false;
            e.preventDefault();
            e.stopPropagation();
            switch(e.type) {
                case "mousedown":
                    this.downX = e.pageX;
                    this.downY = e.pageY;
                    this.bs.left = this.downX + "px";
                    this.bs.top = this.downY + "px";
                    this.body.appendChild(this.box);
                    this.flag = true;
                    break;
                case "mousemove":
                    if (!this.flag) return;
                    this.moveX = e.pageX;
                    this.moveY = e.pageY;
                    if (this.downX > this.moveX) this.bs.left = this.moveX + "px";
                    if (this.downY > this.moveY) this.bs.top  = this.moveY + "px";
                    this.bs.width = Math.abs(this.moveX - this.downX) + "px";
                    this.bs.height = Math.abs(this.moveY - this.downY) + "px";
                    break;
                case "mouseup":
                    this.uninit();
                    break;
            }
        },
        init() {
            var win = {};
            Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager)
                .getFocusedElementForWindow(content, true, win);
            this.win = win.value;

            this.doc = this.win.document;
            this.body = this.doc.body;
            if (!HTMLBodyElement.isInstance(this.body)) {
                Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService)
                    .showAlertNotification("${self.image}", ${JSON.stringify(self.label)}, "Не удается захватить!");
                return false;
            }
            this.flag = null;
            this.box = this.doc.createElement("div");
            this.bs = this.box.style;
            this.bs.border = "#0f0 dashed 2px";
            this.bs.position = "absolute";
            this.bs.zIndex = "2147483647";
            this.defaultCursor = this.win.getComputedStyle(this.body, "").cursor;
            this.body.style.cursor = "crosshair";
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
            this.body.style.cursor = this.defaultCursor;
            this.body.removeChild(this.box);
            this.parent.capture.apply(this, pos);
            ["click", "mouseup", "mousemove", "mousedown"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`,
    click: `click: {
        getPosition() {
            var html = this.doc.documentElement;
            var body = this.doc.body;
            var rect = this.target.getBoundingClientRect();
            return [
                this.win,
                Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft,
                Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop,
                parseInt(rect.width),
                parseInt(rect.height)
            ];
        },
        highlight() {
            this.orgStyle = this.target.hasAttribute("style") ? this.target.style.cssText : false;
            this.target.style.cssText += "outline: red 2px solid; outline-offset: 2px; -moz-outline-radius: 2px;";
        },
        lowlight() {
            if (this.orgStyle) this.target.style.cssText = this.orgStyle;
            else this.target.removeAttribute("style");
        },
        handleEvent(e) {
            switch(e.type){
                case "click":
                    if (e.button) return;
                    e.preventDefault();
                    e.stopPropagation();
                    this.lowlight();
                    this.parent.capture.apply(this, this.getPosition());
                    this.uninit();
                    break;
                case "mouseover":
                    if (this.target) this.lowlight();
                    this.target = e.target;
                    this.highlight();
                    break;
            }
        },
        init() {
            this.win = content;
            this.doc = content.document;
            ["click", "mouseover"].forEach(type=> this.doc.addEventListener(type, this, true));
        },
        uninit() {
            this.target = false;
            ["click", "mouseover"].forEach(type=> this.doc.removeEventListener(type, this, true));
        }
    }`
});


В последнем [firefox] кнопка не работает и консоль жалуется на это:

Выделить код

Код:

NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIWebBrowserPersist.saveURI]

Можно как-то поправить?

Отредактировано unter_officer (20-05-2020 14:41:06)


«The Truth Is Out There»

Отсутствует

 

№1461120-05-2020 22:35:22

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

Re: Custom Buttons

unter_officer пишет

Есть ещё просьба по одной из ваших кнопок.

Не, код не мой, с меня только e10s-оболочка, какая-то.
А перестановки аргументов в nsIWebBrowserPersist.saveURI() обсуждались не раз.


Если нужно, например, под текущий релиз — принцип прост:
открываем релизную idl'ку, смотрим какие аргументы принимает метод saveURI(),
и пытаемся подогнать. Попробуй сам. Если не получится, или просто затем свериться

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

Выделить код

Код:

̣
            fp.open(res => res == fp.returnCancel || !fp.file || makeWebBrowserPersist().saveURI(
                Services.io.newURI(msg.data), document.nodePrincipal,
                //null, null, null, null, null, fp.file, null
                null, null, null, null, fp.file, null, null
            ));

Отсутствует

 

№1461220-05-2020 23:32:56

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

Re: Custom Buttons

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


Не подскажите ещё вот с этим.

Выделить код

Код:

// Открыть новую вкладку двойным кликом по панели вкладок
addEventListener("dblclick", e => {
  if ( e.button || e.ctrlKey || e.shiftKey || e.altKey ) return;
    try { BrowserOpenTab(); } catch(e) { };
}, false, document.getElementById("TabsToolbar"));

Суть в том, что на крайней версии [firefox] новая вкладка почему-то открывается не только при двойным кликом по панели вкладок, но и при двойном клике по самим табам. Можно это как-то подправить?

Отредактировано unter_officer (20-05-2020 23:40:32)


«The Truth Is Out There»

Отсутствует

 

№1461321-05-2020 11:04:05

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

Re: Custom Buttons

unter_officer пишет

новая вкладка почему-то открывается не только при двойным кликом по панели вкладок, но и при двойном клике по самим табам

Ну да, сами табы же на панели вкладок.
Можно, например, какой-нибудь проверочный селектор
подобрать, чтоб подходил под задачу. Что-то типа

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

Выделить код

Код:

(sel => addEventListener("dblclick", e =>
	!(e.button || e.ctrlKey || e.shiftKey || e.altKey)
	&& e.target.matches(sel) && BrowserOpenTab()
, false, document.getElementById("TabsToolbar") || 1))(
	"#tabbrowser-arrowscrollbox,toolbarspring,#TabsToolbar"
);

Отсутствует

 

№1461421-05-2020 21:12:37

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 76.0

Re: Custom Buttons

Dumby пишет

И как же такое может быть, ведь это будет <menu> или <toolbarbutton>,
а в коде написано
if ( target.localName !== "menuitem" || !target._placesNode ) return;

не совсем понял про что конкретно речь...
код вроде давно-давно писал bunda1 и он работает до сих пор у меня на FF52esr, лежит в какой-то кнопке в инициализации
может для FF76 его нужно вначале адаптировать?

мне главнее получить работоспособность второго кода - "прокручивать найденные результаты на странице колесиком мышки"

Отсутствует

 

№1461521-05-2020 21:13:13

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

Re: Custom Buttons

Dumby пишет

Ну да, сами табы же на панели вкладок.
Можно, например, какой-нибудь проверочный селектор
подобрать, чтоб подходил под задачу. Что-то типа

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

Выделить код

Код:

(sel => addEventListener("dblclick", e =>
	!(e.button || e.ctrlKey || e.shiftKey || e.altKey)
	&& e.target.matches(sel) && BrowserOpenTab()
, false, document.getElementById("TabsToolbar") || 1))(
	"#tabbrowser-arrowscrollbox,toolbarspring,#TabsToolbar"
);

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


«The Truth Is Out There»

Отсутствует

 

№1461621-05-2020 21:46:20

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 76.0

Re: Custom Buttons

Inko7 пишет

может для FF76 его нужно вначале адаптировать?

мне главнее получить работоспособность второго кода - "прокручивать найденные результаты на странице колесиком мышки"

А речь о чём? Если о FindBar, то его Dumby уже адаптировал.

Отредактировано voqabuhe (21-05-2020 21:48:35)

Отсутствует

 

№1461722-05-2020 09:46:25

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 76.0

Re: Custom Buttons

voqabuhe пишет

А речь о чём?

вопрос был про адаптацию кодов для user_chrome_files
пост с запросом

Отсутствует

 

№1461823-05-2020 00:15:58

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

Re: Custom Buttons

Dumby. Возможно ли подправить вот эту кнопочку под крайнюю версию [firefox] ?

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

Выделить код

Код:

// "Автоматически перезагружать" в контекстном меню вкладки, от 19.11.2015. .................
((tabContextMenu, tabs, attr) => {
   const reloadInterval = 60000;                            // интервал перезагрузки, 60 sek = 60000 ms
   const throbber = [".tab-progress-box", ".tab-progress"]; // индикаторы загрузки скрываемые при автоперегрузке 
   
   const reloadButtonStyle = "pointer-events: auto !important; -moz-appearance: none !important; -moz-box-ordinal-group: 0 !important; margin-left: -1px !important; margin-right: -1px !important; padding: 0 !important; border: none !important;";
   const reloadButtonIcon = "data:image/x-icon;base64,AAABAAEADAwAAAEAIACYAgAAFgAAACgAAAAMAAAAGAAAAAEAIAAAAAAAcAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgIAAQECAAAAAAAAAAAAAAAAAAAAAAABAQIAAQICAAAAAAAAAAAAAAAAAAEBAQAAAAAEBggGDydSUhM6g40SOYONCyNRUgEDCAYAAAAAAAEBAQAAAAAAAQICAAAAAA4XIR4nXLvNJGnx/yNq9/0jaff9I2jx/x1Suc0FDh4eAAAAAAABAQIAAAAACAoGBDNluMopaOn/LWnf/jJnw90zacTdLmvf/Stq6v8jU7PJAQIEAwAAAAAAAAAAJDpVVTV27f8ta+H/Jkh9hAgJBAEGCAQAK09+gzJw4/8vb+v/ESdPVAAAAAAAAAAANFmJjDR7/P8tZcncBQcKCAAAAAAAAAAACQwLBzhyzNwyefv/HUKFjAAAAAAAAAAAOV+LjDyI//8wbc3bAgUJBgEBAAAAAAABCAsKBjx5z9s6hf//IkqIjAAAAAAAAAAAMEhcVk6c//8+ivH/J1GHigMEBAIBAAAALlV/f0SP8/9Flf//HDhZVgAAAAAAAAAACgoIBVqXzcpPqP//QHq5wBYgJR0/d7C0TJ/8/06j//9GiMzNBAYIBQAAAAABAQICAAAAABggIx5mqt/iOWiNiyAvNjBpv///Xbj//1KWz9ESHSUhAAAAAAEBAgIAAAAAAQEBAQAAAAAJCwoHOllqZRYgJR0mO0VANVVnZAcJCAYAAAAAAQEBAQAAAAAAAAAAAAAAAAECAgIBAQECAAAAAAEBAgEAAAEBAAAAAAABAQIBAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
             
   
   // Создать новый пункт контекстного меню вкладки ....               
   const menuitem = document.createElement("menuitem");
   menuitem.setAttribute("type", "checkbox");
   menuitem.setAttribute("label", "Автоматически перезагружать");
   menuitem.onclick =()=> toggleAutoReload(document.popupNode);
   tabContextMenu.insertBefore(menuitem, document.getElementById("context_bookmarkAllTabs")); // над каким пунктом меню показывать

   
   // Устанавливаем где показывать пункт меню и чекбокс у пункта ....
   addEventListener("popupshowing", (e)=> {  
      var tab = e.target.triggerNode;
      menuitem.hidden = !tab.linkedBrowser.currentURI.scheme.startsWith("http")             
      menuitem.setAttribute("checked", tab.hasAttribute(attr));
   }, false, tabContextMenu); 
   
      
   // Добавлять или удалять кнопку и атрибут перегрузки на вкладку, добавлять обработчик на кнопку .... 
   function toggleIconAndAttribute(tab) {
      var hbox = document.getAnonymousElementByAttribute(tab, "class", "tab-content");

      if ( tab.hasAttribute(attr) ) {   // удалить кнопку и атрибут
           hbox.removeChild(tab.querySelector("#tabReloadButton"));
           tab.removeAttribute(attr); 
           return;
           }             

      var reloadButton = document.createElement("toolbarbutton"); // создать кнопку 
      reloadButton.setAttribute('image', reloadButtonIcon);
      reloadButton.setAttribute('style', reloadButtonStyle);
      reloadButton.setAttribute('id', 'tabReloadButton');      
      hbox.appendChild(reloadButton);
      
      tab.setAttribute(attr, 'true'); // добавить атрибут и обработчик
      reloadButton.onclick =()=> toggleAutoReload(tab);      
   };
     
      
   // Восстановить авто перегрузку табов и иконку после старта браузера и после перемещения вкладки ....
   function restoreAutoReload(e) {
      var tab = e.target;
      if ( !tab.hasAttribute(attr) || tab.querySelector("#tabReloadButton") ) return;

      tab.removeAttribute(attr); 
      toggleAutoReload(tab);
   };
   addEventListener('TabMove', restoreAutoReload, false, tabs);
   addEventListener('SSTabRestored', restoreAutoReload, false, tabs);
          

   // Стиль удаляет разные индикаторы загрузки вкладки при автоперегрузке ....
   throbber.forEach((m,i)=> throbber[i] = '.tabbrowser-tab[autoReload]:not([busy]) ' + m);               
   var str = throbber + '{-moz-appearance: none !important; display: none !important;}'; 

   const sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
   var uri = makeURI("data:text/css," + encodeURIComponent(str));
   sss.loadAndRegisterSheet(uri, 0);     
    
   
   // Переключать авто перегрузку таба ....   
   function toggleAutoReload(tab) {
      clearInterval(tab.interval), toggleIconAndAttribute(tab);

      if ( !tab.hasAttribute(attr) ) return;
            
      tab.interval = setInterval(()=> {
         if (tab.collapsed || !menuitem.parentNode) clearInterval(tab.interval);
         gBrowser.reloadTab(tab);
         tab.removeAttribute("busy");
      }, reloadInterval );
   };
   
   
   // Удалить изменения при удаления кода ....   
   addDestructor(()=> { menuitem.remove(); sss.unregisterSheet(uri, 0); try{ document.querySelector("#tabReloadButton").remove() } catch(e){} });
             
})(document.getElementById("tabContextMenu"), gBrowser.tabContainer, "autoReload");


«The Truth Is Out There»

Отсутствует

 

№1461923-05-2020 07:38:38

katana
Участник
 
Группа: Members
Зарегистрирован: 04-09-2019
Сообщений: 25
UA: Firefox 76.0

Re: Custom Buttons

Inko7
about:user-chrome-files галки стоят там где надо?

Отредактировано katana (23-05-2020 07:47:33)

Отсутствует

 

№1462023-05-2020 09:47:40

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1008
UA: Firefox 76.0

Re: Custom Buttons

katana

скрытый текст
всегда стояли так
3895529f23e3.jpg

проверьте вот этот код для user-chrome-files кто-нибудь у себя? правда, я так и не разобрался в какой именно файл его поместить...
 
проверил еще раз после обновления user_chrome_files и частично код ЗАРАБОТАЛ! - прокрутка результатов поиска на странице листается колесом мыши
(код помещал в конец custom_script_win.js)

Отредактировано Inko7 (23-05-2020 09:56:49)

Отсутствует

 

№1462123-05-2020 13:34:02

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Что необходимо добавить (изменить) в этом скрипте:

скрытый текст
https://github.com/ardiman/userChrome.js/blob/master/autopopup/AutoPopup.uc.js
что бы он реагировал и на кнопки CB ? В [firefox] 76

Отредактировано kokoss (25-05-2020 02:11:43)


Win7

Отсутствует

 

№1462224-05-2020 11:30:47

katana
Участник
 
Группа: Members
Зарегистрирован: 04-09-2019
Сообщений: 25
UA: Firefox 76.0

Re: Custom Buttons

kokoss
Провел мышкой по дополнениям, и капец! а как убрать с дополнений этот попап?
Dumby
У меня на ночном так и не заработал CB, уже не знаю может bootstrap ставить надо?

Отсутствует

 

№1462324-05-2020 17:45:51

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

katana пишет

а как убрать с дополнений этот попап?

Видимо удалить скрипт!


Win7

Отсутствует

 

№1462424-05-2020 20:00:21

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

Re: Custom Buttons

unter_officer пишет

Dumby. Возможно ли подправить вот эту кнопочку под крайнюю версию [firefox] ?

Что-то не соображу как сделать, чтобы favicon таба
не дёргался, если есть, но был скрыт, если нет.

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

Выделить код

Код:

({
	interval: 6e4,

	id: "cb-auto-reload",
	init(popup) {
		this.tabs(this.initTab, true) && this.addStyle();
		addDestructor(this.destroy, this);
		var dsp = e => this[e.type](e);
		for(var type of ["popupshowing", "TabClose", "SSTabRestored"])
			addEventListener(type, dsp, false, (
				type[0] == "p" ? this.popup = popup : gBrowser.tabContainer
			) || 1);
	},
	destroy(reason) {
		this.tabs(this.destroyTab, reason != "delete");
		this.menuitem?.remove();
	},
	tabs(callback, arg) {
		var res;
		for(var tab of gBrowser.tabs) {
			var has = SessionStore.getCustomTabValue(tab, this.id);
			has && callback.call(this, tab, arg, res = true);
		}
		return res;
	},
	initTab(tab, arg) {
		arg || SessionStore.setCustomTabValue(tab, this.id, "1");
		var img = document.createXULElement("hbox");
		img.className = this.id;
		img.setAttribute("onclick", 'linkedObject.destroyTab(this.closest("tab"))');
		img.linkedObject = this;
		tab.throbber.before(img);
		tab.setAttribute(this.id, setInterval(this.reload, this.interval, tab));
	},
	destroyTab(tab, arg) {
		clearInterval(tab.getAttribute(this.id));
		arg || SessionStore.deleteCustomTabValue(tab, this.id);
		tab.removeAttribute(this.id);
		tab.querySelector("." + this.id).remove();
	},
	addStyle() {
		this.addStyle = () => {};
		var css = `
			tab.tabbrowser-tab:not([pinned]) .${this.id} {
				width: 16px;
				height: 16px;
				margin-left: -5px;
				background-position: center;
				background-repeat: no-repeat;
				background-image: url("data:image/x-icon;base64,AAABAAEADAwAAAEAIACYAgAAFgAAACgAAAAMAAAAGAAAAAEAIAAAAAAAcAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgIAAQECAAAAAAAAAAAAAAAAAAAAAAABAQIAAQICAAAAAAAAAAAAAAAAAAEBAQAAAAAEBggGDydSUhM6g40SOYONCyNRUgEDCAYAAAAAAAEBAQAAAAAAAQICAAAAAA4XIR4nXLvNJGnx/yNq9/0jaff9I2jx/x1Suc0FDh4eAAAAAAABAQIAAAAACAoGBDNluMopaOn/LWnf/jJnw90zacTdLmvf/Stq6v8jU7PJAQIEAwAAAAAAAAAAJDpVVTV27f8ta+H/Jkh9hAgJBAEGCAQAK09+gzJw4/8vb+v/ESdPVAAAAAAAAAAANFmJjDR7/P8tZcncBQcKCAAAAAAAAAAACQwLBzhyzNwyefv/HUKFjAAAAAAAAAAAOV+LjDyI//8wbc3bAgUJBgEBAAAAAAABCAsKBjx5z9s6hf//IkqIjAAAAAAAAAAAMEhcVk6c//8+ivH/J1GHigMEBAIBAAAALlV/f0SP8/9Flf//HDhZVgAAAAAAAAAACgoIBVqXzcpPqP//QHq5wBYgJR0/d7C0TJ/8/06j//9GiMzNBAYIBQAAAAABAQICAAAAABggIx5mqt/iOWiNiyAvNjBpv///Xbj//1KWz9ESHSUhAAAAAAEBAgIAAAAAAQEBAQAAAAAJCwoHOllqZRYgJR0mO0VANVVnZAcJCAYAAAAAAQEBAQAAAAAAAAAAAAAAAAECAgIBAQECAAAAAAEBAgEAAAEBAAAAAAABAQIBAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
			}
			tab.tabbrowser-tab[${this.id}] :-moz-any(.tab-throbber, .tab-icon-pending) {
				display: none;
			}
			tab.tabbrowser-tab[${this.id}]/*[image]*/ .tab-icon-image {
				display: -moz-box;
			}
		`.replace(/;/g, " !important;");
		var args = ["data:text/css," + encodeURIComponent(css), windowUtils.USER_SHEET];
		windowUtils.loadSheetUsingURIString(...args);
		addDestructor(() => windowUtils.removeSheetUsingURIString(...args));
	},
	checked(tab = TabContextMenu.contextTab) {
		return tab.hasAttribute(this.id);
	},
	cmd(tab) {
		this.addStyle();
		(this.cmd = tab => this.checked(tab) ? this.destroyTab(tab) : this.initTab(tab))(tab);
	},
	reload(tab) {
		gBrowser.reloadTab(tab);
	},
	get shouldHide() {
		return !TabContextMenu.contextTab
			.linkedBrowser.currentURI.scheme.startsWith("http");
	},
	popupshowing(e) {
		if (this.shouldHide) return;

		var menuitem = this.menuitem = document.createXULElement("menuitem");
		menuitem.id = "context_cbAutoReloadTab";
		menuitem.setAttribute("type", "checkbox");
		menuitem.setAttribute("label", "Автоматически перезагружать");
		menuitem.setAttribute("oncommand", "linkedObject.cmd(TabContextMenu.contextTab)");
		menuitem.linkedObject = this;
		this.popup.querySelector("#context_duplicateTab").after(menuitem);

		(this.popupshowing = e => e.target == this.popup
			&& !(menuitem.hidden = this.shouldHide)
			&& menuitem.setAttribute("checked", this.checked())
		)(e);
	},
	TabClose(e) {
		var intervalId = e.target.getAttribute(this.id);
		if (!intervalId) return;
		clearInterval(intervalId);
		var tab = e.detail.adoptedBy;
		tab && SessionStore.setCustomTabValue(tab, this.id, "1");
	},
	SSTabRestored(e) {
		var tab = e.target;
		SessionStore.getCustomTabValue(tab, this.id)
			&& !tab.hasAttribute(this.id) && this.initTab(tab, true);
	}
}).init(document.getElementById("tabContextMenu"));

Inko7 пишет

частично код ЗАРАБОТАЛ!

Это так кажется из-за упорствования в ереси,
что код делает то, чего он не делает.


Под скудное описание того, что он якобы делает,
возможно, в какой-то степени, подойдёт нечто вроде

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

Выделить код

Код:

try {({
	init(tabpanels) {
		var dsp = e => this[e.type](e);
		addEventListener("click", dsp, true);
		tabpanels.addEventListener("wheel", dsp);
		addEventListener("unload", () => {
			removeEventListener("click", dsp, true);
			tabpanels.removeEventListener("wheel", dsp);
		}, {once: true});
	},
	e: {ctrlKey: true, shiftKey: true},
	p: {triggeringPrincipal: document.nodePrincipal},
	s: "menu.bookmark-item,toolbarbutton.bookmark-item[type=menu]",
	click(e) {
		if (
			e.button == 1 && isBlankPageURL(gBrowser.currentURI.spec)
			&& !e.ctrlKey && !e.shiftKey && !e.altKey
			&& e.target.matches(this.s) && !gBrowser.webProgress.isLoadingDocument
		) {
			var trg = e.target, pn = trg._placesNode;
			if (!pn) return;
			e.stopPropagation();

			var urls = PlacesUtils.getURLsForContainerNode(pn);
			PlacesUIUtils.openInTabClosesMenu && trg.tagName == "menu" && closeMenus(trg);

			if (urls.length && OpenInTabsUtils.confirmOpenInTabs(urls.length, window))
				gBrowser.loadURI(urls.shift().uri, this.p),
				urls.length && PlacesUIUtils._openTabset(urls, this.e, window);
		}
	},
	wheel(e) {
		var findbar = gBrowser.selectedTab._findBar;
		findbar?.matches(":hover") && e.deltaY
			&& findbar.onFindAgainCommand(e.deltaY < 0);
	}
}).init(document.getElementById("tabbrowser-tabpanels"))}
catch(ex) {Cu.reportError(ex);}

kokoss пишет

Что необходимо добавить (изменить) в этом скрипте:
https://github.com/ardiman/userChrome.js/blob/master/autopopup/AutoPopup.uc.js
что бы он реагировал и на кнопки CB ? В [firefox] 76

Ну, если заменить парочку подряд идущих функций,
то будет реагировать на всякие там менюшки #main-menubar'a, папок закладок
на панели закладок, и CB-кнопок, сделанных по стандарту «this.type = "menu";».

Но телепатии коду это не прибавит, пользовательская кнопка может быть сделана как угодно.

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

Выделить код

Код:

̣
	function getPopupMenu(elt) {

		if (whitesInx > -1 && PopElt) return PopElt;

		var popup = elt.querySelector(":scope > menupopup");
		if (popup) return popup;

		var id = elt.getAttribute("popup");
		return id && document.getElementById(id);
	}

	function getPopupPos(elt) {

		var x = elt.screenX, y = elt.screenY, pos = 0;

		var trg = elt.closest("toolbar,hbox,vbox");
		if (trg) {
			var {width, height} = (elt = trg).getBoundingClientRect();
			if (height >= 3 * width) {
				if (height >= 45) pos = 9;
			}
			else if (width >= 3 * height && width >= 45) pos = 8;
		}
		else elt = elt.closest("window");
		try {
			var {width, height} = elt.getBoundingClientRect();
			x = pos & 1
				? x <= width / 2 + elt.screenX ? 1 : 3
				: y <= height / 2 + elt.screenY ? 0 : 2;
		}
		catch {x = 0;}
		return popupPos[x];
	}

katana пишет

У меня на ночном так и не заработал CB

А почему он должен был заработать? Что-то предпринималось?

Отсутствует

 

№1462524-05-2020 23:50:26

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Супер!!! Благодарю :beer:


Win7

Отсутствует

 

Board footer

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