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

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№1465120-05-2020 10:53:35

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
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;
соответственно, можно попробовать заменить в коде (в двух местах).

Отсутствует

 

№1465220-05-2020 14:39:51

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
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»

Отсутствует

 

№1465320-05-2020 22:35:22

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
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
            ));

Отсутствует

 

№1465420-05-2020 23:32:56

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
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»

Отсутствует

 

№1465521-05-2020 11:04:05

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
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"
);

Отсутствует

 

№1465621-05-2020 21:12:37

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

Re: Custom Buttons

Dumby пишет

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

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

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

Отсутствует

 

№1465721-05-2020 21:13:13

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
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»

Отсутствует

 

№1465821-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)

Отсутствует

 

№1465922-05-2020 09:46:25

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

Re: Custom Buttons

voqabuhe пишет

А речь о чём?

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

Отсутствует

 

№1466023-05-2020 00:15:58

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
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»

Отсутствует

 

№1466123-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)

Отсутствует

 

№1466223-05-2020 09:47:40

Inko7
Участник
 
Группа: Members
Зарегистрирован: 09-11-2009
Сообщений: 1005
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)

Отсутствует

 

№1466323-05-2020 13:34:02

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1728
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

Отсутствует

 

№1466424-05-2020 11:30:47

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

Re: Custom Buttons

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

Отсутствует

 

№1466524-05-2020 17:45:51

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

Re: Custom Buttons

katana пишет

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

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


Win7

Отсутствует

 

№1466624-05-2020 20:00:21

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
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

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

Отсутствует

 

№1466724-05-2020 23:50:26

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

Re: Custom Buttons

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


Win7

Отсутствует

 

№1466825-05-2020 05:09:40

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

Re: Custom Buttons

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

Отсутствует

 

№1466925-05-2020 07:24:08

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

Re: Custom Buttons

Dumby пишет

Что-то не соображу как сделать, чтобы 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"));

Dumby, большое спасибо.
Что касается favicon'а, то попробую поиграться со стилями, может что-то придумаю.


«The Truth Is Out There»

Отсутствует

 

№1467025-05-2020 20:56:29

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

Re: Custom Buttons

Dumby пишет

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

Спасибо, устраивает на все сто!

Отсутствует

 

№1467125-05-2020 22:01:37

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

Re: Custom Buttons

Здравствуйте!
Подскажите, пожалуйста, что нужно изменить в коде кнопки Quick toggle for about:config preferences, чтоб браузер запускался с последним запущенным юзер-агентом, а не сбрасывал на дефолтный?

Отсутствует

 

№1467226-05-2020 02:20:21

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

Re: Custom Buttons

Dumby пишет

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

Dumby.
Я попросил помощи со стилями для кнопки у Vitaliy V. Он, как всегда, оказался на высоте.
Вот код кнопки с исправленными стилями:

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

Выделить код

Код:

