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

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

№1062612-09-2016 17:25:58

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

Несколько вопросов:
Как открыть некий код из буфера/страницы или из файла в scratchpad?
Как выполнить некий код при закрытии вкладки scratchpad'a (и вообще вкладки)? С окном выходит, а с вкладкой - никак. onbeforeunload не работает на вкладках?

Отсутствует

 

№1062712-09-2016 21:50:02

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

Re: Custom Buttons

turbot пишет

Несколько вопросов

Вопросы неподробны (непонятны). Может нажми

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

Выделить код

Код:

var некий_код_из_буфера$траницы_или_из_файла = "некий код из буфера/страницы или из файла";

var некий_код_при_закрытии_вкладки_scratchpada_и_вообще_вкладки = br => alert(`
    Вкладка будет закрыта
    ${br.currentURI.spec}
`);


var url = "chrome://devtools/content/scratchpad/scratchpad.xul";
var tab = gBrowser.selectedTab = gBrowser.addTab(url), br = tab.linkedBrowser;

var onPageShow = e => {
    var win = e.target.defaultView, {top} = win;
    if (top.location.href == url && win.location.href.startsWith("data:")) {
        //br.removeEventListener("pageshow", onPageShow, false);
        top.Scratchpad.setText(некий_код_из_буфера$траницы_или_из_файла);
    }
}
br.addEventListener("pageshow", onPageShow, false);
tab.addEventListener("TabClose", function TabClose(e) {
    tab.removeEventListener("TabClose", TabClose, false);
    br.removeEventListener("pageshow", onPageShow, false);
    некий_код_при_закрытии_вкладки_scratchpada_и_вообще_вкладки(br);
}, false);

Отсутствует

 

№1062812-09-2016 22:40:07

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

Dumby

некий_код_при_закрытии_вкладки_scratchpada_и_вообще_вкладки

Спасибо. :D

TabClose

Я ж пробовал, но, видимо, не через то место. :dumb:

Отсутствует

 

№1062913-09-2016 11:44:01

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Custom Buttons

intersk пишет
bunda1 пишет

Блокнот в вкладке( Firefox24+ ) от 27.06.2016.

а шрифт текста можно изменить? как, если можно

В вкладке Справка под:

Выделить код

Код:

color: white;

положи

Выделить код

Код:

font-family: Geneva, Arial, Helvetica, sans-serif;

тут Безопасные шрифтовые CSS стеки для рунета можно взять список шрифтов.

Отсутствует

 

№1063013-09-2016 17:30:33

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 104
UA: Firefox 48.0

Re: Custom Buttons

а можно готовый код Save + с изменением? пытался сам - кнопка не работает

Отсутствует

 

№1063113-09-2016 20:58:25

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Custom Buttons

intersk пишет

а можно готовый код Save + с изменением? пытался сам - кнопка не работает

Выделить код

Код:

// Save+, от 13.09.2016. .............

// Настройка функций кликов мыши .............
this._handleClick =()=> menuPopup.showPopup(this, -1, -1, "popup", "bottomleft", "topleft");


// Объявляем настройки и переменные для этой вкладки .............
var addSiteNameToShortcuts = false; // true => добавлять название домена к названию ярлыка

