bunda1
https://developer.mozilla.org/en-US/doc … /boxObject
https://developer.mozilla.org/en-US/doc … Attributes
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Как сделать, чтобы расширение (джетпак) при запуске браузера было отключено и включалось через N секунд после запуска?
Вот пример:
const addonId = "privateTab@infocatcher"; const delay = 5000; setTimeout(function enableOnStartup() { if(!hasOtherWindows()) setAddon(true); }, delay); addEventListener("unload", function disableOnShutdown() { removeEventListener("unload", disableOnShutdown, false); if(!hasOtherWindows()) setAddon(false); }, false); function hasOtherWindows() { var ws = Services.wm.getEnumerator("navigator:browser"); while(ws.hasMoreElements()) if(ws.getNext() != window) return true; return false; } function setAddon(enabled) { AddonManager.getAddonByID(addonId, function(addon) { if(addon) addon.userDisabled = !enabled; }); }
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Вот пример:
Все получилось!
Спасибо!
.......................................................
Только это получается, каждый раз перед закрытием браузера, расширение надо отключать?
Потому что само оно не отключается, а если оставить включенным, то при следующем запуске браузера расширение загружается сразу, без задержки.
Отредактировано beggrr (06-02-2014 00:21:11)
Отсутствует
(удалять уже написанное лень)
вставил в инициализацию уже существующей кнопки
Может мешать уже существующий код.
Можно попробовать обернуть в
Или выставлена слишком маленькая задержка.
Потому что само оно не отключается, а если оставить включенным, то при следующем запуске браузера расширение загружается сразу, без задержки.
У меня отключается само.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Создал отдельную кнопку. Задержка установлена 10 с. Обернул в анонимную функцию.
И все равно получается: если отключить через менеджер дополнений, то при следующем запуске расширение загружается как и положено, с задержкой. Но если перезапустить браузер еще раз (не отключая расширение в менеджере) — то задержки уже нет.
Отсутствует
beggrr
Странно, я только вижу проблемы с включением, если перезапустить с несколькими открытыми окнами, с этим можно сделать вот так:
const addonId = "privateTab@infocatcher"; const delay = 5000; setTimeout(function enableOnStartup() { //if(!hasOtherWindows()) setAddon(true); }, delay); addEventListener("unload", function disableOnShutdown() { removeEventListener("unload", disableOnShutdown, false); if(!hasOtherWindows()) setAddon(false); }, false); function hasOtherWindows() { var ws = Services.wm.getEnumerator("navigator:browser"); while(ws.hasMoreElements()) if(ws.getNext() != window) return true; return false; } function setAddon(enabled) { AddonManager.getAddonByID(addonId, function(addon) { if(addon && addon.userDisabled == enabled) addon.userDisabled = !enabled; }); }
А с выключением не знаю. Если используется только одно окно, то можно вообще убрать все проверки про «hasOtherWindows()».
Добавлено 06-02-2014 13:25:51
Еще можно отслеживать оповещение о "quit-application-granted", но оно или снимется в деструкторе кнопки при закрытии окна, или создаст утечку памяти. Делается примерно так, но из Custom Buttons это неудобно:
function observer() { // ... } Services.obs.addObserver(observer, "quit-application-granted", false); addDestructor(function(reason) { if(reason == "update" || reason == "delete") Services.obs.removeObserver(observer, "quit-application-granted"); });
Отредактировано Infocatcher (06-02-2014 13:25:51)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
okkamas_knife пишет:
кто мешает создать панель набить её кнопками и потом другой кнопкой просто скрывать-показывать эту панель?
У меня наивный вопрос: а как создать панель, у меня не выходит.
Я кликаю по любой существующей панели — Настроить — Добавить панель — вписываю имя панели (abcd) — ОК — Готово.
Диалог закрывается, где мне искать созданную панель? Панели нигде нет.
Отсутствует
У меня наивный вопрос: а как создать панель, у меня не выходит.
Я кликаю по любой существующей панели — Настроить — Добавить панель — вписываю имя панели (abcd) — ОК — Готово.
Диалог закрывается, где мне искать созданную панель? Панели нигде нет.
Перед тем как нажать ОК добавь на панель любую кнопку, или хотя бы разделитель.
Отсутствует
Есть такой код:
// ==UserScript== // @name SearchOnEngineChangeForFx3.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description // @include main // @compatibility Firefox 17.0+ // @author Alice0775 // @version 2013/05/19 00:00 Bug 831008 Disable Mutation Events in chrome/XUL // @version 2013/05/18 23:20 Bug 738818 // @version 2008/06/24 19:20 修正した // @Note // ==/UserScript== // @version 2008/06/24 18:50 browser.search.openintabがtrueの時2重にタブが開くbug // @version 2008/06/23 02:00 キーボード選択時も // @version 2008/06/23 01:50 なんか非互換まくりだったので, 作り直し // @version 2008/06/22 22:00 var searchOnEngineChange = { // -- config -- KeepDefaultEngine: true, //Чтобы вернуться к поисковой системе по умолчанию ClearWordAfterSearch: true, //Очистить поле поиска после поиска // -- config -- searchBar: null, popup: null, init: function(){ this.searchBar = document.getElementById("searchbar"); if(!this.searchBar)return; this.popup = document.getAnonymousElementByAttribute(this.searchBar, "anonid", "searchbar-popup"); this.popup.addEventListener("command", this, false); window.addEventListener("aftercustomization", this, false); }, handleEvent: function(event){ switch (event.type) { case "unload": this.popup.removeEventListener("command", this, true); window.removeEventListener("aftercustomization", this, false); break; case "aftercustomization": this.init(); break; case "command": this.doSearch(event); break; } }, clearWord: function(){ this.searchBar.value = ""; this.searchBar.updateDisplay(); }, where: function(aEvent){ var where = "current"; if (aEvent && aEvent.originalTarget.getAttribute("anonid") == "search-go-button") { if (aEvent.button == 2) return; where = whereToOpenLink(aEvent, false, true); } else { var newTabPref = this.searchBar._textbox._prefBranch.getBoolPref("browser.search.openintab"); if ((aEvent && aEvent.altKey) ^ newTabPref) where = "tab"; } return where; }, doSearch: function(event){ var target = event.target; var aEngine = target.engine; if (!aEngine) return; var aData = this.searchBar._textbox.value; if (!aData) return; var ss = Cc['@mozilla.org/browser/search-service;1'].getService(Ci.nsIBrowserSearchService); var aWhere = this.where(event); var submission = aEngine.getSubmission(aData, null); openUILinkIn(submission.uri.spec, aWhere, null, submission.postData); if (this.ClearWordAfterSearch){ this.clearWord(); } if (this.KeepDefaultEngine){ let defaultPrefB = Services.prefs.getDefaultBranch("browser.search."); let nsIPLS = Ci.nsIPrefLocalizedString; let defaultEngine =ss.defaultEngine; try { defaultEngineName = defaultPrefB.getComplexValue("defaultenginename", nsIPLS).data; defaultEngine = ss.getEngineByName(defaultEngineName); } catch (ex) {} setTimeout(function(){ss.currentEngine = defaultEngine;},100); } } }; searchOnEngineChange.init(); window.addEventListener('unload', searchOnEngineChange, false);
// @author Morat if (BrowserSearch.searchBar) { if (!("engineObserver" in this)) { this.engineObserver = function (subject, topic, data) { if (data == "engine-current" && BrowserSearch.searchBar.value) { BrowserSearch.searchBar.handleSearchCommand(); } }; Services.obs.addObserver(this.engineObserver, "browser-search-engine-modified", false); this.onDestroy = function () { Services.obs.removeObserver(this.engineObserver, "browser-search-engine-modified"); delete this.engineObserver; delete this.onDestroy; }; } else { this.onDestroy(); } }
Отредактировано lokiju (09-02-2014 13:45:24)
Отсутствует
lokiju
function getEngineModified(subject, topic, data) { if ( data == "engine-current" && gURLBar.value !== '' ) { var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); var submission = ss.currentEngine.getSubmission( gURLBar.value, null ); gBrowser.loadOneTab( submission.uri.spec, null, null, submission.postData, true, false ); } }; Services.obs.addObserver( getEngineModified, "browser-search-engine-modified", false ); addDestructor(function() { Services.obs.removeObserver( getEngineModified, "browser-search-engine-modified", false ) });
Отсутствует
Как прицепить обработчик onclick на значок менеджера индикатор загрузок #downloads-button?
Дело в том, что если была загрузка, то на месте этого значка - индикатор загрузок #downloads-indicator
Мне надо обработчик onclick и на одном, и на другом.
Отсутствует
Отсутствует
Я взял код той кнопки, упростил для себя и вот что у меня получилось:
addEventListener("mousedown", function f(e) { if ( e.button !== 2 ) return; if ( e.target.id == "downloads-button"||e.target.id == "downloads-indicator") { // My action ........................ } }, true );
Вроде работает.
Нормальный код, или что то в нем не так?
Отсутствует
hartumov
Наверно лучше так:
addEventListener("mousedown", function(e) { if ( e.button !== 2 ) return; if ( e.target.id && ["downloads-button", "downloadsPanel", "downloads-indicator"].indexOf( e.target.id ) != -1 ) { // My action ........................ } }, true );
Отсутствует
bunda1
Еще один вопросик: ведь обычно EventListener добавляют так
или иногда
А где в нашем случае указывается, элемент, к которому мы добавляем листенер?
Отредактировано hartumov (10-02-2014 21:10:34)
Отсутствует
okkamas_knife
'use strict'; var restartItem = { init: function() { var localeRestart; try { var strings = Components.classes['@mozilla.org/intl/stringbundle;1'] .createInstance(Components.interfaces.nsIStringBundleService); var quitBundle = strings.createBundle('chrome://browser/locale/preferences/preferences.properties'); localeRestart = quitBundle.GetStringFromName('shouldRestartTitle').replace(/( +)\%S/, ''); } catch (e) {} var getBrowserUILocale = function() { if (!gPrefService.getBoolPref('intl.locale.matchOS')) { try { var locale = gPrefService.getCharPref('general.useragent.locale'); if (locale.substr(0, 9) == 'chrome://') { return gPrefService.getComplexValue('general.useragent.locale', Components.interfaces.nsIPrefLocalizedString).data; } return locale; } catch (ex) {} } try { return Components.classes['@mozilla.org/chrome/chrome-registry;1'] .getService(Components.interfaces.nsIXULChromeRegistry) .getSelectedLocale('global'); } catch (ex) { return 'en-US'; } } if (!localeRestart) { try { var strings = Components.classes['@mozilla.org/intl/stringbundle;1'] .createInstance(Components.interfaces.nsIStringBundleService); var quitBundle = strings.createBundle('chrome://browser/locale/browser.properties'); localeRestart = quitBundle.GetStringFromName('safeModeRestartButton'); } catch (e) { var appLocale = ''; // ru, en if (!appLocale) appLocale = getBrowserUILocale().match(/^[a-z]*/)[0]; if (appLocale == 'ru') localeRestart = 'Перезапуск'; else localeRestart = 'Restart'; } } var imageIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALNJREFUeNpiYMAPBIBYAZfk////sYo7APF6kDwaXg+Vw2tAPxaN6LgflwHImu8DcQLURgco+z66IcgGOCBJzof6HVt4zEdS54BswHokmwUIBCrMJeuRDYCZasFAGCTA1IMMYEKLprdEGPAAmQMy4AMDBQDdAGEi9GBNWLBA9IbSJAeiJlpiQdYgQEw02mExoAGJD2Ib4EtI6MlVAIsYLLX2E8pMDHgMICo3MuDwAlYDAAIMAFQCdq6IkR49AAAAAElFTkSuQmCC'; if (!document.getElementById('appmenuRestart_Firefox')) { var menuitem = document.createElement('menuitem'); menuitem.setAttribute('id', 'appmenuRestart_Firefox'); menuitem.setAttribute('class', 'menuitem-iconic'); menuitem.setAttribute('image', imageIcon); menuitem.setAttribute('label', localeRestart); menuitem.setAttribute('oncommand', 'Application.restart();'); try { var appMenuItem = document.getElementById('appmenu-quit'); appMenuItem.parentNode.insertBefore(menuitem, appMenuItem); } catch (ex) {} } if (!document.getElementById('menuRestart_Firefox')) { var menuitem = document.createElement('menuitem'); menuitem.setAttribute('id', 'menuRestart_Firefox'); menuitem.setAttribute('class', 'menuitem-iconic'); menuitem.setAttribute('image', imageIcon); menuitem.setAttribute('label', localeRestart); menuitem.setAttribute('oncommand', 'Application.restart()'); try { var MenuItem = document.getElementById('menu_FileQuitItem'); MenuItem.parentNode.insertBefore(menuitem, MenuItem); } catch (ex) {} } }, uninit: function() { }, destroy: function() { var am = document.getElementById('appmenuRestart_Firefox'); if (am) am.parentNode.removeChild(am); var m = document.getElementById('menuRestart_Firefox'); if (m) m.parentNode.removeChild(m); restartItem = null; }, destructor: function(reason) { this.destroy(); } }; restartItem.init(); if (typeof addDestructor == 'function' && // userChromeJS/uc addDestructor != ('addDestructor' in window && window.addDestructor)) { let _this = restartItem; addDestructor(_this.destructor, _this); }
Отсутствует
Как сделать что бы код который увеличивает изображения из контекстного меню изображений брал первым делом изображения из кеша и загружал из сервера только в случае отсутствия в кеше. Проблема в том что код обычно берёт изображения из кеша а на некоторых сайтах( http://kinozal.tv/ ) загружает из сервера который бывает отдаёт другую изображение?
// Увеличивать размеры изображений из контекстного меню на странице, от 12.02.2014. ................................ (function z() { var imgZoom = 170; // на сколько увеличить изображение из меню var scrollZoom = 20; // на сколько увеличивать/уменьшать колесиком мыши var scrollTop = 1; // или -1, переключение направление прокрутки для увеличение колёсиком // добавить новый пункт в меню изображений var contextMenu = document.getElementById("contentAreaContextMenu"); var menuitem = contextMenu.appendChild(document.createElement("menuitem")); // как последний пункт меню menuitem.setAttribute("label", "Увеличить размер"); addDestructor(function() contextMenu.removeChild(menuitem)); addEventListener("popupshowing", function(e) { menuitem.hidden = !gContextMenu.onImage; // скрывать если не контекстное меню изображений // получить координаты и размеры элемента над которым открылось контекстное меню z.targRect = e.target.triggerNode.getBoundingClientRect(); z.rect = { left: z.targRect.left, top: z.targRect.top, width: z.targRect.width, height: z.targRect.height }; }, true, contextMenu); // если клик или команда на пункте меню menuitem.setAttribute("oncommand", "this.run(event);"); menuitem.run = function(e) { var img = gContextMenu.target; // получить изображение // создать всплывающую подсказку с увеличенным изображением .... var tooltip = gBrowser.appendChild( document.createElement("tooltip") ); tooltip.setAttribute("onpopuphiding", "event.preventDefault();"); tooltip.style.cssText = "margin-left: -3px; margin-top: -3px; -moz-appearance: none !important; border: none; background: transparent; max-width: none"; var image = tooltip.appendChild( document.createElement("image") ); var w = z.rect.width, h = z.rect.height; image.style.width = w + imgZoom + "px", image.style.height = h * (1 + imgZoom / w) + "px"; image.setAttribute("src", gContextMenu.imageURL || gContextMenu.mediaURL ); // открыть всплывающую подсказку над изображением .... try { var toRect = !img.offsetParent } catch(e) { var toRect = false }; toRect ? tooltip.openPopup( gBrowser, "none", z.rect.left, z.rect.top, false, false, null ) : tooltip.showPopup( img, -1, -1, "popup", "topleft", "none"); // прокрутка на подсказке меняет размеры изображения, на странице закрывает его .... function imageZoom(e) { if ( e && e.target != image ) { removeTooltip(); return; } var zoom = (e.detail < 0 ? scrollZoom : -scrollZoom) * scrollTop; var h = image.clientHeight, w = image.clientWidth; image.style.width = w + zoom + "px"; image.style.height = h * (1 + zoom / w) + "px"; } gBrowser.addEventListener('DOMMouseScroll', imageZoom, true); // удалить подсказку и обработчики .... function removeTooltip() { try { gBrowser.removeChild( tooltip ) } catch(e) {}; gBrowser.removeEventListener("click", removeTooltip, true); gBrowser.removeEventListener("DOMMouseScroll", imageZoom, true); } gBrowser.addEventListener("click", removeTooltip, true); // удалить по клику на странице } })();
Добавлено 12-02-2014 22:51:58
Вроде так можно проверить наличие изображения в кеше:
var uri = img.currentURI; var tools = Components.classes["@mozilla.org/image/tools;1"].getService(Components.interfaces.imgITools); var cache = "getImgCacheForDocument" in tools // Gecko 18 ? tools.getImgCacheForDocument(img.ownerDocument) : Components.classes["@mozilla.org/image/cache;1"].getService(Components.interfaces.imgICache); alert( cache.findEntryProperties(uri) );
Но что делать дальше?
Отредактировано bunda1 (12-02-2014 22:55:43)
Отсутствует