// Добавить новый пункт "Восстановить иконки закладок" в меню папок закладок, от 16.05.2016. ..................... (function() { var menuitem = document.createElement("menuitem"); menuitem.setAttribute("id", "placesContext_restoreIcons"); menuitem.setAttribute("label", "Восст.иконки в папке"); menuitem.setAttribute("selection", "folder"); menuitem.setAttribute("closemenu", "single"); menuitem.setAttribute("oncommand", "this.run(document)"); menuitem.run = function(doc) { var node = PlacesUIUtils.getViewForNode(doc.popupNode).selectedNode; var folderId = node.folderItemId ? node.folderItemId : node.itemId; var contents = PlacesUtils.getFolderContents(folderId, false, false).root; // перебрать все http(s) закладки for ( i = 0; i < contents.childCount; ++i ) { var item = node.getChild(i); item.uri.startsWith("http") && getSiteFavicon(item.uri); } }; // Добавить иконки к закладкам с одинаковыми адресами .... function setBookFavicon(faviconURI, siteURI) {LOG(siteURI + "\n" +faviconURI); var iconURI = Services.io.newURI(faviconURI, null, null); var bookmarkURI = Services.io.newURI(siteURI, null, null); var faviconService = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.mozIAsyncFavicons); faviconService.setAndFetchFaviconForPage( bookmarkURI, iconURI, false, faviconService.FAVICON_LOAD_NON_PRIVATE ) }; // Получить адрес иконки закладки и запустить установку иконки .... function getSiteFavicon(siteURI) { var hostURI = "http://" + siteURI.split(/\/+/g)[1] + "/"; var faviconURI = hostURI + "favicon.ico"; // адрес иконки, если не получить адрес иконки из сайта if ( getSiteFavicon[siteURI] ) return; // стоп если закладка с таким адресом уже была getSiteFavicon[siteURI] = true; // получить адрес иконки из документа сайта закладки var xhr = new XMLHttpRequest(); xhr.open("GET", siteURI, true); xhr.responseType = "document"; xhr.onload = xhr.onerror = function() { var doc = xhr.responseXML; if ( doc !== null ) { var links = doc.getElementsByTagName("link"); [...links].forEach(function(link) { if ( /(?:^|\s)icon(?:\s|$)/.test(link.rel.toLowerCase()) ) faviconURI = link.href }); } setBookFavicon(faviconURI, siteURI); // запустить установку иконки } xhr.send(); }; // Добавить новый пункт во все меню папок закладок .... function handlePopup(e) { var node = e.target; if ( node.id !== 'placesContext' ) return; var sortByName = node.getElementsByAttribute("id", "placesContext_sortBy:name")[0]; setTimeout(()=> { menuitem.setAttribute("disabled", sortByName.disabled) }, 50); if ( node.getElementsByAttribute("id", "placesContext_deleteDuplicates")[0] ) return; node.insertBefore(menuitem, sortByName); }; addEventListener("popupshowing", handlePopup, true, window); addDestructor(()=> menuitem.parentNode && menuitem.parentNode.removeChild(menuitem) ); })(); |