Gladius333 пишетВопрос можно кроме меню "допольнительно", добавить еще одно меню?
==================================
Или можно добавить в меню-еще меню, к примеру
------------------------------------------------
дополнительно[выпадающее меню]
---линкс[выпадающее меню-сами ссылки]
---разное[выпадающее меню-сами ссылки]
-Конечно можно, только я не понял что именно требуется.
Второй вариант с подменю, а первый можно как пример? я его сохраню чтобы потом не задавать вопрос.
1)"допольнительно", добавить еще одно меню?
--Дополнительно=[сами ссылки]
--Что то...=[сами ссылки]
------------------------------------------------
2)
---дополнительно=[выпадающее меню]
===линкс=[выпадающее меню-сами ссылки]
===разное=[выпадающее меню-сами ссылки]
Отредактировано Gladius333 (31-07-2017 18:00:29)
Отсутствует
Все равно не понял что именно требуется, но вот пример:
((contextMenu, el)=> { var menu = document.createElement("menu"); menu.setAttribute("label", "дополнительно"); menu.setAttribute("id", "context-ext-addon"); contextMenu.insertBefore(menu, contextMenu.children[el]); addDestructor(()=> menu.remove() ); var array = [ ["дополнительно1"], ["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}], ["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}], ["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}], ["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}], ["separator"], ["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}], ["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}], ["дополнительно2"], ["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}], ["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}], ["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}], ["separator"], ["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}], ["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}], ["дополнительно3"], ["Удалить куки текущего сайта", "deleteCookiesFromHost()"], ["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}], ]; var menuPopup = menu.appendChild( document.createElement("menupopup") ); var subMenu, subMenupopup; array.forEach(m=> { if ( m.length == 1 && m[0] != "separator" ) { subMenu = menuPopup.appendChild(document.createElement("menu")); subMenu.setAttribute("label", m[0]); subMenupopup = subMenu.appendChild(document.createElement("menupopup")); return; } if ( m[0] == "separator" ) { subMenupopup.appendChild(document.createElement("menuseparator")); return }; var mItem = subMenupopup.appendChild(document.createElement("menuitem")); mItem.setAttribute("label", m[0]); typeof(m[1]) == "string" ? mItem.addEventListener("command", ()=> eval(m[1])) : mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()"); }); function deleteCookiesFromHost() { var host = Services.eTLD.getBaseDomain(gBrowser.currentURI); for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) { var cookie = en.getNext().QueryInterface(Ci.nsICookie); ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); } var reversedDomain = host.split("").reverse().join("") + "."; Cu.import("resource://gre/modules/FileUtils.jsm"); var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]); var dbConn = Services.storage.openDatabase(file); dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\""); dbConn.close(); var dir = Services.dirsvc.get('Home', Ci.nsIFile); dir.append("Application Data"); dir.append("Macromedia"); dir.remove(true); dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777); }; })(document.getElementById("contentAreaContextMenu"), "context-inspect");
Отсутствует
Все равно не понял что именно требуется, но вот пример:
Да то что надо, мне скинули кое-что пока разбераюсь) спс!
Еще хотел как пример без подменю, к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".
Отсутствует
Gladius333 пишетк примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".
Куда поднимим
Тоже самое только (где красные) и только одно подменю.
Отредактировано Gladius333 (31-07-2017 19:09:00)
Отсутствует
Может ли кнопка узнать, посещалась ли ссылка или нет? Я в курсе, что псевдокласс :visited недоступен для проверки в целях безопасности, но локальное расширение по логике таких ограничений иметь не должно...
Отсутствует
Может ли кнопка узнать, посещалась ли ссылка или нет?
Может-может. Причём не только - посещалась ли, но и когда именно.
У меня стоит расширение Link Status Redux, которое для ссылки, на которую мышка наведена, показывает это в строке статуса.
Отредактировано yup (01-08-2017 23:38:00)
Отсутствует
Может-может.
Уже отлично. А не подкинет ли многоуважаемый all кусочек кода на сию тему, чтобы не раскапывать это в расширениях?..
Отсутствует
bugmenot
Как отправная точка: https://developer.mozilla.org/en-US/doc … query_URIs и https://developer.mozilla.org/en-US/doc … ry_service
Отредактировано yup (02-08-2017 12:44:03)
Отсутствует
Расковырял-таки расширение и собрал вот такой код.
var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var query = PlacesUtils.history.getNewQuery(); var queryOptions = PlacesUtils.history.getNewQueryOptions(); queryOptions.includeHidden = true; queryOptions.maxResults = 1; queryOptions.resultType = queryOptions.RESULTS_AS_VISIT; queryOptions.sortingMode = queryOptions.SORT_BY_DATE_DESCENDING; var isVisited = function(link) { try { uri1 = iosvc.newURI(link, null, null); } catch (e if e.result == Components.results.NS_ERROR_MALFORMED_URI) { uri1 = null; } query.uri = uri1; var results = PlacesUtils.history.executeQuery(query, queryOptions).root; results.containerOpen = true; return results.hasChildren; }
Отсутствует
нет ли тут косяков и подводных камней, пропущенных по незнанию?
1. Mozilla не рекомендует использовать конструкцию "catch (e if ...)".
Тем более, что в данном случае её можно совершенно безболезненно переписать как:
catch (e) { if e.result == Components.results.NS_ERROR_MALFORMED_URI) uri1 = null; }
2. Mozilla же рекомендует пользоваться асинхронными методами, а там это выглядит примерно так:
var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var asyncHistory = Components.classes["@mozilla.org/browser/history;1"].getService(Components.interfaces.mozIAsyncHistory); var uri = iosvc.newURI(link, null, null); asyncHistory.isURIVisited(uri, function(uri, isVisited) { if (isVisited) alert('visited') else alert('not visited'); });
В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из уже выкосили.
Отредактировано yup (03-08-2017 04:51:54)
Отсутствует
2yup
Спасибо, catch поправлю. Асинхронность пока что не нужна, но информация полезная, пригодится.
В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из уже выкосили.
Да, сначала с нее и попытался начать.
Отсутствует
Асинхронность пока что не нужна
Но тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.
Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.
Отсутствует
Но тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.
Да, придется. Спасибо еще раз.
Отредактировано bugmenot (03-08-2017 12:49:35)
Отсутствует
yup пишетНо тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.
Да, придется. Спасибо еще раз.
А что делает твоя кнопка? просто я вбил ничего не заметил, как она работает?
Понял из комментов что она показывает посещалось ли ссылка, но в работе я так и не понял...
Отсутствует
А что делает твоя кнопка? просто я вбил ничего не заметил, как она работает?Понял из комментов что она показывает посещалось ли ссылка, но в работе я так и не понял...
Это не кнопка. Это функция, которой можно передать ссылку и узнать, есть она в истории или нет. А дальше как хочешь, так ее и применяй.
Отсутствует
Привет.
Подскажите как; в конт. меню страницы(обычном станд. ПКМ) есть пункты добавляемые расширениями. Этих пунктов может быть не один, но всех их зовут одинаково. Я написал действия для этих пунктов, ф-цию-листенер на действия мыши(case 0,1,2). Все работает правильно и как надо, но сейчас держу две ф-ции для двух разных ID. Вопрос такой:
- как повесить одно-и-тоже действие на два(три, пять) разных id в меню ?
Сейчас это так(две абсолютно одинаковых ф-ции , различия только в id):
// ----------------- Для расширения MediaSnifer\Video-Sniffer действия для кликов -------------------------------------------------------- (function() { addEventListener("click", function(e) { if(e.target.id != "mediasniffer") return; var file = Services.dirsvc.get('ProfD', Ci.nsIFile); var ref = ('"' + content.document.location + '"'); var domain = content.document.domain.replace(/^www./g,''); var url = ('"' + e.target.getAttribute("tooltiptext") + '"'); var title = convertFromUnicode("Windows-1251", gBrowser.mCurrentTab.label); switch (e.button) { // скачать через wget или aria case 0: e.preventDefault(); e.stopPropagation(); if ( domain == "xvideos.com" ) { var url=url.replace(/p\d+\.ts/ig, 'p\.m3u8'); } file.initWithPath(file.path + "\\Soft\\wget\\wgetfile.cmd"); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.run(false, [url, title.replace(/(?:@|#|&|\\|\/|\.|,|\||\:)+/g,'').slice(0,65), ref], 3); break; // скопировать ссылку-подсказку case 1: var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); var tt = e.target.getAttribute("tooltiptext"); gClipboard.write( decodeURIComponent(tt) ); alertsService.showAlertNotification(e.target.image, null, "Скопировал ссылку Mediasniffer-a", false, "", null, ""); break; // Открыть в Smplayer case 2: // var param = "-add-to-playlist"; var url = e.target.getAttribute("tooltiptext"); var file = Services.dirsvc.get('ProfD', Ci.nsIFile); file.initWithPath(file.path + "\\Soft\\PotPlayer\\PotPlayerMini.exe"); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.run(false, [url, "/add"], 2 ); break; } }, false, document.getElementById("contentAreaContextMenu")); })(); // и ниже , точно тоже самое, только с разницей в // if(e.target.id != "video-sniffer") return;
срабатывает только на первом id , для второго нет.
Отредактировано mokujin (12-08-2017 15:55:50)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
срабатывает только на первом id , для второго нет.
Да и на первом-то срабатывать не должно.
или
Отредактировано yup (12-08-2017 18:15:34)
Отсутствует
блиииин... делал точно такуюж конструкцию, а заместо и(&&) писал или( || ) и не работало.
Пасиб, второй пример тоже в копилку, пригодицца.
Благодарю.
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Можно добавить сюда, чтобы пойск закрывался и открывался с помощью "Ctrl+F".
К примеру заходишь на страницу, начинаешь печатать в адресной строке а он начинает автоматом пойск+когда начинаешь искать то саму панель приходиться закрывать через крестик или "Escape" жать...
/*[+++] Задаем положение панели поиска наверху */ @-moz-document url("chrome://browser/content/browser.xul"),url("chrome://global/content/viewSource.xul") { :-moz-any(.browserContainer, #viewSource) .findbar-container > *, :-moz-any(.browserContainer, #viewSource) .findbar-container > *:not(spacer), :-moz-any(.browserContainer, #viewSource) :-moz-any(.findbar-find-previous, .findbar-find-next) {display: -moz-box;} :-moz-any(.browserContainer, #viewSource) .findbar-container :-moz-any(spacer, .findbar-find-fast[anonid="match-case-status"], .findbar-find-fast[anonid="entire-word-status"]) {visibility: collapse} :-moz-any(.browserContainer, #viewSource) .findbar-find-fast.findbar-find-status, .found-matches {-moz-box-ordinal-group: 0;margin:0 5px 0 -6px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-button {margin:0 -1px!important;padding:0!important;max-width: 125px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-closebutton {position: relative !important;right: 0 !important;margin: 0px -3px -5px 0px!important;} :-moz-any(.browserContainer, #viewSource) .findbar-textbox {height: 20px !important;font-size: medium !important;max-width: 170px!important;}.browserContainer findbar, #viewSource #FindToolbar {-moz-box-ordinal-group: 0;position: fixed !important;left: 5px;margin-top: -1px !important;box-shadow: 1px 2px 3px rgba(0, 0, 0, .25) !important;border: 1px solid threedshadow !important;border-top: none !important;border-radius: 0 0 9px 9px;transition-property: margin-top, opacity, visibility !important;} #viewSource #FindToolbar {background-color: -moz-dialog;color: -moz-dialogtext;} :-moz-any(.browserContainer, #viewSource) .findbar-find-status { color: inherit !important }}
var tipOrig1 = "ЛКМ: Вкл-Выкл панели поиска по странице"; var tips2 = ['ПКМ: Вкл-Выкл режима подсветки выделенного слова во всех вкладках','ПКМ: Выкл.подсветки "','Ожидание выделения текста для его подсветки во вкладках...']; // Подсказка для кнопки ........... function setTip() { var normLen = function(str) {return str.slice(0,40) + (str.length > 40 ? '..."' : '"')}; self.tooltipText = tipOrig1 + '\n' + tips2[state > 2 ? 1 : state] + ((state > 2 || state == 1) ? normLen(Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString).data) : ''); }; self.onclick = e => { if(e.button == 0)toggleFindbar(); if(e.button == 1)gShowPopup(self); if(e.button == 2 && e.target == self && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) { e.preventDefault(); e.stopPropagation(); if(!cbu.getPrefs("CB.autoHighlight.state")){ let selWord = getSelect(); if(!selWord){ // Нет выделенного cbu.setPrefs("CB.autoHighlight.state", 2); } else { handleSelect(selWord); setTimeout(()=> autoHighlight(true), 200); cbu.setPrefs("CB.autoHighlight.state", 1); } }else{ cbu.setPrefs("CB.autoHighlight.state", 0); }}}; function toggleFindbar() { if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) } else {gFindBar.close();setTimeout(()=> autoHighlight(true), 10)} }; self.ondblclick = e => {e.preventDefault()}; function keyDown(e) { if(e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey){ e.preventDefault(); toggleFindbar(); } }; addEventListener("keydown", keyDown, false, getBrowser()); var imgOrig = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACZElEQVR42mNgAIK/f/+GMvz69ct3yZIlyxjOnTt3BCTK8P///0Yw49ixY0eBnEAGbICdnf0/SCnvrl27nsBFz5492wuio6Oj/4NopoSExAygqmm/f/9G1R8bG/s9LCzsF9iMlNSU/5cuXcp7/fq1Q3Fx8c8XL17MgKsEuu7Rs2fP3IAKOaCYycrK6j+KcXfv3p0gLib+n5OT87+Xp+d/SSmp/0lJSb8Y8IHIyMjv6urqEJO+fPlStG3btpc3btzYjKHyzJkzF9rb2x++f//e/PDhwxNLS0pQ7Q8MDAS6638FjL9o0aLNr169aoIrcHR0/A8NXbAvdu/e3XT58uX5cAURERH/gcHXBZScCcRVKioq/3//+Z0MVwAUZE1ISPjDwcHxX1tb+7+goOB/Hh6e/z9//gzD6j1gmPuD9IHwp0+f8Cu6efNmG8waZaA7ztXV1f3Pycn5X1ZW9r8E6N3s7Oz/vb29/x8/frwU5AGspn3+8iW/sLDwf319/Y2vX7/WARX2Iss/eHA/ISUl5feUyZNBwWWMYQAwsp+DwvLNmzdOQAXC2Cw5fvx4qZub2/+LFy8uwZA8derURi0trf8rVqyYAzTAFIi9gdgdiD2A2AuILUuKS854AhPJ58+fU7B64/r16/P09fX/S0lJ/a2oqDiybt26tcuWLdsQHx9/SUxM7L+ysvJ/GRmZ/5mZmd+BGSgMZwoD2mbw6NHjqiNHjsw5efLk9A8fPqQANcQmJ6d8B0kLCAj8Z2Rk/B8dE/0LZzziAqCoi4qKAhsEMgREd3V1vWMgFQBd5Ddp0qTbwEzUCuIDAFDBb1F5m6ZWAAAAAElFTkSuQmCC"; var imgLockedSearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACrUlEQVR42o2T30tTYRjHn/PuDM/mmh7RxjYzGiioiRR10UC8CUzzolmIOtAxpsQKc660i4LsqigIpUKxYqCgBu4PKOlmidpNxGA4QujC/IHr7MyUzXPYnt4dp8xZ0POBw8tzvu/3vM953odBBBrtUUilrgnuz26EcNgn0ewaDOEQKotgcFyyoQ2Bkk4wSjYTHJdnpAn9RiAwVlJX176pZD2rHkVut9uVLeRDy0d4TZFlWREcerhcHcZ4XAJIe7i6XdgR6UCrZMW+wT6MxV7spoWK2O8fTtbv1SOXgVCsViseCtKPSGRo13DSgBqNBpsaG9FoMmFPj+P4ubPD4Wg1Li5+2z+ULPfrAoGL+RUVO3JpabeQpTORUGi65OEb9YmB+ufkmRTMG7h315glWAObzYb3KZDB88mDOzsPfh8ckoiiCE8oXAbhtADRaL7qwIIYDAbo/dkLw5R+ynzDPJjNP6TDjyCq153OTuQ4Dqurq5HnedTpdJhMtkX/WiZiC0eIn0+vZblVJLn1M4w/kUq1RNNrUTyjzjhUsMvLj/mpqRArCAJotVp6SVIQj8fBYrHQn6ZNFBV5RIAEHjOUpDuxwUGilywS6G/qoZgtBi/lIG7sXge9twDOnz0Ht25PRgCW5CMGs7OvkpOTcyTyPgIhNgS/KLlhX7fDlmMLxscvJ8rKBqLZ70hNjSSHw2Go/FoJFspVSgPlCqWJconCzDCgUqnAZPq+l2tOyss9wtxcV3ypewlWT60CP8ZD7ZdaqApUAfuQhRXDCiy8XKDTEQSvFwoQ2zVHSjjahgvq7e26vM1NLcuygGbzhqxWJ8HthoLRUR8UFhZCLBaDzq42ePcWRUKm4/+8rrmR7q/TqeZ9vhnaSkYZ0pGRR8jsD/f/mewb2biJiRp9c/Mebe1T3R+cNmFDpJ/KUgAAAABJRU5ErkJggg=="; var imgReady = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC5klEQVR42mNk+F/MkMhgepch/N+iO0uWLFnGsOTG7i9A0TNM0eouvQwgMP/S1i////8PBHOAMowgggEK2DmmGDMK/K8+P/OQhXa43YFLYNGzZ8+C9UZHR/8HGxaXkVIANGPa79+/wQrgZkSlvDb69f0nA9iMkLSXBnm5efmSkpKXWns69qlWeb/N5tv6EKxl8tr5v549e+YGNIYDipmsrKzA5oPtyA26cmkR67nFEuIS37m4uL57e3n9vf/gAUNC+gcjFDvRQVjCc6OLJ84yghVU/XYQ1zv0T+KHGu/XBNmtd5DUmTCuubLv2+3NJ19nZGSEXblyJWrTxo153d3/z8JUMC2tncxZUVExXVBQ8KStrW2+rp7elpavzlJwBR8+fGBgZGTsgPkC6NXznO/+ssEViIuLg4KvC8ieCMRFmZmZtQ9lfn+BK1i3XO7cxKlTSjk5OdN0dHRa3759yzCPL04+/p+xEFZvRv43EFjOFKsMYsf+XnyfCd3/yxkvfIj8t/guiK3wnosTbIIWgzh743UT5csrDnC+e/eOARiiDP/+/WP4/v07g5KSEoNAvPG7HOHtD78z/PmHbiBj2a+Nj3+XH5Dh4+O7WVZWtgyomR/o62KYggcP7ic0tbfNN9LRY1iRw3DjCMODrygGTFsz//fupZtYZs+e7SwsLHwRqPktui3Hjx8vra+v7/KalfuuQP7AfWQ5pn86Il9v3rzJsGfPniggXwkY1t5A7A7EHkDsBcSWa9esDWdmZma4LfXjM7rhTDnqB+6k7u5+297eniwlK3OqEgjWr1+ftnz58oyEhIQOYDwdW79hvfHly5cZfpXsl0v4Dwl+uBeQo8GSQZ7L7qMMP9fLX+z/WRj/v5Jh/PoXSP/I3iW/cMZsRgEBAYaPHz8yRMRH/2eb6/VgIdPZdziTKzoAxe+/pB1KKxcsBQYTUNv//wyNEzv+ggwAyRNlCAhE/NcX0Fj4Ruafr+L7JuEjkgA5RWMpXs0CsgAAAABJRU5ErkJggg=="; var imgReadySearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC1UlEQVR42o2SbUhTURjHn3MdOqftJaVZzLRJmZukOZP0g/olNKVgJqmJOSVL1AQzDSyJ+SXBT5JEWmFmZYJGKVIo4bCJGZq1FSm5nGSJZtetnHO77Z7uvanoJOj/+3DPee5z/ufleRDgcsiDQybIoO9NFumLMNwf71tioiOgxVrMDZoNPUtqrGYmwAUQF12VF79BhcT48ljjwGFlRrzOwEXLZsq45OzsbG4J0ZvWBzcYKIriEtY9Tp35HuW0O4DzSD87F7l8bRnMQjPEVMfA3qrjC8XCnmluyfXOZmeCIwHzVyEY4uLi/p6R3eN82nvD0Z8V8yKpCJAAQXJKEkyZzaA5Z4natKe7Tmpmo969GkVcQhWVKD0wQAes7Ntm0wT2TG7IiyY6PqQqXLf1srrEGt4b6omoogKpNiSMILVajUMfh0ItA/cQ/WXgF3Nk9orPi2/snLBYLNxP/ipkEAnepMtzzYKQSqVQ+rUU6hkuMAwmDcK0jFpa38QTV46ezs/DfD4fK5VKLJFIsK+vL851Pfy8pTyssnCkuI3ICWHHOVTrFOF+/zb01pJFt5rYcfCiwJtzUIDUS/sxOsT4SOdNkiQIBAKgaRrsdjvI5XIQ56rIEr9n03b4Tbsbokrn0y/UJZ3MKXeCsFAI/jx/KGdYU7rtBAjLRRAVfhAelcC4Hsy2jQZEcBcZYGZqZyg0QBOvadNiVh0+neC46oCu7m5Inw7e4X4Cgg73t01MTEDYWBjIGVIZkhiSGVIYYhlQOwIPDw/4tGvl1xaDklDdZEFf3Y/hgmGYCZwBSaMEIl5HgOKlAnjVPDBJTTDUMARGoxGcF/t3a7Bq+6Y32FiGWAgSxFtlIsGc0wvzEJ6XIZuL+a4U9wa13LyFxGIxWK1WyMzNxp53UswtxCj5z3Z1F1tfOv+5vP3uA4TYJsYYtPW1LtaA60r4T2XiCPH+lgUZfWzPYo2ffucfIF9BRWk+aooAAAAASUVORK5CYII="; // Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение .......... var listener = {onStateChange: function(wpr, req, flag) {if ( gBrowser.currentURI.spec.startsWith("http") && flag & Ci.nsIWebProgressListener.STATE_STOP ) setTimeout(()=> autoHighlight(true), 10);},onLocationChange: function(wpr, req) {if ( gBrowser.currentURI.spec.startsWith("http") && !req && wpr.document.readyState == "complete" ) setTimeout(()=> autoHighlight(true), 10);}}; function handleSelect(str) {var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] .createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset="UTF-8";cbu.setPrefs("CB.autoHighlight.value", converter.ConvertFromUnicode(str));}; // Получить выделенный текст из страницы или false .......... function getSelect() {let selA = gBrowser.contentDocument.defaultView.getSelection(), selB ='', sel = '', el = document.commandDispatcher.focusedElement; selA = selA ? selA.toString() : ''; try { selB = el && el.value ? el.value.substring(el.selectionStart, el.selectionEnd) : '' } catch(e) {}; selB = selB ? selB.toString() : ''; sel = selA.length > selB.length ? selA : selB; return(sel == '') ? false : sel.replace(/^\s+|\s+$/g,"");}; //выделить текст .......... function autoHighlight(power) { var finder = gBrowser.finder || gFindBar; var lighted = (finder._highlightDoc || finder.highlight).bind(finder); lighted(false,""); if(power){ var lightstr = Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString); if(lightstr)lighted(true, lightstr.data);};}; var addFlag = false, state = 0, wnd = document.getElementById('main-window'); function onMouseup() {let selection = getSelect(); if(!selection || state<2)return; setTimeout(()=> autoHighlight(true), 200); handleSelect(selection); cbu.setPrefs("CB.autoHighlight.state", state+1);}; function onMouseent() {autoHighlight(true)}; function onStateChange() { state = cbu.getPrefs("CB.autoHighlight.state"); if(!state && state != 0){ state=0; cbu.setPrefs("CB.autoHighlight.state", 0); }; if(state<3){ addFlag = false; //gBrowser.removeProgressListener(listener); removeEventListener("mouseup", onMouseup, false, getBrowser()); }; setTip(); switch (state) { case 0: gBrowser.removeProgressListener(listener); wnd.removeEventListener("mouseenter", onMouseent, false); if(cbu.getPrefs("CB.autoHighlight.value")){ setTimeout(()=> cbu.setPrefs("CB.autoHighlight.value", ""), 50); autoHighlight(false); }; self.image = imgOrig; break; case 1: //setTimeout(()=> autoHighlight(true), 100); wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener); self.image = imgLockedSearch;break;case 2:addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReady;break;default: //setTimeout(()=> autoHighlight(true), 100); if(!addFlag){if(self.image != imgReady)addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReadySearch;addFlag = true; wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener);};break;}}; onStateChange();gPrefService.addObserver("CB.autoHighlight.state", onStateChange, false); addDestructor(() => {gPrefService.removeObserver("CB.autoHighlight.state", onStateChange, false); gBrowser.removeProgressListener(listener);removeEventListener("mouseup", onMouseup, false, getBrowser()); wnd.removeEventListener("mouseenter", onMouseent, false);cbu.setPrefs("CB.autoHighlight.value", ""); cbu.setPrefs("CB.autoHighlight.state", 0);autoHighlight(false);try{removeEventlistener("keydown", keyDown, false, getBrowser())}catch(e){};});
Отредактировано Gladius333 (20-08-2017 14:15:42)
Отсутствует
долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.
была кнопка рестарта Firefox, брал там
// ***** VARS ***** // var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); // ***** FUNCTIONS ***** // function createBrandingBundle() { var myBrandingPath = null; var myStringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"] .getService(Components.interfaces.nsIStringBundleService); myBrandingPath = "chrome://branding/locale/brand.properties" return myStringBundleService.createBundle(myBrandingPath); } function getWindowType() { // Relies on Branding Code so can not be run on startup var myBrandStrings = createBrandingBundle(); var thisBrandShortName = myBrandStrings.GetStringFromName("brandShortName") switch (thisBrandShortName) { case "Mozilla Thunderbird": case "Shredder": case "Thunderbird": return "mail:3pane"; case "Nvu": return "composer:html"; case "Calendar": case "Sunbird": return "calendarMainWindow"; case "eMusic Download Manager": case "eMusic Remote": return "emusic:window"; case "Songbird": return "Songbird:Main"; default: return "navigator:browser"; } } function Restart() { // Notify all windows that an application quit has been requested. var os = Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService); var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"] .createInstance(Components.interfaces.nsISupportsPRBool); os.notifyObservers(cancelQuit, "quit-application-requested", "restart"); // Something aborted the quit process. if (cancelQuit.data) return false; var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var windows = wm.getEnumerator(""); var windowType = getWindowType(); while (windows.hasMoreElements()) { var myConfigWindow = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal); if (myConfigWindow.document.documentElement.getAttribute("windowtype") != windowType) { myConfigWindow.close(); } } if ("@zeniko/crashrecoveryservice;1" in Components.classes) { nsPreferences.setBoolPref("extensions.crashrecovery.resume_session_once", true); } var appStartup = Components.interfaces.nsIAppStartup; Components.classes["@mozilla.org/toolkit/app-startup;1"] .getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit); return true; } // ***** MOUSE HANDLING ***** // this.leftclick = function(evt) { var RestartProceed = prompts.confirm(null, "Restart Firefox", "Перезапустить приложение?"); if (RestartProceed) { Restart(); } } this.aleftclick = function(evt) { Restart(); } // ***** INITIALISATION ***** // this.tooltipText = "Restart"; this.style.opacity = '.85'; this.setAttribute("onclick","custombuttons.gQuot.mHandler(event, this)"); this.setAttribute('ondblclick', 'gQuot(event, this)'); // ***** ATTRIBUTES ***** // this.setAttribute('author','Rawny, zooot'); this.setAttribute('version','4'); this.setAttribute('homepage', 'http://custombuttons2.com/forum/buttons/buttons-database/restart-session-restore.html'); this.setAttribute('dependency','FF2.0*, FL1.0*, TB2.0*, CB2 2.0.5*'); this.setAttribute('status','Complete'); this.setAttribute('public',true)
Отредактировано polk90 (05-09-2017 04:59:47)
Отсутствует
Gladius333
Автоскрытие панели поиска
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.
была кнопка рестарта Firefox, брал там
посмотрите пожалуйста, можно поправить?
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%3ERestart%20%28with%20confirmation%29%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAA6hJREFUOE9VkwtMU1cYx/+9tYAKWAYixWXjIQpYBGEF3AZoNKEyLeCiDQ+dBidjQHj4qHEoyLYw0KCTQUarqLQisGRmG+CCo0zEGljXAI0dr0InJpDNER/Lqin026GajJ3kl3Puyf1+93+/nMPD4pGpFYLHSbxErnJ3Hr3HA3lbbXa71U6WpzbSzv9tU8NORvB5TzFPfmyu/688XStakae7LFWO/pXcYqF930/RwbYpkn8zSYnqMYqq+438ywzTyOr5Ghndb7nk3/uO/2Gv7aUgXesrKuzvKPrpj7lDHQ9pd+sEpTSbKXURu1rMlNJkpo01921LP+p9kHx9cm79CT0BaV2eHvn3mg53/Wk/1P6QZOylheL3WyZIdt3sYGG9sOfYZ/JtjWN0Vj9LkScNTHDgduKOhvEn+bdmSKoepyTNOIs8Tn4Vg+Sr6HewpmqIpEycxARJTLaT/VZ53yxFnPyV4F3Y25bWNk2bNWaKaRijmEujtLyw5wmSGlQIzZQiJEPKkzXdWHpYZxOrRknSOEFvt/xOBXdnab2ij+D/cdczWdsM+dWN0Ju1I+R2VEdI+KqGdcaLwWHLpQDsbG1Dds8cFCxy2RCtrB0n2a1HFJj/M0F05A6FaaZI8IWJBBX3iZP/YEVQntjR3PgrTth6rRMZP9pQzL52jDXtExb71AAFXZ4k770dBHn7MqqyeFDeIOhgH2iTGtaQGvg6BJLzexBZ1YzwzzXYwAj9VIOQ8pesO61BRGUL4tUuzz+zuFG2ASS/DYprBvlXI+fVAVnGZk/Gax6pEItzESnJhTh8H4LWJsN/hQRvIKx6SX+JyYmy9Bzt6gbtYYTW4YFPBT7wLIe3sBRebB0XW++cd84YvP+CMSJZadoUd6QzKNzvBEvqnoucvTfdX5QYRQ5BRi8oS4f5ba14HK3CgETFv7P7hmsnK26sN8VUKI1xRXWGd9KTVT5bndNYOucdCAwo57ouDL9rLzAIKVMHytFjvsiAZ0cNmC4bdB86P7xGqxyOblaZ4quVxoTjxe1r93vlI5ZLgDMgAMelYsu6SlfjGVO4/ZRxFRUYOLvCiOenTdyjs8O+IxfNUXevmjd/ywS1xzqDS18vdpIjAsLF91DAbUdiYKlz94H2gBcKvZAqx1bO1Vh8HistoWaVOeaXMl3IzZQrqy+uLuZnIwyrWDHvfzeZPQgEsdiwPA3Hgytd9NEqNyvjH0m928zGL90HAkqWnHPaDik/CiLHAXs1/gU8lc1wSyvYVQAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28%20%21custombuttons.confirmBox%28null%2C%20%22%u041F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%3F%22%2C%20%22%u0414%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%29%20return%3B%20%0Avar%20startup%20%3D%20Services.startup%3B%0Astartup.quit%28startup.eForceQuit%20%7C%20startup.eRestart%29%3B%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%5BLeft%20%20%20%20%20%20%20%20%3D%20Restart%20application%20with%20confirmation%20dialogue%0AAlt+Left%20%3D%20Restart%20application%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует