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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№102-02-2013 23:45:23

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

[CB]Toggle Restartless Add-ons

Toggle Restartless Add-ons 0.1.2.2 (2016-04-10)
Совместимость: [firefox] Firefox 4.0+, [seamonkey] SeaMonkey 2.1+, [thunderbird] Thunderbird 5.0+
Автор: Infocatcher
Описание:
Кнопка-меню для переключения дополнений, не требующих перезапуска

Управление:
ЛКМ – открыть меню
СКМ или ЛКМ с любым модификатором – открыть управление дополнениями
В меню:
ЛКМ – включить/выключить дополнение
Shift+ЛКМ – включить/выключить дополнение без закрытия меню
СКМ или ЛКМ с любым модификатором (кроме Shift) – открыть страницу дополнения в управлении дополнениями
ПКМ – открыть настройки дополнения (если есть)

Скриншот:
toggleRestartlessAddons-ru.png

Установить:

Выделить код

Код:

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%3EToggle%20Restartless%20Add-ons%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bchrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20http%3A//infocatcher.ucoz.net/js/cb/toggleRestartlessAddons.js%0A//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fid%3D57948%0A//%20https%3A//github.com/Infocatcher/Custom_Buttons/tree/master/Toggle_Restartless_Add-ons%0A%0A//%20Toggle%20Restartless%20Add-ons%20button%20for%20Custom%20Buttons%0A//%20%28code%20for%20%22initialization%22%20section%29%0A//%20Also%20the%20code%20can%20be%20used%20from%20main%20window%20context%20%28as%20Mouse%20Gestures%20code%2C%20for%20example%29%0A%0A//%20Also%20you%20can%20check%20for%20add-ons%20updates%20using%20right-click%3A%0A//%20copy%20all%20code%20from%0A//%20https%3A//github.com/Infocatcher/Custom_Buttons/blob/master/Check_for_Addons_Updates/checkForAddonsUpdates.js%0A//%20after%20%22//%3D%3D%20Check%20for%20Addons%20Updates%20begin%22%0A%0A//%20%28c%29%20Infocatcher%202013-2016%0A//%20version%200.1.2.2%20-%202016-04-10%0A%0Avar%20options%20%3D%20%7B%0A%09addonTypes%3A%20%5B%22extension%22%2C%20%22plugin%22%5D%2C%0A%09//%20Possible%20values%3A%20%22extension%22%2C%20%22plugin%22%0A%09//%20From%20extensions%3A%20%22userstyle%22%20%28Stylish%29%2C%20%22greasemonkey-user-script%22%20%28Greasemonkey%29%2C%20%22userscript%22%20%28Scriptish%29%0A%09//%20%28swap%20to%20reorder%20in%20the%20menu%29%0A%09showVersions%3A%200%2C%0A%09//%200%20-%20don%27t%20show%20versions%0A%09//%201%20-%20show%20after%20name%3A%20%22Addon%20Name%201.2%22%0A%09//%202%20-%20show%20as%20%22acceltext%22%20%28in%20place%20for%20hotkey%20text%29%0A%09sort%3A%20%7B%0A%09%09enabled%3A%20%20%20%20%200%2C%0A%09%09clickToPlay%3A%200%2C%0A%09%09disabled%3A%20%20%20%200%0A%09%09//%20Sort%20order%3A%0A%09%09//%200%2C%200%2C%200%20-%20sort%20add-ons%20of%20each%20type%20alphabetically%0A%09%09//%200%2C%200%2C%201%20-%20show%20enabled%20add-ons%20%28of%20each%20type%29%20first%0A%09%09//%200%2C%201%2C%202%20-%20enabled%20add-ons%2C%20then%20click-to-play%20and%20then%20disabled%0A%09%7D%2C%0A%09closeMenu%3A%20true%2C%0A%09//%20Close%20menu%20after%20left-click%20%28use%20Shift+click%20to%20invert%20this%20behavior%29%0A%09closeMenuClickToPlay%3A%20-1%0A%09//%20Special%20handling%20for%20click%20to%20play%20plugins%3A%0A%09//%20-1%20-%20invert%20Shift+click%20behavior%0A%09//%200%20%20-%20do%20nothing%20special%20%28and%20use%20%22closeMenu%22%20option%29%0A%09//%201%20%20-%20always%20don%27t%20close%20menu%0A%7D%3B%0A%0Avar%20mp%20%3D%20document.createElement%28%22menupopup%22%29%3B%0Amp.setAttribute%28%22onpopupshowing%22%2C%20%22this.updateMenu%28%29%3B%22%29%3B%0Amp.setAttribute%28%22oncommand%22%2C%20%22this.handleEvent%28event%29%3B%22%29%3B%0Amp.setAttribute%28%22onmousedown%22%2C%20%22if%28event.button%20%3D%3D%200%29%20this.handleEvent%28event%29%3B%22%29%3B%0Amp.setAttribute%28%22onclick%22%2C%20%22if%28event.button%20%3E%200%29%20this.handleEvent%28event%29%3B%22%29%3B%0Amp.setAttribute%28%22oncontextmenu%22%2C%20%22return%20false%3B%22%29%3B%0Amp.setAttribute%28%22onpopuphidden%22%2C%20%22this.destroyMenu%28%29%3B%22%29%3B%0A%0Avar%20tb%20%3D%20this.parentNode%3B%0Aif%28tb%20%26%26%20tb.getAttribute%28%22orient%22%29%20%3D%3D%20%22vertical%22%29%20%7B%0A%09//%20https%3A//addons.mozilla.org/firefox/addon/vertical-toolbar/%0A%09var%20isRight%20%3D%20tb.parentNode.getAttribute%28%22placement%22%29%20%3D%3D%20%22right%22%3B%0A%09mp.setAttribute%28%22position%22%2C%20isRight%20%3F%20%22start_before%22%20%3A%20%22end_before%22%29%3B%0A%7D%0A%0Avar%20cleanupTimer%20%3D%200%3B%0Amp.updateMenu%20%3D%20function%28%29%20%7B%0A%09clearTimeout%28cleanupTimer%29%3B%0A%09addStyle%28%29%3B%0A%09getRestartlessAddons%28options.addonTypes%2C%20function%28addons%29%20%7B%0A%09%09var%20df%20%3D%20document.createDocumentFragment%28%29%3B%0A%09%09var%20prevType%3B%0A%09%09function%20sortPosition%28addon%29%20%7B%0A%09%09%09if%28%22STATE_ASK_TO_ACTIVATE%22%20in%20AddonManager%20%26%26%20addon.userDisabled%20%3D%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%29%0A%09%09%09%09return%20options.sort.clickToPlay%3B%0A%09%09%09if%28addon.isActive%29%0A%09%09%09%09return%20options.sort.enabled%3B%0A%09%09%09return%20options.sort.disabled%3B%0A%09%09%7D%0A%09%09function%20key%28addon%29%20%7B%0A%09%09%09return%20options.addonTypes.indexOf%28addon.type%29%0A%09%09%09%09+%20%22%5Cn%22%20+%20sortPosition%28addon%29%0A%09%09%09%09+%20%22%5Cn%22%20+%20addon.name.toLowerCase%28%29%3B%0A%09%09%7D%0A%09%09addons.sort%28function%28a%2C%20b%29%20%7B%0A%09%09%09var%20ka%20%3D%20key%28a%29%3B%0A%09%09%09var%20kb%20%3D%20key%28b%29%3B%0A%09%09%09return%20ka%20%3D%3D%20kb%20%3F%200%20%3A%20ka%20%3C%20kb%20%3F%20-1%20%3A%201%3B%0A%09%09%7D%29.forEach%28function%28addon%29%20%7B%0A%09%09%09var%20type%20%3D%20addon.type%3B%0A%09%09%09if%28prevType%20%26%26%20type%20%21%3D%20prevType%29%0A%09%09%09%09df.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0A%09%09%09prevType%20%3D%20type%3B%0A%09%09%09var%20icon%20%3D%20addon.iconURL%20%7C%7C%20addon.icon64URL%0A%09%09%09%09%7C%7C%20type%20%3D%3D%20%22plugin%22%20%20%20%20%26%26%20%22chrome%3A//mozapps/skin/plugins/pluginGeneric-16.png%22%0A%09%09%09%09%7C%7C%20type%20%3D%3D%20%22extension%22%20%26%26%20%22chrome%3A//mozapps/skin/extensions/extensionGeneric-16.png%22%0A%09%09%09%09%7C%7C%20%22%22%3B%0A%09%09%09var%20mi%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%09%09%09mi.className%20%3D%20%22menuitem-iconic%22%3B%0A%09%09%09var%20label%20%3D%20addon.name%3B%0A%09%09%09if%28options.showVersions%20%3D%3D%201%29%0A%09%09%09%09label%20+%3D%20%22%20%22%20+%20addon.version%3B%0A%09%09%09else%20if%28options.showVersions%20%3D%3D%202%29%0A%09%09%09%09mi.setAttribute%28%22acceltext%22%2C%20addon.version%29%3B%0A%09%09%09mi.setAttribute%28%22label%22%2C%20label%29%3B%0A%09%09%09mi.setAttribute%28%22image%22%2C%20icon%29%3B%0A%09%09%09var%20desc%20%3D%20addon.description%3B%0A%09%09%09desc%20%26%26%20mi.setAttribute%28%22tooltiptext%22%2C%20desc%29%3B%0A%09%09%09setDisabled%28mi%2C%20addon.userDisabled%29%3B%0A%09%09%09mi._cbAddon%20%3D%20addon%3B%0A%09%09%09df.appendChild%28mi%29%3B%0A%09%09%7D%29%3B%0A%09%09mp.textContent%20%3D%20%22%22%3B%0A%09%09mp.appendChild%28df%29%3B%0A%09%7D%29%3B%0A%7D%3B%0Amp.handleEvent%20%3D%20function%28e%29%20%7B%0A%09var%20mi%20%3D%20e.target%3B%0A%09if%28%21%28%22_cbAddon%22%20in%20mi%29%29%0A%09%09return%3B%0A%09var%20addon%20%3D%20mi._cbAddon%3B%0A%09if%28e.type%20%3D%3D%20%22mousedown%22%29%20%7B%0A%09%09var%20stayOpen%20%3D%20options.closeMenu%20%3F%20e.shiftKey%20%3A%20%21e.shiftKey%3B%0A%09%09if%28options.closeMenuClickToPlay%20%26%26%20isAskToActivateAddon%28addon%29%29%0A%09%09%09stayOpen%20%3D%20options.closeMenuClickToPlay%20%3D%3D%20-1%20%3F%20%21stayOpen%20%3A%20true%3B%0A%09%09mi.setAttribute%28%22closemenu%22%2C%20stayOpen%20%3F%20%22none%22%20%3A%20%22auto%22%29%3B%0A%09%09return%3B%0A%09%7D%0A%09var%20hasMdf%20%3D%20hasModifier%28e%29%3B%0A%09if%28e.type%20%3D%3D%20%22command%22%20%26%26%20%28%21hasMdf%20%7C%7C%20e.shiftKey%29%29%20%7B%0A%09%09let%20newDis%20%3D%20setNewDisabled%28addon%29%3B%0A%09%09setDisabled%28mi%2C%20newDis%29%3B%0A%09%7D%0A%09else%20if%28e.type%20%3D%3D%20%22command%22%20%26%26%20hasMdf%20%7C%7C%20e.type%20%3D%3D%20%22click%22%20%26%26%20e.button%20%3D%3D%201%29%20%7B%0A%09%09openAddonPage%28addon%29%3B%0A%09%09closeMenus%28mi%29%3B%0A%09%7D%0A%09else%20if%28e.type%20%3D%3D%20%22click%22%20%26%26%20e.button%20%3D%3D%202%29%20%7B%0A%09%09if%28openAddonOptions%28addon%29%29%0A%09%09%09closeMenus%28mi%29%3B%0A%09%7D%0A%7D%3B%0Amp.destroyMenu%20%3D%20function%28%29%20%7B%0A%09removeStyle%28%29%3B%0A%09clearTimeout%28cleanupTimer%29%3B%0A%09cleanupTimer%20%3D%20setTimeout%28function%28%29%20%7B%0A%09%09mp.textContent%20%3D%20%22%22%3B%0A%09%7D%2C%205000%29%3B%0A%7D%3B%0Afunction%20isAskToActivateAddon%28addon%29%20%7B%0A%09return%20addon.type%20%3D%3D%20%22plugin%22%0A%09%09%26%26%20%22STATE_ASK_TO_ACTIVATE%22%20in%20AddonManager%0A%09%09%26%26%20Services.prefs.getBoolPref%28%22plugins.click_to_play%22%29%3B%0A%7D%0Afunction%20setNewDisabled%28addon%29%20%7B%0A%09var%20newDis%20%3D%20getNewDisabled%28addon%29%3B%0A%09var%20oldDis%20%3D%20addon.userDisabled%3B%0A%09addon.userDisabled%20%3D%20newDis%3B%0A%09var%20realDis%20%3D%20addon.userDisabled%3B%0A%09if%28realDis%20%21%3D%20newDis%29%20%7B%20//%20We%20can%27t%20enable%20vulnerable%20plugins%0A%09%09var%20err%20%3D%20%22Can%27t%20set%20addon.userDisabled%20to%20%22%20+%20newDis%20+%20%22%2C%20real%20value%3A%20%22%20+%20realDis%3B%0A%09%09if%28newDis%29%20%7B%0A%09%09%09LOG%28err%20+%20%22%5CnSTATE_ASK_TO_ACTIVATE%20not%20supported%3F%22%29%3B%0A%09%09%09newDis%20%3D%20false%3B%0A%09%09%7D%0A%09%09else%20%7B%0A%09%09%09LOG%28err%20+%20%22%5CnVulnerable%20plugin%3F%22%29%3B%0A%09%09%09if%28oldDis%20%3D%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%29%0A%09%09%09%09newDis%20%3D%20true%3B%0A%09%09%09else%0A%09%09%09%09newDis%20%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%3B%0A%09%09%7D%0A%09%09addon.userDisabled%20%3D%20newDis%3B%0A%09%7D%0A%09return%20addon.userDisabled%3B%0A%7D%0Afunction%20getNewDisabled%28addon%29%20%7B%0A%09//%20disabled%20-%3E%20STATE_ASK_TO_ACTIVATE%20-%3E%20enabled%20-%3E%20...%0A%09var%20curDis%20%3D%20addon.userDisabled%3B%0A%09var%20newDis%3B%0A%09if%28%22STATE_ASK_TO_ACTIVATE%22%20in%20AddonManager%20%26%26%20curDis%20%3D%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%29%0A%09%09newDis%20%3D%20false%3B%0A%09else%20if%28%21curDis%29%0A%09%09newDis%20%3D%20true%3B%0A%09else%20%7B%0A%09%09if%28isAskToActivateAddon%28addon%29%29%0A%09%09%09newDis%20%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%3B%0A%09%09else%0A%09%09%09newDis%20%3D%20false%3B%0A%09%7D%0A%09return%20newDis%3B%0A%7D%0Afunction%20setDisabled%28mi%2C%20disabled%29%20%7B%0A%09var%20askToActivate%20%3D%20%22STATE_ASK_TO_ACTIVATE%22%20in%20AddonManager%20%26%26%20disabled%20%3D%3D%20AddonManager.STATE_ASK_TO_ACTIVATE%3B%0A%09var%20cl%20%3D%20mi.classList%3B%0A%09cl.toggle%28%22toggleRestartlessAddons-askToActivate%22%2C%20askToActivate%29%3B%0A%09cl.toggle%28%22toggleRestartlessAddons-disabled%22%2C%20disabled%20%26%26%20%21askToActivate%29%3B%0A%7D%0A%0Aif%28%0A%09this%20instanceof%20XULElement%20//%20Custom%20Buttons%0A%09%26%26%20typeof%20event%20%3D%3D%20%22object%22%0A%09%26%26%20%21%28%22type%22%20in%20event%29%20%26%26%20typeof%20_phase%20%3D%3D%20%22string%22%20%26%26%20_phase%20%3D%3D%20%22init%22%20//%20Initialization%0A%29%20%7B%0A%09this.type%20%3D%20%22menu%22%3B%0A%09this.orient%20%3D%20%22horizontal%22%3B%0A%09this.appendChild%28mp%29%3B%0A%0A%09this.onmouseover%20%3D%20function%28e%29%20%7B%0A%09%09if%28e.target%20%21%3D%20this%29%0A%09%09%09return%3B%0A%09%09Array.some%28%0A%09%09%09this.parentNode.getElementsByTagName%28%22*%22%29%2C%0A%09%09%09function%28node%29%20%7B%0A%09%09%09%09if%28%0A%09%09%09%09%09node%20%21%3D%20this%0A%09%09%09%09%09%26%26%20node.namespaceURI%20%3D%3D%20xulns%0A%09%09%09%09%09%26%26%20node.boxObject%0A%09%09%09%09%09//%20See%20https%3A//github.com/Infocatcher/Custom_Buttons/issues/28%0A%09%09%09%09%09//%26%26%20node.boxObject%20instanceof%20Components.interfaces.nsIMenuBoxObject%0A%09%09%09%09%09%26%26%20%22open%22%20in%20node%0A%09%09%09%09%09%26%26%20node.open%0A%09%09%09%09%09%26%26%20node.getElementsByTagName%28%22menupopup%22%29.length%0A%09%09%09%09%29%20%7B%0A%09%09%09%09%09node.open%20%3D%20false%3B%0A%09%09%09%09%09this.open%20%3D%20true%3B%0A%09%09%09%09%09return%20true%3B%0A%09%09%09%09%7D%0A%09%09%09%09return%20false%3B%0A%09%09%09%7D%2C%0A%09%09%09this%0A%09%09%29%3B%0A%09%7D%3B%0A%09this.onmousedown%20%3D%20function%28e%29%20%7B%0A%09%09if%28e.target%20%3D%3D%20this%20%26%26%20e.button%20%3D%3D%200%20%26%26%20hasModifier%28e%29%29%0A%09%09%09e.preventDefault%28%29%3B%0A%09%7D%3B%0A%09this.oncontextmenu%20%3D%20function%28e%29%20%7B%0A%09%09if%28e.target%20%3D%3D%20this%20%26%26%20%21hasModifier%28e%29%20%26%26%20hasUpdater%28%29%29%0A%09%09%09e.preventDefault%28%29%3B%0A%09%7D%3B%0A%09this.onclick%20%3D%20function%28e%29%20%7B%0A%09%09if%28e.target%20%21%3D%20this%29%0A%09%09%09return%3B%0A%09%09if%28e.button%20%3D%3D%200%20%26%26%20hasModifier%28e%29%20%7C%7C%20e.button%20%3D%3D%201%29%0A%09%09%09openAddonsManager%28%29%3B%0A%09%09else%20if%28e.button%20%3D%3D%202%20%26%26%20%21hasModifier%28e%29%20%26%26%20hasUpdater%28%29%29%0A%09%09%09checkForAddonsUpdates.call%28this%29%3B%0A%09%7D%3B%0A%7D%0Aelse%20%7B%20//%20Mouse%20gestures%20or%20something%20other...%0A%09let%20e%3B%0A%09if%28typeof%20event%20%3D%3D%20%22object%22%20%26%26%20event%20instanceof%20Event%20%26%26%20%22screenX%22%20in%20event%29%20//%20FireGestures%0A%09%09e%20%3D%20event%3B%0A%09else%20if%28this%20%3D%3D%20window%20%26%26%20%22mgGestureState%22%20in%20window%20%26%26%20%22endEvent%22%20in%20mgGestureState%29%20//%20Mouse%20Gestures%20Redox%0A%09%09e%20%3D%20mgGestureState.endEvent%3B%0A%09else%20%7B%0A%09%09let%20anchor%20%3D%20this%20instanceof%20XULElement%20%26%26%20this%0A%09%09%09%7C%7C%20window.gBrowser%20%26%26%20gBrowser.selectedBrowser%0A%09%09%09%7C%7C%20document.documentElement%3B%0A%09%09if%28%22boxObject%22%20in%20anchor%29%20%7B%0A%09%09%09let%20bo%20%3D%20anchor.boxObject%3B%0A%09%09%09e%20%3D%20%7B%0A%09%09%09%09screenX%3A%20bo.screenX%2C%0A%09%09%09%09screenY%3A%20bo.screenY%0A%09%09%09%7D%3B%0A%09%09%09if%28this%20instanceof%20XULElement%29%0A%09%09%09%09e.screenY%20+%3D%20bo.height%3B%0A%09%09%7D%0A%09%7D%0A%09if%28%21e%20%7C%7C%20%21%28%22screenX%22%20in%20e%29%29%0A%09%09throw%20new%20Error%28%22%5BToggle%20Restartless%20Add-ons%5D%3A%20Can%27t%20get%20event%20object%22%29%3B%0A%09document.documentElement.appendChild%28mp%29%3B%0A%09mp.addEventListener%28%22popuphidden%22%2C%20function%20destroy%28e%29%20%7B%0A%09%09mp.removeEventListener%28e.type%2C%20destroy%2C%20false%29%3B%0A%09%09setTimeout%28function%28%29%20%7B%0A%09%09%09mp.destroyMenu%28%29%3B%0A%09%09%09mp.parentNode.removeChild%28mp%29%3B%0A%09%09%7D%2C%200%29%3B%0A%09%7D%2C%20false%29%3B%0A%09mp.openPopupAtScreen%28e.screenX%2C%20e.screenY%29%3B%0A%7D%0A%0Afunction%20getRestartlessAddons%28addonTypes%2C%20callback%2C%20context%29%20%7B%0A%09if%28%21%28%22AddonManager%22%20in%20window%29%29%0A%09%09Components.utils.import%28%22resource%3A//gre/modules/AddonManager.jsm%22%29%3B%0A%09AddonManager.getAddonsByTypes%28addonTypes%2C%20function%28addons%29%20%7B%0A%09%09var%20restartless%20%3D%20addons.filter%28function%28addon%29%20%7B%0A%09%09%09var%20ops%20%3D%20addon.operationsRequiringRestart%3B%0A%09%09%09return%20%21addon.appDisabled%0A%09%09%09%09%26%26%20%21%28ops%20%26%20AddonManager.OP_NEEDS_RESTART_ENABLE%20%7C%7C%20ops%20%26%20AddonManager.OP_NEEDS_RESTART_DISABLE%29%3B%0A%09%09%7D%29%3B%0A%09%09callback.call%28context%2C%20restartless%29%3B%0A%09%7D%29%3B%0A%7D%0Afunction%20openAddonOptions%28addon%29%20%7B%0A%09//%20Based%20on%20code%20from%20chrome%3A//mozapps/content/extensions/extensions.js%0A%09//%20Firefox%2021.0a1%20%282013-01-27%29%0A%09Components.utils.import%28%22resource%3A//gre/modules/Services.jsm%22%29%3B%0A%09var%20optionsURL%20%3D%20addon.optionsURL%3B%0A%09if%28%21addon.isActive%20%7C%7C%20%21optionsURL%29%0A%09%09return%20false%3B%0A%09if%28addon.type%20%3D%3D%20%22plugin%22%29%20//%20No%20options%20for%20now%21%0A%09%09return%20false%3B%0A%09if%28addon.optionsType%20%3D%3D%20AddonManager.OPTIONS_TYPE_INLINE%29%0A%09%09openAddonPage%28addon%2C%20true%29%3B%0A%09else%20if%28addon.optionsType%20%3D%3D%20AddonManager.OPTIONS_TYPE_TAB%20%26%26%20%22switchToTabHavingURI%22%20in%20window%29%0A%09%09switchToTabHavingURI%28optionsURL%2C%20true%29%3B%0A%09else%20%7B%0A%09%09let%20windows%20%3D%20Services.wm.getEnumerator%28null%29%3B%0A%09%09while%28windows.hasMoreElements%28%29%29%20%7B%0A%09%09%09let%20win%20%3D%20windows.getNext%28%29%3B%0A%09%09%09if%28win.document.documentURI%20%3D%3D%20optionsURL%29%20%7B%0A%09%09%09%09win.focus%28%29%3B%0A%09%09%09%09return%20true%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09//%20Note%3A%20original%20code%20checks%20browser.preferences.instantApply%20and%20may%20open%20modal%20windows%0A%09%09window.openDialog%28optionsURL%2C%20%22%22%2C%20%22chrome%2Ctitlebar%2Ctoolbar%2Ccenterscreen%2Cdialog%3Dno%22%29%3B%0A%09%7D%0A%09return%20true%3B%0A%7D%0Afunction%20openAddonsManager%28view%29%20%7B%0A%09var%20openAddonsMgr%20%3D%20window.BrowserOpenAddonsMgr%20//%20Firefox%0A%09%09%7C%7C%20window.openAddonsMgr%20//%20Thunderbird%0A%09%09%7C%7C%20window.toEM%3B%20//%20SeaMonkey%0A%09openAddonsMgr%28view%29%3B%0A%7D%0Afunction%20openAddonPage%28addon%2C%20scrollToPreferences%29%20%7B%0A%09scrollToPreferences%20%3D%20scrollToPreferences%20%26%26%20parseFloat%28Services.appinfo.platformVersion%29%20%3E%3D%2012%0A%09%09%3F%20%22/preferences%22%0A%09%09%3A%20%22%22%3B%0A%09openAddonsManager%28%22addons%3A//detail/%22%20+%20encodeURIComponent%28addon.id%29%20+%20scrollToPreferences%29%3B%0A%7D%0A%0Afunction%20hasModifier%28e%29%20%7B%0A%09return%20e.ctrlKey%20%7C%7C%20e.shiftKey%20%7C%7C%20e.altKey%20%7C%7C%20e.metaKey%3B%0A%7D%0A%0Afunction%20addStyle%28%29%20%7B%0A%09if%28addStyle.hasOwnProperty%28%22_style%22%29%29%0A%09%09return%3B%0A%09var%20style%20%3D%20%27%5C%0A%09%09.toggleRestartlessAddons-disabled%20%3E%20.menu-iconic-left%20%7B%5Cn%5C%0A%09%09%09opacity%3A%200.4%3B%5Cn%5C%0A%09%09%7D%5Cn%5C%0A%09%09.toggleRestartlessAddons-disabled%20%3E%20.menu-iconic-text%2C%5Cn%5C%0A%09%09.toggleRestartlessAddons-disabled%20%3E%20.menu-accel-container%20%7B%5Cn%5C%0A%09%09%09opacity%3A%200.5%3B%5Cn%5C%0A%09%09%7D%5Cn%5C%0A%09%09.toggleRestartlessAddons-askToActivate%20%7B%5Cn%5C%0A%09%09%09color%3A%20-moz-nativehyperlinktext%3B%5Cn%5C%0A%09%09%7D%27%3B%0A%09addStyle._style%20%3D%20document.insertBefore%28%0A%09%09document.createProcessingInstruction%28%0A%09%09%09%22xml-stylesheet%22%2C%0A%09%09%09%27href%3D%22%27%20+%20%22data%3Atext/css%2C%22%0A%09%09%09%09+%20encodeURIComponent%28style%29%20+%20%27%22%20type%3D%22text/css%22%27%0A%09%09%29%2C%0A%09%09document.documentElement%0A%09%29%3B%0A%7D%0Afunction%20removeStyle%28%29%20%7B%0A%09if%28%21addStyle.hasOwnProperty%28%22_style%22%29%29%0A%09%09return%3B%0A%09var%20s%20%3D%20addStyle._style%3B%0A%09s.parentNode.removeChild%28s%29%3B%0A%09delete%20addStyle._style%3B%0A%7D%0Afunction%20closeMenus%28node%29%20%7B%0A%09//%20Based%20on%20function%20closeMenus%20from%20chrome%3A//browser/content/utilityOverlay.js%0A%09for%28%3B%20node%20%26%26%20%22tagName%22%20in%20node%3B%20node%20%3D%20node.parentNode%29%20%7B%0A%09%09if%28%0A%09%09%09node.namespaceURI%20%3D%3D%20%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09%09%09%26%26%20%28node.localName%20%3D%3D%20%22menupopup%22%20%7C%7C%20node.localName%20%3D%3D%20%22popup%22%29%0A%09%09%29%0A%09%09%09node.hidePopup%28%29%3B%0A%09%7D%0A%7D%0A%0Afunction%20hasUpdater%28%29%20%7B%0A%09var%20has%20%3D%20checkForAddonsUpdates.toString%28%29.indexOf%28%22Services.jsm%22%29%20%21%3D%20-1%3B%0A%09hasUpdater%20%3D%20function%28%29%20%7B%0A%09%09return%20has%3B%0A%09%7D%3B%0A%09return%20has%3B%0A%7D%0Afunction%20checkForAddonsUpdates%28%29%20%7B%0A//%3D%3D%20Check%20for%20Addons%20Updates%20begin%0A%0A//%3D%3D%20Check%20for%20Addons%20Updates%20end%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%28%21event.target%29%20//%20Button%27s%20hotkey%20pressed%0A%09this.open%20%3D%20true%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%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Исходный код, инициализация: toggleRestartlessAddons.js