var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);

 
// Создать меню для кнопки .............
var array = [
   { label: "Сохранить значок веб-сайта", func: "saveFavicon()", image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACPVBMVEX09ff////C3L+Uq8+Vq8+Uqs+Zr9CZrtCZr9Gfu+ear8+mt9JRf8ORxl3t8vfF06+Twojs8/d9otl8o9s+aquZrs/X9KLp8Pft8fZhisf//+DBzN2hveihv+pii8hti9pgicl6oNlojs1zncNsi836/P2duebx8/eYyWqBp+Gn0IKBvlKHsm9qmaVuk8zt7/FEbauEv1Tp7/JdhL9oi9Pl8e2LwlmdsdD7/P76+/3H7ofo8+peh8eHwFaSteZ0pkp2gl7q8/Ohy5OApt2by2eZuOqbuOWaezWuvtd7nN2HvWxul9Ty9feQxV5ljcqBp+JEcLCVtOOo0nR7odx5n9suX6Z1mtBzmtSXyGPv9PewzfOzx+O6zu/s8fd9o95Xfrthi8lYhMN5oNnw9ffw9Pjw9Pf8/f6ewO/m8O9zmdE6aapsjdyUwouPxWPDzd6XteOSs9B5nNVpnpqHt7h/s6F6n9d7ntSTttGHwVh4qp+Ev1HH7ox6qk5wj+Hm8e3t9fOm0IKAtqOBpNrx+P9ljcyhs9FpkM2hv+/u8/fF0eOLu4N+vFKgzX3p9OSFqN13qExekIl4n9j7/P3x9PhxmNDm8e9Vg8Zfkozr8veq0YTX9qL//92AtamOwnHFz96Fot1diMh+pd13ntmatu+YyW/3+/+Tqs5UgcShzJNbhsdTf8GHs7bo8PaXtuqMr+Ty8/SZt+SUqs7r7Ox3ndb9/f7t8feZyXGYyWWCpNbz9PRuiteNtNDn7/V4ntjx8fGo3JqNAAAAv3RSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AEVuhDkAAAD+SURBVBhXY5jHzcUMAqxAICq9bx8D96adDFAgaGQOFOBaH7h7zoqZDTlFyptncAAFWBjyi52CXCI0unRLxcECPhsatbbzmlXMnS60hg0kkOxW0uNrq93tNaFpD1ggUm21QK532ZQdSm1hmXKdDCwdnOWVOi1RjNGMQCCrwMDMJ8NZ4LAynVGPkXFp8zpJBubYmn579wXtqhZb0iwn9a1iWLaViYmJ3891obOwYtLEvcYMGyWAAkwJdv6accEhi8LjGVr11SenpC5f61g3NcO0vjCAIc+DjZ2dnWexddWSbYa9nlkM+8BgWsxsK7FZ1VLzRaACNokmtdnyu1QMQgF7Rlh4zWWTAwAAAABJRU5ErkJggg=="},
   { label: "Запомнить значок веб-сайта как base64", func: "copyFaviconData()", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAAAAAAAAAAAAAI2bv/9RVpf/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAACIkvD/Jia6/ywpq/8AAAAAAAAAAAAAAAAAAAD/AAAA/wbwAf90qpv/Ymic/1RWqP9OUKr/W2Ch/2dumf9YYKT/Ly/B/xQP3/8MB9P/JCGb/wAAAAAAAAAAAAAAAAAAAP8G8AH/U5ea/ycr8f8VIP3/HiP4/ywo8v8sIvb/LCL2/ywi9v8KBOj/BQDe/wQAtv8tK4P/AAAAAAAAAAAAAAD/BvAB/3Sqm/9iaJz/Tim3/0UuuP9GPrT/R0ex/zk8uf8gIMz/FRDe/xEMzv8jIJz/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8AAAD/SqOR/yImvP8sLKj/AAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/BvAB/3Sqm/9KW5r/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAABvAB/wbwAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/BvAB/wbwAf8G8AH/AAAAAAAAAAAAAAAAAAAAAAAAAAAG8AH/AAAAAAAAAP8G8AH/AAAAAAAAAAAAAAAAAAAA/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAP8G8AH/BvAB/wbwAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BvAB/wbwAf8AAAAAAAAA/wAAAP8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/AAAAAAAAAAAG8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wbwAf8G8AH/BvAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOesQQBjrEGAAaxBwACsQcABrEHDg6xBwAesQcAPrEHAD6xBw8+sQcPprEHD8axBwAGsQQABrEGAAaxB//+sQQ=="},  
   { separator: ''},
   { label: "Сохранить ярлык страницы как…", func: "saveShortcuts('true')", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADzqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/BP8k/wT/JP8E/yT/BP8k/5XLDv/zqgD/86oA//I1///yNf//86oA//OqAP/zqgD/86oA//OqAP+Vyw7/lcsO/wT/JP8E/yT/BP8k/5XLDv+Vyw7/86oA//OqAP/yNf//8jX///OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA//02AP/9NgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP/9NgD//TYA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/wT/JP+Vyw7/86oA//OqAP/zqgD/86oA/wA31v8AN9b/86oA//9If///SH//86oA//OqAP/zqgD/86oA/5XLDv8E/yT/lcsO//OqAP/zqgD/86oA//OqAP8AN9b/ADfW//OqAP//SH///0h///OqAP/zqgD/86oA//OqAP+Vyw7/BP8k/5XLDv/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/lcsO/5XLDv+Vyw7/86oA//OqAP/zqgD/86oA/0CA//9AgP//86oA/07+9f9O/vX/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP9AgP//QID///OqAP9O/vX/Tv71//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/86oA//OqAP/zqgD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ=="},
   { label: "Сохранить ярлык страницы без запроса на сохранение", func: "saveShortcuts()", image: false},
   { separator: ''},
   { label: "Сохранить всю страницу как PNG", func: "WebScreenShot.captureAll()", 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", func: "WebScreenShot.capturePage()", image: false},
   { label: "Сохранить фрейм на странице как PNG", func: "WebScreenShotByClick.init()", 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", func: "WebScreenShotByClipping.init()", 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="},
   { separator: ''},
   { label: "Сохранить всю страницу как PDF", func: "savePageToPDF()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUw4pJt3V/+Rb1D8lnFP/55zTf+VcVH/lXJS/5VyUv+VclL/lXJS/5VyUv+VclL/k3BR/J56Wv9cRzSkAAAAAJNvUKTto2L/4ppe/uehZf/Pmmr/noZv/9Scav/Wl17/1plh/9eZYf/XmWH/15lh/9eZYf/WmGD/2Jlg/suRXP9mRiuk8rWA/397dP1akKn/rqqi/3LF3f8Mntj/4dLJ///+9f/48u3/9e7n//bt5v/47+f/+O/n//jv5//rvZP/1ZJX/a9/VP9+lrD8AIvz/xOt+f8Douv/ALb6/wC28/9tmar/z8jJ//Lq5/////7//v////n9///6/P3//////+Ta0P/PjVP/pnpT/IWds/+aiXj/5efl/8Px//951/3/LMz//wCx8/8GltL/NIu3/4ycqf/l29L////+//n6+//8/v//3tXM/8+OVP+oe1P/6K57/86QWP/r6Ob////////++v/r9/z/oOb9/zDL//8Arf//AI/r/ydysv+hpqr//PTr///////d1Mz/0I5U/6h7U//osH//wo5g/+fm5P/7/f//9vf5//z7+////vv/9/r8/5Dc/P8Oqv7/AJf//wF02v9ffZ7/8Ojh/+Ha1P/NjFL/qHtT/+ewf//Ej1//7O3r///////+/v7//v7+//f5+v/6+vv////8/8Tq/f8hp/7/AJH//wB18/8/bqj/1MGu/9mXXv+leVH/569+/8iSYv+/tKn/wLew/8O5sf/P0M////////7+/v/3+fv////7/9Hv/v8hoP3/AIn//wB4/v84ZqL/w4NH/619VP/nsYD/x45c/9W5of/bv6j/0Jxt/6J/YP+spqD/2N3i//7////6+/3///76/8vr/v8Slv7/AIb+/wBz//83VH7/nW1B/+ewfv/Fjl7/7Ozr///////9+/r/9d7K/9Ghdv+jd1D/pJ6Y/+jt8f/9///////7/6fb/v8Ahv7/AYD//wRp6f95YlT/57B//8SOXv/n5uT//v7///r7/P/8/v////////XRsv/DhEv/loBu/9DX3P/9/v/////7/2O6/f8Afv//FnTU/5JtTf/nsH//xY9e/+jn5f/+/f//+fj5//n4+P/5+Pn/+/////Xbxf/Wj1D/nX1h/+Ll6P////7/3+/3/w+V//8tcbP/qHJB/+WuffzCjV7/5efn///////+/v7//////////////v7///////XRsP/TnW3/8fT3//////////z/ddD//0Nxl/+zdkH88LmH/9CRWP2+qJT/0M7N/8/Jxv/Pysf/z8rH/8/Kxv/Py8n/zsO6/7+pmP/PzMv/zsnG/9bNyP+nsK7/h4R3/b2BT/+Sb1Ck7qxw/9GSW/69hlb/wYhX/8CIV//AiFf/wIhX/8CIVv/BiVj/xI1d/8CIVv/BiFf/vYZW/9STW/7ppmv/bE80pAAAAACUd16k+sui/+7AmPzwwpr/8MKa//DCmv/wwpr/8MKa//DCmf/vwZj/8MKa//DCmv/uwJj8+cui/5N3XaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { label: "Добавить url и сохранить страницу", func: "savePage()", image: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAyMjIzwyMjFeLi0tVS8vLlcuLy9XLS4uVywsLFUuLi5aKSkpUggICBMAAAAAAgICAQAAAAAAAAAAAAAAABQTEyOgoJ/yysvL/s3Pz/7Z293/4OPk/+bp6f/t7u7/5eXl/LOysv97e3vLFRUWJQAAAAACAgIDAAAAAAAAAAA8PDxSz9HT/83Qz/fLx8T8z7+5/M/AsPzez8n89e3r/PDx8fyusLL43dzc/52dndMWFhY2AAAAAAICAgIAAAAAODg5T8bEv/+9o476vIR1/7WDcv+uj3v/spCA/8Wqk//Gtab/rqyq/+Pk5fn19fX+np6e4BQUFCgAAAAAAAAAAC4uJU29oYj/wLao+tLDqf/Mv7P/yLik/7zEvP/F0cr/v62Y/6+Kef/Z2NP/6Ors+d3c3P97e3vNBAQEDgIDAAZhRCuYxaSb/8Gvqfu2inL/vIF0/7FmUv+ygG//waaX/8m8tP/CoIn/vqOF/9zg3//l5ef7ycnJ/zY2Nm0hFw08rGJD/6BlYf2mWUD/rW9g/7aNff+ZRyL/pmxR/7RyWv+qaEz/uYR0/69kSf/k1tD//////Ozs6/1iYmK4WTMck61mVv+Yemj8hjsg/51bQ/+wem//n084/6+pq/+3p6H/l0Ux/4lFOf+gWDr/zq2X//b7/fzo6Oj/YWBgsXpXSbnMsp//wNC8/I9jWv+WX1X/tn5w/7iKfv/Tzc7/ztXc/513bf+MSjH/rWJG/7iRd//o7Oz85OPl/2BgYLN1aFqu2tO+/7ejnvyohYD/ybGb/7q1ov/HwrX/7/Lr//T19v/Hzs3/p4V0/6hvW/+6gHf/4uDh/N3e3v9hYWC0dWNPuaVXRP6cfWv8w7Gz/8vHsv/U2dP/4OHf//b08//9/Pv/3drZ/7rBw/+0ppv/wZ2F/9zc3PzW1tj/ZWRktE1HPW2oa1f/lX1t/cTP0v/Ew8T/3Nvd/9LR0//W1tf/5OXl/+/t6v/i6vD/wK+i/8y2o//b3t/81NTU/2FhYbMMDAsPsZ2a1tDX2P++vL390c/P/+Dh4P/b29r/09PS/9rY1//6+Pf/8PP3/8Kqlf/c0sv/3N7g/NTU1P9iYmKyAAAAAEY6MmXozcP/5ezt+OHk6Pzt7Oz9+Pj4/urq6/zs7/T8+f///NXGsPzey8P87vDy/OXm5vnf39//ZWVlrgAAAAAGBQQQdFdHy8Wfhv/d18797e7w/+3t7P/y8u7/7N/G/7unff+/uqT/4+Tl/97d3v/c3Nz/sLCw+h8fH0IBAQABAAEBABEVFx8vJB1cWy8ciZNrU8itknHrkWdIxUsqFnEnJSBRMjQ3WS8uL1csLCtVMjIyXiIiIj4BAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="},
   { label: "Сохранить выделенный текст как txt файл", func: "saveSelectionToTxt()", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAQE6AAAAZAAAAGgAAAJmAAACZgAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAAAGYAAABlAAAAaQABAmYAAQEjAAAAADlVkOdVcKHxVXKi8kdklPJLZpfyU3Cg8lJvn/JRbZ7yUW+g8lFun/JRbp/yUG6e8lVyofFVdKjzLkV45wAAAFABAQEAaIzF/3y34v9wsuL/cJe0/0lpgv9bjLP/dLLh/2+v3v9sq9v/cK3d/3Gv3v9sqtv/b7Df/4G77P9VcqT2AAAAVAMDAQBnir/+ZqfU/pDB4/7a3uD+j46N/kxYXv6To6/+1er4/tXp+P7J3/D+1ej4/svg8v6Gut/9aqzd/lhxnvAAAABSAwIBAGaIvv9pptX/ocfj//f4/P/P0tX/g4CA/1xZWf+Woqr/2uz8/9Hl+f/W5fT/2Of3/5fC4v5tq93/Vm+e8QAAAFIDAgEAaYm+/3mw2/+iyeX/9Pn8/+z0+//IzNL/d3h5/0tMTv+Mkpn/xdvs/9Hp/f/O4PL/msXk/nmz4/9XcJ/xAAAAUgMDAQBti7//k7/h/6fL5v/v9fn/4u73/9Dk9P+8wMT/YGpx/zJJWv94iJf/ztzo/9Pp/P+ZwuD+gLfk/1dwnvEAAABSAwMBAHOPwf+myub/sNHp//j7/P/6/P3/8fr///r39P+sxdP/IXWq/xJJcv+NjZD/0+Lu/6TN7f6Ft+L/WXGf8QAAAFIDAwEAd5LD/7PR6/+ZxOP/0ePx/97r9f/Y5/L/3e32/8Tc7f9gseT/CHK3/zBYdv+HiY7/lL/f/pLE7/9bcJ3xAAAAUgMDAQB4k8P/xNvx/5/F5f+kyOX/qMrn/6TH5f+kyOX/sM/q/5e51P9Mm83/GHm3/xxIav9fdYf+pMvs/1x1pfIAAABTAwMBAHmSxf/O4/T/y9/y/8Hb9P/C3PX/wNv0/7vW7/+93ff/utDm/42fsf9Gjbn/EXS2/ytSbv6Fj5r/WnGc8gAAAFICAwEBepPE/tHk9f/S5PX/vMjV/7fCzP+3w8//uMPP/7XBzP+6ytf/qa+4/3h/hv9Ghaz/JoO+/jNXdP82PVnyAAAAVgACAgCBmcb/2+r3/dHh8fyPkpX/kI6N/5yam/+dnJ3/paWk/6enpf+sr6//mpSR/3Bubf9SjbD8H4C+/QsrSvcCAAB/AAAAA3yVx//j8///3u/7/52gpf6pqKf+uLm5/rq7u/7Ly8v+ycnI/paWlf6LjY/+np2f/Xh+g/5gnL7/MX+y/xcgJ80BAgNNN1OUs6W84fDA1O73mJyj/ainpv+2trb/t7e4/8fHyP/Fxsb/kZGQ/4eGhP+vucT/j6G+/W53k/NlkbnwNoOv/AgiNb8CCBsQDRo/YwsaO3B0d33arKyp9q2trfWvr6/2u7u79ru7vPawr7H1sbCt9nJ2gOQIGD6bFCFEYB0qPE1Bf6SpEz9cggAAAAMCAQEBAQAAADIyMmlDQ0ONQUFBhUFBQYVCQkGFQkJBhUhISIRNTU2OKysrZAEAAAUBAQAAAgEAAAkEAAEDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="},
   { separator: ''},
   { label: "Запомнить изображение как base64, в контекстном меню", value: "CB.Save.WebScreenShotOnImage"},
   { label: "Сохранить выделенный текст в файл, в контекстном меню", value: "CB.Save.SelectionToFile" },
   { label: "Открыть выделенный текст в внешнем редакторе, в контекстном меню", value: "CB.Save.TextToEditor"},
];

var menuPopup = self.appendChild(document.createElement("menupopup"));
array.forEach((m,i)=> {
   if ("separator" in m) { menuPopup.appendChild(document.createElement("menuseparator")); return };
   var mItem = menuPopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m.label);
   mItem.setAttribute("class", "menuitem-iconic");
   if ("image" in m) mItem.setAttribute("image", m.image || array[i-1].image); 
   if ("value" in m) { 
       mItem.setAttribute('type', 'checkbox');
       mItem.setAttribute('checked', cbu.getPrefs(m.value) );
       mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));
       }
   if ("func" in m) mItem.addEventListener("command", ()=> eval(m.func.toString()));
});
menuPopup.setAttribute("onclick", "event.stopPropagation()");



// Сохранить как PNG страницу или части страницы .............
WebScreenShot = {
   capture: function(win, x, y, width, height, isCopy) {
      var mainWindow = document.getElementById('main-window');
      var scrollbox = document.createElement('scrollbox');
      scrollbox.width = '1';
      scrollbox.height = '1';
      mainWindow.appendChild(scrollbox);
      var canvas = document.createElementNS(xhtmlns, 'canvas');
      canvas.style.display = 'inline';
      canvas.width = width;
      canvas.height = height;
      scrollbox.appendChild(canvas);

      var ctx = canvas.getContext("2d");
      try {
          ctx.clearRect(0, 0, width, height);
          ctx.save();
          ctx.scale(1.0, 1.0);
          ctx.drawWindow(win, x, y, width, height, "rgb(255,255,255)");
          ctx.restore();
          }
      catch(e) {
               alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", self.label, "Не могу сохранить, слишком большая страница"); 
               mainWindow.removeChild(scrollbox);
               }
      var url = canvas.toDataURL("image/png");
      var url = Services.io.newURI(url, null, null);
      var fp = window.makeFilePicker();
      fp.init(window, "Сохранить как…", fp.modeSave);
      fp.appendFilters(fp.filterImages);
      fp.defaultExtension = "png";
      fp.defaultString = getDocTitle() + ".png";
      if (fp.show() == fp.returnCancel || !fp.file) return;
      var wbp = window.makeWebBrowserPersist();
      parseInt(Services.appinfo.version) < 36
      ? wbp.saveURI(url, null, null, null, null, fp.file, null)
      : wbp.saveURI(url, null, null, null, null, null, fp.file, null); // если FF36+
   },
   captureAll: function() {
      var win = content;
      WebScreenShot.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY);
   },
   capturePage: function() {
      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;
      WebScreenShot.capture(win, scrX, scrY, win.innerWidth, win.innerHeight);
   },
   // Запомнить изображение на странице как base64 ....
   onImage: function(image) {
      var canvas = document.createElementNS(xhtmlns, 'canvas');
      canvas.width = image.naturalWidth;
      canvas.height = image.naturalHeight;
      var ctx = canvas.getContext('2d');
      ctx.drawImage(image, 0, 0);
      var base64 = canvas.toDataURL();
      gClipboard.write(base64);
      
      // стиль для изображение на сплывающей подсказке ....
      var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
      var uri = makeURI('data:text/css,'+ encodeURIComponent('#alertImage { height: 25px !important; width: 25px !important; }'));
      sss.loadAndRegisterSheet(uri, 0);
      
      // всплывающая подсказка ....
      alertsService.showAlertNotification(base64, self.label, "Запомнил изображение как base64", true, "", (s, t)=> { 
         if (t == 'alertfinished')
             sss.unregisterSheet(uri, 0); // удалить стиль когда подсказка закрывается
      }, "");
   }
};

// Сохранить выбранную область страницы как PNG ....
WebScreenShotByClipping = {
   capture: WebScreenShot.capture,
   handleEvent: function(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: function() {
      this.win = document.commandDispatcher.focusedWindow;
      if (this.win == window) this.win = content;
      this.doc = this.win.document;
      this.body = this.doc.body;
      if (!this.body instanceof HTMLBodyElement){
          alert("Не удается захватить!");
          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 = getComputedStyle(this.body, '').cursor;
      this.body.style.cursor = 'crosshair';
      this.doc.addEventListener('mousedown', this, true);
      this.doc.addEventListener('mousemove', this ,true);
      this.doc.addEventListener('mouseup', this ,true);
      this.doc.addEventListener('click', this, true);
   },
   uninit: function() {
      var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)];
      this.doc.removeEventListener('mousedown', this, true);
      this.doc.removeEventListener('mousemove', this, true);
      this.doc.removeEventListener('mouseup', this, true);
      this.doc.removeEventListener('click', this, true);
      this.body.style.cursor = this.defaultCursor;
      this.body.removeChild(this.box);
      this.capture.apply(this, pos);
   },
};

// Сохранить фрейм на странице как PNG ....
WebScreenShotByClick = {
   capture: WebScreenShot.capture,
   getPosition: function() {
   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: function() {
      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: function(e) {
      if (this.orgStyle) this.target.style.cssText = this.orgStyle;
      else this.target.removeAttribute('style'); 
   },
   handleEvent: function(e) {
      switch(e.type){
             case 'click':
                if (e.button) return;
                e.preventDefault();
                e.stopPropagation();
                this.lowlight();
                var pos = this.getPosition();
                this.capture.apply(this, pos);
                this.uninit();
                break;
             case 'mouseover':
                if (this.target) this.lowlight();
                this.target = e.target;
                this.highlight();
                break;
      }
   },
   init: function() {
      this.win = content;
      this.doc = content.document;
      this.doc.addEventListener('mouseover', this, true);
      this.doc.addEventListener('click', this, true);
   },
   uninit: function() {
      this.target = false;
      this.doc.removeEventListener('mouseover', this, true);
      this.doc.removeEventListener('click', this, true);
   },
};


// Сохранить страницу как PDF файл через сервис 'pdfmyurl.com' .............
function savePageToPDF(loc = content.location) {
   loc.href.startsWith("http") && loadURI("http://pdfmyurl.com?url=" + loc);
}; 

 
// Сохранить ярлык страницы в указанную папку или в последнюю папку сохранения .............
function saveShortcuts( saveAs ) {
     // блокируем создание ярлыков для внутреных страниц FF ....  
     if ( !getDocTitle() ) {   
          alertsService.showAlertNotification("chrome://global/skin/icons/error-16.png", self.label, "Не поддерживается", false, "", null, "");
          return;
          }
          
     var pref = "Save.pathToSaveShortcuts";
     var fileName = saveAs ? pathToFile( pref ) : false;
     if ( saveAs && !fileName ) return;        
                  
     // если у таба есть иконка сохранить иконку таба в установленную папку ....
     var favicon = /\.jpg/.test(content.location) ? false : gBrowser.mCurrentTab.image;
     var faviconName = "favicon" + Math.round(Math.random()*1000000000);     
     if ( favicon ) saveFaviconToFolder( faviconName );
     
     /* получить путь для сохранения из 'about:config', добавытъ заголовок страницы и название домена 
        или установленное вручную имя файла и создать ярлык ....*/
     var pathToFolder = gPrefService.getComplexValue(pref, Ci.nsISupportsString).data;
     var siteName = addSiteNameToShortcuts ? getSiteName() : "";
     var shortcutName = (!!fileName) ? fileName : ( siteName + getDocTitle() + getCurrentTopicNumber() );
     var path = pathToFolder + shortcutName + ".url";     
     file.initWithPath(path); 
    
     // адрес страницы в UTF-8 если это протокол 'file' или в 'Punycode' если это .рф домен .... 
     var url = content.document.location;   
     if ( url.protocol == 'file:' ) var url = convertFromUnicode("UTF-8", url);   
     else if ( url.host.slice(-3) == '.рф') var url = Services.io.newURI(url, null, null).asciiSpec;
     
     // текст ярлыка из адреса страницы и пути к иконке таба( если она была ) ....     
     var shortcut = "[InternetShortcut]" + "\r\n" + "URL=" + url;
     var faviconPath = "IconFile=C:\\Documents and Settings\\Favicon\\" + faviconName + ".ico" + "\r\n";
     if ( !favicon ) var faviconPath = "";
     var data = shortcut + "\r\n" + faviconPath + "IconIndex=0";      

     // записать текст в ярлык ....
     foStream.init(file, 0x02|0x08|0x20, 0666, 0);
     foStream.write(data, data.length);
     foStream.close();

     // подсказка ....
     var notification = 'Сохранил ярлык страницы в ' + pathToFolder;
     var image = favicon ? favicon : self.image;
     alertsService.showAlertNotification( image, getDocTitle(), notification, false, "", null, "" );
};



// Установка пути и названия для сохранения ярлыка через диалог сохранения, если отмена отдаст 'false' .............
function pathToFile( pref ) {   
     // получить предыдущий путь для сохранения из 'about:config' или диск C: ....
     try { var pathToFile = gPrefService.getComplexValue(pref, Ci.nsISupportsString).data } 
     catch(e) { var pathToFile = "C:\\" };

     // диалог создания и установки пути ....     
     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
     fp.init(window, "Укажите путь к файлу и его название!", fp.modeSave);
     fp.appendFilters( fp.filterAll );
     fp.defaultString = getSiteName() + getDocTitle() + getCurrentTopicNumber();
     file.initWithPath( pathToFile );
     fp.displayDirectory = file;
     
     if ( fp.show() == fp.returnCancel ) return false;
          // убрать название файла из пути к файлу и записать путь в 'about:config' ....
          var filePath = fp.file.path.toString();
          var fileName = fp.file.leafName.toString();
          cbu.setPrefs(pref, convertFromUnicode("UTF-8", filePath.replace(fileName, "")) );
          return fileName;
};



// Сохранить в указаную папку иконку таба как .ico и без диалога сохранения .............
function saveFaviconToFolder( faviconName ) {

     var path = "C:\\Documents and Settings\\Favicon\\";
     var favicon = gBrowser.mCurrentTab.image;
     var uri = Services.io.newURI( favicon, null, null );

     // создать папку если не существует ....
     file.initWithPath( path );
     if ( !file.exists() || !file.isDirectory() ) file.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
     
     // конвертировать в .ico файл иконку таба и сохранить, спасибо Dumby за этот код ....  
     var path = path + faviconName + ".ico";
     const xhtml = "http://www.w3.org/1999/xhtml";
     var img = document.createElementNS(xhtml, "img");
     var canvas = document.createElementNS(xhtml, "canvas");
     img.src = uri.spec;
     img.onload = function() {

     var width = img.width, height = img.height;
     if (width > 255 || height > 255) return;
     canvas.width = width; canvas.height = height;
     var context = canvas.getContext("2d");
     context.drawImage(img, 0, 0);
     var arr = context.getImageData(0, 0, width, height).data;

     var data = [];
     for ( var y = 0, l = height * 4; y < l; y += 4 ) {
           for ( var x = width * 4; x > 0; x -= 4 ) {
             var pos = x + y * width - 1;
             data.unshift(arr[pos - 1], arr[pos - 2], arr[pos - 3], arr[pos])
             }
        }
     function byte(num) {
            var str = num.toString(2);
            var l = str.length;
            var bytes = [];
            for ( var i = 1; i <= 3; i++ ) {
              var sub = str.substring(l - i * 8, l - (i - 1) * 8);
                  if ( !sub ) sub = "0";
              bytes[i] = parseInt(sub, 2);
              }
          return bytes;
        }
     var bytesLength = byte(data.length + 40);
     var bytesHeight = byte(height * 2);

     var header = [0,0, 1,0, 1,0, img.width, img.height, 0, 0, 1,0, 0,0 , bytesLength[1],bytesLength[2],bytesLength[3],0, 22,0,0,0];
     var info = [40,0,0,0,img.width,0,0,0,bytesHeight[1],bytesHeight[2],0,0,1,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
     var ico = header.concat(info, data);
     file.initWithPath(path);
     var bStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
     foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
     bStream.setOutputStream(foStream);
     bStream.writeByteArray(ico, ico.length);
     bStream.close();
     foStream.close();
     }
};


// Добавить адрес наверху страницы и открыть диалог сохранения страницы .............
function savePage() {
   var sURL = gURLBar.value;
   content.document.body.innerHTML = "<table width=100%><tr><td align=left><small><a target=_blank href=" + 
                                        sURL + ">"+ sURL + "</a></small>\n</td></tr></table>" + content.document.body.innerHTML;
   saveDocument(window.content.document);
};


// Сохранить иконку текущего сайта с диалогом сохранения .............
function saveFavicon() { saveImageURL(gBrowser.mCurrentTab.image, "save", null, false, false, null, content.document) };


// Скопировать иконку текущего сайта как base64 код .............
function copyFaviconData() {
   var img = new Image();
   img.src = gBrowser.mCurrentTab.image;
   WebScreenShot.onImage(img);
};


// Сохранить выделенный текст или весь текст на странице как txt файл .............
function saveSelectionToTxt() {
   var sel = getSelect();
   !sel && document.getElementById("cmd_selectAll").doCommand(); 
     
   // создать название файла из заголовка страницы и текущего времени и сохранить текст ....
   var fileTitle = (getDocTitle() ? getDocTitle() : 'Save+') + '  ' + (new Date()).toLocaleFormat("%H·%M·%S");
   saveURL("data:text/plain," + encodeURIComponent((content.location.href.startsWith('http') ? (content.location.href + "\r\n\r\n") : "") + getSelect()), 
                                fileTitle + ".txt", null, false, false, null, content.document);
   !sel && goDoCommand("cmd_selectNone"); 
};

 
// Добавляем в контекстного меню страницы новые пункты .............
((contextMenu, el)=> {
   // в контекстного меню изображений ....
   var baseItem = contextMenu.appendChild(document.createElement("menuitem"));
   baseItem.id = "content-baseItem";
   baseItem.setAttribute("label", "Запомнить изображение как base64");
   baseItem.onclick =()=> WebScreenShot.onImage(gContextMenu.target);

   // в контекстного меню выделенного текста ....
   var saveItem = contextMenu.insertBefore(document.createElement("menuitem"), el);
   saveItem.id = "content-saveItem";
   saveItem.setAttribute("label", "Сохранить выделенный текст в файл");
   saveItem.onclick =()=> saveSelectionToFile();

   var editorItem = contextMenu.insertBefore(document.createElement("menuitem"), el);
   editorItem.id = "content-editorItem";
   editorItem.setAttribute("label", "Открыть выделенный текст в внешнем редакторе");
   editorItem.onclick =()=> textToEditor();

   // устанавливаем где и при каких настройках показывать новые пункты ....
   addEventListener('popupshowing', e=> {
      if (e.target != e.currentTarget) return;
      var sel = gContextMenu.isTextSelected;
      saveItem.hidden = !sel || !cbu.getPrefs("CB.Save.SelectionToFile");
      editorItem.hidden = !sel || !cbu.getPrefs("CB.Save.TextToEditor"); 
      baseItem.hidden =  !gContextMenu.onImage || !cbu.getPrefs("CB.Save.WebScreenShotOnImage"); 
   }, false, contextMenu);

   // удалять новые пункти при изминениях ....
   addDestructor(()=> {
      baseItem.remove(); saveItem.remove(); editorItem.remove();
   });   
})(document.getElementById("contentAreaContextMenu"), document.getElementById("context-sep-open"));



// ПКМ на пункте 'Сохранить изображение как' в контекстном меню запомнинает изображение как base64 ................
document.getElementById("context-saveimage").onclick =e=> {
   if ( e.button !== 2 ) return;
   WebScreenShot.onImage(gContextMenu.target);
   document.getElementById("contentAreaContextMenu").hidePopup();
};



// Сохранить выделенный текст в файл на рабочем столе .............
function saveSelectionToFile() {
   var text = convertFromUnicode("UTF-8", getSelect() ); 
   var textTitle = convertFromUnicode("UTF-8", getDocTitle() ); 
   var time = (new Date()).toLocaleFormat("%H:%M:%S");
     
   // адрес страницы( в UTF-8 если это .рф домен ) ....
   var url = content.document.location;
   if (/\.рф/.test( url.host )) url = convertFromUnicode("UTF-8", url);
     
   // создать текст для записи ....     
   var line = "............................................................................" + "\n";
   var text = line + textTitle + " - " + time + "\n" + url + "\n\n" + text + "\n\n\n";

   // путь к файлу и название файла ....
   var file = Services.dirsvc.get("Desk", Ci.nsIFile); 
   file.append("Save - " + (new Date()).toLocaleFormat("%d.%m.%Y") + ".txt");
          
   // создать файл с текстом или добавлять текст в файл ...
   !file.exists() ? foStream.init(file, 0x02|0x08|0x20, 0666, 0) : foStream.init(file, 0x02 | 0x10, 0664, 0);
   foStream.write(text, text.length);
   foStream.close();

   // всплывающая подсказка дает возможность открыть файл если кликнуть на подсказке ....
   var notification = 'Сохранил выделенный текст в файл на рабочий стол'; 
   var image = gBrowser.mCurrentTab.image || self.image;
   alertsService.showAlertNotification(image, notification, "Кликни чтобы открыть файл", true, "", (s, t)=> { 
      if (t == 'alertclickcallback') file.launch();
   }, "");
};



// Создать текстовой файл с выделенным текстом в папке профиля и открыть в редакторе .............
function textToEditor() {
   var text = convertFromUnicode("UTF-16", getSelect()); 
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
   file.append("TextToEditor.txt");
   custombuttonsUtils.writeFile(file.path, text);
   file.launch(); 
};



// Получить название домена с заглавным первым символом и без приставок( типа .ru и .com ) .............
function getSiteName() {
   try { var domain = Services.eTLD.getBaseDomain(content.document.documentURIObject) }
   catch(e) { return "" };                                                                                        
     
   var num = domain.length;     
   if ( domain.slice(num-3, num-2) == '.' ) var siteName = domain.slice(0, num-3); 
   if ( domain.slice(num-4, num-3) == '.' ) var siteName = domain.slice(0, num-4);

   var siteName = siteName.charAt(0).toUpperCase() + siteName.slice(1);
   return siteName + " "; 
};



// Получить номер топика из текущей страницы если он есть иначе ничего .............
function getCurrentTopicNumber() {
   var currUrl = content.location.toString();
   var array = currUrl.split('=');
   var num = array.length

   if (num == 1) return '';
     
   var val = (((num > 2)? ('  ' + array[num-2]): '') + ' - ' + array[num-1]);          
   return val.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " ");          
};



/* Получить заголовк страницы или название домена если заголовка у страницы нет
   или название вкладки если домена нет ............. */
function getDocTitle() {
   var protocol = content.location.protocol;
   if (["about:", "chrome:", "jar:", "data:"].indexOf(protocol) !== -1) return false;  
   var docTitle = content.document.title || content.document.domain || gBrowser.mCurrentTab.label;       
          
   // заменить недопустимые символы и удалить лишние пробелы 
   var docTitle = docTitle.replace(/[:.\\\/<>?*|"]+/g, " ").replace(/\s\s+/g, " "); 
   return docTitle.slice(0, 50);
};


    
// Получить выделенный текст из страницы или 'false' ..............
function getSelect() {
   var sel = document.commandDispatcher.focusedWindow.getSelection(); // из страницы
   
   if (sel == '') {                                                   // из текстового поля
       var theBox = document.commandDispatcher.focusedElement; 
       if (theBox && (theBox.type == "text" || theBox.type == "textarea")) { 
           var startPos = theBox.selectionStart;
           var endPos = theBox.selectionEnd;
           var sel = theBox.value.substring(startPos, endPos);  
           }
       }
  
   if (sel.anchorNode && sel.anchorNode.parentNode.localName == 'pre') { // из 'PRE' ....
       var node = sel.focusNode;
       var startPos = sel.anchorOffset;
       var endPos = sel.focusOffset;
       var sel = node.data.substring(startPos, endPos); 
       }

   // удалить лишние пробелы и исправыть проблему с переносом текста
   var sel = sel.toString().replace(/^\s+|\s+$/g,"");
   var sel = sel.replace(/\u000A/g, "\u000D\u000A").replace(/\u000D\u000D\u000A/g, "\u000D\u000A");
   
   return (sel == '') ? false : sel;
};

Отсутствует

 

№1063214-09-2016 06:22:46

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

Dumby
Это совсем не важно, но так, если не лень будет, для общего моего развития:

скрытый текст
Я тут все лезу, куда не понимаю и объекты мучаю. Вроде и вышло, если не считать, что не то вышло:

Выделить код

Код:

var getLinks = {
    Links: [],
    get windows() {
        return (function*() {
            var ws = Services.wm.getEnumerator("navigator:browser");
            while(ws.hasMoreElements())
                yield ws.getNext();
        })();
    },
    get links() {
        for(var w of this.windows)
            for(var {contentWindow: win} of w.gBrowser.browsers) {
                var Tabs = {}, host = win.content.document.location.origin;
                //                 window.console.log(win);
                //                 Tabs = Object.create(Object.prototype, {
                //                     title: {writable: true, configurable: true, value: win.content.document.title},
                //                     srcEls: {writable: true, configurable: false, value: {}}
                //                 });
                Tabs = {Tab: {title: win.content.document.title, srcEls: []}};
                //                 Object.assign(Tabs.srcEls, {SrcEl: {link: 'bla'}});
                for (var {localName: node, src: src, href: href, type: type} of win.content.document.querySelectorAll(':-moz-any([href],[src])')) {
                    var link = (src || href), link = /^(\w+)?:\/\//.test(link) ? link : host + link;
                    Tabs.Tab.srcEls.push({link,node,type})
                }
                this.Links.push(Tabs)
            }
        return this.Links;
    }
}
window.console.log(getLinks.links);

Я постараюсь, объяснить, что требуется, чтоб без "некий_код" обойтись, но не уверен, что смогу. Так как до сих пор нихрена теорию не учу и не знаю правильную терминологию:
В общем, этот выкидыш родился из этого поста. :) Нужно получить массив со ссылками по вкладкам. Сортировку по типу я пока не трогал, мне бы с этим разобраться. Проблема - что все объекты только для текущей вкладки создаются. И что-то я залип. Смутно свербит, где тут собака порылась, но никак.

И еще вопрос: ни /^(\w+)?:\/\//.test(link), ни !!link.match(/^(\w+)?:\/\//) в коде - упорно не хотят признавать ссылки вида ://example.com/, хотя в консоли работает.

Ну и вообще, для этого самого развития: как тут красивее и правильнее сделать? :)


shuffle.gif

Отсутствует

 

№1063314-09-2016 10:10:17

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 104
UA: Firefox 48.0

Re: Custom Buttons

bunda1
вставляю этот код Save+ от 13.09.2016 взамен оригинального Save+ - и кнопка перестает работать, "горит" бледным

Отредактировано intersk (14-09-2016 10:12:56)

Отсутствует

 

№1063414-09-2016 11:17:36

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

Re: Custom Buttons

intersk
У меня нормально "горит" :) . Может не весь предыдущий код удалился, или новый не весь скопировался, попробуй ещё раз.

Отсутствует

 

№1063514-09-2016 13:41:52

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: Firefox 48.0

Re: Custom Buttons

intersk пишет

кнопка перестает работать

А Custom Button у вас какой системы?

Отсутствует

 

№1063614-09-2016 14:16:58

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 104
UA: Firefox 48.0

Re: Custom Buttons

voqabuhe пишет

intersk
У меня нормально "горит" :) . Может не весь предыдущий код удалился, или новый не весь скопировался, попробуй ещё раз.

можете тогда свой код в текстовом файле отправить, может копируется как-то не правильно...
c7fab0b5722d41a546e9b7411e9d34a9.jpg

Добавлено 14-09-2016 14:25:30
разобрался - Firefox некорректно копировал код. Пришлось открыть страницу в Хроме, оттуда уже скопировать и вставить в кнопку.
Стоит плагин "Copy Plain Text" наверно из-за него
Windows 64bit

Отредактировано intersk (14-09-2016 14:27:43)

Отсутствует

 

№1063714-09-2016 14:36:34

Northtech
Участник
 
Группа: Members
Зарегистрирован: 16-04-2011
Сообщений: 259
UA: Firefox 49.0

Re: Custom Buttons

Можно как-нибудь скрестить эти 2 кода (или новый код)? Чтобы сначала при закрытии текущей вкладки переключаться на правую вкладку, а когда вкладки справа заканчиваются, то на левую.

Выделить код

Код:

// Переключаться на правую вкладку после закрытии текущей вкладки,  от 22.08.2013. ................................
 function tabCloseHandler(e) {
    var tab = e.target;
    if ( tab == gBrowser.mCurrentTab ) { 
         if ( !gBrowser.visibleTabs.length ) gBrowser.addTab("about:blank");
         else             
              if ( !tab.hasAttribute('first-visible-tab') ) { gBrowser.mTabContainer.advanceSelectedTab(+1,true) }; 
         }
 }
 addEventListener("TabClose", tabCloseHandler, true, gBrowser.tabContainer );
Выделить код

Код:

// Переключаться на левую вкладку после закрытии текущей вкладки,  от 22.08.2013. ................................
 function tabCloseHandler(e) {
    var tab = e.target;
    if ( tab == gBrowser.mCurrentTab ) { 
         if ( !gBrowser.visibleTabs.length ) gBrowser.addTab("about:blank");
         else             
              if ( !tab.hasAttribute('first-visible-tab') ) { gBrowser.mTabContainer.advanceSelectedTab(-1,true) }; 
         }
 }
 addEventListener("TabClose", tabCloseHandler, true, gBrowser.tabContainer );

Отсутствует

 

№1063814-09-2016 14:51:19

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

Re: Custom Buttons

intersk пишет

Стоит плагин "Copy Plain Text" наверно из-за него

Ну отключи и попробуй без него.

Отсутствует

 

№1063914-09-2016 17:36:52

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 38.0

Re: Custom Buttons

Ребята, если возможно, пожалуйста сделайте кнопку копирования текста без запрещенных символов.
Например выделив текст в котором есть запрещенные символы для имени файла windows (\:*?"< и т.д.) при нажатии кнопки он копировался без указанных символов.

скрытый текст
Запрещенные символы:
    \ — разделитель подкаталогов
    / — разделитель ключей командного интерпретатора
    : — отделяет букву диска или имя альтернативного потока данных
    * — заменяющий символ (маска «любое количество любых символов»)
    ? — заменяющий символ (маска «один любой символ»)
    " — используется для указания путей, содержащих пробелы
    < — перенаправление ввода
    > — перенаправление вывода
    | — обозначает конвейер
    + — (в различных версиях) конкатенация
https://ru.wikipedia.org/wiki/%D0%98%D0 … 0%BB%D0%B0

Отредактировано Stakhovsky (14-09-2016 17:38:35)

Отсутствует

 

№1064014-09-2016 19:58:33

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: Custom Buttons

Stakhovsky пишет

Ребята, если возможно, пожалуйста сделайте кнопку копирования текста без запрещенных символов.

Выделить код

Код:

function getSelect() {
   var el = document.commandDispatcher.focusedElement;
   try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
   var sel = document.commandDispatcher.focusedWindow.getSelection();
   return sel.toString().replace(/^\s+|\s+$/g,"");
};
gClipboard.write( getSelect().replace(/[:+.\\\/<>?*|"]+/g, " ") );

Отсутствует

 

№1064114-09-2016 20:26:23

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

Stakhovsky
Пока возился, уже опередили. :) Но вот готовая, с пунктом в контекстном меню:

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

Выделить код

Код:

((menu, elm, menuitem) => {
    menuitem.id = "cb-copy-convert";
    menuitem.setAttribute("label", "Копировать без запрещенных символов");
    elm.parentNode.insertBefore(menuitem, elm);

    var convert = str => {
        var chr = {
            '\\': '&#92;',
            '/': '&#47;',
            ':': '&#58;',
            '*': '&#42;',
            '?': '&#63;',
            '"': '&#34;',
            '<': '&#60;',
            '>': '&#62;',
            '|': '&#124;',
            '+': '&#43;'
        };

        if (!!str)
            return str.replace(/[\\\/:*?"<>|+]/g, s => chr[s]);
    }

    function getSelect() {
        var el = document.commandDispatcher.focusedElement;
        try { return el.value.substring(el.selectionStart, el.selectionEnd) } catch(e) {};
        var sel = document.commandDispatcher.focusedWindow.getSelection();
        if (!!sel)
            return sel.toString().trim();
    };

    menuitem.onclick = e => {
        if (gContextMenu.onLink) {
            if (e.button == 2) gClipboard.write(convert(gContextMenu.linkTextStr));
            else gClipboard.write(convert(gContextMenu.linkURL));
        }
        else gClipboard.write(convert(getSelect()));
    }

//    this._handleClick = () => gClipboard.write(convert(gClipboard.read()));

    menu.addEventListener('popupshowing', function f() menuitem.hidden = !(gContextMenu.onLink || gContextMenu.isTextSelected));
    addDestructor(()=> {
        menu.removeChild(menuitem);
        menu.removeEventListener("popupshowing", f)
    })
})(document.getElementById("contentAreaContextMenu"),
   document.getElementById("context-copy"),
   document.createElement("menuitem"));


Клик по пункту при выделенном тексте - скопирует текст с заменой означенных символов на html-символы. Кли ЛКМ в контекстном меню ссылок - скопирует адрес ссылки с заменой, ПКМ - текст ссылки с заменой. Если положете код в отдельную кнопку, то раскомментируйте строку с this._handleClick - тогда клик по кнопке заменит символы в тексте в буфере.

Отсутствует

 

№1064214-09-2016 20:53:07

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 38.0

Re: Custom Buttons

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

Отсутствует

 

№1064314-09-2016 21:04:08

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

Stakhovsky
Ух, у меня там в коде позаменялись html-спецсимволы при публикации. По идее, это баг движка форума. Не должны в теге "код" заменятся. Может так не потрет:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname/%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bcustombuttons-stdicon-1%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%28menu%2C%20elm%2C%20menuitem%29%20%3D%3E%20%7B%0A%20%20%20%20menuitem.id%20%3D%20%22cb-copy-convert%22%3B%0A%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20%22%u041A%u043E%u043F%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u0435%u0449%u0435%u043D%u043D%u044B%u0445%20%u0441%u0438%u043C%u0432%u043E%u043B%u043E%u0432%22%29%3B%0A%20%20%20%20elm.parentNode.insertBefore%28menuitem%2C%20elm%29%3B%0A%0A%20%20%20%20var%20convert%20%3D%20str%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20var%20chr%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%5C%5C%27%3A%20%27%26%2392%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27/%27%3A%20%27%26%2347%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3A%27%3A%20%27%26%2358%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27*%27%3A%20%27%26%2342%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3F%27%3A%20%27%26%2363%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%22%27%3A%20%27%26%2334%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3C%27%3A%20%27%26%2360%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%3E%27%3A%20%27%26%2362%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27%7C%27%3A%20%27%26%23124%3B%27%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%27+%27%3A%20%27%26%2343%3B%27%0A%20%20%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20%20%20if%20%28%21%21str%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20str.replace%28/%5B%5C%5C%5C/%3A*%3F%22%3C%3E%7C+%5D/g%2C%20s%20%3D%3E%20chr%5Bs%5D%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20getSelect%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20el%20%3D%20document.commandDispatcher.focusedElement%3B%0A%20%20%20%20%20%20%20%20try%20%7B%20return%20el.value.substring%28el.selectionStart%2C%20el.selectionEnd%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29%3B%0A%20%20%20%20%20%20%20%20if%20%28%21%21sel%29%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20sel.toString%28%29.trim%28%29%3B%0A%20%20%20%20%7D%3B%0A%0A%20%20%20%20menuitem.onclick%20%3D%20e%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28gContextMenu.onLink%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28e.button%20%3D%3D%202%29%20gClipboard.write%28convert%28gContextMenu.linkTextStr%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20gClipboard.write%28convert%28gContextMenu.linkURL%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20gClipboard.write%28convert%28getSelect%28%29%29%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20this._handleClick%20%3D%20%28%29%20%3D%3E%20gClipboard.write%28convert%28gClipboard.read%28%29%29%29%3B%0A%0A%20%20%20%20menu.addEventListener%28%27popupshowing%27%2C%20function%20f%28%29%20menuitem.hidden%20%3D%20%21%28gContextMenu.onLink%20%7C%7C%20gContextMenu.isTextSelected%29%29%3B%0A%20%20%20%20addDestructor%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20menu.removeChild%28menuitem%29%3B%0A%20%20%20%20%20%20%20%20menu.removeEventListener%28%22popupshowing%22%2C%20f%29%0A%20%20%20%20%7D%29%0A%7D%29%28document.getElementById%28%22contentAreaContextMenu%22%29%2C%0A%20%20%20document.getElementById%28%22context-copy%22%29%2C%0A%20%20%20document.createElement%28%22menuitem%22%29%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Да, так не заменяет.

Отредактировано turbot (14-09-2016 21:05:22)

Отсутствует

 

№1064414-09-2016 21:54:25

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 38.0

Re: Custom Buttons

turbot ага, спасибо.

Отсутствует

 

№1064515-09-2016 12:49:24

mcafee
Участник
 
Группа: Members
Зарегистрирован: 15-09-2016
Сообщений: 1
UA: Firefox 47.0

Re: Custom Buttons

Приветствую, возможно ли сделать кнопочку, чтобы Responsive Design View был постоянно для любых открывающихся табов/закладок?
Для оптимизации сайтов удобно, но постоянно жмакать ctrl-shift-m отвлекает.
Ничего другого придумать не получается что-то..:sick:

Отсутствует

 

№1064615-09-2016 14:19:53

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 104
UA: Firefox 48.0

Re: Custom Buttons

turbot
так какой рабочий код для кнопки для замены символов?

Отсутствует

 

№1064715-09-2016 15:47:21

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

intersk
Второй же. Под

Да, так не заменяет.

я имел ввиду, что форум не калечит код. :)

Отсутствует

 

№1064815-09-2016 18:32:09

nvrbjs
Участник
 
Группа: Members
Зарегистрирован: 13-06-2014
Сообщений: 16
UA: Firefox 45.0

Re: Custom Buttons

можно сделать кнопку для включения/отключения определенного стиля в Stylish?

Отсутствует

 

№1064915-09-2016 18:41:51

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 51.0

Re: Custom Buttons

nvrbjs
Пройдитесь поиском по теме, выкладывали такие кнопки тыц, тыц.

Отсутствует

 

№1065015-09-2016 19:08:01

nvrbjs
Участник
 
Группа: Members
Зарегистрирован: 13-06-2014
Сообщений: 16
UA: Firefox 45.0

Re: Custom Buttons

turbot, действительно, спасибо.

Отсутствует

 

Board footer

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