Dumby
И еще вопросик. Есть кнопка About:
// Настройка функций кликов мыши(Mouse Click settings) ....................................................... this.onclick = function(e) { if ( e.button == 0 ) gBrowser. selectedTab = gBrowser. addTrustedTab("about:config"); if ( e.button == 1 ) { // запомнить текст из буфера обмена и скопировать текст на странице .... var clip = gClipboard.read(); window.content.focus(); goDoCommand("cmd_copy"); gBrowser.selectedTab = gBrowser.addTrustedTab( 'about:config' ); // oбработчик ждет пока откроется "about:config", вставит текст из буфера обмена и удаляет себя .... gBrowser.addEventListener("pageshow", function(e) { this.removeEventListener("pageshow", arguments.callee, true); content.document.getElementById("textbox").value = gClipboard.read(); content.document.getElementById("textbox").doCommand(); if ( clip ) gClipboard.write( clip ); // вернуть текст в буфер обмена }, true); } }; // Создать меню .............................................................................................. this.ss = [ { label:"Все about:", value: 'about:about'}, { label:"О плагинах", value: 'about:plugins'}, { label:"Новая вкладка", value: 'about:newtab'}, { label:"Настройки как таб", value: 'about:preferences'}, { label:"Информация о кэше", value: 'about:cache'}, { label:"Восстановление сессии", value: 'about:sessionrestore'}, { label:"Управление разрешениями", value: 'about:permissions'}, { label:"Информация для решения проблем", value: 'about:support'}, { label:"Показать исплъзование памяти подробно", value: 'about:memory'} ]; this.mObj = custombuttons.getCbContextObj(this); this.init = function(x) { x.mObj.setSub(); var nItem = {}, mItem = {}; document.getElementById(CB2const.sCBCtxtMenu).setAttribute("oncommand", "event.stopPropagation()"); for ( var i in x.ss ) { nItem = new x.mObj.getItem(); nItem.label = x.ss[i].label; if ( nItem.label == "separator" ) var nItem = document.createXULElement("menuseparator"); var mItem = x.mObj.insertBefore(nItem, x.mObj.oMenu.lastChild); mItem.setAttribute('onclick', 'gBrowser.selectedTab = gBrowser.addTrustedTab("' + x.ss[i].value + '")'); }; x.mObj.getItem(); nItem = x.mObj.getItem(); this.separator = x.mObj.insertBefore( nItem , x.mObj.oMenu.lastChild); }; this.init(this); // Подсказка кнопки ............................................................................................ this.tooltipText = "Л: Открыть 'about:config'\nС: Открыть 'about:config' с настройкой ( выделенной или из буфера )\nП: Показать все about:";
Ну и до кучи кн. Дв. клик по панели вкладок (закрывает все вкладки)
((trg, param, tab, lst = { handleEvent(e) { if (e.button || e.ctrlKey || e.shiftKey || e.altKey) return; this[e.type](e); }, click: e => e.detail == 2 && tab && e.stopPropagation(), mouseup(e) { if (e.detail < 2) return tab = e.target; if (tab.nodeName == "tab" && (tab = e.target == tab)) setTimeout(this.closeTabs, 50, gBrowser.selectedTab); }, closeTabs(tab) { var hbuTabs = []; for(var t of gBrowser.visibleTabs.reverse()) if (//!t.pinned && t != tab) gBrowser._hasBeforeUnload(t) ? hbuTabs.push(t) : gBrowser.removeTab(t, param); for(t of hbuTabs) gBrowser.removeTab(t, param); } }) => ["mouseup", "click"].forEach(type => addEventListener(type, lst, true, trg)))( gBrowser.tabs[0].boxObject.parentBox, {animate: false} );
Отредактировано Garalf (03-12-2019 20:26:16)
Отсутствует
возможно сделать что бы кнопка Bbcode работала в многопроцессорном режиме ?
Ну как, там прямое действие. Берём код, и переставляем
из пустого в порожнее. (не под Fission, разумеется)
То есть, меняем this.handleClick как-нибудь типа так
this.handleClick = e => { var node = e.target; if (!node.matches("popupset :scope")) return; var v1 = node.getAttribute("value1"); var v2 = node.getAttribute("value2"); if (v2) v2 = "=" + v2.replace("%clipboard%", gClipboard.read()); var bb1 = "[" + v1 + (v2 || "") + "]"; var bb2 = "[/" + v1 + "]"; var code = `((bb1, bb2, move) => { var box = Components.classes["@mozilla.org/focus-manager;1"] .getService(Components.interfaces.nsIFocusManager) .getFocusedElementForWindow(content, true, {}); var ed = box && box.editor; if (!(ed && ed instanceof Components.interfaces.nsIEditor)) return; var txt = box.value; var s = box.selectionStart; var e = box.selectionEnd; var bef = txt.substring(0, s); var mid = txt.substring(s, e); var aft = txt.substring(e); var ins = bb1.replace(/%copy%|%move%/, mid) + (move ? "" : mid) + bb2; var val = bef + ins + aft; box.value = val; box.selectionStart = s; box.selectionEnd = s + ins.length; // box.focus(); })('${bb1}', '${bb2}', ${v2 == "=%move%"});`; gBrowser.selectedBrowser.messageManager.loadFrameScript( "data:," + encodeURIComponent(code), false ); }
В 71 перестала работать вставка параметра выделенного или из буфера по клику средней клавиши в about:config
Ну и если есть возможность, чтобы работала и в многопроцессорном режиме.
Так подойдёт?
/* if ( e.button == 1 ) { // запомнить текст из буфера обмена и скопировать текст на странице .... var clip = gClipboard.read(); window.content.focus(); goDoCommand("cmd_copy"); gBrowser.selectedTab = gBrowser.addTrustedTab( 'about:config' ); // oбработчик ждет пока откроется "about:config", вставит текст из буфера обмена и удаляет себя .... gBrowser.addEventListener("pageshow", function(e) { this.removeEventListener("pageshow", arguments.callee, true); content.document.getElementById("textbox").value = gClipboard.read(); content.document.getElementById("textbox").doCommand(); if ( clip ) gClipboard.write( clip ); // вернуть текст в буфер обмена }, true); } */ else if (e.button == 1) { var clip = gClipboard.read(); gBrowser.selectedBrowser.messageManager.loadFrameScript('data:,docShell.doCommand("cmd_copy")', false); var br = (gBrowser.selectedTab = gBrowser.addTrustedTab("about:config")).linkedBrowser; var insert = () => { br.contentDocument.getElementById("about-config-search") .editor.paste(Ci.nsISelectionController.SELECTION_NORMAL); clip && gClipboard.write(clip); } br.addEventListener("pageshow", () => setTimeout(insert, 200), {once: true}); }
Отсутствует
Ну как, там прямое действие. Берём код, и переставляем
из пустого в порожнее. (не под Fission, разумеется)
То есть, меняем this.handleClick как-нибудь типа так
скрытый текст
Чёто в CB 0.0.7.0.0.7 не работает...
Win7
Отсутствует
Dumby
Это не работает....Там много чего не работает, но это...
(selectors => addEventListener("dblclick", e => {
if (
e.button || e.ctrlKey || e.shiftKey || e.altKey
|| !e.originalTarget.matches(selectors)
)
return;
var hbuTabs = [], param = {animate: false};
gBrowser.selectedTab = gBrowser.tabs[0];
for(var tab of gBrowser.visibleTabs.reverse())
//if (tab.pinned) break; else
gBrowser._hasBeforeUnload(tab)
? hbuTabs.push(tab)
: gBrowser.removeTab(tab, param);
for(tab of hbuTabs)
gBrowser.removeTab(tab, param);
}, false, document.getElementById("TabsToolbar") || 1))("" + [
"#tabbrowser-tabs [class*=scrollbox]",
"toolbarspring",
"#TabsToolbar",
]);
Отсутствует
не
У вас не работает. У меня работает.
STR нет. Цитат из консоли нет.
Самостоятельных попыток разобраться нет.
Что я могу поделать? Ничего. Премного изиняюсь, но увы.
Это не работает
А если так?
/* if ( e.button || e.ctrlKey || e.shiftKey || e.altKey || !e.originalTarget.matches(selectors) ) */ if (e.button || e.ctrlKey || e.shiftKey || e.altKey || !( e.target.className == "tabbrowser-arrowscrollbox" || e.originalTarget.matches(selectors) ))
Отсутствует
Dumby
Круто...А, кто это писал? Тоже того...Доп пункты в about;addons
//Добавление на вкладке дополнения в меню расширений дополнительных пунктов (function(){ var iconURL = ""; if (window.AM_Helper) { window.AM_Helper.uninit(); delete window.AM_Helper; } Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/AddonManager.jsm"); window.AM_Helper = { init: function() { document.addEventListener("DOMContentLoaded", this, false); this.platformVersion = parseFloat(Services.appinfo.platformVersion); }, uninit: function() { document.removeEventListener("DOMContentLoaded", this, false); }, handleEvent: function(event){ switch(event.type){ case "DOMContentLoaded": var doc = event.target; var win = doc.defaultView; if (["about:addons","chrome://mozapps/content/extensions/extensions.xul"].indexOf(doc.URL) == -1) return; this.addPopupMenu(doc); win.AM_Helper = AM_Helper; this.win = win; var observer = new MutationObserver(function(e) { e = e[e.length-1]; if(e.attributeName == "loading") { var doc = e.target.ownerDocument; } }); observer.observe(doc.getElementById("detail-view"), {attributes: true}); break; case "popupshowing": this.getAddon(this.win.document.popupNode.value, this.setItemsAttributes, event); break; } }, //Создаем меню addPopupMenu: function(doc) { var mainicon2="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAwAAAP8AAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAD/AAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAA/wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAP8AAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAAAAAAD/AAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAA8wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAPAAAAD/AAAA/wAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPAAAAAAAAAAAAAAAHsAAAD/AAAAkAAAAAAAAADwAAAA/wAAAP8AAADwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAAAAAAIQAAAD/AAAAjQAAAAAAAAB1AAAA/wAAAP8AAAD/AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAIoAAAD/AAAAigAAAAAAAABpAAAAAAAAAAAAAAB7AAAA/wAAAIcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAigAAAAAAAAB7AAAA8AAAAAAAAACEAAAA/wAAAIcAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAACBAAAA/wAAAPAAAACKAAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIQAAAAAAAAAAAAAAAAAAAAAAB8AAAAfAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAxAAAAIgAAAAWAAAAJEAAAEDAAD+BwAA+A8AAA=="; var ins = doc.getElementById("menuitem_uninstallItem"); if (!ins) return; ins = ins.nextSibling; var popup = ins.parentNode; var menuitem = $C("menuseparator", { id: "AM-separator-1" }); popup.insertBefore(menuitem, ins); menuitem = $C("menuitem", { id: "AM-browse-dir", label: "Папка установки", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.browseDir);" }); popup.insertBefore(menuitem, ins); menuitem = $C("menuitem", { id: "AM-browse-Folder", label: "Файл установки", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.Folder);" }); popup.insertBefore(menuitem, ins); menuitem = $C("menuitem", { id: "AM-open-url", label: "Страница на AMO", tooltiptext: null, oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.goAMO);" }); popup.insertBefore(menuitem, ins); menuitem = $C("menuitem", { id: "AM-browse-support", label: "Страница поддержки", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.support);" }); popup.insertBefore(menuitem, ins); menuitem = $C("menuitem", { id: "AM-browse-goHome", label: "Домашняя страница", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.goHome);" }); popup.insertBefore(menuitem, ins); var menu = $C("menu", { id: "AM-menu", class: "menu-iconic", image: mainicon2, label: "Копировать", }); popup.insertBefore(menu, ins); var menuPopup = $C("menupopup", { id: "AM-menupopup", }); menu.appendChild(menuPopup); menuitem = $C("menuitem", { id: "AM-copy-name", label: "Копировать имя", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.copyName);" }); menuPopup.appendChild(menuitem); menuitem = $C("menuitem", { id: "AM-copy-version", label: "Копировать версию", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.copyVersion);" }); menuPopup.appendChild(menuitem); menuitem = $C("menuitem", { id: "AM-copy-NameVersion", label: "Копировать имя и версию", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.copyNameVersion);" }); menuPopup.appendChild(menuitem); menuitem = $C("menuitem", { id: "AM-copy-id", label: "Копировать id", oncommand: "AM_Helper.getAddon(AM_Helper.getPopupNode(this).value, AM_Helper.copyID);" }); menuPopup.appendChild(menuitem); popup.addEventListener("popupshowing", this, true); }, //Указываем где и когда показывать элементы меню setItemsAttributes: function(aAddon, event) { var popup = event.target; var doc = popup.ownerDocument; var isExtension = (aAddon.type == "extension"), isTheme = (aAddon.type == "theme"), isPlugin = (aAddon.type == "plugin"), isService = (aAddon.type == "service"), isCustomButton = (aAddon.type == "custombuttons"), menuitem ; menuitem = doc.getElementById("AM-browse-dir"); menuitem.hidden = isService || isTheme || isCustomButton; menuitem = doc.getElementById("AM-browse-Folder"); menuitem.hidden = isService || isTheme || isCustomButton || isPlugin; menuitem = doc.getElementById("AM-copy-name"); menuitem.tooltipText = aAddon.name; menuitem = doc.getElementById("AM-copy-version"); menuitem.tooltipText = aAddon.version; menuitem.hidden = isCustomButton || isTheme; menuitem = doc.getElementById("AM-copy-NameVersion"); menuitem.tooltipText = aAddon.name + " " + aAddon.version; menuitem.hidden = isCustomButton || isTheme; menuitem = doc.getElementById("AM-copy-id"); menuitem.tooltipText = "ID: " + aAddon.id; menuitem = doc.getElementById("AM-open-url"); var amoURL = aAddon.reviewURL ? aAddon.reviewURL.replace(/\/reviews\//, "/") : null; menuitem.tooltipText = amoURL; menuitem.hidden = !amoURL || /addons.mozilla.org/.test(aAddon.homepageURL); menuitem = doc.getElementById("AM-browse-support"); menuitem.tooltipText = aAddon.supportURL; menuitem.hidden = !aAddon.supportURL; menuitem = doc.getElementById("AM-browse-goHome"); menuitem.tooltipText = aAddon.homepageURL; menuitem.hidden = !aAddon.homepageURL; }, getPopupNode: function (aNode) { var doc = aNode.ownerDocument; return "triggerNode" in aNode.parentNode ? aNode.parentNode.triggerNode : doc.popupNode; }, getAddon: function (aId, aCallback, aEvent) { var self = this; if (this.win.gDetailView._addon) { aCallback.apply(this, [this.win.gDetailView._addon, aEvent]); return; } (self.platformVersion < 61.0? new Promise((resolve, reject) => AddonManager.getAllAddons(addons => resolve(addons))): AddonManager.getAllAddons() ).then(addons => { for (var i = 0; i < addons.length; i++) { if (addons[i].id == aId) { aCallback.apply(self, [addons[i], aEvent]); return; } } }); }, //Открыть папку установки browseDir: function (aAddon) { switch (aAddon.type) { case "plugin": var pathes = aAddon.pluginFullpath; for (var i = 0; i < pathes.length; i++) { this.revealPath(pathes[i]); } return; case "userchromejs": var file = aAddon._script.file; if (file.exists()) file.reveal(); return; } // addon var gecko = parseInt(Services.appinfo.platformVersion); var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile", "initWithPath"); var dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.append("extensions"); dir.append(aAddon.id); var fileOrDir = dir.path + (dir.exists() ? "" : ".xpi"); try { (new nsLocalFile(fileOrDir)).reveal(); } catch (ex) { var addonDir = /.xpi$/.test(fileOrDir) ? dir.parent : dir; try { if (addonDir.exists()) { addonDir.launch(); } } catch (ex) { var uri = Services.io.newFileURI(addonDir); var protSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"]. getService(Ci.nsIExternalProtocolService); protSvc.loadUrl(uri); } } }, //Копировать имя copyName: function (aAddon) { this.copyToClipboard(aAddon.name); }, //Копировать ID copyID: function (aAddon) { this.copyToClipboard("ID: " + aAddon.id); }, //Копировать версию copyVersion: function (aAddon) { this.copyToClipboard(aAddon.version); }, //Копировать имя и версию copyNameVersion: function (aAddon) { this.copyToClipboard(aAddon.name + " " + aAddon.version); }, //Открыть файл установки Folder: function (aAddon) { var gecko = parseInt(Services.appinfo.platformVersion); var nsLocalFile = Components.Constructor("@mozilla.org/file/local;1", (gecko >= 14) ? "nsIFile" : "nsILocalFile", "initWithPath"); var dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.append('extensions'); dir.append(aAddon.id); if ( dir.exists() ) dir.launch(); var file = Components.classes['@mozilla.org/file/directory_service;1'] .getService(Components.interfaces.nsIProperties) .get('ProfD', Components.interfaces.nsIFile); file.append('extensions'); file.append( aAddon.id + '.xpi' ) if ( file.exists() ) file.launch(); return; }, //Страница на АМО goAMO: function (aAddon) { var sourceTracker = "/?src=external-Add-ons_Manager_Context_Menu-extension"; if (aAddon.reviewURL) { var amoURL = aAddon.reviewURL.replace(/\/reviews\//, "/") .replace(/\/(firefox|seamonkey|thunderbird|android)/, "") .replace(/\/\?src\=api/, sourceTracker); } if (/personas.mozilla.org$/.test(aAddon.id)) { amoURL = "https://addons.mozilla.org/addon/" + aAddon.id.match(/\d+/) + sourceTracker; } openURL(amoURL); }, //Домашняя страница goHome: function (aAddon) { var url = aAddon.homepageURL; if (!url) { if (aAddon.reviewURL) { url = aAddon.reviewURL.replace(/\/reviews\/.*$/, "/"); } else { url = "https://addons.mozilla.org/search/?q=" + encodeURIComponent(aAddon.name); } } openURL(url); }, //Страница поддержки support: function(aAddon) { openURL(aAddon.supportURL); }, //Вспомогательные функции get getPath() { var url = this.win.gViewController.viewObjects.detail._addon; if (!url) return false; return url.pluginFullpath || false; }, revealPath: function(path){ var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); file.initWithPath(path); if(file.exists()) file.reveal(); }, copyToClipboard: function (aString) { Cc["@mozilla.org/widget/clipboardhelper;1"]. getService(Ci.nsIClipboardHelper).copyString(aString); } }; AM_Helper.init(); function $C(name, attr) { var el = document.createXULElement(name); if (attr) Object.keys(attr).forEach(function(n){ el.setAttribute(n, attr[n])}); return el; } })(); ((id, g, iconizer) => addDestructor(r => r[5] == "e" && id in g && g[id].destroy()) + addEventListener("shown", { //------------------------------------------------------------------ "Копировать имя_i": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==", "Копировать имя"(addon, hideOn) { if (hideOn) return false; gClipboard.write(addon.name); }, //------------------------------------------------------------------ "Копировать ID_i": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AMgA/wDIAP8AyAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==", "Копировать ID"(addon, hideOn) { if (hideOn) return false; gClipboard.write(addon.id); }, //------------------------------------------------------------------ "Копировать версию_i": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==", "Копировать версию"(addon, hideOn) { if (hideOn) return ["custombuttons"]; gClipboard.write(addon.version); }, //------------------------------------------------------------------ "Домашняя страница"(addon, hideOn) { if (hideOn) return !addon.homepageURL; alert(addon.homepageURL); }, //------------------------------------------------------------------ url: "chrome://mozapps/content/extensions/aboutaddons.html", handleEvent(e) { if (e.target.baseURI != this.url) return; var item = this.getItem(e.target.ownerDocument); var addon = item.addon = e.target.closest("addon-card").addon; for(var child of item.children) { var res = this[child.textContent](addon, true); child.hidden = Array.isArray(res) ? res.includes(addon.type) : res; } e.target.contains(item) || requestAnimationFrame( () => e.target.prepend(item) ); }, click(e) { e.stopPropagation(); iconizer.item.parentNode.hide(); this[e.target.textContent](iconizer.item.addon); }, getItem(doc) { if (iconizer.item) { if (iconizer.item.ownerDocument == doc) return iconizer.item; iconizer.handleEvent(); } var item = doc.createElement("div"); item.id = id; for(var lab of this.labels) item.appendChild( doc.createElement("panel-item") ).append(lab); item.onclick = this.click; doc.ownerGlobal.addEventListener("unload", iconizer); return iconizer.item = item; }, get labels() { delete this.labels; this.click = this.click.bind(this); if (id in g) return this.labels = (iconizer = g[id]).labs; g[id] = iconizer; var css = "", ind = 0, arr = []; var push = (ind, icon) => { var chromeImg = `chrome://custombuttons/content/${id + ind}`; arr.push(["override", chromeImg, icon]); return chromeImg; } var labs = iconizer.labs = Object.keys(this).filter(key => { var res = String(this[key]).startsWith('"'); if (!res) return false; ind++; var icon = this[key + "_i"]; if (icon) css += `\n\t#${ id } > panel-item:nth-child(${ind}) {\n\t\t--icon: url(${ push(ind, icon) }) !important;\n\t}`; return true; }); var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup); var mUri = Services.io.getProtocolHandler("resource").getSubstitution("custombuttons-modules"); iconizer.iconHelper = ams.registerChrome(mUri, arr); var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); var md = "@-moz-document url(chrome://mozapps/content/extensions/aboutaddons.html) {"; var uri = Services.io.newURI("data:text/css;charset=utf-8," + encodeURIComponent(md + css + "\n}")); var args = [uri, sss.USER_SHEET]; sss.loadAndRegisterSheet(...args); iconizer.handleEvent = function() { if (!this.item) return; this.item.ownerGlobal.removeEventListener("unload", this); this.item.remove(); this.item = null; } iconizer.destroy = function() { delete g[id]; this.handleEvent(); sss.unregisterSheet(...args); this.iconHelper.destruct(); } return this.labels = labs; } }, true, gBrowser.tabpanels || 1))("CBAddonsMenuExt", Cu.import("resource://gre/modules/Services.jsm", {}), {});
Отредактировано solombala (04-12-2019 17:04:39)
Отсутствует
У вас не работает. У меня работает.
Взял эту кнопку: https://forum.mozilla-russia.org/viewto … 10#p775310, затем заменил этот код:
this.handleClick = function(evt) { var node = evt.target; if (node.nodeName != "button" || node.parentNode == hbox) return; var v1 = node.getAttribute("value1"); var v2 = node.getAttribute("value2"); if (v2) v2 = "=" + v2.replace("%clipboard%", gClipboard.read()); var bb1 = "[" + v1 + (v2 || "") + "]"; var bb2 = "[/" + v1 + "]"; var box = content.document.activeElement; var txt = box.value; var s = box.selectionStart; var e = box.selectionEnd; var bef = txt.substring(0, s); var mid = txt.substring(s, e); var aft = txt.substring(e); var ins = bb1.replace(/%copy%|%move%/, mid) + (v2 == "=%move%" ? "" : mid) + bb2; var val = bef + ins + aft; box.value = val; box.selectionStart = s; box.selectionEnd = s + ins.length; // box.focus(); }
Отредактировано kokoss (04-12-2019 18:42:38)
Win7
Отсутствует
Зашел по ссылке http://custombuttons.mozdev.org/installation.html
Последняя версия от 2011 на мой свежий Firefox не ставится.
А тут люди вроде используют, обсуждают.
Люди добрые! Как мне получить работающую версию этого замечательного плагина?
Отредактировано Eugene20212021 (04-12-2019 21:57:53)
Отсутствует
Dumby
Нельзя глянуть? FindBar в 71 блекнет в ini , приходится в код вставлять и жмакать пару раз , что ни есть гуд.
/*Initialization Code*/ ((bar, button = true, insertAtTop = true, ctrlFcloseFinbar = false) => ({ init(parent) { var has = bar = parent.querySelector("#appcontent > findbar"); has || this.initFinbar(parent); var lo = bar.linkedObject; lo.listenCtrlF = ctrlFcloseFinbar ? listen => listen ? addEventListener("keydown", lo, true) : removeEventListener("keydown", lo, true) : () => {}; has && !bar.hidden && lo.listenCtrlF(true); if (button) self._handleClick = () => bar.hidden ? bar.startFind(bar.FIND_NORMAL) : bar.collapsed || bar.close(); addDestructor(lo.destroy, lo); }, destroy(reason) { if (reason[5] != "e") return; bar.close(); bar._browser = {}; bar.remove(); this.setProgressListener(false); for(var key of ["gFindBar", "gFindBarInitialized"]) Object.defineProperty(window, key, this[key]); gBrowser[this.gBrKey] = this[this.gBrKey]; Services.ppmm.removeDelayedProcessScript(this.url); Services.ppmm.loadProcessScript("data:," + encodeURIComponent(` Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_DEFAULT && Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_CONTENT || (nsvo => { var proto = nsvo.Finder.prototype; if ("_requestMatchesCount" in proto) { proto.requestMatchesCount = proto._requestMatchesCount; delete proto._requestMatchesCount; } })(Cu.import("resource://gre/modules/Finder.jsm", {}));` ) , false); }, initFinbar(parent) { for(var tab of gBrowser.tabs) { if (!tab._findBar) continue; tab._findBar.browser = null; tab._findBar._browser = {}; tab._findBar.remove(); delete tab._findBar; } bar = document.createXULElement("findbar"); var p = new Proxy({}, {get: () => () => {}}); bar._browser = {finder: p, messageManager: p}; parent.insertBefore(bar, insertAtTop ? parent.firstChild : null); bar.linkedObject = this; ["gFindBar", "gFindBarInitialized"].forEach((key, ind) => { this[key] = Object.getOwnPropertyDescriptor(window, key); delete window[key]; window[key] = ind ? true : bar; }); var key = "getCachedFindBar" in gBrowser ? "getCachedFindBar" : "getFindBar"; this[this.gBrKey = key] = gBrowser[key]; gBrowser[key] = () => bar; [ "close", "startFind", "onMatchesCountResult", "_updateMatchesCount", "_onBrowserKeypress", "receiveMessage" ].forEach((key, ind) => { var func = bar[key].bind(bar); bar[key] = ind ? (...args) => this[key](...args) || func(...args) : (...args) => func(...args) || this[key](...args); }); this.url = "data:," + encodeURIComponent(` Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_DEFAULT && Services.appinfo.processType != Services.appinfo.PROCESS_TYPE_CONTENT || (nsvo => { var proto = nsvo.Finder.prototype; if ("_requestMatchesCount" in proto) return; proto._requestMatchesCount = proto.requestMatchesCount; proto.requestMatchesCount = ${ this.newRequestMatchesCount } })(Cu.import("resource://gre/modules/Finder.jsm", {}));` ); delete this.newRequestMatchesCount; Services.ppmm.loadProcessScript(this.url, true); }, newRequestMatchesCount: async function requestMatchesCount(aWord, aLinksOnly) { if (typeof aLinksOnly != "boolean") { var {linksOnly, data} = aLinksOnly; aLinksOnly = linksOnly; this.entireWord = data.entireWord; this.caseSensitive = data.caseSensitive; this.onModalHighlightChange(data.useModalHighlight); this.onHighlightAllChange(data.highlightAll); data.highlightAll && await this.highlighter.highlight(true, aWord, linksOnly); this._iterator && this._iterator.reset(); var obj; Object.defineProperty(this, "_currentMatchesCountResult", { configurable: true, enumerable: true, get: (val = obj) => { if (val) { if (!val.total) val.total = new Number(0); val.currentFound = val._currentFound; } return obj = val; }, set: val => { if (val) return obj = val; delete this._currentMatchesCountResult; return obj = this._currentMatchesCountResult = val; } }); var lfr = this._lastFindResult; lfr !== null && lfr != Ci.nsITypeAheadFind.FIND_NOTFOUND || Object.defineProperty(this, "_lastFindResult", { configurable: true, enumerable: true, get: () => null, set: val => { if (val == Ci.nsITypeAheadFind.FIND_WRAPPED) val = Ci.nsITypeAheadFind.FIND_FOUND; delete this._lastFindResult; return this._lastFindResult = val; } }); } this._requestMatchesCount(aWord, aLinksOnly); }, close() { bar.collaped = false; this.setProgressListener(false); this.setBrowser(null, null); }, startFind() { if (this.maybeCollapse(gBrowser.selectedBrowser)) return true; if (bar.hidden) this.setBrowser(300), this.setProgressListener(true); else if (!ctrlFcloseFinbar) setTimeout(() => this.updateMatchesCount(), 100); }, onMatchesCountResult(res) { if (!("currentFound" in res) || res.total == -1 || res.currentFound) return; bar._foundMatches.value = `${+res.total || "Нет"} совпадени${ bar.pluralForm.get(res.total, "е;я;й") }.`; bar._foundMatches.hidden = false; return true; }, _updateMatchesCount() { return true; }, _onBrowserKeypress(e) { if (!bar.hidden) return; if (!e.charCode) return true; this.setBrowser(300); this.setProgressListener(true); }, receiveMessage(msg) { msg.target = bar._browser; }, progressListenerAdded: false, setProgressListener(add) { if (add) { if (this.progressListenerAdded) return; this.progressListenerAdded = true; gBrowser.addProgressListener(this); this.listenCtrlF(true); } else { if (!this.progressListenerAdded) return; this.progressListenerAdded = false; gBrowser.removeProgressListener(this); this.listenCtrlF(false); } }, handleEvent(e) { if ( e.ctrlKey && e.code == "KeyF" && !e.shiftKey && !e.altKey && !bar.collapsed ) e.preventDefault(), e.stopPropagation(), bar.close(); }, updateMatchesCount() { var str = bar._findField.value; if (!str) return; var data = { entireWord: bar._entireWord, caseSensitive: bar._typeAheadCaseSensitive, highlightAll: bar._highlightAll, useModalHighlight: bar._useModalHighlight }; bar.browser.finder.requestMatchesCount( bar._findField.value, {linksOnly: bar._findMode == bar.FIND_LINKS, data} ); }, maybeCollapse(br) { return br.isSyntheticDocument || br.documentContentType == "application/vnd.mozilla.xul+xml"; }, setBrowser(updateDelay, br = gBrowser.selectedBrowser) { if (bar._browser != br) { var b = bar._browser; if (b) { b.messageManager.removeMessageListener("Findbar:Mouseup", bar); b.finder.removeResultListener(bar); bar._highlightAll && b.finder.highlight(false); } if (br) { br.messageManager.addMessageListener("Findbar:Mouseup", bar); bar._updateBrowserWithState(); } bar._browser = br; } if (!br) return; bar._updateStatusUI(); bar._foundMatches.value = ""; br.finder.addResultListener(bar); if ( !(bar.collapsed = this.maybeCollapse(br)) && br.currentURI.spec != "about:blank" && updateDelay !== null ) updateDelay ? setTimeout(this.updateMatchesCount, updateDelay) : this.updateMatchesCount(); }, onStateChange(wpr, req, state) { state & Ci.nsIWebProgressListener.STATE_STOP && this.setBrowser(); }, onLocationChange(wpr, req) { req || Components.stack.formattedStack.includes("SessionStore.jsm") || this.setBrowser(); } }).init(document.getElementById("appcontent")))();
Отсутствует
Что делает эта кнопка? // Дв.клик по панели вкладок........... ||| Понять не могу, какая панель?
Насчет BBCode, тоже все сделал как надо заменил и подставил в конец, не пашет.
Отредактировано func4ptch4 (05-12-2019 22:17:26)
Отсутствует
func4ptch4
Здесь обе эти кнопки. Работают даже в 73.
Дв.клик по вкладке&Дв. клик по панели вкладок - двойной клик по панели вкладок закрывает все вкладки, а двойной клик по вкладке закрывает другие открытые вкладки. Проверь у себя - у меня все работает, как в однопроцессорном режиме, так и многопроцессорном.
Отредактировано Garalf (05-12-2019 22:49:33)
Отсутствует
Dumby
Больше не знаю к кому обратиться. В 71 прокси frigate https приказали долго жить.(TLS1.1) Кое-что я рихтанул в свойственной мне манере. процесс пошел, но не для гугла с его ютюбом. Короче, Socks 5 применил , но как proxy.pac применить ? Кнопки есть , а Pac как заделать с socks5 ? привожу примеры: Это для Http , к сожалению
Снят вопрос , все сделал.
Отредактировано solombala (06-12-2019 01:51:11)
Отсутствует
Dumby мда, не долго музыка играла
var {label} = gBrowser.selectedTab; var re = /(.+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)/; re.test(label) && gClipboard.write( label.replace(re, "$1 $2 ($4) ($3)").replace(/ \/ /g, " - ") );
только я привык к этой кнопке, бац и обновления 71, СВ установлен, но кнопка исчезла из панели, в меню больше нет под ПКМ пункта про кнопку, что делать???
Отсутствует
Garalf
Проверил, и это удобно? у меня по привычке то что по стандарту.
И по привычке тыкаю а там все окна бах и нет..) мда ну эту кнопку, да и 2-клик по вкладке тоже мне легче выборочно.
BBCode работает, вот бы еще меню вылазил по автопопапу, а так все норм.)
solombala, как решил? интересно.
Вроде сокс видел, а вот с авторизацией .pac не сделать.
Отредактировано func4ptch4 (06-12-2019 06:54:52)
Отсутствует
func4ptch4
Прокси нормальный нужен . Пример (сам прокси от фонаря, сам ищи )
var no_proxy = 'DIRECT';
{
var proxy_list = new Array(
'whoer.net',
'yandex.ua',
'yandex.ru',
'rutube.ru',
'ren.tv',
'yadi.sk',
'yandex.net',
'yandex.sx',
'naydex.net',
'youtube.com',
'static.yandex.sx',
'ok.ru',
'vk.com',
'hdrezka.ag',
'mail.ru',
'kinopoisk.ru',
'yastatic.net',
'yandex.sx',
'youtube.com',
'ya.ru',
'2ip.ru',
);
for (var i = 0; i < proxy_list.length; i++){
var value = proxy_list[i];
if (dnsDomainIs(host, '.' + value) || host === value) {
return proxy_server;
}
}
return no_proxy;
}
return no_proxy;
}
Отредактировано solombala (06-12-2019 12:19:29)
Отсутствует
Кстати это нельзя к профилю привязать, а не к диску? file:///D:/proxy/Proxy1.pac
У меня есть вот такая кнопка, если не ошибаюсь от Dumby:
(()=> { // Задать путь к файлу в папке chrome. .......... (({io, dirsvc, prefs}) => { var substitution = "chrome", dir = "UChrm"; var rph = io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler); addDestructor(reason => reason[5] == "e" && rph.hasSubstitution(substitution) && rph.setSubstitution(substitution, null)); if (rph.hasSubstitution(substitution)) return; rph.setSubstitution(substitution, io.newFileURI(dirsvc.get(dir, Ci.nsIFile))); })(Services); })();
Далее в папку chrome в профиле я положил файл proxy.pac и в настройках прокси указал resource://chrome/proxy.pac.
У меня это работает в 68 ESR. Сработает ли в более новых версиях, я не знаю.
Отредактировано unter_officer (06-12-2019 15:57:55)
«The Truth Is Out There»
Отсутствует
unter_officer
В 68 тоже не работает ...
Ну, не знаю. У меня работает.
Отредактировано unter_officer (06-12-2019 18:02:50)
«The Truth Is Out There»
Отсутствует