Также код можно использовать из других расширений, позволяющих выполнять произвольный код в контексте главного окна приложения, например, из Mouse Gestures.
Дополнительно можно сделать проверку обновлений кликом правой кнопкой мыши по кнопке: надо скопировать код кнопки Check for Addons Updates после «//== Check for Addons Updates begin».

Отредактировано Infocatcher (11-04-2016 00:52:44)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№203-02-2013 00:18:23

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

Тестовая версия, будьте осторожны!

Разрабатываемая версия


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№303-02-2013 21:18:25

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

feature requests:
1. пусть MMB по самой кнопке открывает about:addons.
2. пусть RMB по самой кнопке срабатывает как Check for Addons Updates.

Отредактировано iDev.Pi (03-02-2013 21:55:05)


mzfx

Отсутствует

 

№404-02-2013 00:43:34

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

iDev.Pi пишет

1. пусть MMB по самой кнопке открывает about:addons.

Это можно.

iDev.Pi пишет

2. пусть RMB по самой кнопке срабатывает как Check for Addons Updates.

Мне как-то не очень нравится заменять контекстное меню действием.
И, если честно, не особо хочется пихать все в одну кнопку. Вдобавок код можно запускать жестами мышью, например, там это вообще окажется кучей невостребованного кода. :D


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№504-02-2013 01:12:13

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

