mserv
Баг в Toggle Find+3, если использовать FindBar мини. При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.
У меня не воспроизводится проверил сейчас на http://softodrom.ru/ и http://rutracker.org/forum/index.php
Отредактировано bunda1 (09-03-2012 00:00:58)
Отсутствует
Колесиком мыши на FindBar - очень удобно.
вклучить Автовыделение или двойным кликом на поле текстового ввода в Findbar mini
что ж ты раньше то молчал?
добавь это тогда в описание кнопки, пожалуйста:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".
Кстати, было бы неплохо добавить описание кнопки в её help (ПКМ по кнопке - Custom Button - Edit Button - вкладка Help).
p.s.: пожалуйста, ну создай уже отдельную тему для обсуждения этой кб!
Добавлено 09-03-2012 00:04:42
У меня не воспроизводится проверил сейчас на http://softodrom.ru/ и http://rutracker.org/forum/index.php
проверь на этом форуме (вот куда ты сообщения пишешь)
Отредактировано iDev.Pi (09-03-2012 00:04:42)
mzfx
Отсутствует
Dev.Pi
добавь это тогда в описание кнопки, пожалуйста:
"Перейти к предыдущей/следующей найденной фразе можно наведя курсор на Панель поиска и покрутив колесо вверх/вниз.
добавыл
Двойной клик ЛКМ по полю ввода включает/отключает подсветку всех найденных совпадений с поисковым запросом".
Нет, там другая кнопка.
Кстати, было бы неплохо добавить описание кнопки в её help (ПКМ по кнопке - Custom Button - Edit Button - вкладка Help).
Но тогда кнопка не залезет на Форум ограничение <64 kB
p.s.: пожалуйста, ну создай уже отдельную тему для обсуждения этой кб!
завтра, сейчас пара спать.
Отредактировано bunda1 (09-03-2012 00:19:54)
Отсутствует
У меня не воспроизводится проверил сейчас на http://softodrom.ru/ и http://rutracker.org/forum/index.php
И на не воспроизводится?
Отсутствует
Но тогда кнопка не залезет на Форум ограничение <64 kB
можно разместить на каком-нибудь обменнике типа ftp на narod.ru:
народ.ру позволяет создавать свой сайт, который будет хоститься у яндекса, и помимо прочего - даётся фтп-доступ к хранилищу файлов.
файлы из этого хранилища не удаляются при неактивности - как это бывает на всяких обменниках.
а здесь на форуме просто ссылку дать.
mzfx
Отсутствует
iDev.Pi
Баг в Toggle Find+3, если использовать FindBar мини. При поиске на странице, если искомое слово содержится в любом окне для ввода текста и на него попадает курсор, то на нём поиск прекращается, стоит как вкопанный.
проверь на этом форуме (вот куда ты сообщения пишешь)
У меня не воспроизводится проверил сейчас на этой странице на FF13 и FindBar мини, может я что то неправильно понял
Отсутствует
p.s.: пожалуйста, ну создай уже отдельную тему для обсуждения этой кб!
Отсутствует
SendInfo
Вот CB код каторый заменяет greasemonkey.
Скрипты сохраняй в папку \Profile\chrome\UserScriptLoader, скрипт в папке должен быть вот таким 47007.user
Код саздает на панеле дополнений кнопку которая открывает меню для управление скриптами:
http://img713.imageshack.us/img713/6812 … 466531.jpgскрытый текстВыделить кодКод:
//User Script Loader....................... (function() { const OPEN_FOLDER_MENU = false; const SAVE_SCRIPT_MENU = true; const USE_STORAGE_NAME = ['cache', 'cacheInfo']; // ????? pref ? storage ????? // User setting (pref.js ?????????????) const EDITOR = 'C:\\Program Files\\EmEditor\\EmEditor.exe'; //\>\\ const SCRIPTS_FOLDER = ''; // ???? chrome\\UserScriptLoader ???? // ?: 'D:\\UserScriptLoader' const ON_IMAGE = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVQ4ja3Q3UtTcRgH8N8f" + "4K11FaRrVGumlTXndPYiyQqkCyPoLroOCbyJSCGJUhOGUSnShVqtFpYlW/lCKiPmy5zinObZ" + "dJtn29nZcW7nnB39TapvF+WdI4W+95/n+zwPIf8zwnRFt+AyIj5VDn7CAN5ZiphDD25Mh+jI" + "aUSGixEePAnWXhTaeYCr/OdWogMZoR2Z2DPQyBNsrpqxEWiF4muG4LwK9nOhvCOOT5Y1iks3" + "sSV0IP29CrLnAkS3EalxPRR/CxJTN8Dai35kXZ+fNGQyfBs2Q7chz1dCcp9FasIAxd+E5Gwt" + "woNl8H3QqnZuHy+tSc5fRybejvTCRUiz55CaKoPsvQV5sR7ciAnBvoJLWdtjTn1aCTWARlsh" + "z52HOG1E0lkCxd+C+LdrCH7S1mXHjhLd2nQ1MvxzyF4TxJlKpCYrsD6mQ3rpEUL92l+BPg1d" + "6T1Kl98dpr43asq8OkSZ7nyeEEII59DzElMHGm3DJmvGRvAxFH8TFF8T0osPIXkaIc7UI+W6" + "i+TEHbD9VWC68hRPx4E//+BGz6QiX4tpeOgUZQdO0FV7IQ3ZCqi8+ACC7TjWhkwQ3Q2IfrmC" + "ZcsxMF0HX2Q9ZzuBj9rRdVctpLn7EN33ELaZwPSoRE/nvv3/xIQQEnivgeRpBDdcg5W3BWB6" + "8s27gn/xDDdUjejAZfheqxOezrzdtRJCiNeamxPo1WLFqgHzUtW8a7idZesRr9+i5r1Pc3P2" + "jAkhhLGodXs1vwEkf3FKAtNVEwAAAABJRU5ErkJggg=="; const OFF_IMAGE = "data:image/png;base64," + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACrElEQVQ4ja2QXUhTARzFb3f5" + "5kuB2EOBplLJTCtrzs/pJNHEJ03orXyIHkQkFSvSSKTmB5hRKfWSVJZhWX5MvZIuiemc05zT" + "3Obm3Ny8m7rP6+7MdnoIQWF76zwe+J3z/x+C+J+yTWd02OTpsE6lgZ5MAS1Nxvo4HxYJD+bR" + "i1gbSYRp+DyMAwmGwAHytD87m+3w2drgW38Odu0pvKst2NY3g9E0wCYtglEc7w4IW2Wpdc6l" + "EuzY2uH5lQO3UginIh2OCT4YbSM2p67DOJCwG/R8Wpbi89Gt8BrK4Z7PhkshgGMyBYxWBPts" + "GUzDqdB85kYFbp9ILrTPX4PP2gbPwmW4ZjPhmEqFW1UK92INLKO5WOmJywvavi7lexhDLVhz" + "M9xzWXBOp8MuTQKjbYT1RzFWvnIrgsPjSbyN6QL46Bdwq3LhnMmGQ5aBLQkPnqXHMPRy/fqe" + "WFbXfYZd/niK1byPYdVvo1l1x0maIAiCsIzzaZe6Aqy5FV5jC7ZXmsBoRWA0IngWH8GlrINz" + "pgYO+T3YJ+/A2JsD9etIRtl+4t8elrFLjrVviayJusAah86xqwPxrKE/jnUv1sPWfxYbVC6c" + "ilosNCThe/FRUJmHMZhNroqzyeqgb+m/cMe25GVwzT2EU3EfKlEift7mwdvXBP+CGExnOWS3" + "uLtDWWRp4IBPsXAp62AZKYTuQxyovBDHdl8T8CQfqDoC1EfAJsrAoJDUBYJnLFQBzENXoHkX" + "s6l8GRlOCTh+/3Q39steEw5KwPEfgFVdYaH6bi50XbFQv4lq2PPFQtLoeXUDqAkHW0lgq5KA" + "4SYHYiFpOhCw3HVape2MoVXPwkL3+5Krxx5MlET/NldFwFodguWSQ6DyObsDQvLugQB1Zwwv" + "2LCSouPVYiGppwQcv1hIGvfgv6X5zFaYeSAgAAAAAElFTkSuQmCC"; var useDocumentStart = (function(){ var version = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo).version; var vc = Cc["@mozilla.org/xpcom/version-comparator;1"].getService(Ci.nsIVersionComparator); return vc.compare(version, '3.6.12') >= 0; })(); var observer = !useDocumentStart? null :(function(){ let list = Cc['@mozilla.org/appshell/window-mediator;1'] .getService(Ci.nsIWindowMediator) .getEnumerator('navigator:browser'); while(list.hasMoreElements()) { let win = list.getNext(); if (win.UserScriptLoader && win.UserScriptLoader.observer) { return win.UserScriptLoader.observer; } } return { disabled: true, observerService: Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService), observe: function(subject, topic, data){ var doc = subject.document; var evt = doc.createEvent("Events"); evt.initEvent("USL_DocumentStart", true, false); doc.dispatchEvent(evt); }, register: function(){ this.observerService.addObserver(this, "content-document-global-created", false); this.disabled = false; this.log('USL observer start'); }, unregister: function(){ this.observerService.removeObserver(this, "content-document-global-created"); this.disabled = true; this.log('USL observer end'); }, log: log }; })(); if (typeof window.UserScriptLoader != 'undefined') { window.UserScriptLoader.theEnd(); } var ns = window.UserScriptLoader = { OPEN_FOLDER_MENU : OPEN_FOLDER_MENU, SAVE_SCRIPT_MENU : SAVE_SCRIPT_MENU, HIDE_EXCLUDE : false, DEBUG : false, USE_STORAGE_NAME : USE_STORAGE_NAME, SCRIPTS_FOLDER : SCRIPTS_FOLDER, ON_IMAGE : ON_IMAGE, OFF_IMAGE : OFF_IMAGE, EDITOR : EDITOR, AUTO_REBUILD : false, useDocumentStart : useDocumentStart, readScripts : [], runAtStartScripts: [], runAtEndScripts : [], disabled_scripts : [], _disabled : null, observer : observer, get disabled () this._disabled, set disabled (bool) { this._disabled = bool; if (bool) { //$('sidebar').removeEventListener('DOMContentLoaded', this.sidebarContentLoaded, false); gBrowser.mPanelContainer.removeEventListener('DOMContentLoaded', this.domContentLoaded, false); gBrowser.mPanelContainer.removeEventListener('USL_DocumentStart', this.onDocumentStart, false); this.icon.style.textDecoration = 'line-through'; this.icon.setAttribute('src', this.OFF_IMAGE); } else { //$('sidebar').addEventListener('DOMContentLoaded', this.sidebarContentLoaded, false); gBrowser.mPanelContainer.addEventListener('DOMContentLoaded', this.domContentLoaded, false); gBrowser.mPanelContainer.addEventListener('USL_DocumentStart', this.onDocumentStart, false); this.icon.style.textDecoration = 'none'; this.icon.setAttribute('src', this.ON_IMAGE); } return bool; }, fxver: parseFloat(Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo).version), getFocusedWindow: function(){ var win = document.commandDispatcher.focusedWindow; if (!win || win == window) win = content; return win; }, init: function() { // ???????????????? ["require", "resourceText", "resourceURL"].forEach(function(name){ var s = window.globalStorage['UserScriptLoader.' + name]; for (var n in s) { s.removeItem(n) } }); this.pref = new PrefManager(); try { let ds = this.pref.getValue('script.disabled', ''); if (ds) ns.disabled_scripts = ds.split('|'); ns._disabled = this.pref.getValue('disabled', ns._disabled); ns.SCRIPTS_FOLDER = this.pref.getValue('SCRIPTS_FOLDER', ns.SCRIPTS_FOLDER); ns.EDITOR = this.pref.getValue('EDITOR', ns.EDITOR); ns.HIDE_EXCLUDE = this.pref.getValue('HIDE_EXCLUDE', false); ns.DEBUG = this.pref.getValue('DEBUG', ns.DEBUG); } catch(ex) { log(ex) } ns.icon = $('status-bar').appendChild($E( <statusbarpanel id="UserScriptLoader-icon" class="statusbarpanel-iconic" context="UserScriptLoader-popup" onclick="UserScriptLoader.iconClick(event);" style="text-decoration: none;"/> )); ns.popup = $('mainPopupSet').appendChild($E( <menupopup id="UserScriptLoader-popup" onpopupshowing="UserScriptLoader.onPopupShowing(event);" onpopuphidden="UserScriptLoader.onPopupHidden(event);" onclick="UserScriptLoader.menuClick(event);"> <menuseparator id="UserScriptLoader-menuseparator"/> <menu label="User Script Command" id="UserScriptLoader-register-menu" accesskey="C"> <menupopup id="UserScriptLoader-register-popup"/> </menu> <menuitem label="Save Script" id="UserScriptLoader-saveMenu" accesskey="S" oncommand="UserScriptLoader.saveScript();" collapsed={!ns.SAVE_SCRIPT_MENU}/> <menu label="Menu" id="UserScriptLoader-submenu"> <menupopup id="UserScriptLoader-submenu-popup"> <menuitem label="delete resource / require" oncommand="UserScriptLoader.deleteStorage('resource');"/> <menuitem label="delete pref storage" oncommand="UserScriptLoader.deleteStorage('pref');"/> <menuseparator/> <menuitem label="Hide exclude script" id="UserScriptLoader-hide-exclude" accesskey="N" type="checkbox" checked={ns.HIDE_EXCLUDE} oncommand="UserScriptLoader.HIDE_EXCLUDE = !UserScriptLoader.HIDE_EXCLUDE;"/> <menuitem label="Open Scripts Folder" id="UserScriptLoader-openFolderMenu" accesskey="O" oncommand="UserScriptLoader.openFolder();" collapsed={!ns.OPEN_FOLDER_MENU}/> <menuitem label="Rebuild" accesskey="R" oncommand="UserScriptLoader.rebuild();"/> <menuitem label="Auto Rebuild" id="UserScriptLoader-auto-rebuild" accesskey="A" type="checkbox" checked={ns.AUTO_REBUILD} oncommand="UserScriptLoader.AUTO_REBUILD = !UserScriptLoader.AUTO_REBUILD;"/> </menupopup> </menu> </menupopup> )); ns.menuseparator = $('UserScriptLoader-menuseparator'); ns.registMenu = $('UserScriptLoader-register-menu'); ns.registPopup = $('UserScriptLoader-register-popup'); ns.openFolderMenu = $('UserScriptLoader-openFolderMenu'); ns.saveMenu = $('UserScriptLoader-saveMenu'); ns.hideExcludeMenu = $('UserScriptLoader-hide-exclude'); ns.autoRebuildMenu = $('UserScriptLoader-auto-rebuild'); ns.importScripts(); ns.disabled = ns._disabled; window.addEventListener('unload', ns.uninit, false); if (this.observer.disabled) this.observer.register(); }, uninit: function(event) { let disabledScripts = ns.readScripts.reduce(function(ret, script) { if (script._disabled) ret.push(script._leafName); return ret; }, []); var pref = ns.pref || new PrefManager(); pref.setValue('script.disabled', disabledScripts.join('|')); pref.setValue('disabled', ns._disabled); pref.setValue('HIDE_EXCLUDE', ns.HIDE_EXCLUDE); if (!ns.disabled) ns.disabled = true; if (event) { let list = Cc['@mozilla.org/appshell/window-mediator;1'] .getService(Ci.nsIWindowMediator) .getEnumerator('navigator:browser'); while(list.hasMoreElements()) { if (list.getNext() != window) return } ns.observer.unregister(); } }, theEnd: function() { ns.uninit(); ns.icon.parentNode.removeChild(ns.icon); ns.popup.parentNode.removeChild(ns.popup); //delete window.UserScriptLoader; }, importScripts: function() { let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile) if (!ns.SCRIPTS_FOLDER) { let UChrm = Cc["@mozilla.org/file/directory_service;1"] .getService(Ci.nsIProperties) .get("UChrm", Ci.nsIFile); ns.SCRIPTS_FOLDER = UChrm.path; aFolder.initWithPath(ns.SCRIPTS_FOLDER); aFolder.appendRelativePath('UserScriptLoader'); } else { aFolder.initWithPath(ns.SCRIPTS_FOLDER); } try { if( !aFolder.exists() || !aFolder.isDirectory() ) { aFolder.append(""); aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664); } } catch (e) { return error('importScripts error.') } ns.readScripts = []; ns.runAtStartScripts = []; ns.runAtEndScripts = []; let ext = /\.user\.js$/i; let files = aFolder.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator); while (files.hasMoreElements()) { let file = files.getNext().QueryInterface(Ci.nsIFile); if (ext.test(file.leafName)) ns.loadScript(file); } }, rebuild: function() { let disabledScripts = ns.readScripts.reduce(function(ret, script) { if (script._disabled) ret.push(script._leafName); return ret; }, []); ns.disabled_scripts = disabledScripts; ns.importScripts(); ns.DEBUG = this.pref.getValue('DEBUG', ns.DEBUG); }, openFolder: function() { var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); file.initWithPath(ns.SCRIPTS_FOLDER); file.launch(); }, saveScript: function() { var win = ns.getFocusedWindow(); var url = win.location.href; var doc = win.document; var pre = doc.querySelector('body > pre'); var filename = pre && /@name\s+([^\n]+)/i.test(pre.textContent)? RegExp.$1 + '.user.js': /[^/]+$/i.exec(url)[0]; var lastDir = gPrefService.getCharPref('browser.download.lastDir'); gPrefService.setCharPref('browser.download.lastDir', ns.SCRIPTS_FOLDER); saveURL( url, filename, null, true, false, makeURI(url, doc.characterSet) ); gPrefService.setCharPref('browser.download.lastDir', lastDir); }, deleteStorage: function(type) { var storage = new StorageManager(type); var list = storage.listValues(); if (list.length == 0) return alert(type + ' is none.'); list.push('All ' + type); var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService); var selected = {}; var ok = prompts.select( window, "UserScriptLoader " + type, "Select delete URL.", list.length, list, selected ); if (!ok) return; if (selected.value == list.length -1) { list.pop(); list.forEach(function(url, i, a) { storage.deleteValue(url); }); return; } storage.deleteValue(list[selected.value]); }, loadScript: function(aFile) { var script = new ScriptEntry(aFile); script._disabled = ns.disabled_scripts.indexOf(script._leafName) >= 0; ns.readScripts.push(script); var runat = script['run-at']; if (runat === 'document-start') { ns.runAtStartScripts.push(script); } else { ns.runAtEndScripts.push(script); } return; }, onPopupShowing: function(event) { var win = ns.getFocusedWindow(); var popup = event.target; var data = GrieverWindowStore.get(win); switch(popup.id) { case 'UserScriptLoader-popup': var run = data.USL_run; ns.readScripts.forEach(function(script) { if (ns.HIDE_DISABLED_SCRIPT && script._disabled) return; if (ns.HIDE_EXCLUDE && !script._isURLMatching(win.location.href)) return; let m = document.createElement('menuitem'); m.setAttribute('label', script.name || script._leafName); m.setAttribute('checked', !script._disabled); m.setAttribute('type', 'checkbox'); m.setAttribute('oncommand', 'this.script._disabled = !this.script._disabled;'); m.script = script; if (run && run.indexOf(script) >= 0) m.style.fontWeight = 'bold'; ns.popup.insertBefore(m, ns.menuseparator); }, ns); ns.saveMenu.hidden = win.location.href.indexOf('.js') == -1; ns.registMenu.hidden = data.USL_registerCommands && data.USL_registerCommands.length == 0; break; case 'UserScriptLoader-register-popup': var registers = data.USL_registerCommands; if (!registers) return; registers.forEach(function(item, i, a) { let m = document.createElement('menuitem'); m.setAttribute('label', item.label); m.setAttribute('tooltiptext', item.tooltiptext); m.setAttribute('oncommand', 'this.registCommand();'); m.registCommand = item.func; popup.appendChild(m); }, ns); break; case 'UserScriptLoader-submenu-popup': ns.hideExcludeMenu.setAttribute('checked', ns.HIDE_EXCLUDE); ns.autoRebuildMenu.setAttribute('checked', ns.AUTO_REBUILD); break; } }, onPopupHidden: function(event) { var popup = event.target; switch(popup.id) { case 'UserScriptLoader-popup': case 'UserScriptLoader-register-popup': var child = popup.firstChild; while (child && child.localName == 'menuitem') { popup.removeChild(child); child = popup.firstChild; } break; } }, menuClick: function(event){ var menuitem = event.target; if (event.button == 0 || menuitem.getAttribute('type') != 'checkbox') return; event.preventDefault(); event.stopPropagation(); if (event.button == 1) { menuitem.doCommand(); menuitem.setAttribute('checked', menuitem.getAttribute('checked') == 'true'? 'false' : 'true'); }else if (event.button == 2 && ns.EDITOR && menuitem.script) { var app = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); app.initWithPath(ns.EDITOR); var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); process.init(app); process.run(false, [menuitem.script._path], 1); } }, iconClick: function(event){ if (event.button == 0) { ns.disabled = !ns.disabled; ns.pref.setValue('disabled', ns.disabled); } else if (event.button == 1) ns.rebuild(); }, domContentLoaded: function(event) { var doc = event.target; if (!/^(?:https?|data|file|chrome):/.test(doc.location.protocol)) return; // document-start ????????? DOMContentLoaded ????? if (!ns.useDocumentStart) ns.injectScripts(ns.runAtStartScripts, doc); ns.injectScripts(ns.runAtEndScripts, doc); }, sidebarContentLoaded: function(event) { return; var doc = event.target; if (!/^(?:https?):/.test(doc.location.protocol)) return; if (!ns.useDocumentStart) ns.injectScripts(ns.runAtStartScripts, doc); ns.injectScripts(ns.runAtEndScripts, doc); }, onDocumentStart: function(event) { var doc = event.target; if (!/^(?:https?|data|file|chrome):/.test(doc.location.protocol)) return; if (doc.documentElement) { ns.injectScripts(ns.runAtStartScripts, doc); } else { doc.addEventListener('DOMNodeInserted', function(event){ event.currentTarget.removeEventListener(event.type, arguments.callee, false); ns.injectScripts(ns.runAtStartScripts, doc); }, false); } }, sidebarDocumentStart: function(event) { return; var doc = event.target; if (!/^(?:https?):/.test(doc.location.protocol)) return; ns.injectScripts(ns.runAtStartScripts, doc); }, injectScripts: function(scripts, aDocument) { if (scripts.length === 0) return; var contentWindow = aDocument.defaultView; var locationHref = contentWindow.location.href; var data = GrieverWindowStore.get(contentWindow); var unsafeWindow = contentWindow.wrappedJSObject || contentWindow; var wrappedWindow = new XPCNativeWrapper(unsafeWindow); var safeWindow = ns.fxver >= 4? { wrappedJSObject: unsafeWindow, __proto__: wrappedWindow }: wrappedWindow; if ("AutoPagerize" in data) safeWindow.AutoPagerize = data.AutoPagerize; var sbWindow = ns.fxver >= 4? window: wrappedWindow; var console = unsafeWindow.console || new Console(); if (!data.USL_registerCommands) data.USL_registerCommands = []; if (!data.USL_run) data.USL_run = []; scripts.filter(function(script) { if ("noframes" in script && contentWindow.frameElement instanceof HTMLIFrameElement) return false; if (!script._isURLMatching(locationHref)) return false; if (data.USL_run.indexOf(script) >= 0) { log('DABUTTAYO!!!!! ' + script.name); return false; } let sandbox = new Cu.Sandbox(sbWindow); sandbox.GM_log = log; sandbox.GM_xmlhttpRequest = GM_xmlhttpRequest; sandbox.GM_openInTab = function(url) { openNewTabWith(url); }; sandbox.GM_registerMenuCommand = function(label, func) { data.USL_registerCommands.push({ label:label, func:func, tooltiptext:(script.name || script._leafName) }); } sandbox.GM_getResourceText = function(name) { let obj = script._resourceValues[name]; if (obj.bytes) { return obj.bytes; } } sandbox.GM_getResourceURL = function(name) { let obj = script._resourceValues[name]; if (obj) { return 'data:' + obj.contentType + ';base64,' + btoa(obj.bytes); } } sandbox.GM_addStyle = function(code) GM_addStyle(code, sandbox.document); sandbox.GM_setValue = function(name, value) { return ns.USE_STORAGE_NAME.indexOf(name) >= 0? script._storage.setValue(script._prefName + name, value): script._pref.setValue(name, value); } sandbox.GM_getValue = function(name, def) { return ns.USE_STORAGE_NAME.indexOf(name) >= 0? script._storage.getValue(script._prefName + name, def): script._pref.getValue(name, def); } sandbox.GM_listValues = function() { var p = script._pref.listValues(); var s = script._storage.listValues(script._prefName + name).filter(function(e) e.indexOf(script._prefName) == 0); s.forEach(function(e, i, a) a[i] = e.replace(script._prefName, '')); p.push.apply(p, s); return p; } sandbox.GM_deleteValue = function(name) { return ns.USE_STORAGE_NAME.indexOf(name) >= 0? script._storage.deleteValue(script._prefName + name): script._pref.deleteValue(name); } sandbox.GM_setClipboard = function(str) { if (str.constructor === String || str.constructor === Number) { Cc['@mozilla.org/widget/clipboardhelper;1'].getService(Ci.nsIClipboardHelper).copyString(str); return; } return error('GM_setClipboard error.'); } sandbox.unsafeWindow = unsafeWindow; sandbox.window = safeWindow; sandbox.document = safeWindow.document; sandbox.XPathResult = Ci.nsIDOMXPathResult; sandbox.console = console; sandbox.__proto__ = safeWindow; if (script['run-at'] === 'document-start') { if (aDocument.documentElement) { ns.evalInSandbox(script, sandbox); } else { aDocument.addEventListener('readystatechange', function(event){ if (aDocument.readyState !== 'loading') { event.currentTarget.removeEventListener(event.type, arguments.callee, false); ns.evalInSandbox(script, sandbox); } }, false); } } else if (script['run-at'] === 'document-idle') { setTimeout(ns.evalInSandbox, 0, script, sandbox); } else { ns.evalInSandbox(script, sandbox); } data.USL_run.push(script); return true; }); }, evalInSandbox: function(aScript, aSandbox) { try{ Cu.evalInSandbox('(function() {' + aScript._requireSrc + aScript._code + '})();', aSandbox, "1.8"); } catch(e) { if (e.stack) { var evalErr = parseInt(e.stack.match(/\d+\s*$/)) || 0; var req = aScript._requireSrc? aScript._requireSrc.split('\n').length: 0; var line = e.lineNumber - evalErr - req + 2; error(aScript.name + ' / line:' + line + '\n' + e); } else { error(aScript._leafName + '\n' + e); } } }, } // Class function PrefManager(str) { var root = 'UserScriptLoader.'; if (str) root += str; this.pref = Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefService) .getBranch(root); } PrefManager.prototype = { setValue: function(name, value) { try { switch(typeof value) { case 'string' : var str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); str.data = value; this.pref.setComplexValue(name, Ci.nsISupportsString, str); break; case 'number' : this.pref.setIntPref(name, value); break; case 'boolean': this.pref.setBoolPref(name, value); break; } } catch(e) { } }, getValue: function(name, defaultValue){ var value = defaultValue; try { switch(this.pref.getPrefType(name)) { case Ci.nsIPrefBranch.PREF_STRING: value = this.pref.getComplexValue(name, Ci.nsISupportsString).data; break; case Ci.nsIPrefBranch.PREF_INT : value = this.pref.getIntPref(name); break; case Ci.nsIPrefBranch.PREF_BOOL : value = this.pref.getBoolPref(name); break; } } catch(e) { } return value; }, deleteValue: function(name) { try { this.pref.deleteBranch(name); } catch(e) { } }, listValues: function() this.pref.getChildList("", {}), }; function StorageManager(name) { this.storage = window.globalStorage['UserScriptLoader.' + (name || '')]; } StorageManager.prototype = { setValue: function(key, value) { this.storage.setItem(key, value); }, getValue: function(key, defaultValue) { var value = defaultValue; try { value = this.storage.getItem(key).value; } catch (e) { } return value; }, deleteValue: function(key) { this.storage.removeItem(key); }, listValues: function() { var st = this.storage; var h = []; for (var n in st) { h.push(n); } return h; }, } function ScriptEntry(aFile) { this._readFile(aFile); this._getMetadata(); this._init(); this._includeRegExp = !this.include || this.include == '*'? new RegExp("^https?://") : this._createRegExp(this.include); this._excludeRegExp = !this.exclude || this.exclude == '*'? null : this._createRegExp(this.exclude); this._prefName = 'scriptival.' + (this.namespace || 'nonamespace/') + '/' + (this.name || this._leafName) + '.'; this._getResource(); } ScriptEntry.prototype = { _init: function() { this._disabled = false; this._requires = this.require? this.require.split('\n') : []; this._requireSrc = ''; this._resources = {}; this._resourceValues = {}; if (!this['run-at']) this['run-at'] = 'document-end'; if (this.resource) { let resource = this.resource.split('\n'); for (let i = 0, l = resource.length; i < l; i++) { let res = resource[i].split(/\s+/); this._resources[res[0]] = res[1]; } } this.__defineGetter__('_storage', function() { delete this._storage; return this._storage = new StorageManager('pref'); }); this.__defineGetter__('_pref', function() { delete this._pref; return this._pref = new PrefManager(this._prefName); }); this.__defineGetter__('_resourceStorage', function() { delete this._resourceStorage; return this._resourceStorage = new StorageManager('resource'); }); }, _readFile: function(aFile) { var stream = Cc['@mozilla.org/network/file-input-stream;1'].createInstance(Ci.nsIFileInputStream); stream.init(aFile,1,0,false); var ss = Cc['@mozilla.org/scriptableinputstream;1'].createInstance(Ci.nsIScriptableInputStream); ss.init(stream); var data = ss.read(ss.available()); ss.close(); stream.close(); try { data = decodeURIComponent(escape(data)); } catch(e) { } this._code = data; this._leafName = aFile.leafName; this._path = aFile.path; }, _getMetadata: function() { let m = this._code.match(/\/\/\s*==UserScript==[\s\S]+?\/\/\s*==\/UserScript==/); if (!m) return; m = (m+'').split(/[\r\n]+/); for (let i = 0; i < m.length; i++) { if (!/\/\/\s*?@(\S+)($|\s+([^\r\n]+))/.test(m[i])) continue; let name = RegExp.$1; let value = RegExp.$3; if (this[name]) { this[name] += '\n' + value; } else { this[name] = value; } } }, _createRegExp: function(urlstr) { let regstr = urlstr.split('\n').map(function(str) { var res = '^' + str.replace(/([()[\]{}|+.,^$?\\])/g, "\\$1").replace(/\*/g, '.*'); // from UCJSToolkit wildcardToRegex var tldRegExp = new RegExp("^(\\^(?:[^/]*)(?://)?(?:[^/]*))(\\\\\\.tld)((?:/.*)?)$"); var tldRes = res.match(tldRegExp); if (tldRes) { var tldStr = "\.(?:demon\\.co\\.uk|esc\\.edu\\.ar|(?:c[oi]\\.)?[^\\.]\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.(?:(?:pvt\\.)?k12|cc|tec|lib|state|gen)\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nvus|ne|gg|tr|mm|ki|biz|sj|my|hn|gl|ro|tn|co|br|coop|cy|bo|ck|tc|bv|ke|aero|cs|dm|km|bf|af|mv|ls|tm|jm|pg|ky|ga|pn|sv|mq|hu|za|se|uy|iq|ai|com|ve|na|ba|ph|xxx|no|lv|tf|kz|ma|in|id|si|re|om|by|fi|gs|ir|li|tz|td|cg|pa|am|tv|jo|bi|ee|cd|pk|mn|gd|nz|as|lc|ae|cn|ag|mx|sy|cx|cr|vi|sg|bm|kh|nr|bz|vu|kw|gf|al|uz|eh|int|ht|mw|gm|bg|gu|info|aw|gy|ac|ca|museum|sk|ax|es|kp|bb|sa|et|ie|tl|org|tj|cf|im|mk|de|pro|md|fm|cl|jp|bn|vn|gp|sm|ar|dj|bd|mc|ug|nu|ci|dk|nc|rw|aq|name|st|hm|mo|gq|ps|ge|ao|gr|va|is|mt|gi|la|bh|ms|bt|gb|it|wf|sb|ly|ng|gt|lu|il|pt|mh|eg|kg|pf|um|fr|sr|vg|fj|py|pm|sn|sd|au|sl|gh|us|mr|dz|ye|kn|cm|arpa|bw|lk|mg|tk|su|sc|ru|travel|az|ec|mz|lb|ml|bj|edu|pr|fk|lr|nf|np|do|mp|bs|to|cu|ch|yu|eu|mu|ni|pw|pl|gov|pe|an|ua|uk|gw|tp|kr|je|tt|net|fo|jobs|yt|cc|sh|io|zm|hk|th|so|er|cz|lt|mil|hr|gn|be|qa|cv|vc|tw|ws|ad|sz|at|tg|zw|nl|info\\.tn|org\\.sd|med\\.sd|com\\.hk|org\\.ai|edu\\.sg|at\\.tt|mail\\.pl|net\\.ni|pol\\.dz|hiroshima\\.jp|org\\.bh|edu\\.vu|net\\.im|ernet\\.in|nic\\.tt|com\\.tn|go\\.cr|jersey\\.je|bc\\.ca|com\\.la|go\\.jp|com\\.uy|tourism\\.tn|com\\.ec|conf\\.au|dk\\.org|shizuoka\\.jp|ac\\.vn|matsuyama\\.jp|agro\\.pl|yamaguchi\\.jp|edu\\.vn|yamanashi\\.jp|mil\\.in|sos\\.pl|bj\\.cn|net\\.au|ac\\.ae|psi\\.br|sch\\.ng|org\\.mt|edu\\.ai|edu\\.ck|ac\\.yu|org\\.ws|org\\.ng|rel\\.pl|uk\\.tt|com\\.py|aomori\\.jp|co\\.ug|video\\.hu|net\\.gg|org\\.pk|id\\.au|gov\\.zw|mil\\.tr|net\\.tn|org\\.ly|re\\.kr|mil\\.ye|mil\\.do|com\\.bb|net\\.vi|edu\\.na|co\\.za|asso\\.re|nom\\.pe|edu\\.tw|name\\.et|jl\\.cn|gov\\.ye|ehime\\.jp|miyazaki\\.jp|kanagawa\\.jp|gov\\.au|nm\\.cn|he\\.cn|edu\\.sd|mod\\.om|web\\.ve|edu\\.hk|medecin\\.fr|org\\.cu|info\\.au|edu\\.ve|nx\\.cn|alderney\\.gg|net\\.cu|org\\.za|mb\\.ca|com\\.ye|edu\\.pa|fed\\.us|ac\\.pa|alt\\.na|mil\\.lv|fukuoka\\.jp|gen\\.in|gr\\.jp|gov\\.br|gov\\.ac|id\\.fj|fukui\\.jp|hu\\.com|org\\.gu|net\\.ae|mil\\.ph|ltd\\.je|alt\\.za|gov\\.np|edu\\.jo|net\\.gu|g12\\.br|org\\.tn|store\\.co|fin\\.tn|ac\\.nz|gouv\\.fr|gov\\.il|org\\.ua|org\\.do|org\\.fj|sci\\.eg|gov\\.tt|cci\\.fr|tokyo\\.jp|net\\.lv|gov\\.lc|ind\\.br|ca\\.tt|gos\\.pk|hi\\.cn|net\\.do|co\\.tv|web\\.co|com\\.pa|com\\.ng|ac\\.ma|gov\\.bh|org\\.zw|csiro\\.au|lakas\\.hu|gob\\.ni|gov\\.fk|org\\.sy|gov\\.lb|gov\\.je|ed\\.cr|nb\\.ca|net\\.uy|com\\.ua|media\\.hu|com\\.lb|nom\\.pl|org\\.br|hk\\.cn|co\\.hu|org\\.my|gov\\.dz|sld\\.pa|gob\\.pk|net\\.uk|guernsey\\.gg|nara\\.jp|telememo\\.au|k12\\.tr|org\\.nz|pub\\.sa|edu\\.ac|com\\.dz|edu\\.lv|edu\\.pk|com\\.ph|net\\.na|net\\.et|id\\.lv|au\\.com|ac\\.ng|com\\.my|net\\.cy|unam\\.na|nom\\.za|net\\.np|info\\.pl|priv\\.hu|rec\\.ve|ac\\.uk|edu\\.mm|go\\.ug|ac\\.ug|co\\.dk|net\\.tt|oita\\.jp|fi\\.cr|org\\.ac|aichi\\.jp|org\\.tt|edu\\.bh|us\\.com|ac\\.kr|js\\.cn|edu\\.ni|com\\.mt|fam\\.pk|experts-comptables\\.fr|or\\.kr|org\\.au|web\\.pk|mil\\.jo|biz\\.pl|org\\.np|city\\.hu|org\\.uy|auto\\.pl|aid\\.pl|bib\\.ve|mo\\.cn|br\\.com|dns\\.be|sh\\.cn|org\\.mo|com\\.sg|me\\.uk|gov\\.kw|eun\\.eg|kagoshima\\.jp|ln\\.cn|seoul\\.kr|school\\.fj|com\\.mk|e164\\.arpa|rnu\\.tn|pro\\.ae|org\\.om|gov\\.my|net\\.ye|gov\\.do|co\\.im|org\\.lb|plc\\.co\\.im|net\\.jp|go\\.id|net\\.tw|gov\\.ai|tlf\\.nr|ac\\.im|com\\.do|net\\.py|tozsde\\.hu|com\\.na|tottori\\.jp|net\\.ge|gov\\.cn|org\\.bb|net\\.bs|ac\\.za|rns\\.tn|biz\\.pk|gov\\.ge|org\\.uk|org\\.fk|nhs\\.uk|net\\.bh|tm\\.za|co\\.nz|gov\\.jp|jogasz\\.hu|shop\\.pl|media\\.pl|chiba\\.jp|city\\.za|org\\.ck|net\\.id|com\\.ar|gon\\.pk|gov\\.om|idf\\.il|net\\.cn|prd\\.fr|co\\.in|or\\.ug|red\\.sv|edu\\.lb|k12\\.ec|gx\\.cn|net\\.nz|info\\.hu|ac\\.zw|info\\.tt|com\\.ws|org\\.gg|com\\.et|ac\\.jp|ac\\.at|avocat\\.fr|org\\.ph|sark\\.gg|org\\.ve|tm\\.pl|net\\.pg|gov\\.co|com\\.lc|film\\.hu|ishikawa\\.jp|hotel\\.hu|hl\\.cn|edu\\.ge|com\\.bm|ac\\.om|tec\\.ve|edu\\.tr|cq\\.cn|com\\.pk|firm\\.in|inf\\.br|gunma\\.jp|gov\\.tn|oz\\.au|nf\\.ca|akita\\.jp|net\\.sd|tourism\\.pl|net\\.bb|or\\.at|idv\\.tw|dni\\.us|org\\.mx|conf\\.lv|net\\.jo|nic\\.in|info\\.vn|pe\\.kr|tw\\.cn|org\\.eg|ad\\.jp|hb\\.cn|kyonggi\\.kr|bourse\\.za|org\\.sb|gov\\.gg|net\\.br|mil\\.pe|kobe\\.jp|net\\.sa|edu\\.mt|org\\.vn|yokohama\\.jp|net\\.il|ac\\.cr|edu\\.sb|nagano\\.jp|travel\\.pl|gov\\.tr|com\\.sv|co\\.il|rec\\.br|biz\\.om|com\\.mm|com\\.az|org\\.vu|edu\\.ng|com\\.mx|info\\.co|realestate\\.pl|mil\\.sh|yamagata\\.jp|or\\.id|org\\.ae|greta\\.fr|k12\\.il|com\\.tw|gov\\.ve|arts\\.ve|cul\\.na|gov\\.kh|org\\.bm|etc\\.br|or\\.th|ch\\.vu|de\\.tt|ind\\.je|org\\.tw|nom\\.fr|co\\.tt|net\\.lc|intl\\.tn|shiga\\.jp|pvt\\.ge|gov\\.ua|org\\.pe|net\\.kh|co\\.vi|iwi\\.nz|biz\\.vn|gov\\.ck|edu\\.eg|zj\\.cn|press\\.ma|ac\\.in|eu\\.tt|art\\.do|med\\.ec|bbs\\.tr|gov\\.uk|edu\\.ua|eu\\.com|web\\.do|szex\\.hu|mil\\.kh|gen\\.nz|okinawa\\.jp|mob\\.nr|edu\\.ws|edu\\.sv|xj\\.cn|net\\.ru|dk\\.tt|erotika\\.hu|com\\.sh|cn\\.com|edu\\.pl|com\\.nc|org\\.il|arts\\.co|chirurgiens-dentistes\\.fr|net\\.pa|takamatsu\\.jp|net\\.ng|org\\.hu|net\\.in|net\\.vu|gen\\.tr|shop\\.hu|com\\.ae|tokushima\\.jp|za\\.com|gov\\.eg|co\\.jp|uba\\.ar|net\\.my|biz\\.et|art\\.br|ac\\.fk|gob\\.pe|com\\.bs|co\\.ae|de\\.net|net\\.eg|hyogo\\.jp|edunet\\.tn|museum\\.om|nom\\.ve|rnrt\\.tn|hn\\.cn|com\\.fk|edu\\.dz|ne\\.kr|co\\.je|sch\\.uk|priv\\.pl|sp\\.br|net\\.hk|name\\.vn|com\\.sa|edu\\.bm|qc\\.ca|bolt\\.hu|per\\.kh|sn\\.cn|mil\\.id|kagawa\\.jp|utsunomiya\\.jp|erotica\\.hu|gd\\.cn|net\\.tr|edu\\.np|asn\\.au|com\\.gu|ind\\.tn|mil\\.br|net\\.lb|nom\\.co|org\\.la|mil\\.pl|ac\\.il|gov\\.jo|com\\.kw|edu\\.sh|otc\\.au|gmina\\.pl|per\\.sg|gov\\.mo|int\\.ve|news\\.hu|sec\\.ps|ac\\.pg|health\\.vn|sex\\.pl|net\\.nc|qc\\.com|idv\\.hk|org\\.hk|gok\\.pk|com\\.ac|tochigi\\.jp|gsm\\.pl|law\\.za|pro\\.vn|edu\\.pe|info\\.et|sch\\.gg|com\\.vn|gov\\.bm|com\\.cn|mod\\.uk|gov\\.ps|toyama\\.jp|gv\\.at|yk\\.ca|org\\.et|suli\\.hu|edu\\.my|org\\.mm|co\\.yu|int\\.ar|pe\\.ca|tm\\.hu|net\\.sb|org\\.yu|com\\.ru|com\\.pe|edu\\.kh|edu\\.kw|org\\.qa|med\\.om|net\\.ws|org\\.in|turystyka\\.pl|store\\.ve|org\\.bs|mil\\.uy|net\\.ar|iwate\\.jp|org\\.nc|us\\.tt|gov\\.sh|nom\\.fk|go\\.th|gov\\.ec|com\\.br|edu\\.do|gov\\.ng|pro\\.tt|sapporo\\.jp|net\\.ua|tm\\.fr|com\\.lv|com\\.mo|edu\\.uk|fin\\.ec|edu\\.ps|ru\\.com|edu\\.ec|ac\\.fj|net\\.mm|veterinaire\\.fr|nom\\.re|ingatlan\\.hu|fr\\.vu|ne\\.jp|int\\.co|gov\\.cy|org\\.lv|de\\.com|nagasaki\\.jp|com\\.sb|gov\\.za|org\\.lc|com\\.fj|ind\\.in|or\\.cr|sc\\.cn|chambagri\\.fr|or\\.jp|forum\\.hu|tmp\\.br|reklam\\.hu|gob\\.sv|com\\.pl|saitama\\.jp|name\\.tt|niigata\\.jp|sklep\\.pl|nom\\.ni|co\\.ma|net\\.la|co\\.om|pharmacien\\.fr|port\\.fr|mil\\.gu|au\\.tt|edu\\.gu|ngo\\.ph|com\\.ve|ac\\.th|gov\\.fj|barreau\\.fr|net\\.ac|ac\\.je|org\\.kw|sport\\.hu|ac\\.cn|net\\.bm|ibaraki\\.jp|tel\\.no|org\\.cy|edu\\.mo|gb\\.net|kyoto\\.jp|sch\\.sa|com\\.au|edu\\.lc|fax\\.nr|gov\\.mm|it\\.tt|org\\.jo|nat\\.tn|mil\\.ve|be\\.tt|org\\.az|rec\\.co|co\\.ve|gifu\\.jp|net\\.th|hokkaido\\.jp|ac\\.gg|go\\.kr|edu\\.ye|qh\\.cn|ab\\.ca|org\\.cn|no\\.com|co\\.uk|gov\\.gu|de\\.vu|miasta\\.pl|kawasaki\\.jp|co\\.cr|miyagi\\.jp|org\\.jp|osaka\\.jp|web\\.za|net\\.za|gov\\.pk|gov\\.vn|agrar\\.hu|asn\\.lv|org\\.sv|net\\.sh|org\\.sa|org\\.dz|assedic\\.fr|com\\.sy|net\\.ph|mil\\.ge|es\\.tt|mobile\\.nr|co\\.kr|ltd\\.uk|ac\\.be|fgov\\.be|geek\\.nz|ind\\.gg|net\\.mt|maori\\.nz|ens\\.tn|edu\\.py|gov\\.sd|gov\\.qa|nt\\.ca|com\\.pg|org\\.kh|pc\\.pl|com\\.eg|net\\.ly|se\\.com|gb\\.com|edu\\.ar|sch\\.je|mil\\.ac|mil\\.ar|okayama\\.jp|gov\\.sg|ac\\.id|co\\.id|com\\.ly|huissier-justice\\.fr|nic\\.im|gov\\.lv|nu\\.ca|org\\.sg|com\\.kh|org\\.vi|sa\\.cr|lg\\.jp|ns\\.ca|edu\\.co|gov\\.im|edu\\.om|net\\.dz|org\\.pl|pp\\.ru|tm\\.mt|org\\.ar|co\\.gg|org\\.im|edu\\.qa|org\\.py|edu\\.uy|targi\\.pl|com\\.ge|gub\\.uy|gov\\.ar|ltd\\.gg|fr\\.tt|net\\.qa|com\\.np|ass\\.dz|se\\.tt|com\\.ai|org\\.ma|plo\\.ps|co\\.at|med\\.sa|net\\.sg|kanazawa\\.jp|com\\.fr|school\\.za|net\\.pl|ngo\\.za|net\\.sy|ed\\.jp|org\\.na|net\\.ma|asso\\.fr|police\\.uk|powiat\\.pl|govt\\.nz|sk\\.ca|tj\\.cn|mil\\.ec|com\\.jo|net\\.mo|notaires\\.fr|avoues\\.fr|aeroport\\.fr|yn\\.cn|gov\\.et|gov\\.sa|gov\\.ae|com\\.tt|art\\.dz|firm\\.ve|com\\.sd|school\\.nz|edu\\.et|gob\\.pa|telecom\\.na|ac\\.cy|gz\\.cn|net\\.kw|mobil\\.nr|nic\\.uk|co\\.th|com\\.vu|com\\.re|belgie\\.be|nl\\.ca|uk\\.com|com\\.om|utazas\\.hu|presse\\.fr|co\\.ck|xz\\.cn|org\\.tr|mil\\.co|edu\\.cn|net\\.ec|on\\.ca|konyvelo\\.hu|gop\\.pk|net\\.om|info\\.ve|com\\.ni|sa\\.com|com\\.tr|sch\\.sd|fukushima\\.jp|tel\\.nr|atm\\.pl|kitakyushu\\.jp|com\\.qa|firm\\.co|edu\\.tt|games\\.hu|mil\\.nz|cri\\.nz|net\\.az|org\\.ge|mie\\.jp|net\\.mx|sch\\.ae|nieruchomosci\\.pl|int\\.vn|edu\\.za|com\\.cy|wakayama\\.jp|gov\\.hk|org\\.pa|edu\\.au|gov\\.in|pro\\.om|2000\\.hu|szkola\\.pl|shimane\\.jp|co\\.zw|gove\\.tw|com\\.co|net\\.ck|net\\.pk|net\\.ve|org\\.ru|uk\\.net|org\\.co|uu\\.mt|com\\.cu|mil\\.za|plc\\.uk|lkd\\.co\\.im|gs\\.cn|sex\\.hu|net\\.je|kumamoto\\.jp|mil\\.lb|edu\\.yu|gov\\.ws|sendai\\.jp|eu\\.org|ah\\.cn|net\\.vn|gov\\.sb|net\\.pe|nagoya\\.jp|geometre-expert\\.fr|net\\.fk|biz\\.tt|org\\.sh|edu\\.sa|saga\\.jp|sx\\.cn|org\\.je|org\\.ye|muni\\.il|kochi\\.jp|com\\.bh|org\\.ec|priv\\.at|gov\\.sy|org\\.ni|casino\\.hu|res\\.in|uy\\.com)" //var tldStr = "\.(?:(?:[a-z0-9]{2}\.)?[a-z0-9]{2,3}|(?:[a-z]+\.)?jp)"; res = tldRes[1] + tldStr + tldRes[3]; } return res + "$"; }).join('|'); return new RegExp(regstr); }, _isURLMatching: function(url) { return !this._disabled && this._includeRegExp.test(url) && (!this._excludeRegExp || !this._excludeRegExp.test(url)); }, _getResource: function() { var self = this; if (this._requires.length) { for (let i = 0, l = this._requires.length; i < l; i++) { let requireURL = this._requires[i]; let json = this._resourceStorage.getValue(requireURL); if (json) { json = JSON.parse(json); let val = json.bytes; try { val = decodeURIComponent(escape(val)); } catch (e) { } this._requireSrc += val + '\n'; continue; } getContents(requireURL, function(bytes, contentType){ var js = { bytes: bytes, contentType: contentType }; js = JSON.stringify(js); self._resourceStorage.setValue(requireURL, js); let val = bytes; try { val = decodeURIComponent(escape(val)); } catch (e) { } self._requireSrc += val + '\n'; }); } } for (let n in this._resources) { let resourceURL = this._resources[n]; let json = this._resourceStorage.getValue(resourceURL); if (json) { json = JSON.parse(json); this._resourceValues[n] = json; continue; } getContents(resourceURL, function(bytes, contentType){ let obj = { bytes: bytes, contentType: contentType }; let json = JSON.stringify(obj); self._resourceStorage.setValue(resourceURL, json); self._resourceValues[n] = obj; }); } } }; function Console() {} Console.prototype = { log: function(str){ Application.console.log(str); }, time: function(name) { this['_' + name] = new Date().getTime(); }, timeEnd: function(name) { if (typeof this['_' + name] == 'undefined') return this.log('timeEnd: Error' + name); this.log(name + ':' + (new Date().getTime() - this['_' + name])); delete this['_' + name]; }, }; ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"] .forEach(function(name){ if (name in this) return; this[name] = function(){}; }, Console.prototype); function getContents(aURL, callback){ try{ urlSecurityCheck(aURL, gBrowser.contentPrincipal,Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL); }catch(ex){ return; } var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); var channel = ioService.newChannel(aURL,null,null); if (channel.URI.scheme != 'http' && channel.URI.scheme != 'https') return error('getContents is "http" or "https" only'); var listener = { data: "", onStartRequest: function (request, context) { this.data = ""; }, onDataAvailable: function (request, context, inputStream, offset, count) { var bs = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream); bs.setInputStream(inputStream); var n = bs.available(); var bytes = bs.readBytes(n); this.data += bytes; bs.close(); }, onStopRequest: function (request, context, statusCode) { if (Components.isSuccessCode(statusCode)) { this.callback.apply(this, [this.data, channel.contentType]); } else { } }, callback: callback }; channel.asyncOpen(listener, null); debug("getContents: " + aURL); } function GM_addStyle(code, doc) { var head = doc.getElementsByTagName('head')[0]; if (head) { var style = doc.createElement('style'); style.type = 'text/css'; style.appendChild(doc.createTextNode(code)); head.appendChild(style); return style; } } function GM_xmlhttpRequest(obj) { if(typeof(obj) != 'object' || (typeof(obj.url) != 'string' && !(obj.url instanceof String))) return; var req = new XMLHttpRequest(); req.open(obj.method || 'GET',obj.url,true); if(typeof(obj.headers) == 'object') for(var i in obj.headers) req.setRequestHeader(i,obj.headers[i]); ['onload','onerror','onreadystatechange'].forEach(function(k) { if(obj[k] && (typeof(obj[k]) == 'function' || obj[k] instanceof Function)) req[k] = function() { obj[k]({ status : (req.readyState == 4) ? req.status : 0, statusText : (req.readyState == 4) ? req.statusText : '', responseHeaders : (req.readyState == 4) ? req.getAllResponseHeaders() : '', responseText : req.responseText, readyState : req.readyState, finalUrl : (req.readyState == 4) ? req.channel.URI.spec : '' }); }; }); if(obj.overrideMimeType) req.overrideMimeType(obj.overrideMimeType); var c = 0; var timer = setInterval(function() { if(req.readyState == 1 || ++c > 100) { clearInterval(timer); req.send(obj.data || null); } },10); debug('GM_xmlhttpRequest ' + obj.url); } function log(str) { Application.console.log(str); } function debug() { if (ns.DEBUG) Application.console.log('DEBUG: ' + Array.slice(arguments));} function error(str) { var consoleSvc = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService); var err = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError); err.init(str, null, null, null, null, err.errorFlag, null); consoleSvc.logMessage(err); } // http://gist.github.com/321205 function $(id) document.getElementById(id); function $E(xml, doc) { doc = doc || document; xml = <root xmlns={doc.documentElement.namespaceURI}/>.appendChild(xml); var settings = XML.settings(); XML.prettyPrinting = false; var root = new DOMParser().parseFromString(xml.toXMLString(), 'application/xml').documentElement; XML.setSettings(settings); doc.adoptNode(root); var range = doc.createRange(); range.selectNodeContents(root); var frag = range.extractContents(); range.detach(); return frag.childNodes.length < 2 ? frag.firstChild : frag; } (function(){ const currentRevision = 1.1; const namespace = 'GrieverWindowStore'; if (namespace in window && window[namespace].version >= currentRevision) return; var fxver = parseFloat(Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULAppInfo).version); var table = []; var data = []; window[namespace] = fxver >= 4? { version: currentRevision, get table() table, get data() data, getId: function(obj) { if (!obj || obj instanceof Window === false) return -1; try { return obj .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils) .currentInnerWindowID; } catch(e) { Cu.reportError(e); } return -1; }, indexOf: function(id) { return table.indexOf(id); }, get: function(obj){ if (obj instanceof Window === false) return null; var id = this.getId(obj); var index = this.indexOf(id); if (index >= 0) return data[index]; var url = obj.location.href; var dataObj = { toString: function() url, id: id }; table.push(id); data.push(dataObj); obj.addEventListener('pagehide', this, false); return dataObj; }, delete: function(obj){ if (obj instanceof Window === false) return false; var id = this.getId(obj); var index = this.indexOf(id); if (index == -1) return false; table.splice(index, 1); data.splice(index, 1); return true; }, handleEvent: function(event) { switch (event.type) { case 'pagehide': event.currentTarget.removeEventListener('pagehide', this, false); this.delete(event.currentTarget); break; } }, } : { version: currentRevision, get table() table, get data() data, indexOf: function(obj) { if (!(obj instanceof Window)) return -1; var id = -1; table.some(function(e, i, a) e == obj? (id = i, true) : false); return id; }, get: function(obj){ if (!(obj instanceof Window)) return null; var id = this.indexOf(obj); if (id >= 0) return data[id]; var url = obj.location.href; var dataObj = { toString: function() url }; table.push(obj); data.push(dataObj); obj.addEventListener('pagehide', this, false); return dataObj; }, delete: function(obj){ if (!(obj instanceof Window)) return false; var id = this.indexOf(obj); if (id == -1) return false; table.splice(id, 1); data.splice(id, 1); return true; }, handleEvent: function(event) { switch (event.type) { case 'pagehide': event.currentTarget.removeEventListener('pagehide', this, false); this.delete(event.currentTarget); break; } }, } })(); return ns; })(); window.UserScriptLoader.init();
Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.
А как в этой кнопке добавить к определенному скрипту исключения, как это можно сделать в Greasemonkey и Scriptish?
Отсутствует
Добрый всем...
Нужна кнопка "закладок", без излишеств, что бы можно было вставить разделительную полосу и создавать папки, внутри которых еще закладки.
Столбец с закладками сайтов - (разделительная полоса) - папки с закладками. (с верху в низ если смотреть)
Что-то по типу того.
Отредактировано bziki.t4 (10-03-2012 18:48:00)
Отсутствует
bziki.t4
Есть Bookmarks Folder, позволяет выбрать любую папку с закладками для отображения только ее содержимого, то есть создаем специальную папку с закладками, и там создаем все что нужно.
Отредактировано Kamui (10-03-2012 19:08:15)
Отсутствует
А как в этой кнопке добавить к определенному скрипту исключения, как это можно сделать в Greasemonkey и Scriptish?
Наверное никак, исключения надо вносить в скрипт.
Отсутствует
Подскажите пожалуйста схему(скрипт) - включения\выключения расширения Multi Links
для последующего добавления в FireGestures
Отсутствует
Подскажите пожалуйста схему(скрипт) - включения\выключения расширения Multi Links
для последующего добавления в FireGestures
Этот Multi Links без рестарта не включишь\выключишь.
//Переключить "Multi Links" Components.utils.import("resource://gre/modules/AddonManager.jsm"); AddonManager.getAddonsByTypes(["extension"], function(addons) { for(var i = 0, l = addons.length; i < l; i++) if(addons[i].name == "Multi Links") { addons[i].userDisabled = !addons[i].userDisabled; } }); //Рестарт... const nsIAppStartup = Components.interfaces.nsIAppStartup; // Notify all windows that an application quit has been requested. var os = Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService); var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"] .createInstance(Components.interfaces.nsISupportsPRBool); os.notifyObservers(cancelQuit, "quit-application-requested", "restart"); // Something aborted the quit process. if (!cancelQuit.data) Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup) .quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit);
Отсутствует
Открытие "Настроек" во вкладке
Выделить кодКод:
getBrowser (). selectedTab = getBrowser (). addTab ("chrome://browser/content/preferences/preferences.xul");вызывает уменьшение окна браузера . Приходится нажимать кнопку окна "Восстановить" Вопрос :как этого избежать или не допустить?
Есть вот такая кнопка"Восстановить\развернуть на весь экран"
if(window.windowState == 1) window.restore(); else if(window.windowState == 3) window.maximize();
Как их объединить в одну кнопку. То есть при нажатии на кнопку открываются "Настройки" в новой вкладке и восстанавливается размер окна браузера.
Bookmarks Folder
Вопрос :как сделать ,чтобы папка открывалась не нажатием, а наведением курсора мыши на кнопку.
Отредактировано lokiju (14-03-2012 22:07:41)
Отсутствует
Этот Multi Links без рестарта не включишь\выключишь.
Нет, зачем мне рестарт?
У расширения есть кнопочка вкл\выкл, но она мёртво привинчена к статус-бару, я её перенёс в панель дополнений, но вместе со статус-баром,
в общем, какая-то она маленькая.
Я думал может можно скриптом включать\выключать,
или если кнопкой, то без рестарта.
Но если только с рестартом, то нет так нет.
Отсутствует
Как их объединить в одну кнопку. То есть при нажатии на кнопку открываются "Настройки" в новой вкладке и восстанавливается размер окна браузера.
var tab = gBrowser.addTab('chrome://browser/content/preferences/preferences.xul'); gBrowser.selectedTab = tab; var browser = gBrowser.getBrowserForTab(tab); browser.addEventListener('DOMContentLoaded', function(event){ setTimeout(function() { window.maximize(); }, 0) }, false)
Bookmarks Folder
Вопрос :как сделать ,чтобы папка открывалась не нажатием, а наведением курсора мыши на кнопку.
Можно добавить в инициализацию кнопки
но лучше спросить у автора - Infocatcherа
Отредактировано bunda1 (14-03-2012 22:55:44)
Отсутствует
bunda1
спасибо.
lokiju пишетBookmarks Folder
Вопрос :как сделать ,чтобы папка открывалась не нажатием, а наведением курсора мыши на кнопку.Можно добавить в инициализацию кнопки
но лучше спросить у автора - Infocatcherа
Не работает. Буду ждать ответа от Infocatcherа
Отредактировано lokiju (14-03-2012 23:15:59)
Отсутствует
Спасибо за подсказку. Я в начало добавлял - не работало.
Ну да, просто там уже есть задание this.onmouseover – для раскрытия меню при наведении, если на той же панели есть другое открытое меню (это другое меню при этом закрывается).
Так что если хочется закрывать соседние меню, надо править исходную функцию, а не переопределять ее:
this.onmouseover = function(e) { if(e.target != this) return; Array.some( this.parentNode.childNodes, function(node) { if( node != this && node.namespaceURI == xulns && node.boxObject && node.boxObject instanceof Components.interfaces.nsIMenuBoxObject && node.open ) { node.open = false; //this.open = true; return true; } return false; }, this ); this.open = true; };
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
если сделать так(№4274), то после раскрытия Bookmarks Folder по наведению курсора мыши на кнопку, также (по наведению курсора мыши на кнопку) раскрывается и Session Bookmarks(однократно), что мне не надо.
Возможно это только у меня. Спасибо за внимание.
Отредактировано lokiju (16-03-2012 14:57:38)
Отсутствует