drage
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору // Кнопка для управления масштабом страницы в адресной строке, от 24.11.2016. .......................... (()=> { // Удалить из адресной строки FF51 стандартную кнопку масштаба .... var but = document.getElementById('urlbar-zoom-button'); if (but) but.style.display = "none"; // Создать в адресной строке кнопку масштаба .... var zoomButton = document.createElement("statusbarpanel"); var urlbarIcons = document.getElementById("urlbar-icons"); urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки addDestructor(()=> zoomButton.remove()); updateZoomButton(); zoomButton.id = "zoomButton"; zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% "; // Отслеживать клики на кнопке масштаба .... addEventListener("click", e=> { if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба if ( e.button == 1 ) { // единый масштаб для всех страниц cbu.isPref("CB.zoom.allEvenly", false); cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") ); cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) ); updateZoomButton(); } if ( e.button == 2 ) { e.preventDefault(); FullZoom.reset(); }; // сбросить масштаб }, false, zoomButton); // Менять масштаб колесиком мыши на кнопке масштаба .... addEventListener("DOMMouseScroll", e=> { e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge(); }, false, zoomButton); // Следим за изменением масштаба и запускаем обновление кнопки .... var str = "{ setTimeout(()=> { updateZoomButton() }, 50);"; var handleEvent = parseInt(Services.appinfo.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled; var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent]; array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) )}, 50) }); addDestructor(()=> { array.forEach(func=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ) }); }); // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба .... function updateZoomButton(e) { zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; setTimeout(()=> { zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold'; zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : ""; }, 5); // запомнить текущий масштаб в 'about:config' if ( e == undefined ) { try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {}; zoomButton.prefTimeout = window.setTimeout(()=> { cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) ) }, 250); } }; // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' .... addEventListener("TabAttrModified", e=> { if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return; if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) { var value = cbu.getPrefs("CB.zoom.Percent"); if ( ZoomManager.zoom.toFixed(2) == value ) return; setTimeout(()=> { gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value; updateZoomButton(e); }, 0); } else updateZoomButton(e); }, true, gBrowser.tabContainer); })(); // Настройка функций кликов мыши для кнопки .............. this.onclick = this.oncontextmenu = e => { // действие при клике ЛКМ .... if ( e.button == 0 ) FullZoom.enlarge(); // действие при клике СКМ .... if ( e.button == 1 ) cbu.setPrefs(s, !cbu.getPrefs(s)); // действие при клике ПКМ .... if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { e.preventDefault(); FullZoom.reduce(); } showTooltip(); }; this.setAttribute("ondblclick", "event.preventDefault()"); // Менять масштаб колесиком мыши на кнопке .............. this.onwheel =e=> { e.deltaY > 0 ? FullZoom.reduce() : FullZoom.enlarge(); showTooltip(); }; // Создать подсказку и показывать у кнопки при вызове функции .............. function showTooltip() { var tooltip = self.lastChild; if ( !tooltip ) { tooltip = self.appendChild(document.createElement("tooltip")); tooltip.style.cssText = "font-weight: bold !important; color: red !important;"; } self.tooltipText = "" tooltip.label = Math.floor((ZoomManager.zoom + 0.005) * 100) + "%"; tooltip.showPopup(self, -1, -1, "popup", "topleft", "topright"); self.onmouseleave =()=> { tooltip.hidePopup(self.onmouseleave = null); self.tooltipText = self.label }; }; // Подсказка для кнопки .............. this.onmouseover =()=> { var value = Math.floor((ZoomManager.zoom + 0.005) * 100) + "%"; this.tooltipText = "Zoom: " + value + "\nЛ: увеличить масштаб \nП: уменьшить масштаб "; }; // Установить нужную иконку кнопки при старте браузера или при изменениях настроек 'about:config' .............. var s = "browser.zoom.full"; function toggleImage() { self.image = cbu.getPrefs(s) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQklEQVQ4jaWSzUtUYRTGf+97rzM6V22YVBQJa1GbPjCiIMJFzaJNYosiiSAooV0ryWW7Nv0DiYXRJnAVtgqMaBEEFShJovmRM43jfDsfd+aO9973bWVIjBZ0ls/znIdzznPgP0vsRYxPvt/KFUqVRHLLS6RE36sXtxpqZSPwZP/A1aagdSBkRXqlGe7bTJcxgkev/LPB9ZsPxoslh0zOJpkqkUiWsLoHXzfSmo3AuhfsysYKxBNFFpezlIoFlG8DdADZfScYvv1oJpO1WVjK8PHTUj6+vpJWfhmUS0vn0Nu/rnDoyOmoXd0mnamQXH1+w9l69xAMhNGMGew5ta9B/5nLI0ppao6HXd0GJzbjVuafSLMVabQjDItg+OLTPQ0Gr41O2NVtsjmbjdiX6R3crS5PC9mMkEECbSfuNjTo7Dzc79Q98oUqyXSZaurl0A5XTU0NmaaJECZCGBjNx0Z2uN/PcX9sKleuycjc/CbLqzHUdg7QCCOENCyQAdAK7dsor0xl45mAXTEWSkS+LiRZWVnEq62h3C0QAmm0Icx2pBFCyABaK7SuA1Y/2LMC4PylsZlivScaj33HrXzDKX2+gxZ9SImUzSADKF/9DIXPTiAkWnto38k7+TcHTYB0qTOaSf/ArS5Ttxen8cuTAChQuw7m1rqGjUBHFHzQKgIgWiIXRptazz32amu4tTXcylwPsPln3jsVDA9orV3QPtqrfRBW772KcuIVt570lJtvVfX18F7NAKZ1fBbtd2vtOdKw+n4B6skL1gRzZQAAAAAASUVORK5CYII=' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4jd3RMWpCQRSF4S/iBtyCELHW1sIV6ALiRnQH4hJ0ByF2Ym8aG1Ml8Ji3ArXRDZhUA+bx3qCWHjgw3Jn57+XcF1fq0JXQF7vUvYxw4bfKGWHO4mFA9AfLJCAjdOhG9+jPWVxDmrSSgLIGGz4jYMwEaslQCtqyLdbuAgwYxvOJM9SrHscRoUFjwLDFKwTy97Igb93CG6P4p3KCQF6sHdhPma1YJwGBvF22phLdFeKTAv6F+MP3gf2R462AP7hdbq8C1bDsAAAAAElFTkSuQmCC'; }; toggleImage(); gPrefService.addObserver(s, toggleImage, false); addDestructor(()=> gPrefService.removeObserver(s, toggleImage) ); // Context Search, от 29.01.2014. ................................ (function () { var searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); var searchSelect = document.getElementById('context-searchselect'); searchSelect.collapsed = false; // удалить стандартный пункт меню для поиска // Создать новый пункт меню для поиска .... var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = contextMenu.insertBefore( document.createElement('menu'), searchSelect ); // над каким пунктом меню показывать menu.setAttribute("class", "menu-iconic"); // устанавливать иконку, название и поисковик для нового пункта меню function setMenu() { menu.engine = searchService.currentEngine; menu.setAttribute("label", "Искать в..."); }; setMenu(); // наблюдатель за стандартным пунктом меню 'Копировать' прячет меню поиска var copy = document.getElementById('context-copy'); var setHiddenMenu = new MutationObserver(function() { menu.hidden = copy.hidden || copy.disabled; }); setHiddenMenu.observe( copy, { attributes: true, attributeFilter: ["hidden", "disabled"] } ); // Создать подменю с поисковиками .... var menuPopup = menu.appendChild( document.createElement("menupopup") ); menuPopup.setAttribute('style', 'overflow: scroll'); // создать пункты в подменю function setItemsToMenuPopup(e) { menuPopup.textContent = ""; var engines = searchService.getVisibleEngines({}); engines.forEach(function( engine ) { var mItem = document.createElement("menuitem"); mItem.setAttribute("label", engine.name ); mItem.setAttribute("class", "menuitem-iconic"); mItem.setAttribute("src", engine.iconURI.spec ); mItem.engine = engine; menuPopup.appendChild( mItem ); }); }; setItemsToMenuPopup(); // Установить действие для клика на меню и подменю .... menu.setAttribute("onmouseup", "\ var background = ( event.button == 0 ) ? false : true;\ var clip = gClipboard.read();\ goDoCommand('cmd_copy');\ setTimeout(function() {\ document.getElementById('contentAreaContextMenu').hidePopup();\ var submission = event.target.engine.getSubmission( gClipboard.read(), null );\ gBrowser.loadOneTab( submission.uri.spec, null, null, submission.postData, background, false );\ gClipboard.write( clip );\ }, 0);\ "); // Наблюдатель за изменениями в поисковиках пересоздаёт меню и подменю .... var getEngineModified = { observe: function(subject, topic, data) { if ( /changed|removed|current/.test( data ) ) { setMenu(); setItemsToMenuPopup() }; } }; Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false ); // Удалять наблюдатели и меню, показать стандартный пункт .... addDestructor(function() { contextMenu.removeChild( menu ); setHiddenMenu.disconnect(); Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false ); searchSelect.collapsed = false; }); })(document.getElementById("contentAreaContextMenu") ); | Всего записей: 556 | Зарегистр. 01-06-2016 | Отправлено: 17:38 26-08-2017 | Исправлено: drage, 17:41 26-08-2017 |
|