Infocatcher пишет

И, если честно, не особо хочется пихать все в одну кнопку. Вдобавок код можно запускать жестами мышью, например, там это вообще окажется кучей невостребованного кода.

А я вот наоборот, хочу поменьше кнопок на панели иметь :)

Infocatcher пишет

Мне как-то не очень нравится заменять контекстное меню действием

Это можно обойти так:
пусть MMB по самой кнопке срабатывает как Check for Addons Updates, а открытие about:addons убрать в меню, открывающееся по LMB.

Добавлено 04-02-2013 01:16:36
И да, а тебе не кажется ли, что лучше было бы отделить включённые дополнения (и плагины) от отключённых? правда так 4 списка получится - это да. Но можно между включёнными и выключенными не ставить разделитель или ставить, а между дополнениями и плагинами - сделать его потолще.

Отредактировано iDev.Pi (04-02-2013 01:16:36)


mzfx

Отсутствует

 

№604-02-2013 01:16:58

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

Infocatcher пишет

Мне как-то не очень нравится заменять контекстное меню действием.

И синхронизировать изменения тоже не очень-то удобно. И забыть можно.
Пока вот так: Allow use checkForAddonsUpdates.js – если скопировать код из checkForAddonsUpdates.js вовнутрь функции checkForAddonsUpdates(), он будет вызываться по клику правой кнопкой мыши.