({
	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[${this.id}] .${this.id} {
				width: 16px;
				height: 16px;
                position: relative;
                margin-top: 1px;
                margin-inline-start: -6px;
                margin-inline-end: -10px;
				background-position: top left;
				background-repeat: no-repeat;
				background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEHSURBVHjaYmQAArWgflEglQrEgUCsAsR3gHg9EM++ta7wNSNIASMjQx/rr7fhEd6WrAbaygy3Hr1l2Hjw+u8Xbz+v/P+foYgFZIKEMG94foARKxfTDwZ3G3UGb6Cgj406a2rrhvDnbz5fZwJZ4W+vyRroacdw4MB+hjt37jA8e/aMYd/2NQzOxrKsIHmQIhU1OWGQ0xiSk5MZVFVVGdasWcPg4eHBYKglDxJWAVl3B+gGE5AV8vLyDLdv3wbTrKysDOuOHgMpugMyaT3IkbeBjgVJqKiogOnbUMeD5JmFNT1ufP3+S2b/mfua7z//YH778RvD1iO3GLoXHwH7DqionZGYcAIIMADkw2lofXkQ/wAAAABJRU5ErkJggg==");
            }
            tab.tabbrowser-tab[${this.id}]:-moz-locale-dir(rtl) .${this.id} {
				background-position: top right;
            }
            tab.tabbrowser-tab[${this.id}] .tab-icon-image {
				display: -moz-box;
            }
            tab.tabbrowser-tab[${this.id}][pendingicon] .tab-icon-image {
				visibility: hidden;
            }
            tab.tabbrowser-tab[${this.id}] .tab-icon-pending,
            tab.tabbrowser-tab[${this.id}] .tab-throbber {
				display: none;
			}
		`.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"));


«The Truth Is Out There»

Отсутствует

 

№1467326-05-2020 08:35:03

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

Re: Custom Buttons

katana пишет

да и как исправили походу, думал заработает баг какой-то был?

Ровно наоборот.
Не было никакого бага, затем его придумали.
А когда "исправили", тогда и отвалилось.
Этот ещё ничего, имеет разумное обоснование.

Что надо сделать? Обновление надо сделать.
Хотя весьма странно чего-то ожидать от Nightly.
Она чтобы с чем-то возиться, а не чтобы чем-то пользоваться.
Если почему-то прям невтерпёж забрать снимок за неделю
до Merge Day, то вот, собери себе от двенадцатой

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

Выделить код

Код:

// CB-0.0.7.0.0.{12-14}-fx.js
(async re => {
	var gzip = "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";

	var sel = "Select";
	try {sel = Services.strings.createBundle("chrome://global/locale/commonDialogs.properties")
		.GetStringFromName(sel);} catch(ex) {}
	var picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
	picker.init(window, sel + " CB 0.0.7.0.0.12", picker.modeOpen);
	picker.appendFilter(null, "custom_buttons-0.0.7.0.0.12-fx-*.xpi");
	await new Promise(resolve => picker.open(resolve));
	var {file} = picker; if (!file) return;
	var ln = file.leafName;
	if (!re.test(ln)) return alert("???\n" + ln);
	var {fileURL} = picker;

	var xpi = file.parent.clone();
	xpi.append(ln = ln.replace("12-", "14-"));
	file.copyTo(file.parent, ln);

	var obs = {}, data;
	var td = new TextDecoder(), te = new TextEncoder();
	var scs = Cc["@mozilla.org/streamConverters;1"].getService(Ci.nsIStreamConverterService);
	var sis = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
	var sl =  Cc["@mozilla.org/network/stream-loader;1"].createInstance(Ci.nsIStreamLoader);

	sis.data = atob(gzip);
	obs.onStreamComplete = (a, b, c, d, result) => data = td.decode(new Uint8Array(result));
	sl.init(obs);
	var converter = scs.asyncConvertData("gzip", "uncompressed", sl, null);

	converter.onStartRequest(null, null);
	var args = [null, null, sis, 0, sis.data.length];
	if (converter.onDataAvailable.length == 4) args.shift();
	converter.onDataAvailable(...args);
	converter.onStopRequest(null, null, null);

	var zw = Cc["@mozilla.org/zipwriter;1"].createInstance(Ci.nsIZipWriter);
	var mt = Date.now() * 1000, cp = zw.COMPRESSION_DEFAULT;
	var bootstrap = ln.includes("bootstrap");
	var prefix = "jar:" + fileURL.spec + "!/";
	var lr = /^¦(?:\d+)?$/, sep1 = "£", sep2 = "¥";

	zw.open(xpi, 0x04); // PR_RDWR
	for(var item of data.split(sep1)) {
		var [entry, val] = item.split(sep2);
		if (bootstrap && (entry == "manifest.json" || entry == "startup.jsm")) continue;
		if (val == "+") {
			zw.addEntryDirectory(entry, mt, false); continue;
		}
		if (zw.hasEntry(entry)) {
			if (val.includes("¦")) {
				var lines = val.split("\n");
				var oldLines = (await (await fetch(prefix + entry)).text()).split("\n");

				lines.forEach((line, ind) => {
					if (lr.test(line)) lines[ind] = oldLines[
						line.length == 1 ? ind : +line.slice(1)
					];
				});
				val = lines.join("\n");
			}
			zw.removeEntry(entry, false);
			if (val == "-") continue;
		}
		var stream = Cc["@mozilla.org/io/string-input-stream;1"]
			.createInstance(Ci.nsISupportsCString);
		stream.data = String.fromCharCode(...new Uint8Array(te.encode(val)));
		zw.addEntryStream(entry, mt, cp, stream, false);
		stream.close();
	}
	zw.close(); xpi.reveal();
})(
	/^custom_buttons-0\.0\.7\.0\.0\.12-fx-(?:paxmod|bootstrap)\.xpi$/
);

kazarin пишет

что нужно изменить в коде кнопки

Очевидно же

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

Выделить код

Код:

/*
var ps = Components.classes["@mozilla.org/preferences-service;1"].getService (Components.interfaces.nsIPrefService).getBranch("general.");
    ps.setCharPref("useragent.override", useragent);
*/

unter_officer пишет

Вот код кнопки с исправленными стилями

Как-то я потерялся.
Да, улучшения вижу, типа компактное позиционирование,
показ индикатора и на закреплённых вкладках, поддержка rtl,
но я говорил о другом и, видимо, плохо сформулировал.
Попробую ещё раз:

скрытый текст
В режиме автоперезагрузки
скрываем всякие снующие точки, а чтобы favicon,
при пересменке адреса, не схлопывался и не дёргал
за собой текст на вкладке, делаем его всегда видимым,
пусть спокойно мигает.


Но если на странице favicon отсутствует вообще,
то и на (незакреплённой) вкладке он не показывается никакой.


А вот в режиме автоперезагрузки он, соответственно, вылезает,
красуется своим defaultFavicon.svg list-style-image, занимает место.


И это нехорошо. Ну разве что только не для тех, кто и так,
в повседневном обиходе, имеет, и как-то реализовал,
предпочтение видеть favicon на всех вкладках без исключения.

Отсутствует

 

№1467426-05-2020 11:43:11

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 77.0

Re: Custom Buttons

Dumby пишет

А вот в режиме автоперезагрузки он, соответственно, вылезает,
красуется своим defaultFavicon.svg list-style-image, занимает место.

Да я заметил, но меня просили сделать чтобы favicon таба не сдвигался вправо,
и сам индикатор не занимал места был поверх favicon.
А так можно попробовать добавить в последнее правило

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

Выделить код

Код:

tab.tabbrowser-tab[${this.id}]:not([pendingicon]) .tab-icon-image:not([src]):not([busy]):not([pinned]):not([crashed]):not([sharing]),


тогда там где нет иконок defaultFavicon.svg будет появлятся только во время загрузки, но там и по умолчанию текст дергается когда появляется индикатор загрузки.
Да кстати вчера надо было исправить замену
скрытый текст

Выделить код

Код:

.replace(/;\s*\n/g, " !important;\n");


а то странный тип данных получается data:image/png !important;base64,... или data:image/x-icon !important;base64,...

Отредактировано Vitaliy V. (26-05-2020 12:06:35)

Отсутствует

 

№1467526-05-2020 12:03:44

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

Re: Custom Buttons

Dumby
Пересел на бету, заметил с этим ночным одни проблемы, лучше подождать Merge Day, просто недопонял.


Может вам обьеденится с Vitaliy V.? и делать один продукт, легче будет да и там понятнее, а так 2 продукта и каждый в нем крутится.
Многие уже переходят смотрю на CustomizableUI.createWidget.
Не спорю тут есть свой плюсы, что можно сразу в окне редактировать, да и продукт который допиливали долго(но он морально устарел"наверно").

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

Есть сильные различия? чтобы продолжать чинить "все умирающий и никак не умрет".)
Хотя если только те кто остались на еср ветках, так там 2 пути или обновлять и приобрести проблемы, либо сидеть на итак рабочем.

Раньше в этой теме много кто сидел, Infocatcher пишет еще кнопки?
Да пишет походу, и еще какой-то код.
https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/customizableUI.js

Отсутствует

 

Board footer

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