при нажатии СКМ по папкам в меню закладок или на панели закладок
==> код позволяет
И как же такое может быть, ведь это будет <menu> или <toolbarbutton>,
а в коде написано
if ( target.localName !== "menuitem" || !target._placesNode ) return;
Эту бы кнопку в скрипт
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);}
В ночном похоже отвалился CB?
Было дело. Bug 1558635
Возможно ли его переделать под последнюю версию ?
Ну, <label> вкладки нынче предлагается получать так: var lab = tab.textLabel;
соответственно, можно попробовать заменить в коде (в двух местах).
Отсутствует
Ну, <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)); } }` });
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»
Отсутствует
Есть ещё просьба по одной из ваших кнопок.
Не, код не мой, с меня только 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 ));
Отсутствует
Dumby, спасибо большое.
Не подскажите ещё вот с этим.
// Открыть новую вкладку двойным кликом по панели вкладок addEventListener("dblclick", e => { if ( e.button || e.ctrlKey || e.shiftKey || e.altKey ) return; try { BrowserOpenTab(); } catch(e) { }; }, false, document.getElementById("TabsToolbar"));
Суть в том, что на крайней версии новая вкладка почему-то открывается не только при двойным кликом по панели вкладок, но и при двойном клике по самим табам. Можно это как-то подправить?
Отредактировано unter_officer (20-05-2020 23:40:32)
«The Truth Is Out There»
Отсутствует
новая вкладка почему-то открывается не только при двойным кликом по панели вкладок, но и при двойном клике по самим табам
Ну да, сами табы же на панели вкладок.
Можно, например, какой-нибудь проверочный селектор
подобрать, чтоб подходил под задачу. Что-то типа
(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" );
Отсутствует
И как же такое может быть, ведь это будет <menu> или <toolbarbutton>,
а в коде написано
if ( target.localName !== "menuitem" || !target._placesNode ) return;
не совсем понял про что конкретно речь...
код вроде давно-давно писал bunda1 и он работает до сих пор у меня на FF52esr, лежит в какой-то кнопке в инициализации
может для FF76 его нужно вначале адаптировать?
мне главнее получить работоспособность второго кода - "прокручивать найденные результаты на странице колесиком мышки"
Отсутствует
Ну да, сами табы же на панели вкладок.
Можно, например, какой-нибудь проверочный селектор
подобрать, чтоб подходил под задачу. Что-то типаскрытый текстВыделить кодКод:
(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»
Отсутствует
может для FF76 его нужно вначале адаптировать?
мне главнее получить работоспособность второго кода - "прокручивать найденные результаты на странице колесиком мышки"
А речь о чём? Если о FindBar, то его Dumby уже адаптировал.
Отредактировано voqabuhe (21-05-2020 21:48:35)
Отсутствует
А речь о чём?
вопрос был про адаптацию кодов для user_chrome_files
пост с запросом
Отсутствует
Dumby. Возможно ли подправить вот эту кнопочку под крайнюю версию ?
// "Автоматически перезагружать" в контекстном меню вкладки, от 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»
Отсутствует
katana
проверьте вот этот код для user-chrome-files кто-нибудь у себя? правда, я так и не разобрался в какой именно файл его поместить...
проверил еще раз после обновления user_chrome_files и частично код ЗАРАБОТАЛ! - прокрутка результатов поиска на странице листается колесом мыши
(код помещал в конец custom_script_win.js)
Отредактировано Inko7 (23-05-2020 09:56:49)
Отсутствует
Dumby
Что необходимо добавить (изменить) в этом скрипте:
Отредактировано kokoss (25-05-2020 02:11:43)
Win7
Отсутствует
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"));
частично код ЗАРАБОТАЛ!
Это так кажется из-за упорствования в ереси,
что код делает то, чего он не делает.
Под скудное описание того, что он якобы делает,
возможно, в какой-то степени, подойдёт нечто вроде
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);}
Что необходимо добавить (изменить) в этом скрипте:
https://github.com/ardiman/userChrome.js/blob/master/autopopup/AutoPopup.uc.js
что бы он реагировал и на кнопки CB ? В 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]; }
У меня на ночном так и не заработал CB
А почему он должен был заработать? Что-то предпринималось?
Отсутствует
Что-то не соображу как сделать, чтобы 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»
Отсутствует
Здравствуйте!
Подскажите, пожалуйста, что нужно изменить в коде кнопки Quick toggle for about:config preferences, чтоб браузер запускался с последним запущенным юзер-агентом, а не сбрасывал на дефолтный?
Отсутствует
Что-то не соображу как сделать, чтобы 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»
Отсутствует
да и как исправили походу, думал заработает баг какой-то был?
Ровно наоборот.
Не было никакого бага, затем его придумали.
А когда "исправили", тогда и отвалилось.
Этот ещё ничего, имеет разумное обоснование.
Что надо сделать? Обновление надо сделать.
Хотя весьма странно чего-то ожидать от 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$/ );
что нужно изменить в коде кнопки
Очевидно же
/* var ps = Components.classes["@mozilla.org/preferences-service;1"].getService (Components.interfaces.nsIPrefService).getBranch("general."); ps.setCharPref("useragent.override", useragent); */
Вот код кнопки с исправленными стилями
Как-то я потерялся.
Да, улучшения вижу, типа компактное позиционирование,
показ индикатора и на закреплённых вкладках, поддержка rtl,
но я говорил о другом и, видимо, плохо сформулировал.
Попробую ещё раз:
Но если на странице favicon отсутствует вообще,
то и на (незакреплённой) вкладке он не показывается никакой.
А вот в режиме автоперезагрузки он, соответственно, вылезает,
красуется своим defaultFavicon.svg list-style-image, занимает место.
И это нехорошо. Ну разве что только не для тех, кто и так,
в повседневном обиходе, имеет, и как-то реализовал,
предпочтение видеть favicon на всех вкладках без исключения.
Отсутствует
А вот в режиме автоперезагрузки он, соответственно, вылезает,
красуется своим 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]),
Отредактировано Vitaliy V. (26-05-2020 12:06:35)
Отсутствует
Dumby
Пересел на бету, заметил с этим ночным одни проблемы, лучше подождать Merge Day, просто недопонял.
Может вам обьеденится с Vitaliy V.? и делать один продукт, легче будет да и там понятнее, а так 2 продукта и каждый в нем крутится.
Многие уже переходят смотрю на CustomizableUI.createWidget.
Не спорю тут есть свой плюсы, что можно сразу в окне редактировать, да и продукт который допиливали долго(но он морально устарел"наверно").
Два кода в конфиге лежит, и не знаю куда прыгать, там немного труднее но из за непоняток, тут сразу код вставил и работает, но просто зачем 2 иметь когда можно все завязать на одном, там и стили прикручены, сейчас мало живых тем, а так ну не знаю будут заходить не ради того или того а ради одного.
Есть сильные различия? чтобы продолжать чинить "все умирающий и никак не умрет".)
Хотя если только те кто остались на еср ветках, так там 2 пути или обновлять и приобрести проблемы, либо сидеть на итак рабочем.
Раньше в этой теме много кто сидел, Infocatcher пишет еще кнопки?
Да пишет походу, и еще какой-то код.
https://github.com/Infocatcher/Custom_Buttons/blob/master/code_snippets/customizableUI.js
Отсутствует