iDev.Pi пишет

а открытие about:addons убрать в меню, открывающееся по LMB.

А из меню и так можно открыть управление дополнениями, только для конкретного дополнения, но там уже всего один клик до обычного управления пополнениями.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№704-02-2013 02:15:04

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

iDev.Pi пишет

отделить включённые дополнения (и плагины) от отключённых?

Я про это думал. По-моему, так искать проще, когда по алфавиту.
Приделал настройку: Add "separateDisabledAddons" option


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№816-02-2013 21:45:27

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 18.0

Re: [CB]Toggle Restartless Add-ons

Toggle Restartless Add-ons 0.1.1 (2013-02-04)
[+] Клик СКМ или ЛКМ с любым модификатором на самой кнопке – открыть управление дополнениями.
[+] Добавлена возможность использования кода кнопки Check for Addons Updates для проверки обновлений по клику правой кнопкой мыши на самой кнопке – см. описание в коде.
[+] Добавлена настройка «separateDisabledAddons» для возможности вывода сначала включенных дополнений в каждой из категорий.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№902-10-2013 22:15:56

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 24.0

Re: [CB]Toggle Restartless Add-ons

Toggle Restartless Add-ons 0.1.2 (2013-10-02)
[+] Добавлена поддержка click-to-play плагинов (plugins.click_to_play = true) (#15).
[+] Добавлены настройки закрытия меню после клика левой кнопкой мыши (closeMenu и closeMenuClickToPlay).
[+] Добавлена расширенная настройка сортировки (см. примеры для настройки sort).


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1021-02-2014 01:14:34

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 27.0

Re: [CB]Toggle Restartless Add-ons

Toggle Restartless Add-ons 0.1.2.1 (2014-02-21)
[x] Исправлена обработка уязвимых плагинов (их невозможно включить).


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1121-02-2014 09:55:44

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 27.0
Веб-сайт

Re: [CB]Toggle Restartless Add-ons

1. Есть ли возможность вызова настроек для аддонов, у которых есть настройки?
2. Есть ли возможность "задавить" некоторые аддоны, которые не нуждаются в тогглинге (чтобы уменьшить само меню).
3. Пункт 1 был бы актуален не только для рестартлесс аддонов.


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1221-02-2014 11:29:33

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 27.0

Re: [CB]Toggle Restartless Add-ons

difabor пишет

1. Есть ли возможность вызова настроек для аддонов, у которых есть настройки?

Из описания:

В меню:
ЛКМ – включить/выключить дополнение
Shift+ЛКМ – включить/выключить дополнение без закрытия меню
СКМ или ЛКМ с любым модификатором (кроме Shift) – открыть страницу дополнения в управлении дополнениями
ПКМ – открыть настройки дополнения (если есть)

difabor пишет

2. Есть ли возможность "задавить" некоторые аддоны, которые не нуждаются в тогглинге (чтобы уменьшить само меню).

На данный момент – только правкой исходного кода.

Например, так (надо заменить соответствующую функцию в коде):

Выделить код

Код:

function getRestartlessAddons(addonTypes, callback, context) {
    if(!("AddonManager" in window))
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
    var excludeIds = [
        "{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}", // Adblock Plus
        "elemhidehelper@adblockplus.org"
    ];
    var excludeNames = [
        "Shockwave Flash"
    ];
    AddonManager.getAddonsByTypes(addonTypes, function(addons) {
        var restartless = addons.filter(function(addon) {
            var ops = addon.operationsRequiringRestart;
            return !addon.appDisabled
                && excludeIds.indexOf(addon.id) == -1
                && excludeNames.indexOf(addon.name) == -1
                && !(ops & AddonManager.OP_NEEDS_RESTART_ENABLE || ops & AddonManager.OP_NEEDS_RESTART_DISABLE);
        });
        callback.call(context, restartless);
    });
}

difabor пишет

3. Пункт 1 был бы актуален не только для рестартлесс аддонов.

Extension Options Menu?
Поддержка обычных дополнений изначально не планировалась, нужен был только переключатель.
Но, в принципе, в той же функции getRestartlessAddons() можно убрать проверку на необходимость перезапуска – все должно работать, только, конечно, никакой специальной обработки типа предложения сделать перезапуск не будет. И индикация будет показывать не текущую включенность, а ту, что будет после перезапуска.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1321-02-2014 12:38:09

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 27.0
Веб-сайт

Re: [CB]Toggle Restartless Add-ons

1. Спасибо за разъяснение и извините, что сам не разобрался с описанием.
2. Насчёт выборочного задавливания -  в моём понимании - это 100% решение, задавливание делается один раз и можно спокойно - жёстко в коде.
Ещё раз спасибо - в целом :)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1420-01-2016 14:24:55

