15楼#
发布于:2019-05-22 15:28
|
|
16楼#
发布于:2019-05-22 15:31
|
|
17楼#
发布于:2019-05-22 15:54
lonely_8:12 楼的代码,本论坛 代码语法高亮插件的锅,在麻烦下大神。下面的代码改了下这5个功能还是都不起作用。 // ==UserScript== // @name Tabplus.uc.js // @description 设置标签的打开方式 // @update 2018-04-20 // @license MIT License // @compatibility Firefox 57+ // @charset UTF-8 // @include chrome://browser/content/browser.xul // ==/UserScript== // 01. 空白标签处双击新建标签 gBrowser.tabContainer.addEventListener('dblclick', function(event) { if (event.target.localName != 'tabs' && event.target.localName != 'toolbarbutton') { return; } gBrowser.selectedTab = gBrowser.addWebTab('about:newtab'); event.preventDefault(); event.stopPropagation(); }); // 02. 历史记录在新标签打开 (function() { if (location.href.startsWith('chrome://browser/content/browser.x')) return; eval('PlacesUIUtils.openNodeWithEvent = ' + PlacesUIUtils.openNodeWithEvent.toString() .replace(' && PlacesUtils.nodeIsBookmark(aNode)', '') .replace('getBrowserWindow(window)', '(window && window.document.documentElement.getAttribute("windowtype") == "navigator:browser") ? window : BrowserWindowTracker.getTopWindow()') ); let onPopupshowing = function() { let historyMenu = document.getElementById('history-menu'); if (!historyMenu._placesView) { new HistoryMenu(event); historyMenu._placesView._onCommand = function HM__onCommand(aEvent) { let placesNode = aEvent.target._placesNode; if (placesNode) { PlacesUIUtils.openNodeWithEvent(placesNode, aEvent); }; }; }; }; let historyPopup = document.getElementById('goPopup'); historyPopup.setAttribute('onpopupshowing', '(' + onPopupshowing.toString() + ')()'); })(); // 03. 主页按钮在新标签打开 (function() { // 新标签打开:主页按钮(排除about:blank和about:newtab) try { eval("BrowserHome = " + BrowserHome.toString() .replace(/switch \(where\) {/, "where = (gBrowser.currentURI.spec!="+"'about:blank' && gBrowser.currentURI.spec!="+"'about:newtab' || gBrowser.webProgress.isLoadingDocument"+") ? 'tab' : 'current'; $&")); }catch(e){} })(); // 04. 在新标签页查看图片 if (location.href.startsWith('chrome://browser/content/browser.x')) && (function () { document.querySelector("#context-viewimage").setAttribute("oncommand", 'openTrustedLinkIn(gContextMenu.imageURL,"tab")'); })(); // 05. 重新载入全部标签页 if (location.href.startsWith('chrome://browser/content/browser.x')) && (() => { const reloadTab = document.getElementById('context_reloadTab'); if(!reloadTab) return; const menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('accesskey', 'A'); menuitem.setAttribute('label', reloadTab.getAttribute('label') .startsWith('Reload') ? 'Reload All Tabs' : '重新载入全部标签页' ); menuitem.addEventListener('command', () => { gBrowser.visibleTabs.forEach(tab => { try { gBrowser.getBrowserForTab(tab).reload(); } catch (e) {} }); }); reloadTab.after(menuitem); })(); |
|
18楼#
发布于:2019-05-22 15:57
|
|
19楼#
发布于:2019-05-22 16:05
|
|
20楼#
发布于:2019-05-22 16:09
|
|
21楼#
发布于:2019-05-22 16:20
|
|
22楼#
发布于:2019-05-22 16:29
|
|
23楼#
发布于:2019-05-22 16:38
|
|
24楼#
发布于:2019-05-22 16:41
|
|
25楼#
发布于:2019-05-22 16:47
|
|
26楼#
发布于:2019-05-22 16:56
lonely_8:好吧,我也乱了,30行整行改为麻烦了你下午,真的是太感谢了,现在我自己修改了好多,基本就剩下两个脚本了,在麻烦帮我看看这是第一个 这个脚本可以加载,但是功能不完整了,右键点击图标不起作用了。在麻烦看看 // ==UserScript== // @Name UndoCloseTabBtn.uc.js // @namespace UndoCloseTab@gmail.com // @description 可移动恢复已关闭标签按钮 // @author defpt // @charset UTF-8 // @Compatibility FF57+ // @version v2018.04.04 更新兼容57+ by runningcheese // @version v2014.09.15 // ==/UserScript== (function() { if(document.getElementById('undoclosetab-button')) return; CustomizableUI.createWidget({ id: 'undoclosetab-button', label: '恢复最后关闭的标签', tooltiptext: '左键:恢复最后关闭的标签\n右键:显示关闭标签菜单', defaultArea : CustomizableUI.AREA_NAVBAR, onCreated: (uCTBtn) => { uCTBtn.setAttribute('context', '_child'); //点击按钮恢复最后一次关闭的标签 //如果想左键恢复最后一次关闭的标签,右键打开已关闭标签列表,那么改为(context: "_child",) //如果想改成菜单形式的,那么改为(type: "menu-button",) uCTBtn.setAttribute('command', 'History:UndoCloseTab'); uCTBtn.appendChild($C('menupopup', { oncommand: 'event.stopPropagation();', onpopupshowing: 'this.parentNode.populateUndoSubmenu();', context: '', tooltip: 'bhTooltip', popupsinherittooltip: 'true' })); uCTBtn._getClosedTabCount = HistoryMenu.prototype._getClosedTabCount; uCTBtn.populateUndoSubmenu = eval('(' + HistoryMenu.prototype.populateUndoSubmenu.toString().replace(/\.undoTabMenu/g, '') + ')'); } }); document.insertBefore(document.createProcessingInstruction( 'xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ #undoclosetab-button menuitem {max-width: 240px;}\ #undoclosetab-button .toolbarbutton-icon {list-style-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABuUlEQVRIib2VL08DQRDFKxANqahErijJte/N5pI2oQlNuA+AqEBUkHAJAkMIAhJERYNBICr4ABUIFKlEIBA4DAJRgUBUIJpgKioqitkry8H9CxcmmeQutzu/eTO5mULhP4xkA0Ar6ruIOCR3SZ4A6JrnRhaAR3JqQ5RSRQDHJMckFxE+JtlzXbccCwDQMRemAFpaa5J8jQkc9ncRaccBfOvw1HjwPhORvjnTAFAB0BGRfkjdXEQOo2rs/5YZgIGIbEUlJiKOAc3MnQ8Ae0kKlvUFsBZb2y9Qm+Tc3Jv86AnJo4ja3lar1fU0EJKXlvLz8MdeTAOHnuetJAFc1y1bPZlkASwAXKVU0bPuuN/ojuOoOE+jAsCOBfDTJJXJarXahqX8NHeA+UEDBd3cASJyYCnYzx0AYBAAtNbNvINvknwxgKd6vb6aK4DkfZB95EyysimJyBmAUprgZkcEwe+SDq8FUgG8kfSizppF9Gg1dpI4vwBUSI7sMUzy2YzsjvELkkNrwAVjfjuN4mCu3GRYOCOtNVMFD6lpkbwOLaDlIiL5AMBPM0ZiTSlVNPX2SHpa66ZSqvinoHnZJ3jLDwknYoRNAAAAAElFTkSuQmCC")}\ ') + '"'), document.documentElement); function $C(name, attr) { var el = document.createElement(name); if (attr) Object.keys(attr).forEach(function(n) { return el.setAttribute(n, attr[n]);}); return el; } })(); |
|
27楼#
发布于:2019-05-22 17:00
还有最后要改的脚本,改了以后,还是不起作用,再麻烦看看,万谢!
// ==UserScript== // @name rebuild_userChrome.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description UC脚本管理器 // @charset utf-8 // @include main // @compatibility Firefox 61 // @author Alice0775 // @version 2018/04/14 00:00 de XUL // @version 2017/11/23 23:00 Services :( // @version 2017/11/14 21:00 use nsIFile instead nsILocalFile // @version 2017/11/14 21:00 use Services.jsm // @version 2016/11/28 21:00 remove "for each" // @version 2015/12/04 24:00 Bug 1177310 [e10s] Stop using CPOWs on application shutdow // @version 2013/03/20 24:00 force cancel default right click action for unknown modification // @version 2013/03/22 08:02 Added "use strict" // @version 2013/03/22 08:01 Fixed commands to work properly, even if menus had been moved into other place // @version 2013/03/22 08:00 Fixed dragdrop target // @version 2013/03/20 24:00 autocheck=false for script menu // @version 2012/11/30 22:00 ubuntu12.04.1 "chromeフォルダを開く" に失敗することがあるのを修正 // ==/UserScript== // @version 2012/09/30 09:00 ubuntu12.04.1 "chromeフォルダを開く" に失敗することがあるのを修正 // @version 2012/02/25 23:00 restart // @version 2010/10/25 22:00 Bug 574688 adon bar // @version 2010/07/04 00:00 nsDragAndDrop // @version 2009/11/14 00:00 Seamonkeyに対応 // @version 2009/08/24 00:00 Namoroka3.6a2pre で右クリックでのスクリプト編集時にコンテキストメニューが表示されるのを修正 // @version 2009/04/10 00:00 Minefield3.6a1pre での動作改善 // @version 2009/03/27 00:00 nsIProcess変更 // @version 2008/02/25 00:00 reuseのデフォルト値trueに変更 // @version 2008/01/09 02:00 スクリプト保存ファイルピッカーをキャンセル時のエラー処理追加 // @version 2008/01/04 16:00 スクリプトのドロップをstatusbar-display上に変更 // @version 2007/12/15 18:00 base64データスキームの保存に対応 // @version 2007/12/15 02:00 ttp://の保存に対応 // @version 2007/12/15 01:00 メニューが表示されない場合があるのを修正 // @version 2007/12/14 23:00 saveFolderModokiがある時スクリプトのリンクをステータスバーの左1/3にドロップすることで, chrmeホルダに保存するようにした // @version 2007/12/14 19:00 日本語のファイル名のスクリプトの有効/無効が機能していなかったのを修正 // @version 2007/12/14 17:00 スクリプトの有効/無効/編集を設定できるようにした // @Note 使用するエディタを編集しておくこと // @Note Required Sub-Script/Overlay Loader v3.0.38mod( https://github.com/alice0775/userChrome.js/blob/master/userChrome.js ) Components.utils.import('resource://gre/modules/Services.jsm'); // 要移动的菜单列表,移动到一起统一管理。 var movedMenus = [ "anoBtn_set", // AnotherButton按钮菜单 "addMenu-rebuild", // addMenu 的重新载入配置 "toolsbar_KeyChanger_rebuild", //KeyChanger "FloatingScrollbar", //浮动滚动条 "ucjs_getUCJS_toolmenu",//更新userChrome.js //"AwesomeBookmarkbar_set", //智能书签栏配置 //"ucjsMouseGestures_menues",//鼠标手势配置 //"RefererChanger", //"wordhighlight-toolbar-menuitem", // WordHighlightToolbar.uc.js //"sw-menuitem", // siteinfo_write // "easydragMODOption", // easydrag_customMOD.uc.js // "JSCSS-menuitem", // js、css、ahk 代码着色 // "uSuper_preloader-menuitem", // "GrabScroll_optionsMenu", // "Patch_XULrubySupportMenu", // "menutabTooltip", // "PipeliningToggle", // "linkInNewTabForSpecifiedPageToolMenu", // "ieviewModokiTool", // "linkloadInBackgroundToolMenu", // "SaveFolderToolsMenu", // "ucjs_copysysinfo-menu" ]; var userChromejs = { // --- config --- editor: "\\Local\\Notepad2\\Notepad2.exe", // editor: "/usr/bin/gedit", // --- config --- _statusDisplay: null, get statusDisplay() { if (!this._statusDisplay) this._statusDisplay = document.getElementById('status-bar') || document.getElementById('statusbar-display'); return this._statusDisplay; }, _addonbar: null, get addonbar() { if (!this._addonbar) this._addonbar = document.getElementById('addon-bar'); return this._addonbar; }, handleEvent: function(event) { switch(event.type) { case 'dragover': this.dragover(event); break; case 'drop': this.drop(event); break; case 'unload': this.uninit(); break; } }, createElement: function(localName, arryAttribute) { let elm = document.createXULElement(localName); for(let i = 0; i < arryAttribute.length; i++) { elm.setAttribute(arryAttribute[i].attr, arryAttribute[i].value); } return elm; }, init: function(){ window.addEventListener("unload",this , false); let ref = document.getElementById("menu_preferences"); let menu = ref.parentNode.insertBefore( this.createElement("menu", [{attr: "id", value:"userChrome.js_menu"}, {attr: "label", value:"UC脚本管理"}, {attr: "accesskey", value:"u"} ]), ref); let popup = menu.appendChild(this.createElement("menupopup", [{attr: "id", value:"userChromejs_options"}, {attr: "onpopupshowing", value:"userChromejs.onpopup()"}, {attr: "context", value:""} ])); popup.appendChild(this.createElement("menuitem", [{attr: "id", value:"userChrome_setting"}, {attr: "label", value:"每个新窗口都重载脚本"}, {attr: "accesskey", value:"u"}, {attr: "oncommand", value:"userChromejs.setting();"}, {attr: "type", value:"checkbox"} ])); popup.appendChild(this.createElement("menuitem", [{attr: "label", value:"打开新窗口并重载脚本"}, {attr: "accesskey", value:"x"}, {attr: "oncommand", value:"userChromejs.rebuild();"} ])); /* popup.appendChild(this.createElement("menuitem", [{attr: "label", value:"重新启动浏览器"}, {attr: "accesskey", value:"r"}, {attr: "oncommand", value:"userChromejs.restartApp();"} ])); */ popup.appendChild(this.createElement("menuitem", [{attr: "label", value:"打开Chrome文件夹"}, {attr: "accesskey", value:"h"}, {attr: "oncommand", value:'new Components.Constructor("@mozilla.org/file/local;1","nsIFile", "initWithPath")(Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("UChrm", Components.interfaces.nsIFile).path).reveal();'} ])); popup.appendChild(this.createElement("menuseparator", [{attr: "label", value:""}, {attr: "accesskey", value:""}, {attr: "oncommand", value:""} ])); let menuu = popup.appendChild(this.createElement("menu", [{attr: "id", value:"userChromejs_script_options_Menu"}, {attr: "label", value:"用户脚本设置"}, {attr: "accesskey", value:"s"} ])); let popupp = menuu.appendChild(this.createElement("menupopup", [{attr: "id", value:"userChromejs_script_options"} ])); if ("nsDragAndDrop" in window && this.statusDisplay) { this.statusDisplay.addEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true); this.statusDisplay.addEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true); } else if(this.addonbar) { this.addonbar.addEventListener('dragover', this ,true); this.addonbar.addEventListener('drop', this ,true); } this.addPrefListener(userChromejs.readLaterPrefListener); // 登録処理 }, uninit: function(){ if ("nsDragAndDrop" in window && this.statusDisplay) { this.statusDisplay.removeEventListener('dragover',function(event){nsDragAndDrop.dragOver(event,userChromejs.dndObserver);},true); this.statusDisplay.removeEventListener('dragdrop',function(event){nsDragAndDrop.drop(event,userChromejs.dndObserver);},true); } else if(this.addonbar) { this.addonbar.removeEventListener('dragover', this ,true); this.addonbar.removeEventListener('drop', this ,true); } this.removePrefListener(userChromejs.readLaterPrefListener); // 登録解除 }, dragover: function(event) { var dragService = Cc["@mozilla.org/widget/dragservice;1"] .getService(Ci.nsIDragService); var dragSession = dragService.getCurrentSession(); var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"]; for (let type of supportedTypes) { if (event.dataTransfer.types.contains(type)) { var data = event.dataTransfer.getData(type); var url = (/^\s*(.*?)\s*$/m.test(data)) ? RegExp.$1 : null; if (/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)) { dragSession.canDrop = true; event.preventDefault(); return; } } } }, drop: function(event) { var dragService = Cc["@mozilla.org/widget/dragservice;1"] .getService(Ci.nsIDragService); var dragSession = dragService.getCurrentSession(); var supportedTypes = ["text/x-moz-url", "text/unicode", "application/x-moz-file"]; for (let type of supportedTypes) { if (event.dataTransfer.types.contains(type)) { var data = event.dataTransfer.getData(type); this.dndObserver.onDrop(event, {data: data}, dragSession); return; } } }, dragDropSecurityCheck: function dragDropSecurityCheck(event, dragSession, url) { if (!url) return false; // need to do a security check to make // sure the source document can load the dropped URI. url = url.replace(/^\s*|\s*$/g, ''); if (url.indexOf('chrome://') == 0 || url.indexOf('file://') == 0) return url; // urlSecurityCheck try { urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL); } catch(e) { event.stopPropagation(); //throw 'Drop of ' + url + ' denied.'; return false; } return url; }, dndObserver: { getSupportedFlavours : function () { var flavours = new FlavourSet(); flavours.appendFlavour("text/x-moz-url"); flavours.appendFlavour("text/unicode"); flavours.appendFlavour("application/x-moz-file"); return flavours; }, onDragOver: function (evt,flavour,session){}, onDrop: function (evt,dropdata,session){ var fname; evt.stopPropagation(); evt.preventDefault(); if (dropdata.data!=""){ //ステータスバーの左1/3にドロップしたか var target = evt.target; while(target){ if(target == userChromejs.statusDisplay || target == userChromejs.addonbar) break; target = target.parentNode; } if(!target) return; if(evt.screenX > target.boxObject.screenX + target.boxObject.width/3) return; //saveFolderModokiが必要 if(!saveFolderModoki) return; //ドロップしたurl var url = (/^\s*(.*?)\s*$/m.test(dropdata.data))?RegExp.$1:null; //保存ホルダ nsIFile var folder = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("UChrm", Components.interfaces.nsIFile); //デフォルトのファイル名 if(/(.*)\n?(.*)?/m.test(dropdata.data) ) fname = RegExp.$2?RegExp.$2:""; //データスキームか if(/(^data:text\/javascript(;.*)?,?)|(^data:application\/x-javascript(;.*)?,?)/.test(url)){ // urlSecurityCheck は saveFolderModoki.directSaveLinkで実施している saveScript(url, fname, folder); }else{ //リンクか if(!/(^h?ttps?:\/\/)|(^ftp:\/\/)/.test(url)) return; if (/^h?.?.p(s?):(.+)$/i.test(url)){ url = "http" + RegExp.$1 + ':' + RegExp.$2; if(!RegExp.$2) return null; fname = url.match(/.+\/(.+)$/)[1]; } fname = fname.replace(/\.uc\.xul\.txt$/,'.uc.xul'); //スクリプトファイルか? if(/(\.uc\.js|\.uc\.xul|\.uc\.xul\.txt)$/.test(url)){ if (typeof gBrowser.dragDropSecurityCheck == 'function') gBrowser.dragDropSecurityCheck(evt, session, url); else { userChromejs.dragDropSecurityCheck(evt, session, url) } saveScript(url, fname, folder); } } } function saveScript(url, fname, folder){ //ファイルピッカによりnsIFile決定 var aFile = getFolderPath(fname, folder) if(!aFile) return; //フォルダパス folder = aFile.path.replace(aFile.leafName,''); //nsILocalFileのフォルダ var aFolder = saveFolderModoki.initFileWithPath(folder); if(!aFolder) return; //リンクを保存 saveFolderModoki.directSaveLink(null, url, aFile.leafName, gBrowser.currentURI, aFolder); } function getFolderPath(fname, folder){ //ファイルピッカにより保存先決定 var fp = Components.classes['@mozilla.org/filepicker;1'] .createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Save script As", fp.modeSave); fp.appendFilter("Script Files","*.uc.js; *.uc.xul"); if(/\.uc\.js$/.test(fname)){ fp.defaultExtension = "uc.js"; fp.defaultString = fname; }else if(/\.uc\.xul$/.test(fname)){ fp.defaultExtension = "uc.xul"; fp.defaultString = fname; }else{ fp.defaultExtension = "uc.js"; fp.defaultString = fname + ".uc.js"; } fp.displayDirectory = folder; if ( fp.show() == fp.returnCancel || !fp.file ) return; //nsIFile return fp.file; } } }, rebuild: function(){ var flag = this.getPref("userChrome.enable.reuse",'bool',true); this.setPref("userChrome.enable.reuse",'bool',false); setTimeout(function(){OpenBrowserWindow();}, 0); setTimeout(function(self,flag){self.setPref("userChrome.enable.reuse",'bool',flag);},2000,this,flag); }, setting: function(){ var flag = this.getPref("userChrome.enable.reuse",'bool',true); this.setPref("userChrome.enable.reuse",'bool',!flag); }, onpopup: function(){ var menu; var flag = this.getPref("userChrome.enable.reuse",'bool',true); var menuitem = document.getElementById('userChrome_setting'); menuitem.setAttribute('checked', !flag); var menupopup = document.getElementById("userChromejs_options"); for(var i = 5, len = menupopup.childNodes.length; i < len; i++){ menupopup.removeChild(menupopup.lastChild); } var menuseparator = document.createXULElement('menuseparator'); menupopup.appendChild(menuseparator); menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('label','启用/禁用 UC脚本'); menuitem.setAttribute('oncommand','userChromejs.chgDirStat("*");'); menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event,true);'); menuitem.setAttribute('type','checkbox'); menuitem.setAttribute('checked', !userChrome_js.dirDisable['*']); menuitem.dirName = '*'; menupopup.appendChild(menuitem); for(var j = 0, lenj = userChrome_js.arrSubdir.length; j < lenj; j++){ var dirName = userChrome_js.arrSubdir[j] == "" ? "root" : userChrome_js.arrSubdir[j]; var flg = false; for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){ var script = userChrome_js.scripts[i]; if(script.dir != dirName) continue; flg = true; break; } if(!flg){ for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){ var script = userChrome_js.overlays[i]; if(script.dir != dirName) continue; flg = true; break; } } if(!flg) continue; menu = document.createXULElement('menu'); menu.setAttribute('label','chrome/' + (dirName=="root"?"":dirName) ); menu.setAttribute('onclick','userChromejs.clickDirMenu(event);'); if(userChrome_js.dirDisable[dirName]) menu.setAttribute('style', 'font-style:italic;'); menu.dirName = dirName; menupopup = document.createXULElement('menupopup'); menupopup.setAttribute('onpopupshowing','event.stopPropagation();'); menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('label','启用/禁用 ' + (dirName=="root"?"":dirName) + ' 下所有脚本'); menuitem.setAttribute('oncommand', 'userChromejs.chgDirStat(this.dirName);'); menuitem.setAttribute('onclick','userChromejs.clickDirMenuitem(event);'); menuitem.setAttribute('type', 'checkbox'); menuitem.setAttribute('checked', !userChrome_js.dirDisable[dirName]); menuitem.dirName = dirName; menupopup.appendChild(menuitem); menuseparator = document.createXULElement('menuseparator'); menupopup.appendChild(menuseparator); var flg = false; for(var i = 0, len = userChrome_js.scripts.length; i < len; i++){ var script = userChrome_js.scripts[i]; if(script.dir != dirName) continue; flg = true; menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('label',script.filename); menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);'); menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);'); menuitem.setAttribute('type','checkbox'); menuitem.setAttribute('autocheck','false'); menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] ); if(script.description) menuitem.setAttribute('tooltiptext',script.description); menuitem.script = script; menupopup.appendChild(menuitem); } for(var i = 0, len = userChrome_js.overlays.length; i < len; i++){ var script = userChrome_js.overlays[i]; if(script.dir != dirName) continue; if(flg){ menuseparator = document.createXULElement('menuseparator'); menupopup.appendChild(menuseparator); } flg = false; menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('label',script.filename); menuitem.setAttribute('oncommand','userChromejs.chgScriptStat(this.script.filename);'); menuitem.setAttribute('onclick','userChromejs.clickScriptMenu(event);'); menuitem.setAttribute('type','checkbox'); menuitem.setAttribute('autocheck','false'); menuitem.setAttribute('checked',!userChrome_js.scriptDisable[script.filename] ); if(script.description) menuitem.setAttribute('tooltiptext',script.description); menuitem.script = script; menupopup.appendChild(menuitem); } menu.appendChild(menupopup); menupopup = document.getElementById("userChromejs_options"); menupopup.appendChild(menu); } }, clickDirMenu: function(event){ if(event.button == 1 || event.button == 2){ event.stopPropagation(); event.preventDefault(); userChromejs.chgDirStat(event.target.dirName); if(event.target.firstChild && event.target.firstChild.firstChild) event.target.firstChild.firstChild.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] ); if(!!userChrome_js.dirDisable[event.target.dirName]) event.target.setAttribute('style', 'font-style:italic;'); else event.target.removeAttribute('style'); } }, clickDirMenuitem: function(event,stop){ if(event.button == 1 || event.button == 2){ event.stopPropagation(); event.preventDefault(); userChromejs.chgDirStat(event.target.dirName); event.target.setAttribute('checked',!userChrome_js.dirDisable[event.target.dirName] ); if(!stop && !!userChrome_js.dirDisable[event.target.dirName]) event.target.parentNode.parentNode.setAttribute('style', 'font-style:italic;'); else event.target.parentNode.parentNode.removeAttribute('style'); } }, clickScriptMenu: function(event){ if(event.button==1){ event.stopPropagation(); event.preventDefault(); userChromejs.chgScriptStat(event.target.script.filename); event.target.setAttribute('checked',!userChrome_js.scriptDisable[event.target.script.filename] ); }else if(event.button==2){ event.stopPropagation(); event.preventDefault(); this.launchEditor(event.target.script); } }, launchEditor: function(aScript){ var editor = this.editor; var UI = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); var platform = window.navigator.platform.toLowerCase(); if(platform.indexOf('win') > -1){ UI.charset = 'GB2312'; }else{ UI.charset = 'UTF-8'; } var path = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService).getProtocolHandler('file').QueryInterface(Components.interfaces.nsIFileProtocolHandler).getFileFromURLSpec(aScript.url).path path = UI.ConvertFromUnicode(path); var appfile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsIFile); appfile.initWithPath(editor); var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess); process.init(appfile); process.run(false, [path], 1, {}); }, chgDirStat: function(adirName){ var s = userChromejs.getPref("userChrome.disable.directory", "str", ""); if(!userChrome_js.dirDisable[adirName]){ s = (s+',').replace(adirName+',','') + adirName+','; }else{ s = (s+',').replace(adirName+',',''); } s = s.replace(/,,/g,',').replace(/^,/,''); userChromejs.setPref("userChrome.disable.directory", "str", s); userChrome_js.dirDisable = this.restoreState(s.split(',')); }, chgScriptStat: function(afilename){ var s = userChromejs.getPref("userChrome.disable.script", "str", ""); if(!userChrome_js.scriptDisable[afilename]){ s = (s+',').replace(afilename+',','') + afilename+','; }else{ s = (s+',').replace(afilename+',',''); } s = s.replace(/,,/g,',').replace(/^,/,''); userChromejs.setPref("userChrome.disable.script", "str", s); userChrome_js.scriptDisable = this.restoreState(s.split(',')); }, restoreState: function (arr){ var disable = []; for(var i = 0,len = arr.length; i < len; i++) disable[arr[i]] = true; return disable; }, //prefを読み込み getPref: function(aPrefString, aPrefType, aDefault){ var xpPref = Services.prefs; try { switch (aPrefType){ case 'complex': return xpPref.getComplexValue(aPrefString, Components.interfaces.nsIFile); break; case 'str': return unescape(xpPref.getCharPref(aPrefString).toString()); break; case 'int': return xpPref.getIntPref(aPrefString); break; case 'bool': default: return xpPref.getBoolPref(aPrefString); break; } } catch(e) {} return aDefault; }, //prefを書き込み setPref: function(aPrefString, aPrefType, aValue){ var xpPref = Services.prefs; try { switch (aPrefType){ case 'complex': return xpPref.setComplexValue(aPrefString, Components.interfaces.nsIFile, aValue); break; case 'str': return xpPref.setCharPref(aPrefString, escape(aValue)); break; case 'int': aValue = parseInt(aValue); return xpPref.setIntPref(aPrefString, aValue); break; case 'bool': default: return xpPref.setBoolPref(aPrefString, aValue); break; } } catch(e) {} return null; }, // 監視を開始する addPrefListener: function(aObserver) { try { var pbi = Services.prefs; pbi.addObserver(aObserver.domain, aObserver, false); } catch(e) {} }, // 監視を終了する removePrefListener: function(aObserver) { try { var pbi = Services.prefs; pbi.removeObserver(aObserver.domain, aObserver); } catch(e) {} }, readLaterPrefListener:{ domain : 'userChrome.disable', //"userChrome.disable"という名前の設定が変更された場合全てで処理を行う observe : function(aSubject, aTopic, aPrefstring) { if (aTopic == 'nsPref:changed') { // 設定が変更された時の処理 setTimeout(function(){ var s = userChromejs.getPref("userChrome.disable.directory", "str", ""); userChrome_js.dirDisable = userChromejs.restoreState(s.split(',')); s = userChromejs.getPref("userChrome.disable.script", "str", ""); userChrome_js.scriptDisable = userChromejs.restoreState(s.split(',')); }, 0); } } }, restartApp: function() { if ("BrowserUtils" in window && typeof BrowserUtils.restartApplication == "function") { Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULRuntime).invalidateCachesOnRestart(); BrowserUtils.restartApplication(); return; } const appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"] .getService(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", null); // Something aborted the quit process. if (cancelQuit.data) return; // Notify all windows that an application quit has been granted. os.notifyObservers(null, "quit-application-granted", null); // Enumerate all windows and call shutdown handlers var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); var windows = wm.getEnumerator(null); var win; while (windows.hasMoreElements()) { win = windows.getNext(); if (("tryToClose" in win) && !win.tryToClose()) return; } let XRE = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime); if (typeof XRE.invalidateCachesOnRestart == "function") XRE.invalidateCachesOnRestart(); appStartup.quit(appStartup.eRestart | appStartup.eAttemptQuit); } } userChromejs.init(); //メニューが長くなりすぎるので, あまり使わないメニューを"userChrome.jsの各スクリプトの設定"の下に移動させる var userChromejsScriptOptionsMenu = { //あまり使わないメニューのリスト menues: movedMenus, interval: 500, //0.5秒間隔 maxcount: 50, //最大50回までトライ count: 0, timer: null, run: function() { //DOMの構築が完了するのを待ってからメニューを移動させる(5秒間隔で最大50回までトライ) this.timer = setInterval(function(self){ if (++self.count > self.maxcount || self.moveMenu()) clearInterval(self.timer); }, this.interval, this); }, moveMenu: function(){ var menupopup = document.getElementById('userChromejs_script_options'); if (!menupopup) return false; var i = 0; while (i < this.menues.length) { var menu = document.getElementById(this.menues[i]) if (menu) { setTimeout(function(menupopup, menu){menupopup.appendChild(menu);}, 100, menupopup, menu); this.menues.splice(i, 1); continue; } i++; } return this.menues.length == 0 ? true : false; }, } userChromejsScriptOptionsMenu.run(); |
|
28楼#
发布于:2019-05-22 17:05
|
|
29楼#
发布于:2019-05-22 17:10
|
|