Xant1k
Участник
 
Группа: Members
Зарегистрирован: 22-10-2011
Сообщений: 48
UA: Chrome 47.0

Re: [CB]Toggle Restartless Add-ons

У меня в ласт ESR версий кнопка показывает только плагины (ставил отсюда https://github.com/Infocatcher/Custom_B … ss_Add-ons)
Как показывать установленные дополнения?

Отсутствует

 

№1520-01-2016 14:58:00

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 43.0

Re: [CB]Toggle Restartless Add-ons

Xant1k
Эээ... выводятся только дополнения, не требующие перезапуска. Такие вообще есть?

Если очень хочется, можно закомментировать в коде проверку:

Выделить код

Код:

function getRestartlessAddons(addonTypes, callback, context) {
    if(!("AddonManager" in window))
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
    AddonManager.getAddonsByTypes(addonTypes, function(addons) {
        var restartless = addons.filter(function(addon) {
            var ops = addon.operationsRequiringRestart;
            return !addon.appDisabled
                //&& !(ops & AddonManager.OP_NEEDS_RESTART_ENABLE || ops & AddonManager.OP_NEEDS_RESTART_DISABLE);
        });
        callback.call(context, restartless);
    });
}

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1620-01-2016 16:27:43

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 2710
UA: Firefox 43.0

Re: [CB]Toggle Restartless Add-ons

Можно исключить из меню все плагины? Их названия вытягивают меню на 2\3 экрана...да и не особо нужно.

Отсутствует

 

№1720-01-2016 20:13:12

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 43.0

Re: [CB]Toggle Restartless Add-ons

oleg.sgh
Можно, в самом начале подправить вот так:

Выделить код

Код:

var options = {
    addonTypes: ["extension"],

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1820-01-2016 20:25:31

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 2710
UA: Firefox 43.0

Re: [CB]Toggle Restartless Add-ons

Infocatcher
На самом видном месте не увидел и не сообразил....
Благодарю.

Отсутствует

 

№1920-01-2016 23:14:27

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 36.0
Веб-сайт

Re: [CB]Toggle Restartless Add-ons

Уважаемый Infocatcher,
у меня есть несколько вопросов касательно Вашего Менеджера-меню.
Только заранее хочу пояснить - это ни в коей мере не пожелания что-то туда добавить или изменить.
Просто я хотел бы сам попытаться что-то модифицировать, но вряд ли самостоятельно мне это удастся...
1. Недавно bunda1 показал мне как организовывать меню в две колонки (по-видимому, так же можно организовать меню и в любое К колонок):

Выделить код

Код:

// Создать двухсекционное меню ...................... 
var popup = addElement("menupopup", {
   position: "after_start",
   oncontextmenu: "return false",
   style: "-moz-appearance: none; border: 1px solid"
}, self);

var mainBox = addElement("hbox", {}, popup);
var leftBox = addElement("vbox", {style: "background-color: rgb(255,255,0);"},  mainBox);     // Левое меню
var rightBox = addElement("vbox", {                 // Правое меню
   style: "background-color: rgb(255,0,0); box-shadow: 1px 0px 2px rgb(204, 214, 234) inset;" // стиль правого меню 241, 245, 251
}, mainBox);

Можно задать счётчик менюитемов и каждый менюитем с №М%К равным 0 помещать в первую колонку, №М%К равным 1 помещать во вторую колонку, и т.д.
В принципе, можно сделать, чтобы сначала менюитемы заполняли бы первую колонку, с некоторого их номера - вторую и т.д.
Но вот где у Вас в коде можно организовать счётчик менюитемов и как указывать в какую колонку его помещать, я не знаю.
Кроме того, потребуется ограничить макс. ширину колонок. Это, наверное, в стиле колонок.
При большом кол-ве расширений и желании видеть не только безрестартные - это было бы хорошим подспорьем.
2. Вы объяснили как выборочно исключать расширения:

Выделить код

Код:

function getRestartlessAddons(addonTypes, callback, context) {
    if(!("AddonManager" in window))
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
    var excludeIds = [
        "{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}", // Adblock Plus
        "elemhidehelper@adblockplus.org"
    ];
    var excludeNames = [
        "Shockwave Flash"
    ];
    AddonManager.getAddonsByTypes(addonTypes, function(addons) {
        var restartless = addons.filter(function(addon) {
            var ops = addon.operationsRequiringRestart;
            return !addon.appDisabled
                && excludeIds.indexOf(addon.id) == -1
                && excludeNames.indexOf(addon.name) == -1
                && !(ops & AddonManager.OP_NEEDS_RESTART_ENABLE || ops & AddonManager.OP_NEEDS_RESTART_DISABLE);
        });
        callback.call(context, restartless);
    });
}

В принципе, если в about:config хранить список таких исключений, то их можно исключать по такому списку.
Надо получить этот список из about:config один раз при старте браузера и это должно работать.
3. Было бы удобно иметь возможность добавлять исключения в такой список из самого меню, например по отпусканию СКМ (или ЛКМ), когда нажатие было левее.
Кстати, использование жестов "влево"/"вправо" на менюитемах может быть удобнее модификаторов
4. Исключённые расширения - это расширения, которые юзер не хочет видеть в меню высшего уровня (чтобы оно выглядело не таким большим)
Но это не значит, что он вообще не хочет иметь к ним доступ.
Поэтому желательно чтобы имелось подменю "Спрятанные" и чтобы оно открывало список спрятанных расширений/плагинов
Возвращение расширения из этого списка в главное меню может быть по отпусканию СКМ/ЛКМ когда нажатие было правее
5. Число спрятанных расширений может быть большим и возникнет необходимость в нескольких списках спрятанных расширений.
Для этого нужен механизм создания списка где по промпту можно задать его название.
В принципе если есть хотя бы одно подменю, кликами на него самого можно и формировать подобный промпт для создания/добавления другого списка.
Другим кликом можно удалять подменю. Если оно не пустое, все расширения из такого списка перейдут в главное меню.
6. В принципе пп. 2 и 3 я бы мог (надеюсь) реализовать самостоятельно. А с остальными - напряжёнка...


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№2021-01-2016 15:26:15

Xant1k
Участник
 
Группа: Members
Зарегистрирован: 22-10-2011
Сообщений: 48
UA: Chrome 47.0

Re: [CB]Toggle Restartless Add-ons

Infocatcher пишет

Xant1k
Эээ... выводятся только дополнения, не требующие перезапуска. Такие вообще есть?

Если очень хочется, можно закомментировать в коде проверку:

Выделить код

Код:

function getRestartlessAddons(addonTypes, callback, context) {
    if(!("AddonManager" in window))
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
    AddonManager.getAddonsByTypes(addonTypes, function(addons) {
        var restartless = addons.filter(function(addon) {
            var ops = addon.operationsRequiringRestart;
            return !addon.appDisabled
                //&& !(ops & AddonManager.OP_NEEDS_RESTART_ENABLE || ops & AddonManager.OP_NEEDS_RESTART_DISABLE);
        });
        callback.call(context, restartless);
    });
}

Ааа... вот как получается. У меня то стоят как раз таки которые требуют.

Спасибо, работает!

Отредактировано Xant1k (21-01-2016 15:27:11)

Отсутствует

 

№2122-01-2016 10:04:36

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 43.0

Re: [CB]Toggle Restartless Add-ons

difabor пишет

1. ... организовать меню и в любое К колонок

Можно, что-то такое будет:

Выделить код

Код:

<hbox>
    <vbox>
        <menuitem label="1" />
        <menuitem label="2" />
    </vbox>
    <vbox>
        <menuitem label="3" />
        <menuitem label="4" />
    </vbox>
    <vbox>...</vbox>
    ...
</hbox>

Только, скорее всего, не будет работать навигация по меню с клавиатуры.

difabor пишет

Но вот где у Вас в коде можно организовать счётчик менюитемов и как указывать в какую колонку его помещать, я не знаю.

Это просто, надо искать в коде создание пунктов меню, по "menuitem" находится одно такое место.

Выделить код

Код:

mp.updateMenu = function() {
    ...
    getRestartlessAddons(options.addonTypes, function(addons) { // Получение списка дополнений
        // Создание "буфера" для небольшого увеличения производительности
        // https://developer.mozilla.org/en-US/docs/Web/API/Document/createDocumentFragment
        var df = document.createDocumentFragment();
        ...
        // Тут можно объявить какие-нибудь счетчики
        addons.sort(function(a, b) { // Сортировка списка дополнений
            var ka = key(a);
            var kb = key(b);
            return ka == kb ? 0 : ka < kb ? -1 : 1;
        }).forEach(function(addon) { // Перебор всех элементов списка
            ...
            var mi = document.createElement("menuitem"); // Создается новый пункт меню
            ...
            df.appendChild(mi); // Созданный пункт меню добавляется в "буфер"
        });
        mp.textContent = ""; // Очистка меню
        mp.appendChild(df); // Меню заполняется содержимым "буфера"
difabor пишет

В принципе, если в about:config хранить список таких исключений, то их можно исключать по такому списку.

Можно, что-то такое:

Выделить код

Код:

var excludeIds = getRestartlessAddons._excludeIds || (
        getRestartlessAddons._excludeIds = Services.prefs.getCharPref("extensions.custombuttons.button.toggleRestartlessAddons.excludeIds")
            .split("|")
    );
    var excludeNames = getRestartlessAddons._excludeNames || (
        getRestartlessAddons._excludeNames = Services.prefs.getCharPref("extensions.custombuttons.button.toggleRestartlessAddons.excludeNames")
            .split("|")
    );

Только Services.prefs.getCharPref() не понимает юникод и выпадет с ошибкой, если настройка не существует.

(на остальное попозже отвечу)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2227-01-2016 11:16:29

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 44.0

Re: [CB]Toggle Restartless Add-ons

difabor пишет

3. Было бы удобно иметь возможность добавлять исключения в такой список из самого меню, например по отпусканию СКМ (или ЛКМ), когда нажатие было левее.

Это все реализуемо, просто тогда уж интуитивнее сделать контекстное меню.

difabor пишет

Кстати, использование жестов "влево"/"вправо" на менюитемах может быть удобнее модификаторов

Ну, если есть желание писать свой велосипед для жестов...
Тут скорее бы какое-нибудь расширение, чтобы один раз настроить в нем, а во всех прочих местах просто добавлять поддержку.

difabor пишет

4. Исключённые расширения - это расширения, которые юзер не хочет видеть в меню высшего уровня (чтобы оно выглядело не таким большим)
Но это не значит, что он вообще не хочет иметь к ним доступ.
Поэтому желательно чтобы имелось подменю "Спрятанные" и чтобы оно открывало список спрятанных расширений/плагинов
Возвращение расширения из этого списка в главное меню может быть по отпусканию СКМ/ЛКМ когда нажатие было правее

Тут на самом деле сложнее всего сделать интерфейс настроек.

Вот упрощенный пример с вложенным меню. Только там если скрыть все дополнения одного типа, неправильно выведет разделитель.

Выделить код

Код:

--- toggleRestartlessAddons.js
+++ toggleRestartlessAddons_submenu.js
@@ -42,7 +42,7 @@
 };
 
 var mp = document.createElement("menupopup");
-mp.setAttribute("onpopupshowing", "this.updateMenu();");
+mp.setAttribute("onpopupshowing", "if(event.target == this) this.updateMenu();");
 mp.setAttribute("oncommand", "this.handleEvent(event);");
 mp.setAttribute("onmousedown", "if(event.button == 0) this.handleEvent(event);");
 mp.setAttribute("onclick", "if(event.button > 0) this.handleEvent(event);");
@@ -75,6 +75,20 @@
                 + "\n" + sortPosition(addon)
                 + "\n" + addon.name.toLowerCase();
         }
+        var collapseNames = [
+            "Adblock Plus"
+        ];
+        var menu;
+        function more(mi) {
+            menu = document.createElement("menu");
+            menu.setAttribute("label", "More…");
+            var mp = document.createElement("menupopup");
+            menu.appendChild(mp);
+            more = function(mi) {
+                mp.appendChild(mi);
+            };
+            more(mi);
+        }
         addons.sort(function(a, b) {
             var ka = key(a);
             var kb = key(b);
@@ -101,8 +115,13 @@
             desc && mi.setAttribute("tooltiptext", desc);
             setDisabled(mi, addon.userDisabled);
             mi._cbAddon = addon;
-            df.appendChild(mi);
+            if(collapseNames.indexOf(addon.name) != -1)
+                more(mi);
+            else
+                df.appendChild(mi);
         });
+        if(menu)
+            df.appendChild(menu);
         mp.textContent = "";
         mp.appendChild(df);
     });
difabor пишет

5. Число спрятанных расширений может быть большим и возникнет необходимость в нескольких списках спрятанных расширений.

Я не вполне уверен, что получится найти такое количество полезных расширений, чтобы эти все доработки оказались оправданы. :)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2327-01-2016 21:57:04

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 36.0
Веб-сайт

Re: [CB]Toggle Restartless Add-ons

Infocatcher пишет

Вот упрощенный пример с вложенным меню. Только там если скрыть все дополнения одного типа, неправильно выведет разделитель.

Выделить код

Код:

--- toggleRestartlessAddons.js
+++ toggleRestartlessAddons_submenu.js
@@ -42,7 +42,7 @@
 };
 
 var mp = document.createElement("menupopup");
-mp.setAttribute("onpopupshowing", "this.updateMenu();");
+mp.setAttribute("onpopupshowing", "if(event.target == this) this.updateMenu();");
 mp.setAttribute("oncommand", "this.handleEvent(event);");
 mp.setAttribute("onmousedown", "if(event.button == 0) this.handleEvent(event);");
 mp.setAttribute("onclick", "if(event.button > 0) this.handleEvent(event);");
@@ -75,6 +75,20 @@
                 + "\n" + sortPosition(addon)
                 + "\n" + addon.name.toLowerCase();
         }
+        var collapseNames = [
+            "Adblock Plus"
+        ];
+        var menu;
+        function more(mi) {
+            menu = document.createElement("menu");
+            menu.setAttribute("label", "More…");
+            var mp = document.createElement("menupopup");
+            menu.appendChild(mp);
+            more = function(mi) {
+                mp.appendChild(mi);
+            };
+            more(mi);
+        }
         addons.sort(function(a, b) {
             var ka = key(a);
             var kb = key(b);
@@ -101,8 +115,13 @@
             desc && mi.setAttribute("tooltiptext", desc);
             setDisabled(mi, addon.userDisabled);
             mi._cbAddon = addon;
-            df.appendChild(mi);
+            if(collapseNames.indexOf(addon.name) != -1)
+                more(mi);
+            else
+                df.appendChild(mi);
         });
+        if(menu)
+            df.appendChild(menu);
         mp.textContent = "";
         mp.appendChild(df);
     });

Спасибо большое! Буду "переваривать".
По ходу у меня возникло пару имхо простых вопросов:
1.Приведённый ниже кусочек - это результат diff'a двух файлов, или этим можно как-то пользоваться в самой кнопке?

Выделить код

Код:

--- toggleRestartlessAddons.js
+++ toggleRestartlessAddons_submenu.js
@@ -42,7 +42,7 @@
... и т.д.

2.Я совсем не понял нотацию в приведённом Вами коде:

Infocatcher пишет
difabor пишет

... организовать меню и в любое К колонок

Можно, что-то такое будет:

Выделить код

Код:

<hbox>
    <vbox>
        <menuitem label="1" />
        <menuitem label="2" />
    </vbox>
    <vbox>
        <menuitem label="3" />
        <menuitem label="4" />
    </vbox>
    <vbox>...</vbox>
    ...
</hbox>

Только, скорее всего, не будет работать навигация по меню с клавиатуры.

Где этот код писать?
Что такое "1", "2" и т.д.?
Что должно быть вместо "..." в <vbox>...</vbox>
Заранее извините, если вопросы выглядят идиотскими :(


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№2428-01-2016 00:07:28

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4323
UA: Firefox 44.0

Re: [CB]Toggle Restartless Add-ons

difabor пишет

1.Приведённый ниже кусочек - это результат diff'a двух файлов, или этим можно как-то пользоваться в самой кнопке?

Это diff, да.

difabor пишет

Где этот код писать?
Что такое "1", "2" и т.д.?
Что должно быть вместо "..." в <vbox>...</vbox>

Это не совсем код, это результат (можно наглядно увидеть в DOM Inspector'е).
Но можно и превратить строку с подобной разметкой в DOM-дерево примерно так:
https://github.com/Infocatcher/Custom_B … ks.js#L552
https://github.com/Infocatcher/Custom_B … 2318-L2321

label="1" и прочее – просто для примера, это название пункта меню.
<vbox>...</vbox> добавляет очередную вертикальную колонку, в которую можно добавлять menuitem'ы.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2528-01-2016 01:48:11

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 539
UA: Firefox 36.0
Веб-сайт

Re: [CB]Toggle Restartless Add-ons

Спасибо! Понял :) Извините за тупость!
Есть ещё два вопроса..
1. Как сортировать аддоны не по имени, а по времени последнего обновления?
2. Как (болдом) выделять аддоны, имеющие настройки от не имеющих и (курсивом)  не Restartless от Restartless?
Как я понимаю, что-то надо добавить в

Выделить код

Код:

function addStyle() {
    if(addStyle.hasOwnProperty("_style"))
        return;
    var style = '\
        .toggleRestartlessAddons-disabled > .menu-iconic-left {\n\
            opacity: 0.4;\n\
        }\n\
        .toggleRestartlessAddons-disabled > .menu-iconic-text,\n\
        .toggleRestartlessAddons-disabled > .menu-accel-container {\n\
            opacity: 0.5;\n\
        }\n\
        .toggleRestartlessAddons-askToActivate {\n\
            color: -moz-nativehyperlinktext;\n\
        }';
    addStyle._style = document.insertBefore(
        document.createProcessingInstruction(
            "xml-stylesheet",
            'href="' + "data:text/css,"
                + encodeURIComponent(style) + '" type="text/css"'
        ),
        document.documentElement
    );
}

Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

Board footer

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