├── .gitignore ├── AboutConfigMultipleSelection.uc.js ├── AddBookmarkHere.uc.js ├── Bookmarkmenuplus.uc.xul ├── CustomAppMenu.uc.js ├── DefaultFullZoomLevel.uc.js ├── ExportHTMLFolder.uc.xul ├── GoogleSearchIcons.uc.js ├── README.md ├── SITEINFO_Writer.uc.js ├── SidebarModfix.uc.js ├── SimpleSessionManagerMod.uc.js ├── SnapLinksMod.uc.xul ├── UserAgentChangeModLite.uc.js ├── UserScriptLoader.uc.js ├── WordHighlightToolbar.uc.js ├── _uAutoPagerize.js ├── blur2revertMod.uc.js ├── bookmarkButtonLite.uc.xul ├── bookmarkButtonPlus.uc.xul ├── contextHistoryMenu.uc.xul ├── contextHistoryMenuLite.uc.xul ├── countryflags.js ├── externalAppButtonM.uc.js ├── externalAppButtonMEx.uc.js ├── externalFuncButtonM.uc.js ├── externalFuncMenu.uc.js ├── qrCreator.uc.js ├── qrCreatorOnline.uc.js ├── qrReader.uc.js ├── qrReaderOnline.uc.js ├── quickProxyModokiMod.uc.js ├── sendToGmail.uc.js ├── showLocationModEx.uc.js ├── showLocationModSpecial.uc.js ├── sideBookmarkBarMod.uc.js ├── uAutoPagerizeMod.uc.js └── urlfilterfast.uc.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Build and Release Folders 2 | bin/ 3 | bin-debug/ 4 | bin-release/ 5 | 6 | # Other files and folders 7 | .settings/ 8 | 9 | # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` 10 | # should NOT be excluded as they contain compiler settings and other important 11 | # information for Eclipse / Flash Builder. -------------------------------------------------------------------------------- /AboutConfigMultipleSelection.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name About:config Multiple Selection 3 | // @version 0.3 4 | // @description Allow multiple selection on about:config and more 5 | // @namespace https://github.com/nightson/ 6 | // @author NightsoN 7 | // @include chrome://browser/content/browser.xul 8 | // @note 0.3 add "Copy as Function" to the contextmenu. Now you can copy config entries in user_pref(xxx, xxx); format to be used in user.js 9 | // ==/UserScript== 10 | window.addEventListener('DOMContentLoaded', function (event) { 11 | var doc = event.target, 12 | win; 13 | if (!doc || !doc.location.href.startsWith('about:config')) return; 14 | doc.getElementById('configTree').setAttribute('seltype', 'multiple'); 15 | win = doc.defaultView; 16 | 17 | var contextMenu = doc.getElementById('configContext'), 18 | menuitem = contextMenu.insertBefore(doc.createElement('menuitem'), doc.getElementById('copyValue').nextSibling); 19 | menuitem.id = 'copyAsFunction'; 20 | menuitem.setAttribute('label', 'Copy as Function'); 21 | menuitem.setAttribute('accesskey', 'F'); 22 | menuitem.setAttribute('oncommand', 'copyAsFunction();'); 23 | 24 | win.getSelected = function () { 25 | var arr = [], 26 | i = 0, 27 | k = 0, 28 | j = win.view.selection.getRangeCount(), 29 | start = {}, 30 | end = {}; 31 | for (i; i < j; i++) { 32 | win.view.selection.getRangeAt(i, start, end); 33 | for (k = start.value; k <= end.value; k++) { 34 | arr.push(win.gPrefView[k]); 35 | } 36 | } 37 | return arr; 38 | } 39 | 40 | win.ResetSelected = function () { 41 | win.getSelected().forEach(function (i) { 42 | win.gPrefBranch.clearUserPref(i.prefCol); 43 | }) 44 | } 45 | 46 | win.copyPref = function () { 47 | var arr = []; 48 | win.getSelected().forEach(function (i) { 49 | arr.push(i.prefCol + ';' + i.valueCol); 50 | }); 51 | win.gClipboardHelper.copyString(arr.join('\n'), document); 52 | } 53 | 54 | win.copyName = function () { 55 | var arr = []; 56 | win.getSelected().forEach(function (i) { 57 | arr.push(i.prefCol); 58 | }); 59 | win.gClipboardHelper.copyString(arr.join('\n'), document); 60 | } 61 | 62 | win.copyValue = function () { 63 | var arr = []; 64 | win.getSelected().forEach(function (i) { 65 | arr.push(i.valueCol); 66 | }); 67 | win.gClipboardHelper.copyString(arr.join('\n'), document); 68 | } 69 | 70 | win.copyAsFunction = function () { 71 | var arr = []; 72 | win.getSelected().forEach(function (i) { 73 | if (i.typeCol === 32) { 74 | arr.push('user_pref("' + i.prefCol + '", "' + i.valueCol + '");'); 75 | } else { 76 | arr.push('user_pref("' + i.prefCol + '", ' + i.valueCol + ');'); 77 | } 78 | }); 79 | win.gClipboardHelper.copyString(arr.join('\n'), document); 80 | } 81 | 82 | }, true); 83 | -------------------------------------------------------------------------------- /AddBookmarkHere.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Add Bookmark Here 3 | // @namespace http://script.bitcp.com/addbookmarkhere 4 | // @description add "Add Bookmark Here" contextmenu in places menu 5 | // @author zbinlin 6 | // @homepage http://bitcp.com 7 | // @include main 8 | // @include chrome://browser/content/places/places.xul 9 | // @include chrome://browser/content/bookmarks/bookmarksPanel.xul 10 | // @version 0.0.1 11 | // @note modify by lastdream 2013: support sidebar addbookmarkhere 12 | // ==/UserScript== 13 | 14 | (function () { 15 | if (window.AddBookmarkHere) return; 16 | var AddBookmarkHere = { 17 | init: function () { 18 | var placesContext = document.getElementById("placesContext"); 19 | if (!placesContext) return; 20 | var self = this; 21 | window.addEventListener("unload", function (e) { 22 | window.removeEventListener("unload", arguments.callee, false); 23 | self.uninit(); 24 | }, false); 25 | this.addContextMenu(placesContext, document.getElementById("placesContext_new:bookmark")); 26 | /* 27 | var node = document.getElementById("placesContext_createBookmark"); 28 | if (!node) return; 29 | node.removeAttribute("forcehideselection"); 30 | node.setAttribute("selection", "any"); 31 | node.removeAttribute("command"); 32 | node.setAttribute("oncommand", "AddBookmarkHere.addBookmark(event);"); 33 | */ 34 | }, 35 | addContextMenu: function (parentNode, afterNode) { 36 | var menuitem = document.createElement("menuitem"); 37 | menuitem.id = "placesContext_add:bookmark"; 38 | menuitem.setAttribute("label", "\u6DFB\u52A0\u5230\u8FD9\u91CC"); 39 | menuitem.setAttribute("accesskey", "h"); 40 | menuitem.setAttribute("selection", "any"); 41 | menuitem.addEventListener("command", this.addBookmark, false); 42 | parentNode.insertBefore(menuitem, afterNode); 43 | }, 44 | addBookmark: function (e) { 45 | var popupNode = e.currentTarget.parentNode.triggerNode; 46 | if (!popupNode) return; 47 | var view = PlacesUIUtils.getViewForNode(popupNode); 48 | if (!view) return; 49 | var bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Ci.nsINavBookmarksService); 50 | var selectedNode = view.selectedNode; 51 | var iid, aid; 52 | if (selectedNode) { 53 | if (PlacesUtils.nodeIsFolder(selectedNode) && !PlacesUtils.nodeIsLivemarkContainer(selectedNode) && !PlacesUtils.isReadonlyFolder(selectedNode)) { 54 | iid = selectedNode.itemId; 55 | aid = e.shiftKey ? 0 : bookmarks.DEFAULT_INDEX; 56 | } else { 57 | iid = bookmarks.getFolderIdForItem(selectedNode.itemId); 58 | var id = bookmarks.getItemIndex(selectedNode.itemId); 59 | aid = e.shiftKey ? id : id + 1; 60 | } 61 | } else { 62 | iid = view.result.root.folderItemId; 63 | aid = e.shiftKey ? 0 : bookmarks.DEFAULT_INDEX; 64 | } 65 | //var doc = gBrowser.getBrowserForTab(gBrowser.mCurrentTab).contentDocument; 66 | var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 67 | .getInterface(Components.interfaces.nsIWebNavigation) 68 | .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 69 | .rootTreeItem 70 | .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 71 | .getInterface(Components.interfaces.nsIDOMWindow); 72 | var doc = mainWindow.gBrowser.getBrowserForTab(mainWindow.gBrowser.mCurrentTab).contentDocument; 73 | var uri = Services.io.newURI(doc.location.toString(), null, null); 74 | var title = doc.title; 75 | bookmarks.insertBookmark(iid, uri, aid, title); 76 | }, 77 | uninit: function () { 78 | try { 79 | var menuitem = document.getElementById("placesContext_add:bookmark"); 80 | menuitem.removeEventListener("command", this.addBookmark, false); 81 | } catch (ex) { 82 | } 83 | } 84 | }; 85 | 86 | AddBookmarkHere.init(); 87 | window.AddBookmarkHere = AddBookmarkHere; 88 | 89 | })(); 90 | -------------------------------------------------------------------------------- /Bookmarkmenuplus.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 13 | %browserDTD; 14 | 15 | %placesDTD; 16 | ]> 17 | 18 | 19 | 20 | 61 | 62 | 206 | 207 | 208 | 212 | 213 | 214 | 215 | 216 | -------------------------------------------------------------------------------- /GoogleSearchIcons.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name GoogleSearchIcons.uc.js 3 | // @note 20130614: modify by lastdream2013 for uAutoPagerize 4 | // @include main 5 | // ==/UserScript== 6 | 7 | (function () { 8 | var googleicon = function (doc) { 9 | if (!doc || !doc.location) return; 10 | if (doc.location.href.match(/^https?:\/\/.*\.google\..*\/search?.*$/i)) { 11 | 12 | // Check if already loaded 原来要注释掉了,为配合uAutoPagerize翻页 13 | //if(doc.getElementById("googleicon")) return; 14 | 15 | // Create Google Icon 16 | var div = doc.createElement("div"); 17 | div.id = "googleicon"; 18 | doc.body.appendChild(div); 19 | 20 | var results = doc.evaluate("//h3[contains(@class,'r')]/a", doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 21 | for (var i = results.snapshotLength - 1; i >= 0; i--) { 22 | var result = results.snapshotItem(i); 23 | 24 | if (result.firstChild.className == "googleicon") //Check if already loaded 25 | break; 26 | // Find url 27 | var url = result.href.replace(/<\S[^><]*>/g, ""); 28 | if (/^http:\/\/.*\.google\..*\/url\?.*$/i.test(url)) 29 | url = url.match(/&q=(.*?)&/)[1]; 30 | var safe = (url.indexOf("https://") < 0); 31 | if (url.match("google.com/interstitial?")) 32 | url = "chrome://googleicon/content/malware.png"; 33 | else 34 | url = "http://" + url.split('/')[2] + "/favicon.ico"; 35 | 36 | // Add icon 37 | (function (url) { 38 | var img = new Image(); 39 | img.width = 16; 40 | img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACG0lEQVQ4ja2TwW7aQBRF+ZDku0q/qChds5mxkDG2iY3H9jyTBFAWLAgRG7CwCawQi6BEQhgEFkiAuF3VaVXaSlWvdBazuGfx5r1c7n/H9/1rIvpCAUWS5E6S3FFAkU9+wff967+VP1FA6fPzMwaDAcbjMQaDAabTKSggEFEqpcxfLEvp5huNxnmxWGC73SIMQ9Tv6gjqAbrdLqT0Ub+rg4jOUro/S4QQV57nbZMkwel0wvF4xGazQafTgeu5GY1GA8PhEMITqRDiKhM4jnPTbrdxOBxwOByQJAlcz4UQ4heiKILruXAc52smsGzrpd/v4/X1FcPhEBQQ7Jp9kVarhdlsBsu2Xj4E1u3x/v4eRATLuv0tQT3AdDrFcrmEZd2eMoFZNXdm1cSP2DUbZtUEEYECglk1MRqNkKYp3t/fYZjGPhPohh7rhg7d0PH09IQ4jjGbzdBsNtHr9SBcAd3QMZlMMJ/PEYYhdEOPM0G5Ur7RKhoeHx+xWq2wXq+xXq/x9vaGVqsFraJBq2jQDT17l8vljyFyzq9UVd2qqoooirBarTLCMIRds6GqKgzTgOPUoKpqyjn/+MZcLpdTFCVfKpXOlm1huVwiSRIkSYLFYgGzauLh4QHNZhNaRTsrinJ5GxljeUVRUil99Ho9dLtduJ4LKX0QERRFSTnnny+Wv6dYLF4zxgqMsZhzvuec7xljMWOsUCwW/3xM/5JvTakQArDW8fcAAAAASUVORK5CYII="; 41 | img.className = "googleicon"; 42 | img.setAttribute("style", "border:0; padding-top:2px; padding-right:4px; display:block; float:left;"); 43 | result.insertBefore(img, result.firstChild); 44 | if (safe) { 45 | var newimg = new Image(); 46 | newimg.src = url; 47 | newimg.addEventListener("load", function (doc) { 48 | if (!img) return; 49 | img.src = url; 50 | }, false); 51 | } 52 | })(url); 53 | 54 | } 55 | } 56 | }; 57 | 58 | // Bind Google Icon 59 | var delay = function (aEvent) { 60 | var doc = aEvent.originalTarget; 61 | setTimeout(function () { 62 | googleicon(doc); 63 | }, 1); 64 | }; 65 | var load = function () { 66 | gBrowser.addEventListener("DOMContentLoaded", delay, true); 67 | gBrowser.addEventListener('GM_AutoPagerizeNextPageLoaded', delay, true); 68 | }; 69 | window.addEventListener("pageshow", load, false); 70 | 71 | })(); 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | userChromeJS 2 | ========== 3 | 4 | 这里的userChromeJS是我个人所使用过程中所原创,以及修改/bug修复别人的userChromeJS的版本。转载时请尊重所有原作者以及出处 5 | 如果您选择使用这些userChromeJS,请自行负责,作者不会为意外数据损害等情况承担责任。 6 | 7 | 20130509更新: 8 | 修复使用WordHighlightToolbar.uc.js中出现的问题,google搜索"JavaScript yield"之后,自动高亮条出现后,再点击跳转到: 9 | https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7 10 | 页面代码框中出现不应该的字段。 11 | 12 | 20130510更新: 13 | SimpleSessionManagerMod.uc.js 14 | 原作者为nightson, 0510mod版加强了一下功能: 15 | 1. 启动时可选自动恢复上一次会话或从弹出菜单中选择恢复(水平有限,先做了个简陋的弹出菜单会话列表……); 16 | 2. 如果启动时恢复的是退出的自动恢复会话,可选自动删除已恢复的会话; 17 | 3. 退出时可选自动保存会话或确认手动保存; 18 | 4. 可选自定义出现在火狐橙菜单下或以小图标方式出现(打开脚本可自定义,小图标位置可自定义) 19 | 5. 增加删除所有会话的菜单选项。 20 | 21 | -------------------------------------------------------------------------------- /SITEINFO_Writer.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name SITEINFO_Writer.uc.js 3 | // @description AutoPagerize の SITEINFO を書くためのスクリプト 4 | // @namespace http://d.hatena.ne.jp/Griever/ 5 | // @author Griever 6 | // @include main 7 | // @compatibility Firefox 5 - firefox 23a1 8 | // @charset UTF-8 9 | // @version 下書き1 10 | // @note 同步:增加下一页中文选择xpath By ywzhaiqi@gmail.com 11 | // @note fix compatibility for firefox 23a1 by lastdream2013 12 | // @note まだこれからつくり込む段階 13 | // @note ツールメニューから起動する 14 | // ==/UserScript== 15 | 16 | (function(css){ 17 | 18 | if (window.siteinfo_writer) { 19 | window.siteinfo_writer.destroy(); 20 | delete window.siteinfo_writer; 21 | } 22 | 23 | window.siteinfo_writer = { 24 | init: function() { 25 | this.style = addStyle(css); 26 | 27 | var overlay = '\ 28 | \ 30 | \ 31 | \ 96 | \ 97 | '; 98 | overlay = "data:application/vnd.mozilla.xul+xml;charset=utf-8," + encodeURI(overlay); 99 | window.userChrome_js.loadOverlay(overlay, window.siteinfo_writer); 100 | }, 101 | observe : function (aSubject, aTopic, aData) { 102 | if (aTopic == "xul-overlay-merged") 103 | { 104 | this.popup = $("mainPopupSet").appendChild($C("menupopup", 105 | { 106 | id : "sw-popup", 107 | class : "sw-add-element", 108 | } 109 | )); 110 | 111 | var menuitem = $C("menuitem", 112 | { 113 | class : "sw-add-element", 114 | label : "辅助查找翻页规则", 115 | oncommand : "siteinfo_writer.show();", 116 | } 117 | ); 118 | $("devToolsSeparator").parentNode.insertBefore(menuitem, $("devToolsSeparator")); 119 | 120 | setTimeout(function () 121 | { 122 | if (!window.uAutoPagerize) 123 | { 124 | $("sw-launch").hidden = true; 125 | return; 126 | }; 127 | 128 | let aupPopup = $("uAutoPagerize-popup"); 129 | if (aupPopup) 130 | { 131 | aupPopup.appendChild(document.createElement("menuseparator")).setAttribute("class", "sw-add-element"); 132 | aupPopup.appendChild(menuitem.cloneNode(false)); 133 | } 134 | }, 2000); 135 | 136 | this.container = $("sw-container"); 137 | this.url = $("sw-url"); 138 | this.siteName = $("sw-siteName"); 139 | this.nextLink = $("sw-nextLink"); 140 | this.pageElement = $("sw-pageElement"); 141 | this.insertBefore = $("sw-insertBefore"); 142 | 143 | this.nextLink.addEventListener("popupshowing", siteinfo_writer.pps, false); 144 | this.pageElement.addEventListener("popupshowing", siteinfo_writer.pps, false); 145 | this.insertBefore.addEventListener("popupshowing", siteinfo_writer.pps, false); 146 | } 147 | }, 148 | uninit : function () { 149 | }, 150 | 151 | pps: function(event) { 152 | event.currentTarget.removeEventListener(event.type, arguments.callee, false); 153 | var popup = event.originalTarget; 154 | var type = event.currentTarget.id.replace("sw-", ""); 155 | 156 | popup.appendChild($C("menuseparator",{})); 157 | popup.appendChild($C("menuitem", { 158 | label: '@class="xxx" → contains()', 159 | oncommand: "siteinfo_writer.class2contains('"+ type +"');", 160 | })); 161 | popup.appendChild($C("menuitem",{ 162 | label: 'contains() → @class="xxx"', 163 | oncommand: "siteinfo_writer.contains2class('"+ type +"');", 164 | })); 165 | }, 166 | destroy: function() { 167 | $A(document.getElementsByClassName("sw-add-element")).forEach(function(e){ 168 | e.parentNode.removeChild(e); 169 | }) 170 | this.style.parentNode.removeChild(this.style); 171 | }, 172 | setUrl: function() { 173 | this.url.value = "^" + content.location.href.replace(/[()\[\]{}|+.,^$?\\]/g, '\\$&'); 174 | this.url.className = ""; 175 | }, 176 | show: function() { 177 | this.setUrl(); 178 | this.siteName.value = content.document.title; 179 | this.nextLink.value = ""; 180 | this.pageElement.value = ""; 181 | this.insertBefore.value = ""; 182 | this.container.hidden = false; 183 | }, 184 | hide: function() { 185 | this.container.hidden = true; 186 | }, 187 | toJSON: function() { 188 | var json = "\t{\n"; 189 | json += "\t\tsiteName : '" + this.siteName.value + "',\n"; 190 | json += "\t\turl : '" + this.url.value.replace(/\\/g, "\\\\") + "',\n"; 191 | json += "\t\tnextLink : '" + this.nextLink.value + "',\n"; 192 | json += "\t\tpageElement : '" + this.pageElement.value + "',\n"; 193 | if ( this.insertBefore.value != '' ) {json += "\t\tinsertBefore: '" + this.insertBefore.value + "',\n";} 194 | json += "\t\texampleUrl : '" + content.location.href + "',\n"; 195 | json += "\t},"; 196 | var r=confirm("翻页规则(按OK键将其复制到剪贴板):"+'\n\n' + json); 197 | if(r==true){ 198 | try{ 199 | Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(json); 200 | } 201 | catch(e){ 202 | alert(e); 203 | } 204 | } 205 | }, 206 | toSuperPreLoaderFormat: function() { 207 | var spdb = "\t{\n"; 208 | spdb += "\t\tsiteName : '" + this.siteName.value + "',\n"; 209 | spdb += "\t\turl : /" + this.url.value.replace(/\//g, "\\\/") + "/i,\n"; 210 | spdb += "\t\tsiteExample : '" + content.location.href + "',\n"; 211 | spdb += "\t\tnextLink : '" + this.nextLink.value + "',\n"; 212 | spdb += "\t\tautopager: {\n"; 213 | spdb += "\t\t\tuseiframe : true,\n"; 214 | spdb += "\t\t\tpageElement : '" + this.pageElement.value + "',\n"; 215 | if ( this.insertBefore.value != '' ) {spdb += "\t\t\tHT_insert : ['" + this.insertBefore.value + "', 1],\n";} 216 | spdb += "\t\t}\n"; 217 | spdb += "\t},"; 218 | var r=confirm("翻页规则(SuperPreLoader格式)(按OK键将其复制到剪贴板):"+'\n\n' + spdb); 219 | if(r==true){ 220 | try{ 221 | Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(spdb); 222 | } 223 | catch(e){ 224 | alert(e); 225 | } 226 | } 227 | }, 228 | launch: function() { 229 | if (content.ap) return alert("已经运行"); 230 | 231 | var i = {}; 232 | ["url", "nextLink", "pageElement", "insertBefore"].forEach(function(type) { 233 | if (this[type].value) 234 | i[type] = this[type].value 235 | }, this); 236 | if (!i.url || !i.nextLink || !i.pageElement) 237 | return alert("指定的值无效"); 238 | 239 | let [index, info] = uAutoPagerize.getInfo([i], content); 240 | 241 | if (index === 0) { 242 | if (content.AutoPagerize && content.AutoPagerize.launchAutoPager) 243 | content.AutoPagerize.launchAutoPager([i]); 244 | else alert("翻页规则语法正确,但uAutoPagerize无法执行,可能uAutoPagerize被禁用或没有安装脚本"); 245 | } else { 246 | alert("翻页规则不匹配"); 247 | } 248 | }, 249 | inspect: function(aType) { 250 | if (this._inspect) 251 | this._inspect.uninit(); 252 | var self = this; 253 | this._inspect = new Inspector(content, function(xpathArray) { 254 | if (xpathArray.length) { 255 | let range = document.createRange(); 256 | range.selectNodeContents(self.popup); 257 | range.deleteContents(); 258 | range.detach(); 259 | for (let [i, x] in Iterator(xpathArray)) { 260 | let menuitem = document.createElement("menuitem"); 261 | menuitem.setAttribute("label", x); 262 | menuitem.setAttribute("oncommand", "siteinfo_writer['"+ aType +"'].value = this.getAttribute('label')"); 263 | self.popup.appendChild(menuitem); 264 | } 265 | self.popup.openPopup(self.container, "before_start"); 266 | } 267 | self._inspect = null; 268 | }); 269 | }, 270 | xpathTest: function(aType) { 271 | var textbox = this[aType] 272 | if (!textbox || !textbox.value) return; 273 | try { 274 | var elements = getElementsByXPath(textbox.value, content.document); 275 | } catch (e) { 276 | alert(e); 277 | } 278 | 279 | for (let [i, elem] in Iterator(elements)) { 280 | if (!("orgcss" in elem)) 281 | elem.orgcss = elem.style.cssText; 282 | elem.style.backgroundImage = "-moz-linear-gradient(magenta, plum)"; 283 | elem.style.outline = "1px solid magenta"; 284 | } 285 | 286 | var self = this; 287 | if (this.timer) { 288 | clearTimeout(this.timer); 289 | this.timer = null; 290 | } 291 | this.timer = setTimeout(function() { 292 | for (let [i, elem] in Iterator(elements)) { 293 | if ("orgcss" in elem) { 294 | elem.orgcss? 295 | elem.style.cssText = elem.orgcss: 296 | elem.removeAttribute("style"); 297 | delete elem.orgcss; 298 | } 299 | } 300 | }, 5000); 301 | }, 302 | urlTest: function() { 303 | var url = this.url.value; 304 | try { 305 | var regexp = new RegExp(this.url.value); 306 | if (regexp.test(content.location.href)) 307 | this.url.classList.remove("error"); 308 | else 309 | this.url.classList.add("error"); 310 | } catch (e) { 311 | this.url.classList.add("error"); 312 | } 313 | }, 314 | inputTimer: null, 315 | onInput: function(event) { 316 | if (this.inputTimer) { 317 | clearTimeout(this.inputTimer); 318 | } 319 | var self = this; 320 | this.inputTimer = setTimeout(function() { 321 | self.urlTest(); 322 | }, 100); 323 | }, 324 | class2contains: function(aType) { 325 | this[aType].value = this.splitClass(this[aType].value); 326 | }, 327 | contains2class: function(aType) { 328 | this[aType].value = this.normalClass(this[aType].value); 329 | }, 330 | splitClass: function(xpath) { 331 | return xpath.replace(/@class=\"(.+?)\"/g, function(str, cls) { 332 | cls = cls.replace(/\s+/g, " ").replace(/^\s+|\s+$/g, "").split(" "); 333 | for (var i = 0, l = cls.length; i < l; i++) { 334 | cls[i] = 'contains(concat(" ",normalize-space(@class)," "), " '+ cls[i] +' ")'; 335 | } 336 | return cls.join(" and "); 337 | }); 338 | }, 339 | normalClass: function(xpath) { 340 | let r = /(?:contains\(concat\(\" \"\,normalize\-space\(@class\)\,\" \"\)\, \" .+? \"\)(?: and )?)+/g; 341 | return xpath.replace(r, function(str) { 342 | let cls = str.split(' and ').map(function(c) c.replace(/.*\" (.*) \".*/i, '$1') ); 343 | return '@class="'+ cls.join(' ') +'"'; 344 | }); 345 | }, 346 | }; 347 | 348 | window.siteinfo_writer.init(); 349 | 350 | function Inspector(aWindow, aCallback) { 351 | this.win = aWindow; 352 | this.doc = this.win.document; 353 | this.callback = aCallback; 354 | this.init(); 355 | } 356 | Inspector.prototype = { 357 | init : function(){ 358 | this.doc.addEventListener('mousedown', this, true); 359 | this.doc.addEventListener('click', this, true); 360 | this.doc.addEventListener('mouseover', this, true); 361 | }, 362 | uninit : function(){ 363 | var self = this; 364 | this.lowlight(); 365 | this.doc.removeEventListener('mouseover', this, true); 366 | setTimeout(function(){ 367 | self.doc.removeEventListener('mousedown', self, true); 368 | self.doc.removeEventListener('click', self, true); 369 | }, 500); 370 | XULBrowserWindow.statusTextField.label = ""; 371 | }, 372 | handleEvent : function(event){ 373 | switch(event.type){ 374 | case 'mousedown': 375 | event.preventDefault(); 376 | event.stopPropagation(); 377 | this.uninit(); 378 | if (event.button == 0) 379 | this.callback(this.getXPath(this.target)); 380 | break; 381 | case 'mouseover': 382 | if (this.target) 383 | this.lowlight(); 384 | this.target = event.target; 385 | this.highlight(); 386 | break; 387 | case "click": 388 | event.preventDefault(); 389 | event.stopPropagation(); 390 | break; 391 | } 392 | }, 393 | highlight : function(){ 394 | if (this.target.mozMatchesSelector('html, body')) 395 | return; 396 | if (!("orgcss" in this.target)) 397 | this.target.orgcss = this.target.style.cssText; 398 | this.target.style.outline = "magenta 2px solid"; 399 | this.target.style.outlineOffset = "-1px"; 400 | XULBrowserWindow.statusTextField.label = this.getElementXPath(this.target, this.ATTR_FULL); 401 | }, 402 | lowlight : function() { 403 | if ("orgcss" in this.target) { 404 | this.target.orgcss? 405 | this.target.style.cssText = this.target.orgcss: 406 | this.target.removeAttribute("style"); 407 | delete this.target.orgcss; 408 | } 409 | }, 410 | ATTR_CLASSID: 0, 411 | ATTR_ID: 1, 412 | ATTR_CLASS: 2, 413 | ATTR_NOT_CLASSID: 3, 414 | ATTR_FULL: 4, 415 | TEXT: 5, 416 | NEXT_REG: /[下后][一]?[页张个篇章节步]/, 417 | NEXT_REG_A: /^[下后][一]?[页张个篇章节步]$/, 418 | getXPath: function(originalTarget) { 419 | var nodes = getElementsByXPath( 420 | 'ancestor-or-self::*[not(local-name()="html" or local-name()="HTML" or local-name()="body" or local-name()="BODY")]', originalTarget).reverse(); 421 | if (nodes.length == 0) return []; 422 | 423 | var current = nodes.shift(); 424 | var obj = {}; 425 | obj.localnames = current.localName; 426 | obj.self_classid = this.getElementXPath(current, this.ATTR_CLASSID); 427 | obj.self_id = this.getElementXPath(current, this.ATTR_ID); 428 | obj.self_class = this.getElementXPath(current, this.ATTR_CLASS); 429 | obj.self_attr = this.getElementXPath(current, this.ATTR_NOT_CLASSID); 430 | obj.self_full = this.getElementXPath(current, this.ATTR_FULL); 431 | obj.self_text = this.getElementXPath(current, this.TEXT); 432 | obj.ancestor_classid = obj.self_classid; 433 | obj.ancestor_id = obj.self_id; 434 | obj.ancestor_class = obj.self_class; 435 | obj.ancestor_attr = obj.self_attr; 436 | obj.ancestor_full = obj.self_full; 437 | obj.ancestor_text = obj.self_text; 438 | 439 | var hasId = current.getAttribute("id"); 440 | for (let [i, elem] in Iterator(nodes)) { 441 | obj.localnames = elem.localName + "/" + obj.localnames; 442 | 443 | if (!hasId) { 444 | hasId = elem.getAttribute("id"); 445 | obj.ancestor_classid = this.getElementXPath(elem, this.ATTR_CLASSID) + "/" + obj.ancestor_classid; 446 | obj.ancestor_id = this.getElementXPath(elem, this.ATTR_ID) + "/" + obj.ancestor_id; 447 | obj.ancestor_full = this.getElementXPath(elem, this.ATTR_FULL) + "/" + obj.ancestor_full; 448 | obj.ancestor_text = this.getElementXPath(elem, this.ATTR_ID) + "/" + obj.ancestor_text; 449 | } 450 | obj.ancestor_class = this.getElementXPath(elem, this.ATTR_NOT_CLASS) + "/" + obj.ancestor_class; 451 | obj.ancestor_attr = this.getElementXPath(elem, this.ATTR_NOT_CLASSID) + "/" + obj.ancestor_attr; 452 | } 453 | 454 | for (let [key, val] in Iterator(obj)) { 455 | if (val.substr(0, 4) !== 'id("') 456 | obj[key] = val = "//" + val; 457 | } 458 | var res = [x for each(x in obj)].filter(function(e, i, a) a.indexOf(e) === i).sort(function(a, b){ 459 | let aa = a.substr(0, 4) == 'id("'; 460 | let bb = b.substr(0, 4) == 'id("'; 461 | if ((aa && bb) || (!aa && !bb)) 462 | return b.length - a.length; 463 | return bb? 1 : -1; 464 | }); 465 | //var res = [[x, obj[x]] for(x in obj)].sort(function([a,], [b,]) a >= b); 466 | ////inspectObject([x for each(x in res)]); 467 | //res = [x for each([,x] in res)].filter(function(e, i, a) a.indexOf(e) === i); 468 | ////inspectObject(res); 469 | return res; 470 | }, 471 | getElementXPath: function(elem, constant) { 472 | if (!elem.getAttribute) 473 | return ""; 474 | 475 | if (this.ATTR_CLASSID == constant) { 476 | if (elem.getAttribute("id")) 477 | return 'id("'+ elem.getAttribute('id') +'")'; 478 | if (elem.getAttribute("class")) 479 | return elem.nodeName.toLowerCase() + '[@class="' + elem.getAttribute("class") + '"]'; 480 | return elem.nodeName.toLowerCase(); 481 | } 482 | if (this.ATTR_ID == constant) { 483 | if (elem.getAttribute("id")) 484 | return 'id("'+ elem.getAttribute('id') +'")'; 485 | return elem.nodeName.toLowerCase(); 486 | } 487 | if (this.ATTR_CLASS == constant) { 488 | if (elem.getAttribute("class")) 489 | return elem.nodeName.toLowerCase() + '[@class="' + elem.getAttribute("class") + '"]'; 490 | return elem.nodeName.toLowerCase(); 491 | } 492 | if(this.TEXT == constant){ 493 | var elemHtml = elem.textContent; 494 | if(elemHtml.length < 20 && elemHtml.match(this.NEXT_REG)){ 495 | if(elemHtml.match(this.NEXT_REG_A)){ 496 | return elem.nodeName.toLowerCase() + '[text()="' + elemHtml + '"]'; 497 | } 498 | return elem.nodeName.toLowerCase() + '[contains(text(), "' + elemHtml + '")]'; 499 | } 500 | return elem.nodeName.toLowerCase(); 501 | } 502 | 503 | var xpath = elem.nodeName.toLowerCase(); 504 | if (this.ATTR_FULL == constant) { 505 | let x = []; 506 | if (elem.hasAttribute("id")) 507 | x[x.length] = '@id="' + elem.getAttribute("id") + '"'; 508 | if (elem.hasAttribute("class")) 509 | x[x.length] = '@class="' + elem.getAttribute("class") + '"'; 510 | if (x.length) 511 | xpath += '['+ x.join(" and ") +']'; 512 | } 513 | 514 | /* 515 | var attrs = elem.attributes; 516 | var arr = []; 517 | for (var i = 0, len = attrs.length; i < len; i++) { 518 | var name = attrs[i].nodeName; 519 | if (name === "style" || name === "id" || name === "class") continue; 520 | var value = attrs[i].nodeValue; 521 | arr[arr.length] = '@' + name + '="' + value + '"'; 522 | }; 523 | */ 524 | var arr = [ 525 | "@"+ x.nodeName +'="'+ x.nodeValue +'"' 526 | for each(x in $A(elem.attributes)) 527 | if (!/^(?:id|class|style)$/i.test(x.nodeName)) 528 | ]; 529 | if (arr.length > 0) 530 | xpath += '[' + arr.join(" and ") + ']'; 531 | return xpath; 532 | }, 533 | }; 534 | 535 | 536 | 537 | function log(){ Application.console.log($A(arguments)); } 538 | function $(id) document.getElementById(id); 539 | function $A(arr) Array.slice(arr); 540 | function $C(name, attr) { 541 | var el = document.createElement(name); 542 | if (attr) Object.keys(attr).forEach(function(n) el.setAttribute(n, attr[n])); 543 | return el; 544 | } 545 | 546 | function addStyle(css) { 547 | var pi = document.createProcessingInstruction( 548 | 'xml-stylesheet', 549 | 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"' 550 | ); 551 | return document.insertBefore(pi, document.documentElement); 552 | } 553 | 554 | function getElementsByXPath(xpath, node) { 555 | var nodesSnapshot = getXPathResult(xpath, node, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE); 556 | var data = []; 557 | for (var i = 0, l = nodesSnapshot.snapshotLength; i < l; i++) { 558 | data[i] = nodesSnapshot.snapshotItem(i); 559 | } 560 | return data; 561 | } 562 | 563 | function getFirstElementByXPath(xpath, node) { 564 | var result = getXPathResult(xpath, node, XPathResult.FIRST_ORDERED_NODE_TYPE); 565 | return result.singleNodeValue; 566 | } 567 | 568 | function getXPathResult(xpath, node, resultType) { 569 | var doc = node.ownerDocument || node 570 | var resolver = doc.createNSResolver(node.documentElement || node) 571 | // Use |node.lookupNamespaceURI('')| for Opera 9.5 572 | var defaultNS = node.lookupNamespaceURI(null) 573 | if (defaultNS) { 574 | const defaultPrefix = '__default__' 575 | xpath = addDefaultPrefix(xpath, defaultPrefix) 576 | var defaultResolver = resolver 577 | resolver = function (prefix) { 578 | return (prefix == defaultPrefix) 579 | ? defaultNS : defaultResolver.lookupNamespaceURI(prefix) 580 | } 581 | } 582 | return doc.evaluate(xpath, node, resolver, resultType, null) 583 | } 584 | 585 | function addDefaultPrefix(xpath, prefix) { 586 | const tokenPattern = /([A-Za-z_\u00c0-\ufffd][\w\-.\u00b7-\ufffd]*|\*)\s*(::?|\()?|(".*?"|'.*?'|\d+(?:\.\d*)?|\.(?:\.|\d+)?|[\)\]])|(\/\/?|!=|[<>]=?|[\(\[|,=+-])|([@$])/g 587 | const TERM = 1, OPERATOR = 2, MODIFIER = 3 588 | var tokenType = OPERATOR 589 | prefix += ':' 590 | function replacer(token, identifier, suffix, term, operator, modifier) { 591 | if (suffix) { 592 | tokenType = 593 | (suffix == ':' || (suffix == '::' && 594 | (identifier == 'attribute' || identifier == 'namespace'))) 595 | ? MODIFIER : OPERATOR 596 | } 597 | else if (identifier) { 598 | if (tokenType == OPERATOR && identifier != '*') { 599 | token = prefix + token 600 | } 601 | tokenType = (tokenType == TERM) ? OPERATOR : TERM 602 | } 603 | else { 604 | tokenType = term ? TERM : operator ? OPERATOR : MODIFIER 605 | } 606 | return token 607 | } 608 | return xpath.replace(tokenPattern, replacer) 609 | }; 610 | 611 | 612 | })('\ 613 | \ 614 | #sw-grid row > label {\ 615 | margin: 1px !important;\ 616 | }\ 617 | #sw-grid row > textbox {\ 618 | -moz-appearance: none !important;\ 619 | margin: 1px !important;\ 620 | padding: 1px !important;\ 621 | border-width: 1px !important;\ 622 | }\ 623 | #sw-grid row > textbox[multiline="true"] {\ 624 | height: 4em;\ 625 | }\ 626 | \ 627 | #sw-grid .inspect {\ 628 | list-style-image: url("chrome://global/skin/icons/Search-glass.png");\ 629 | -moz-image-region: rect(0px, 16px, 16px, 0px);\ 630 | }\ 631 | \ 632 | #sw-grid .check {\ 633 | list-style-image: url("chrome://global/skin/icons/find.png");\ 634 | -moz-image-region: rect(0px, 48px, 16px, 32px);\ 635 | }\ 636 | \ 637 | #sw-url.error {\ 638 | outline: 1px solid red !important;\ 639 | }\ 640 | #sw-popup > * {\ 641 | max-width: none !important;\ 642 | }\ 643 | '); 644 | -------------------------------------------------------------------------------- /SnapLinksMod.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | 25 | 40 | 41 | 42 | 43 | 45 | 49 | 53 | 83 | 84 | 91 | 92 | 93 | 94 | 433 | 434 | -------------------------------------------------------------------------------- /UserAgentChangeModLite.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name UserAgentChangeModLite.uc.js 3 | // @namespace http://www.sephiroth-j.de/mozilla/ 4 | // @charset utf-8 5 | // @note modify by lastdream2013 at 20130616 mino fix 6 | // @note modify by lastdream2013 at 20130409 sitelist : change SITELIST idx to Name 7 | // @note modify by lastdream2013 for navigator.userAgent https://g.mozest.com/thread-43428-1-2 8 | // @include chrome://browser/content/browser.xul 9 | // ==/UserScript== 10 | var ucjs_UAChanger = { 11 | 12 | DISPLAY_TYPE : 1, // 0显示列表为radiobox, 1显示为ua图标列表 13 | 14 | //(1)在url后面添加网站,注意用正则表达式 15 | SITE_LIST : [ 16 | 17 | // 在 http://www.google.co.jp/m 伪装成日本DoCoMo手机 18 | { 19 | url : "http://www\\.google\\.co\\.jp/m/", 20 | Name : "iPhone" 21 | }, //此处添加你需要的useragent的名称 22 | { 23 | url : "https?://www\\.icbc\\.com\\.cn/", 24 | Name : "Firefox10.0" 25 | }, { 26 | url : "https?://(?:mybank1?|b2c1)\\.icbc\\.com\\.cn/", 27 | Name : "Firefox10.0" 28 | },{ 29 | url : "http://vod\\.kankan\\.com/", 30 | Name : "Safari - Mac" 31 | }, //直接可以看kankan视频,无需高清组件 32 | 33 | //添加网站到此结束 34 | ], 35 | 36 | //现有版本firefox的图标 37 | NOW_UA_IMG : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADfklEQVQ4jW2TfUzUBRzGH+6444477o1TkXfZUUwJLwh72a6Dxk2wkBcPUSBAl6Ye0Cx0iIkk1AGyapO1AmbQKF+CTGm5DAySKOXFwIQJpkecTd2wabyk/O6e/sgaq56/vn88z3fPH88H+K9ksuDYHFNhdUvB+229+1q+7Ml9t+mw78r4dAAeDz0eC24AgAQA4OmfsMRSfqmwf5bfkXSQnCA5TrJ2dIqpJTW9oaERcQtyfz0pMeleKokPPymPKniQVNbDpqoyV1dHq9A188DV/ducq31qVrCP33Vv+aSPnZ01LE+PPgpACUAEAGiIlX18Z+si9m6PEPqyw1xfrQ9n9S03j98n2+/Ns+raXeZ+46Tp4EVXZ2epMDuQx33WiOZ/apy2+vQ6MxXCaLJMGLUqeM4awPN7k9l65G2+cUPgfscMbaMzXPXhJAtqKsixNMHRseb+smWyEDy/wmv17XwVh+K83AMJSv6Yqqaj6BFert1E28FmZnRPM/WzCZoarjCs+GsaN9p5+4yFdCQyw6y24FCar/3GejX7ExTCcJqGgxv86Nhv5Lrazxl5+BbjG0e4vKiNIVkfUJlUx11lO3nvbLzrj/Nm2hODmlBn0dRdW6viUJpa6FqtYUuwiKaUPdS/1sOA0gvU7e6nPr+V/omVhLGcFRXZ5FiscP1kDF9NMZxG7Uqv6svxSg5l+gpnzQr+8AR49BULn7W9x6wdZWy0b2PS7noqn3qdkuVF/OitOLq/jRB+bwvigY0KO56W45nuSBkvvKB1j+RoOWH15HCylMNZGjo3y/hpbhTjcioJQynDjcmcPhLA6WNL3DcPSOeilyIGACR1es+fvnhU5h7coBeublvM0U2+3BMTQUNYNuFfSujyqAvM5CHbKs43a+gsl7pPpQdNAVABAMxyZLT4iHnCqJgfzl7MsR1+HN8ZyPrMGNqeDGe5yYcDL8t5p0rLyTKVMFasZWVe1Km/hyQCgDyZqLFBIeaJx+RCX4rGPZKn5+RWFW9uV9K5RcWrm5XuX3YphZl3tOzeqxgMXQS/hTx4APBZKxcfr1eL2B4m5ffPKXnJquLYi0pez/fmrzZv/ly4lHUW9UUAwQ9zooVAiQAEGqR4s1jncaUpRDx35nEJz5k92bFGMtuSKptcF6k6BiD6/2hcKDEAg0qMpCAJ8v0kyPUWIwnACgDSf5v/BEdntiMaVZDwAAAAAElFTkSuQmCC", 38 | //其他版本firefox的图标 39 | EXT_FX_LIST_IMG : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADaUlEQVQ4jW1TX0xbdRj9MaKoJMYoTJiOja0t/XPbrrSU9T/QS2lvV1oYHVJK2diETGkwrCHKDOvIio4Y2MbAVbpB2s0YVDZT0HZEWKwCokYi2dRoYhbNYpZlD5poZL33+KAiQ8/T930557yc7xDyFzKCweAmQkjG3zuJx+NPJZPJ0kTiQ3Uikcj/576R9x9kPviIa0tBwQwlV9yt9uyHwcJwfBF1J2+b4H1CiG0d9V8Tz/StbY5XL9uys7JOFRUJYGScoN1N8D33Ajyt7Sg1mKCvaYapIwxtR2xEFkhm32dSHJjz2nqn4Og4BkfnCbb5/NW01XuQo2126Gkr9OYqrsRoThfX+tN0aAllPQspUdtV/pqB1DvYeXzxNkLLv/zR+9VveDa2gFKLFxU1XlQwTtDVdTBa7KAoEZRm96qh6xpEBz+YIoQQMjExkdk4sbLQNvkt1/LmCts6+Q2aIvNoHPkCrsAgDOZKaCqqsKtUBx3NQKU1cuoDb7AC37u3gxcXHyWxT3+S61++xtac/RzOs5+hKvQRHKdvoL4njLLKSuyusIIvlqCQX4RijR67NCaoDkS5ne7z7GuxeRcZvvK1Q/n8NCzHU5w19Akaxm/A0jkMZZkLmjIaGpMZlEKJgh08bOfxQGksUDWPpQv3nEb/+GwXiSS/by5ui0Ppm2T39C/h8MzPUNgPgccXQFKig7a2BeISPXLz8pGT+zhE1iNQNMW4reZenBydqSUXUjd3qNqnfpU6o9C1T3O+yzexu/0SZJ5RMIPLqI9eB2WtR/bDDyFn8xMQM92Q7XsdW/Rdv78SeY9HCCGEPjmfkNeOcZRjNK3zx2HqngP1zBDEdj/yCgqRlUnwWM6TEJQfhsjZz4qYEJev9qfWYqw8s2wxd89A5gqvCukBSKvPQeEdw3btfmylypEvNEJQdRTyhgsQ2vpW+eVdyJU2udf/NrEPfDluemkWysboPZk7wkpsZ6DwvAV5QxRSdxiSvUOsiOm7t9MUQJHBf2W9NoMEg5uUreEHTMcWYvoXU9AemYXq0NuQ7TsHiWsAQuYEhEwfBHQPhOajcZklkE0Iua9Ua4OiLVkna3lnVuq7dFdcH+GEe4dZce3IHXnN0Jy67pTvf8u0odKEEELmFr97en75R/XHK7dUS9d/yNsgXBP/CaqqlOsrHyplAAAAAElFTkSuQmCC", 40 | 41 | //自己在底下添加ua 42 | UA_LIST : [{ 43 | name : "分隔线", 44 | }, { 45 | name : "Firefox10.0", 46 | ua : "Mozilla/5.0 (Windows NT 6.1; rv:10.0.6) Gecko/20120716 Firefox/10.0.6", 47 | label : "Firefox10.0", 48 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADiklEQVQ4jV2Tf1DTdRjHP2pwV+Y348KUozGswYRlhECCGv5Iwx8zNhhQEXGpgIi6pBCQ8EfC6LgGnvJLL5ER4l0dQv5CLIQIaMeGMGQ4lMXmd8N5/JRCD/b5vvtDIeP553n+eL/ueZ6795uQ/2rusz5PItkuTcvJK2R2l1x+Ka6kxlH8tYLwVq56TjuPzKqnMM9v1bnrf7YBQF3fKILPGyG+yGJ1hRExP96gW5P31zAMI3jGzJmG56TLRIdOZcQVRqnaJ8u1LEYaiulR1UV7fHUv3abqospGk33EqMX4H1/AdG3jaOR7TNT/FlfFirQjZ2PQXbyDM+ZuoT8dliGo/C/ILvQgtFSDSvVdVGuMGLTdm5pgs4DOj5AsfjV1+oIFrenB5uHSGLutUEZHT4eh6eAHKM6QIznvB6RV30KD3oz7Q48w/AQwsw/pWEsCbHXrRhiGOBH5BteUv8uiwZ4Mo5aTElgKpLAqgtF/JglJ+SoUNdxBZbMe1271oUptwGWNHoafP+amWkO5EL+X15KqOO/64SIJWOVW+uCUGNYT2/Awyx/S42cR9H0TWm7fQ35tB+SqRvzaZUKncQCmS+EUunDkSF7JJTU7320dLAiFVbmR6tPW4ZfNIoQnfgPPA2VQXOrAoB2wjD3Gg9FxNOpZ3Lx6AdZza+1ol+JErFsBqVjvrh7M3wT2uzX094h30BzigpR9iXhrzxkcyTsNU20pdDodeqxD6GT/geFGCsZKl9u5+hDIP+XtJan8hUpbhj/MOYH2u/uXo/+zJWiPcsP1MC+0yfgoCvVFZnYeeoefoE7TD23t55go88FEywYa5M/4E5GDg1935DLKZvtQ81FfWA56oWsnH2kfrkZgSDyIOBdL95Sj7bYemsJoWCsDqP3mGq7zykodIeQFQgghCqHb+fs73kZfpteU+bAIA8e8oTm0ApkJEkR+Eo2vdkXAoAjAULYLbCWiSXS8j32S1xJmbOxMyOLaFUJrj8wTul2CScNeD86SuhSPMnkYyxJgPIuPgSOu1HTMfZKrEKLpuLuaEOI47cS5hBDiPd/B54qvm6l7/RvQbHKFNoIHXfybtOdLT86YLsDQtzxMKXmoP+DS7DyfLJ4VwKfD64QsSvVwUl4NcurXbHHm7sTyYZQL0Zvi8fi33a7qpGAmcebv58I0O87EiRAmYNGLgdsFC6WbhQvEoiWOy2ZpZ+B/AT1n+R4PGm8BAAAAAElFTkSuQmCC" 49 | }, { 50 | name : "分隔线", 51 | }, 52 | 53 | //伪装 IE8 - Windows7 54 | { 55 | name : "IE8 - Win7", //此处文字显示在右键菜单上,中文字符请转换成javascript编码,否则乱码(推荐http://rishida.net/tools/conversion/) 56 | ua : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)", 57 | label : "IE8", //此处文字显示在状态栏上,如果你设置状态栏不显示图标 58 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADL0lEQVQ4jYWTa0iTURjHj61NoyghuyBiRRZNgtQ3nbNs5jT1i/RB0DIFQ8UUiUmrKLrKQryQVjrHnNSmqGlheL+Q8zZ1ur2a7VbN65q5pvMWXta7pw/TZZH0wIHD8z//HzyXg9CfsQ39P7Z8sy5gZOSVGu0akV1Cv1bc7ZcskLhG5IiQz/XLCGHkrSDWhG+K14lEoaKoYQhUk0bQGRdAZ1yA4VED8OoG4WSScAj5sE7/DbFezqad8mJVrOBfvppGDHMTTfi4uVqqhWqpFpoGx3/2aKbMzXIt+LEr5pEf22PdS0IIITvkQt/hGCcck2p08t7P07Ks2kEQdmgWJZ+mZWKFXsFtVRLPGodB0KZcy6/D4WC8SIncwuwRQnZWTvDdGP57dblUa6hJFkrgafPHbwRBsAEgAQDiRr/PF9yulBG3Xw9Y0qtl5mBOLaDQR5c2SiA5XX3u/BYfuxEj6IRIQbclo0X1Qa4zpfeMGvP6x2ZyeseNuUnlAz9iXkosia961kIz6wnSFV7ZBsAOhd85cDqnzRTKFVtCeN3EeZ4EfAu6gM6VWE9BFzAKu+BcfjswX7QBxqkFcqJQ/nsEqeUlB+7VgPczsfnUi07w4/ctMkW47kIJrg8uxb8Gi2T68FL5yEWRVBspkn45fP+dhpRS9toGoLAq32y/W0Psy2hdcczugLg6dT0AOC6urlLnV1aOLS8vH+qZnA9rnzCF8/snA1wf12Ionn/EBiAlcKMoHDGQnrxfI+VILHt58plixZT7hp4t04c45PWZyVldBHrQtEp62AqUZEH07x64hdmT83AlJasD9hTKzDv5Q2DPww1RLaO8yKaRIgoPn9vFH4LdBf1mh0wxUHJlKhQQ4LAxRusipXI9EV9jcinVAL1KZaZVqYFargRqmRJ8qtTgW6n66VyiBlSoMKG0V56bF8kGOR6Vwtyf1bB0pnEKEqWzcAufJW7KZ4mEvhmgN+rBKbN+iXo5Nehvsw2CYYjsz2Cw3WNZuAdHZAgqalkKLGpZ8uCIDNRYFu7PYLAxDCP/6zPZ+oFhGDkQw476e3syaTRaBI1Gi/D39mQGYtjRdbPdZsMvtAyiG2p6whQAAAAASUVORK5CYII=" 59 | }, { 60 | name : "分隔线", 61 | }, 62 | 63 | // 伪装 Chrome22.0.1219.0 - Windows7 64 | { 65 | name : "Chrome - Win7", 66 | ua : "Mozilla/5.0 (Windows NT 6.1;) AppleWebKit/537.3 (KHTML, like Gecko) Chrome/22.0.1219.0 Safari/537.3", 67 | label : "Chrome Win7", 68 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOklEQVQ4jY3Sz2vTYBjA8QeEwkBsU2iTJW+Cdnkz19r546Jr3Vh7E08DR8GT4F+gIMybh0JhUGkt7Zt/wEsPngbzoqmehkwt2rTdUuZhHWt3EGVQKCR9vNhuqavsgc/tfb/wwAMwNp2laLSTjBa6ieh2JzHf6ybnf3UT0e1O8lpufzmijr8fjRmJeNqL4ezBUsQ+WIrgJPuLkfUywIWxz+DZu61t/Lgzi+ejbboi1etEatwMHTdvhfC86jeupAEAQMyHFLk4k/pylaxVwwSrYYLVObL3eU5MfbocECbuPBxFp+syo+3Vx8S/NRO0tlR+j2kLkjdmpLmY0eZiRtsbM9JGeVlwakHLqfE4ZNf4AiiMmoquIWFa5gPhHn6U/A+4uJHh4hV0MzL29+CKY/I4UuNNkBntKbqGiq71xXxIKQN4fPHK0XjAF68c/dzmvI4p4EhN6IOia/2/AZQZfQ0AMCnw27zkd+oCjpj8MciMWsOAomuoFEN3z1xh4f26XedTg8Y0jtQFE2RGS64Ao6bw/F7AF6tkubhxyMWNQ1+skl1dfTI1aIjfBk0Rh5z6dA4EXQ3LOrXdEa1JmLZCXpIp4ZUaCBQDF+2G8GiwI+KJabvf4KMAACAzteAKnCIzapXfEv9gR2oPdiUccnal3MkxvACPzOibswJSid7HHTGDFsFTNtEEz79HxdQ19zp0A1sBFS3SxxZBbJEeWtLT/16mmA8ppESfKUx7R4ozKrbIBlrkK1pyFpvi7Pj7PzASq+Abn5PIAAAAAElFTkSuQmCC" 69 | }, { 70 | name : "分隔线", 71 | }, 72 | 73 | //伪装 Opera 10.60 74 | { 75 | name : "Opera", 76 | ua : "Opera/9.80 (Windows NT 6.1; U) Presto/2.6.30 Version/10.60", 77 | label : "Opera", 78 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADbElEQVQ4jW2SX0hbdxTHf1FWBhuIpQnkYR34MKRZt0JcXw2UyfQSNIYQd5tax3RRVJS6VVMZJSvUbSkpltY5IrTXtVqwbF3dFvXqbVozTdC7mOr1ahvaqfmjSW6axja58Sb37EXDKv0+HM7D93POF85B6HXl7TUymezjQqm0QiqXf1ZQUFD0Js9+5SGEUHFxcanh1CnHhfPnU9d7eqDv4kVoP3MmXlVVdUsul7+/681/I1xSUvL51b6+7CpNQ9zlAj/DZLdoOrs1Owv2sTFoaGjYKCoqOro/yd5mpcViefmYZbPR0VFhmSSFB24375yZ4QMjI9mg08nbSRK+OH16WavVFu+yklypNRiGRu7eFXx2e3rdaoXp8fHYFEVFJhyO8OLgYHK9t1ek3e5oZ1dX0mAw/KZWqw/l8mu12o++M5t9xNCQ/2l//85jk0l46HCs3qcodmp6eokmiMBaezvM37u39sPly97Os2d9OI5X5waYzebWW8PDz34dHh5f0GqTTEvLqwWPh6Ln5iZphrF779z5h1GpYLa7e/53khwavHGDbWxs/FahUBxACCHJ1StXvvcyjGttZcXmyMvLzJeWhp5vb9uiW1vX46lU/8bo6J9TCMFSU5OLSyYtix7P/Y6Ojh8xDCtECoXigM1m640nEjM7L1788iA/X6SPHw8BwABkMoMAYOPs9rFxhOBpd7cHAH5+znFTJpPJolarDyGVSvW21Wq1pnh+VeB50imT8XPHjiUAgBQFgQKAic2bNxcnJBIIXLu2LIriWCwS8ba2tpoxDCtESqXyrba2to4YxwVFUXzkPXEi4ZRKBVEQliCbXQJR9K5brUESIYi73U9EUWRWWfYRjuNNZWVl7yCEENLpdJ86KGoBALgAQUQohIAPhTbFTMYPABvLtbWvZg8fFjLp9DoAxAYGBv6orq7Gcs9UXl4ubW5uvhCLxeIAkHIdObLj6+xMAUA8HQ4nHh48mAndvr0NAOlFr3elpqbmXGVl5Xt7V5Tspjh6rqvrpyjHvYTNTWA1GvBfupR9Ul8PUYIAAACWZZ/V1dX14Diu/D+bG6TRaD4wGo1f2ycn/w4Eg5zf6UxHfD7+33A4RBDEX3q9/hv9yZOf7Adfk0qlehfDsA9xHK+sb2n5st5o/KpGp9NXVFSUaDQa2X7/f7oO8ld2yvCoAAAAAElFTkSuQmCC" 79 | }, { 80 | name : "分隔线", 81 | }, 82 | 83 | //伪装 Safari - Mac OS X 84 | { 85 | name : "Safari - Mac", 86 | ua : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16", 87 | label : "Safari", 88 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADCUlEQVQ4jX2T70uTARDHL2sJwUNI/gdhWtkPQrMSlH44KbLIepWVGSauzDRr5SSI1H7IqF5kZRbOtbJsqWWa5dbSMnQ2dVtu89mz5lxNl85FQqF73LcX6Qiz7tXB3efDcdwR/R1ziGgewzChEonkuFgszmYYJpSIBFO1/0bQdMIwzCKZTHZPrlDIGYZZNFvPrHBISMjCU2fO5DY1PH819GUAbpcTjfV1TWKxOJuImH9JgoiINgmFcdY+i+2bx42Oj3aotKy/Wcv6O3v7MeYdhsXUy8bHb14/UxJERBQbGxs1OuL+YTRzOC03TOyQGvjdVw1IvqLHvhsm/oLS5DNaPsEz7B6LiYlZOcXOnV7a/LetLb0WzoEMGetLumbGtgs6JBZ3Qlj8AWm3TEi9aUaewuzj7E5o1KquKfj3FBsTEnZ8dTmQ/8DIJ2U9Qfrld4gvdeCE0onztf04ImNRUG3DofI+3Giw8q4BOzbExQkDCzh2LPu6wcz5N10y+FJK3uPK/gJUpJ1F/cte1HaP4lydA5mVVmRWsDha2eczWTj/ofQMaUAgEh2p1Ro57C018IdlLEpaPDAUXkRrugiqj0N4w47hlNKBlFI9chQsrzdxyMgUVQUEu5L3VLV06LHnpsUnkrMoahqEkuPxsK0fOvMnOD67IH31Bal3WeQ8tPNt2h4k7UyuCAiWRa7Or6t7hlzlgO+A3I5ilRuSF4Oot/7EI+N3SOrtKG1mce6pDdLmIb768RMsXb4iNyAQCBZE5ebk+Z+1s5OFao+/UDOMAo0HJe3fINV+R77GixONbuQ8daGhvW/yaNZxXiAQrP7zkIIjIlfV3L9fhWa9c+Jsi9cvNYzjZOMg8hoHUaIfx/lWr7+hy+mrrFQgLGJ5FREFT8PTD7IiYev27tdqDbqsTtSYRyYfm0b5atMoX2Memey2OqFWqbF5y9ZOIoqcwQaSxdFr15XfKS/39uh0sHFW2DgrenQfcLuszLMmKrqMiBbPhGdKiIjCw8LD04SJiUVCYWJRWFjEQSJaMlvvLwJ0xKwgmMgDAAAAAElFTkSuQmCC" 89 | }, { 90 | name : "分隔线", 91 | }, 92 | 93 | //伪装 iPhone,查询http://www.zytrax.com/tech/web/mobile_ids.html 94 | { 95 | name : "iPhone", 96 | ua : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16", 97 | label : "iPhone", 98 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADLSURBVCiRddA/C0FRGMfxc4UyGdQNpQzIKzDhFViNZvKn7y5loow3Ay/AaLQpeQUMkkWhjBbFonQM13X9efRM5/l9zjlPj9Lqu4hSJeycfuMUKy5E/wB8TNEM3I4beTHxE+HIiBjBD4BBhSVH1lj0mbDlwJgMhlZKKzw00ULNMG2Q4yzEOxLPL2iL91uvGRiKoOSCjggsFxS5C+BCAY8NYizFN26UnT3URHAi74AAcwE03lZNkg0azZ4F168hnyRNjypxQmTpUsdr9x/STR736IkaIQAAAABJRU5ErkJggg==" 99 | }, { 100 | name : "分隔线", 101 | }, 102 | 103 | //伪装 Apple iPad 2 104 | { 105 | name : "Apple iPad 2", 106 | ua : "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25", 107 | label : "Apple iPad 2", 108 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADG0lEQVQ4jW3R708TdxwH8HPGB0fLj0TguN5dCxkLiUSDOrLExDAXf8RHOjKJmTEKrcUftKUdlLrVWQwI18QZ2Nwsa7vatBRaaHtnqdIqFIzgZtzOLtb4wGV/h7lv33uwLIuh7z/glc/7/aGof7Otq6vrF4NeX2rmeaVFEIoCpyt+fuJE0Ts5WbzmdhfdV13FEeeQ4rDbSy6XK+LxeD6g/ks8Ht8ucFyplmHR1L4bDR+1YeeHbdhz8FOM3boN9/gEnNc9sLu/Rb/FAqPR+Nbn8+14D+B1uj+Omy6VZ5Zy6mg0UZ7KyGVvMlWOrq2XpY2NsvT8RTn/8pU65vOXu0+eLG0BdCyrfNl/GbnlHAnML2JubgaR2D3IhSyevVhB/skaXhafk/Hb0/js0KHXWwCWZRXboAOp5QKJLspISmkkMzIyS6tYX/sN+fVNFH4tkQnRi086O7cCDMsqww47Ftb/JDG5gHQijGQ6hmxiBfn5x5BWn2Jh8y8yNjqKXe3tlQBGcdhHUHgYJXImguXlVeTyjyDJElL37yObXMTjWJhc99xAc7OhUgVGGfpqBIn4PJEWQ0iml5B9kMXcXByhcBSZRAKZoJ98/c018DxfeQPLgAW53ApJxFOQ0hLSqRRkWYaUlrCQTCFfeEJs1kFwlQCdTqcY+0y4e9dHfvj+DkKhewgGgwgEAggEgpiZ+Rmz0RgxGk2VL+A4Tunu/gI/3vmJTEyK8Hq9EEUvRFHEpOjFzfEJTE1Nk1OneqDX6ysDhw8fgcvpJDarDVaLBTabFTbbICwWKwasVjiGRsjRI8dgMFQYURAEZW9HBy5ZnaTn9Bn0mi7iXJ8ZvefPwnShD2dO92BooJ907N0HQ6UvcBz/+8cde9SLwdy73uFRdco/q96YDqk3x4dV8TuP6nGcU1dD5nf7Ow+oer3wagvQ0tLyRqvVoJFtAtPEgGEY8IIAXtBjZ0MjGpkGsLpGVFdXo7W19W+z2fw/QFEUpdVqr9TW1vo1VVV+mqbDNE1HampqonV1dRENTUdoWhOuqtL4NRqNv76+3k5R1DaKoqh/AOus3HSfnM0iAAAAAElFTkSuQmCC" 109 | }, { 110 | name : "分隔线", 111 | }, 112 | 113 | //伪装 Google 爬虫 114 | { 115 | name : "Googlebot", 116 | ua : "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)", 117 | label : "Googlebot", 118 | img : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACxklEQVQ4jb2TW0hTARjHj1j0kiXdL/YSCdJDF4qECsGSQJOeWgVFrCItug260LrASaY2llvbWm6i6damZbZZbEuns9Uu7tY2d87Z2c7Z2XrxIaiwl6DA/j1Uq4guT/1fvpf///d9H3wfQfwHFfWYTK4Rt2fS5XKVK5XK5X90kyRZo9Foyq4rFAdUqtsrT5yRViYoBrzwcspqtS6SyWQbfwldukSuEYslpSRJrhoYsJ3xj4dedXUHIWsdmNq2XTe1ZasdbTeHPvb32zaYzGZJa6ty1Y8dZ5AkOc/nD5k9Xh8diSffmSyJt3v2qcDyOQSjHErmWmDoegp/KPomwWQQo1mtSCQqbmw8XU5YLJaV32CO4RFlRngJydkg6uo1YLN5sNk8anYM4NzFW2D4PBguj2Q6+2nY/cwh12qXEcbe3jVGo6Var++s6uq5a0tl89B1+DGntAlDYwnQXA519So8fOwClckhmckhmRbeaDTOWYU1RCJRscM1xtJcDjSXB83lcEPdB/ERNXbu6oWm/R4mWAETaQGJtIAEK+CJ61ldAaDW3VYEY9T09w45TKQFBOMcFiy+ioOH+xClecTYLGKpLF6ksgjEaDQ3q5YSBEEU9w/aJ3+kO0YYSM514FqLGRcu67BoyTEcONSBKMMjyvCIfKl0YQL70Gh1OMlGYqksnodZrFt/Eg63txC4/8iHshX74YsxCFM8QhQ/7XtBnf/pFrQGQ4V91Bt/aA9jdsleDA4FEKZ5hKjMa3eAel9bfwr+OItQkhO6u22l+k5LlVwuLykApNKWhQ8eDw+HKA6Np+SoWC3C8dMqyBRmtfjwlaNmq1Pmjafehhle+tszbmhomGkw9VU6PYGwJ0J9eDTqg30s0EQQBNGsUi1t0+jXEgRR9Mdf+Kqiuw8GN7uej2+5Z3PWtncaN+nvmHffMhrn/0v4J9DfDJ8BKCTDLoGbeskAAAAASUVORK5CYII=" 119 | }, { 120 | name : "分隔线", 121 | }, 122 | // 添加ua,到此结束 123 | ], 124 | 125 | UANameIdxHash : [], 126 | 127 | // ----- 下面设置开始 ----- 128 | // defautl: ステータスバーの右端に表示する 129 | TARGET : null, // 定义一个target,用来调整状态栏顺序,null为空 130 | 131 | ADD_OTHER_FX : true, // true:自动添加其他版本firefox的ua false:不添加 132 | 133 | //2种版本firefox,下面请勿修改 134 | EXT_FX_LIST : [{ 135 | name : "Firefox4.0", 136 | ua : "Mozilla/5.0 (Windows; Windows NT 6.1; rv:2.0b2) Gecko/20100720 Firefox/4.0b2", 137 | label : "Fx4.0", 138 | img : "" 139 | }, { 140 | name : "Firefox3.6", 141 | ua : "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8", 142 | label : "Fx3.6", 143 | img : "" 144 | }, 145 | ], 146 | // ---------------------- 147 | // UA リストのインデックス 148 | def_idx : 0, 149 | Current_idx : 0, 150 | 151 | // 初期化 152 | init : function () { 153 | this.mkData(); // UA データ(UA_LIST)を作る 154 | this.mkPanel(); // パネルとメニューを作る 155 | this.setSiteIdx(); 156 | // Observer 登録 157 | var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); 158 | os.addObserver(this, "http-on-modify-request", false); 159 | os.addObserver(this.onDocumentCreated, "content-document-global-created", false); 160 | // イベント登録 161 | var contentArea = document.getElementById("appcontent"); 162 | contentArea.addEventListener("load", this, true); 163 | contentArea.addEventListener("select", this, false); 164 | var contentBrowser = this.getContentBrowser(); 165 | contentBrowser.tabContainer.addEventListener("TabClose", this, false); 166 | window.addEventListener("unload", this, false); 167 | }, 168 | onDocumentCreated : function (aSubject, aTopic, aData) { 169 | var aChannel = aSubject.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShell).currentDocumentChannel; 170 | if (aChannel instanceof Ci.nsIHttpChannel) { 171 | var navigator = aSubject.navigator; 172 | var userAgent = aChannel.getRequestHeader("User-Agent"); 173 | if (navigator.userAgent != userAgent) 174 | Object.defineProperty(XPCNativeWrapper.unwrap(navigator), "userAgent", { 175 | value : userAgent, 176 | enumerable : true 177 | }); 178 | } 179 | }, 180 | // UA データを作る 181 | mkData : function () { 182 | var ver = this.getVer(); // 現在使っている Firefox のバージョン 183 | // 現在使っている Firefox のデータを作る 184 | var tmp = []; 185 | tmp.name = "Firefox" + ver; 186 | tmp.ua = ""; 187 | tmp.img = this.NOW_UA_IMG; 188 | tmp.label = "Fx" + (this.ADD_OTHER_FX ? ver : ""); 189 | this.UA_LIST.unshift(tmp); 190 | // Fx のバージョンを見て UA を追加する 191 | if (this.ADD_OTHER_FX) { 192 | if (ver == 3.6) { // Fx3.6 の場合 Fx4 を追加する 193 | this.EXT_FX_LIST[0].img = this.EXT_FX_LIST_IMG; 194 | this.UA_LIST.push(this.EXT_FX_LIST[0]); 195 | } else { // Fx3.6 以外では Fx3.6 を追加する 196 | this.EXT_FX_LIST[1].img = this.EXT_FX_LIST_IMG; 197 | this.UA_LIST.push(this.EXT_FX_LIST[1]); 198 | } 199 | } 200 | // 起動時の UA を 初期化 (general.useragent.override の値が有るかチェック 07/03/02) 201 | var preferencesService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch(""); 202 | if (preferencesService.getPrefType("general.useragent.override") != 0) { 203 | for (var i = 0; i < this.UA_LIST.length; i++) { 204 | if (preferencesService.getCharPref("general.useragent.override") == this.UA_LIST[i].ua) { 205 | this.def_idx = i; 206 | break; 207 | } 208 | } 209 | } 210 | }, 211 | // UA パネルを作る 212 | mkPanel : function () { 213 | var uacPanel = document.createElement("toolbarbutton"); 214 | uacPanel.setAttribute("id", "uac_statusbar_panel"); 215 | uacPanel.setAttribute("class", "toolbarbutton-1 chromeclass-toolbar-additional"); 216 | uacPanel.setAttribute("type", "menu"); 217 | // css 解决按钮定义在urlbar-icons撑大地址栏,变宽…… 218 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent( 219 | '\ 220 | #uac_statusbar_panel {\ 221 | -moz-appearance: none !important;\ 222 | border-style: none !important;\ 223 | border-radius: 0 !important;\ 224 | padding: 0 3px !important;\ 225 | margin: 0 !important;\ 226 | background: transparent !important;\ 227 | box-shadow: none !important;\ 228 | -moz-box-align: center !important;\ 229 | -moz-box-pack: center !important;\ 230 | min-width: 18px !important;\ 231 | min-height: 18px !important;\ 232 | }\ 233 | #uac_statusbar_panel > .toolbarbutton-icon {\ 234 | max-width: 18px !important;\ 235 | padding: 0 !important;\ 236 | margin: 0 !important;\ 237 | }\ 238 | #uac_statusbar_panel dropmarker{display: none !important;}\ 239 | ') + '"'), document.documentElement); 240 | 241 | uacPanel.setAttribute("image", this.UA_LIST[this.def_idx].img); 242 | uacPanel.style.padding = "0px 2px"; 243 | 244 | var toolbar = document.getElementById("urlbar-icons"); 245 | if (this.TARGET != null) { // default から書き換えている場合 246 | this.TARGET = document.getElementById(this.TARGET); 247 | } 248 | toolbar.insertBefore(uacPanel, this.TARGET); 249 | // UA パネルのコンテクストメニューを作る 250 | var PopupMenu = document.createElement("menupopup"); 251 | PopupMenu.setAttribute("id", "uac_statusbar_panel_popup"); 252 | for (var i = 0; i < this.UA_LIST.length; i++) { 253 | if (this.UA_LIST[i].name == "分隔线") { 254 | var mi = document.createElement("menuseparator"); 255 | PopupMenu.appendChild(mi); 256 | } else { 257 | var mi = document.createElement("menuitem"); 258 | 259 | mi.setAttribute('label', this.UA_LIST[i].name); 260 | mi.setAttribute('tooltiptext', this.UA_LIST[i].ua); 261 | mi.setAttribute('oncommand', "ucjs_UAChanger.setUA(" + i + ");"); 262 | 263 | if (this.DISPLAY_TYPE) { 264 | mi.setAttribute('class', 'menuitem-iconic'); 265 | mi.setAttribute('image', this.UA_LIST[i].img); 266 | } else { 267 | mi.setAttribute("type", "radio"); 268 | mi.setAttribute("checked", i == this.def_idx); 269 | } 270 | if (i == this.def_idx) { 271 | mi.setAttribute("style", 'font-weight: bold;'); 272 | mi.style.color = 'red'; 273 | } else { 274 | mi.setAttribute("style", 'font-weight: normal;'); 275 | mi.style.color = 'black'; 276 | } 277 | mi.setAttribute("uac-generated", true); 278 | PopupMenu.appendChild(mi); 279 | } 280 | } 281 | uacPanel.addEventListener("popupshowing", this, false); 282 | uacPanel.appendChild(PopupMenu); 283 | 284 | // パネルの変更を可能にする 285 | uacPanel.setAttribute("context", "uac_statusbar_panel_popup"); 286 | uacPanel.setAttribute("onclick", "event.stopPropagation();"); 287 | }, 288 | // URL 指定で User-Agent の書き換え(UserAgentSwitcher.uc.js より) 289 | observe : function (subject, topic, data) { 290 | if (topic != "http-on-modify-request") 291 | return; 292 | var http = subject.QueryInterface(Ci.nsIHttpChannel); 293 | for (var i = 0; i < this.SITE_LIST.length; i++) { 294 | if (http.URI && (new RegExp(this.SITE_LIST[i].url)).test(http.URI.spec)) { 295 | var idx = this.SITE_LIST[i].idx; 296 | http.setRequestHeader("User-Agent", this.UA_LIST[idx].ua, false); 297 | } 298 | } 299 | }, 300 | // イベント・ハンドラ 301 | handleEvent : function (aEvent) { 302 | var contentBrowser = this.getContentBrowser(); 303 | var uacPanel = document.getElementById("uac_statusbar_panel"); 304 | var uacMenu = document.getElementById("uac_statusbar_panel_popup"); 305 | switch (aEvent.type) { 306 | case "popupshowing": // コンテクスト・メニュー・ポップアップ時にチェック・マークを更新する 307 | var menu = aEvent.target; 308 | for (var i = 0; i < menu.childNodes.length; i++) { 309 | if (i == ucjs_UAChanger.Current_idx) { 310 | menu.childNodes[i].setAttribute("style", 'font-weight: bold;'); 311 | menu.childNodes[i].style.color = 'red'; 312 | if (!this.DISPLAY_TYPE) 313 | menu.childNodes[i].setAttribute("checked", true); 314 | } else { 315 | menu.childNodes[i].setAttribute("style", 'font-weight: normal;'); 316 | menu.childNodes[i].style.color = 'black'; 317 | } 318 | } 319 | break; 320 | case "load": // SITE_LIST に登録された URL の場合 321 | case "select": 322 | case "TabClose": 323 | for (var i = 0; i < ucjs_UAChanger.SITE_LIST.length; i++) { 324 | if ((new RegExp(this.SITE_LIST[i].url)).test(contentBrowser.currentURI.spec)) { 325 | var idx = this.SITE_LIST[i].idx; 326 | this.setImage(idx); 327 | return; 328 | } 329 | } 330 | this.setImage(this.def_idx); 331 | 332 | break; 333 | case "unload": // 終了処理 334 | var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); 335 | os.removeObserver(this, "http-on-modify-request"); 336 | os.removeObserver(this.onDocumentCreated, "content-document-global-created"); 337 | var contentArea = document.getElementById("appcontent"); 338 | contentArea.removeEventListener("load", this, true); 339 | contentArea.removeEventListener("select", this, false); 340 | if (contentBrowser) 341 | contentBrowser.tabContainer.removeEventListener("TabClose", this, false); 342 | uacMenu.removeEventListener("popupshowing", this, false); 343 | window.removeEventListener("unload", this, false); 344 | break; 345 | } 346 | }, 347 | // 番号を指定して UA を設定 348 | setUA : function (i) { 349 | var preferencesService = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch(""); 350 | if (i == 0) { // オリジナル UA にする場合 351 | // 既にオリジナル UA の場合は何もしない 352 | if (preferencesService.getPrefType("general.useragent.override") == 0) 353 | return; 354 | preferencesService.clearUserPref("general.useragent.override"); 355 | } else { // 指定した UA にする場合 356 | preferencesService.setCharPref("general.useragent.override", this.UA_LIST[i].ua); 357 | } 358 | this.def_idx = i; 359 | this.setImage(i); 360 | }, 361 | // UA パネル画像とツールチップを設定 362 | setImage : function (i) { 363 | var uacPanel = document.getElementById("uac_statusbar_panel"); 364 | 365 | uacPanel.setAttribute("image", this.UA_LIST[i].img); 366 | uacPanel.style.padding = "0px 2px"; 367 | 368 | this.Current_idx = i; 369 | }, 370 | // アプリケーションのバージョンを取得する(Alice0775 氏のスクリプトから頂きました。) 371 | getVer : function () { 372 | var info = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo); 373 | var ver = parseInt(info.version.substr(0, 3) * 10, 10) / 10; 374 | return ver; 375 | }, 376 | setSiteIdx : function () { 377 | for (let i = 0; i < this.UA_LIST.length; i++) { 378 | this.UANameIdxHash[this.UA_LIST[i].name] = i; 379 | } 380 | for (let j = 0; j < this.SITE_LIST.length; j++) { 381 | var uaName = this.SITE_LIST[j].Name; 382 | if (this.UANameIdxHash[uaName]) { 383 | this.SITE_LIST[j].idx = this.UANameIdxHash[uaName]; 384 | 385 | } else { 386 | this.SITE_LIST[j].idx = this.def_idx; 387 | 388 | } 389 | } 390 | }, 391 | // 現在のブラウザオブジェクトを得る。 392 | getContentBrowser : function () { 393 | var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"] 394 | .getService(Ci.nsIWindowMediator); 395 | var topWindowOfType = windowMediator.getMostRecentWindow("navigator:browser"); 396 | if (topWindowOfType) 397 | return topWindowOfType.document.getElementById("content"); 398 | return null; 399 | } 400 | } 401 | ucjs_UAChanger.init(); 402 | -------------------------------------------------------------------------------- /_uAutoPagerize.js: -------------------------------------------------------------------------------- 1 | // uAutoPagerize 的配置文件。Ver 0.2.2 以上专用。 2 | // 本体更新時に設定を書き換える手間を省くためのもので、無くても問題ない。 3 | 4 | // 排除列表 5 | var EXCLUDE = [ 6 | 'https://mail.google.com/*' 7 | ,'http://www.google.co.jp/reader/*' 8 | ,'http://b.hatena.ne.jp/*' 9 | ,'http://www.livedoor.com/*' 10 | ,'http://reader.livedoor.com/*' 11 | ,'http://fastladder.com/*' 12 | ,'http://**mail.yahoo.co.jp/*' 13 | ,'http://maps.google.co.jp/*' 14 | ,'*/archives/*' 15 | ]; 16 | 17 | // 自定义站点,优先级最高 18 | var MY_SITEINFO = [ 19 | { 20 | url : '^https://mobile\\.twitter\\.com/[^/]+/status(?:es)?/\\d', 21 | nextLink : 'id("tweets-list")/div[@class="list-tweet"][1]/div[@class="list-tweet-status permalink"]/a[@class="status_link"][2]', 22 | pageElement : 'id("tweets-list")', 23 | }, 24 | { 25 | url : '^http://www\\.dm5\\.com/m\\d+/', 26 | nextLink : 'id("s_next")/a', 27 | pageElement : 'id("showimage")', 28 | }, 29 | { 30 | siteName : '顶点小说', 31 | url : '^http://www\\.23us\\.com/html/.+\\.html', 32 | siteExample : 'http://www.23us.com/html/26/26627/16952316.html', 33 | nextLink : ' //dd[@id="footlink"]/descendant::a[text()="下一页"]', 34 | pageElement : 'id("amain")/dl/dd/h1 | id("contents")' 35 | }, 36 | { 37 | url : '^http://bbs\\.iiikl\\.net/forum\\.php\\?forum_id=.*', 38 | nextLink : '//a[@class="next"]', 39 | pageElement : '//tr[@class="topic_list_row"]', 40 | exampleUrl : 'http://bbs.iiikl.net/forum.php?forum_id=82&class_id=0&page=2' 41 | }, 42 | { 43 | "url" : "^http://[^.]+\\.getuploader\\.com/", 44 | "nextLink" : "//li[contains(concat(\" \", @class, \" \"), \" current \")]/following-sibling::li[contains(concat(\" \", @class, \" \"), \" page \")]/a", 45 | "pageElement" : "id(\"primary\")/table/tbody/tr|id(\"thumbnail\")" 46 | }, 47 | { 48 | url : '^http://list\\.tmall\\.com/search_product\\.htm', 49 | nextLink : '//a[@class="ui-page-next"]', 50 | pageElement : 'id("J_ItemList")', 51 | insertBefore : '', 52 | exampleUrl : 'http://list.tmall.com/search_product.htm?spm=3.1000473.332931.1.IYk3dO&q=&area_code=310000&sort=s&style=g&vmarket=0&from=sn_1_cat-qp&active=1&cat=50024400' 53 | }, 54 | { 55 | url : '^http://f\\.ppxclub\\.com/.*', 56 | nextLink : '//a[@class="nxt"]', 57 | pageElement : '//div[@class="pl bm"] | id("threadlist")/div', 58 | exampleUrl : 'http://f.ppxclub.com/147006-1-2' 59 | }, 60 | { 61 | siteName : '百度贴吧', 62 | url : '^http://tieba\\.baidu\\.(cn|com)/f', 63 | nextLink : '//div[@class="pager clearfix"]/descendant::a[@class="next"]', 64 | pageElement : '//ul[@id="thread_list"]', 65 | }, 66 | { 67 | siteName : '百度空间', 68 | url : '^http://hi\\.baidu\\.com', 69 | nextLink : 70 | { 71 | startAfter : '?page=', 72 | mFails : [/^http:\/\/hi\.baidu\.com\/.+/i, '?page=1'], 73 | inc : 1, 74 | isLast : function (doc, win, lhref) 75 | { 76 | var script = doc.querySelector("#pagerBar > script"); 77 | var m = script && script.textContent.match(/pageSize.*'(\d+)'[\s\S]*curPage.*'(\d+)'/); 78 | if (m && (m.length == 3)) 79 | { 80 | if (parseInt(m[2]) >= parseInt(m[1])) 81 | return true; 82 | } 83 | } 84 | }, 85 | pageElement : '//div[@class="mod-realcontent mod-cs-contentblock"]', 86 | exampleUrl : 'http://hi.baidu.com/gelida', 87 | }, 88 | { 89 | name : '水木社区', 90 | url : '^http://www\\.newsmth\\.net/nForum.*', 91 | nextLink : '//a[@title="下一页"]', 92 | pageElement : '//div[@class="b-content"] | //div[@class="b-content corner"]', 93 | exampleUrl : 'http://www.newsmth.net/nForum/#!board/TouHou' 94 | }, 95 | { 96 | siteName : '软件淘', 97 | url : '^http://www\\.65052424\\.com/', 98 | nextLink : '//a[@class="next"]', 99 | pageElement : '//div[@id="content"]', 100 | exampleUrl : 'http://www.65052424.com/page/7', 101 | }, 102 | { 103 | siteName : 'OperaChina', 104 | url : /http:\/\/(?:bbs\.operachina\.com|oc\.ls\.tl)/i, 105 | nextLink : 'auto;', 106 | pageElement : '//table | //article[@class="post blue"]' 107 | }, 108 | ]; 109 | 110 | // 本体に組み込まれている MICROFORMAT を利用するか? 111 | USE_MICROFORMAT = true; 112 | -------------------------------------------------------------------------------- /blur2revertMod.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name url bar blur to revert mod 3 | // @namespace blur2revert@zbinlin.gmail.com 4 | // @filename blur2revert.uc.js 5 | // @description url bar blur to revert mod ( Ctrl + 鼠标点击页面后,恢复原来的地址,规避原脚本和Noscript冲突 ) 6 | // @author zbinlin 7 | // @version 0.1.20110602.1 8 | // @updateURL https://j.mozest.com/ucscript/script/39.meta.js 9 | // ==/UserScript== 10 | 11 | if (location == "chrome://browser/content/browser.xul") { 12 | gBrowser.addEventListener("DOMWindowCreated", function () { 13 | window.content.document.addEventListener("click", function (e) { 14 | if (e.ctrlKey) { 15 | document.getElementById("urlbar").handleRevert(); 16 | } 17 | }, false); 18 | }, false); 19 | } 20 | -------------------------------------------------------------------------------- /bookmarkButtonLite.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | %mainwindowDTD; 6 | 7 | %placesDTD; 8 | ]> 9 | 10 | 11 | // ==UserScript== 12 | // @name bookmarkButtonlite.uc.xul 13 | // @description 14 | // @include main 15 | // @include chrome://browser/content/places/places.xul 16 | // @include chrome://browser/content/bookmarks/bookmarksPanel.xul 17 | // @author lastdream2013 18 | // @version 0.11 19 | // ==/UserScript== 20 | --> 21 | 35 | 36 | 37 | 38 | 52 | 62 | 67 | 72 | 73 | 74 | 75 | 77 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /bookmarkButtonPlus.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | %mainwindowDTD; 6 | 7 | %placesDTD; 8 | ]> 9 | 10 | 11 | // ==UserScript== 12 | // @name bookmarkButtonPlus.uc.xul 13 | // @description 14 | // @include main 15 | // @include chrome://browser/content/places/places.xul 16 | // @include chrome://browser/content/bookmarks/bookmarksPanel.xul 17 | // @author lastdream2013 18 | // @version 0.11 19 | // ==/UserScript== 20 | --> 21 | 35 | 36 | 37 | 51 | 61 | 67 | 68 | 72 | 73 | 78 | 84 | 88 | 92 | 93 | 94 | 99 | 104 | 105 | 106 | 107 | 109 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /contextHistoryMenu.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 4 | %browserDTD; 5 | ]> 6 | 7 | 8 | 9 | 10 | 14 | 17 | 18 | 22 | 23 | 28 | 32 | 34 | 35 | 40 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /contextHistoryMenuLite.uc.xul: -------------------------------------------------------------------------------- 1 | 2 | 4 | %browserDTD; 5 | ]> 6 | 7 | 8 | 9 | 10 | 14 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /externalAppButtonM.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name externalAppButtonM.uc.js 3 | // @namespace ithinc#mozine.cn 4 | // @description External Applications button 5 | // @include main 6 | // @author ithinc & lastdream2013 7 | // @charset UTF-8 8 | // @version 20130616.1.1.6 tidy and merge moveable code 9 | // @version 20130504.1.1.3 delay load exefile, may speedup firefox startup 10 | // @version 20130414.1.1.0 support submenu 11 | // @version 20130402.1.0.1 start modified by lastdream2013, add app menu 12 | // @version 20091216.1.0.0 Final release 13 | // @version 20091215.0.0.2 Handle toolbar apps and menu apps separately 14 | // @version 20091212.0.0.1 Initial release 15 | // ==/UserScript== 16 | 17 | var gExternalAppbuttonM = { 18 | autohideEmptySubDirs: true, //自动隐藏没有一个子项目的子目录菜单 19 | moveSubDirstoBottom: false, //把主菜单下的子目录移动到最下面 20 | moveablePositonOrInsertafter: false, //true : ToolbarPalette moveable button false: insert appbutton in "insertafter" 21 | insertafter: 'urlbar-icons', // useless if moveablePositonOrInsertafter is true; urlbar-icons addon-bar TabsToolbar alltabs-button 22 | toolbar: { 23 | //在这里定义好主菜单下子目录的名字,以及图标(可定义或留空,好图标不好找....); 可在中间加{name: 'separator'}建立一个目录与目录之间的分隔线 24 | subdirs: [ 25 | {name: 'windows工具', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADvUlEQVQ4jZXUX0wUBBzA8R+JY4czRxzcGWqZD5SgIgoJd0doSoaMKwSXYIqYhAP/gWPDdGlPbllYE9haohAC4/gXjoADNVI4FQyUvxegEHZ3HCogKYvavj2E3ms8fB9/n+338PuJiDh5RedGLNleYF0SW8is2l5g9YrOjRARJxER50XbLlhjztzlQLGVgyU2kossJBdZSCmxkmKwklJqJbVyhMNlNg6V2jhYYuNAsZWYM3dZtO2CVUScRURcvLaeI/L0ACvSe/BJ6yQ1b5CO358y9vQfuv94RnrRMKs+68HveC9+x8yszOhlRXoPkacH8Np6DhFxERFRLNRnE/6FGZ+DHXgnt9LSN4FtfBrL+DQjE9N8ZxwmLf8eG0528dahO7y5vx3flHbCjvewUJ+NiChERFzV4Zm8d6wD78Tb6FJbePBwmiH7XwyN/tfOL2/Rfu8JoxN/0/rbE0w9E1xpf8z6I7dRh2ciIq4iIq6em06xKb2NN+KukZbTyZ17k5i6H9M7/JS7g5NsTLtMn2UK84Nn9FumGLBO8fm5LkL2N+G56ZQDUoaeYP2BW7wec5WVH9fzmr6EZVHF+O0oZX/mTQ5900L7wKSj/knWJxnRJV1DGXrCAblpMwjdZ2JxRC25l+5jHppkaGSKmhtWQj6tQ3/kKlXXLdzoHqe5Y4yvL3bhtbmcd5KacNNmOKAFgYfR7LpK6J4GWrrG+aX9EY1tjzB1jrE5uYGjWW0s1xezPPIiyzbn4as38OrGSnQJjSwIPOyA5q/eR0BMDemnW6m/YX/Rjz9beD+pjtbuccxDf/Jr7xi9g5PszLiOKqSS4B1XmL96nwOa55tAwAdV5Ff0UVDVT0nNfYzNdk6evU3GVzcxmuwYm+3Um+zUNdnwDjOg0pQT/FE983wTHJDCO5Y1kRWoAr/HbVUWr/idJXS7gbBdlZTWDtLY8pDGFjuNt+zklppxX5OHR1AZ66JrUXjHOiCXpVEEfHgJ9zWFKAMK8QgsQrn2B9z9z5N49AoVxvuY2kYprDKj31uFu38+ygADgVHVuCyNckBzF0ewLroazyADKk0ZKl05al05Kp0Bj7fPo1ybjbv/t7j7Z6EMzEUVXIJnkIF10dXMXRzxAlLMUb874rMlB028Ec1uI9qEBrSfXEab2IB2bz2aPbUEJVQTHP8TmvhaNLvr0MQb8dmSwxz1BvvzE3ERN/84Jw+t/SWljtnk5KG1iZt/3POjdRaRl0VELSKLZpl6ZtZZZp6S84yqmNn3/6SYmXEWEad/AVgWg/PjJEAaAAAAAElFTkSuQmCC"}, 26 | {name: '常用工具', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADmklEQVQ4jZXUyU8TaBiA8ZeEhMBhjsZEQqCUsohhXwREoKVDpAlBR1oBkSWyVDA2CJQCLYRAo0ABURCQJSJrtYAKKmLgIi6cTQyiXnSYIRP/hWcO4MhlEj08t/f9Jd/h/URE3BQF9TplsW0noKSZX0lZbNtRFNTrRMRNRMRdWWTbKZhew/xyi/pXWzS+/oD1zTbNb7dp2fxEy+Ynmt9uY32zTePrD9S/2sL8couC6TWURbYdEXEXEfEIKLSiX9hEc/MZ2v4VMgZXOTX8gsyRNXSj6+hG18kcWePU8AsyBlfR9q+gufkM/cImAYVWRMRDRMRTeaGJrOkNUjuXUDuWSe99irZvhYxbz8no3+/Wc7R9K6T3PkXtWCa1c4ms6Q2UF5oQEU8RES9lfgOZY+skt7pIsS+Sdv0R6o7HaLqWSO9eJr17GU3XEuqOx6Rdf0SKfZHkVheZY+so8xsQES8RES//3Aa0faskWGZJst7nRIuL5NZ5TrYtkNK+SEr7IifbFkhunedEi4sk630SLLNo+1bxzz0AKQwWUu1PiDVNEF87RYJ5hkTLLImNcyQ1OUlqcpLYOEeiZZYE8wzxtVPEmiZItT9BYbAcgHLqSbI9JNI4QvTlcWJMd4mtniD26j3iaiaJq5kk9uo9YqsniDHdJfryOJHGEZJsD1Hk1P+A/M7WEV/nIqxkgIiyISIrRoi6NEpU5RjRVeNEV40TVTlG1KVRIitGiCgbIqxkgPg6F35n6w5AZ2qJMc0RqO8iOK+HkPM3CLs4RFjpMOFldwgvu0NY6TBhF4cIOX+D4LweAvVdxJjm8DtT+wPyza4hwjiDKrud7S//oNJ3EVo4QGjRbY4VD3KseJDQotuEFg6g0nftzWS3E2GcwTe75gCUVUN46RT+OhvvPu+iOm0nMMdBoKGboHO9BJ3rJdDQTWCOA9VpO+8+7+KvsxFeOoVv1gHIR1dNePkkCp2V5Y33fPz6jY9//k9fv7G88R6Fzkp4+SQ+uuoDUOYVjpudBBmuofqjmaAcG8GGVkJy2zia387R/HZCctsINrQSlGPbmzFc47jZiU/mlf8gT29t5d9x5lHSOhdRd7hI63CicTwgvceFtncebe886T0uNI4HpHU492Y6F4kzj+L9e9Xu9xPxOBSvzzuiMe56a4x4ayp+MiNH1OV/HYrX530/WncR+U1EDouI9y92eH/XXfY/Jfd91XP/vT+T5/6Ou4i4/QuMxVcZdYKnaAAAAABJRU5ErkJggg==" }, 27 | {name: '网络工具', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADsklEQVQ4jZXUS0wTBhjA8Y+ExMDBZCMqpS2FMh6lUmBTD0v0uMWMg8linMEHIYsHl7BEE2JQeT/EAWGkqQalSDoq70ehvNfW1gryfgghZTOByVqBhW0xGnf57zBcd5yH//H7Jd/h+0REQoyFyoy75Rp/fYWG9+luucZvLFRmiEiIiEioqTjaP+s8iX/1HP7V8wR8Fwn4sni5ls3Ln77+p7VsAr4sAr6L+FfP4189x6zzJKbiaL+IhIqI7DMVqXk+cZwFeyqLg2ksDX/Ms5FPWB49wvLoEZYG01kYSGPensriUDqLg2ks2FN5PnEcU5EaEdknIhJmzFfj8xxjtieFOZuBhf5UFuxpLA6mM9NrYHPFxF9vtnmxbGSqS8+czcBsTwo+zzGM+WpEJExEJLw2T8WK4yhT7XqmOw8z221grtfAnC2V8VY9b1/7efvaz5tXv+Bt1jHdeZipdj0rjqPU5qkQkXARkfDqXCVLI+mMW3U8bU1msl3PVMdhxlt0OJsSWXpcwh/b8yy6S3A0JvC0NZlxq46lkXSqc5VB6PaVKObtBjwPEvBaknjSnMS4VcejBzp+D0zyuCuT1pp4bMZ4frz3EV5LEp4HCczbDdy+EhWEKnIUzHTrcdXH4W6Ix9OYgLshHmfTp/y5vcirXR9b6y52A9OMmLS4G+Jx1ccx062nIkcRhEovK5jsSGTMGIvjjhZXfRxjplgmurLY3fSyNn2fCVsO7odfMlCrwXFHy5gxlsmOREov/wcqvhTJxMMEhms0jNbFMGaMpb9azeqTOnbWXfzqs9PxXQqdt9QMfR/DaF0MwzUaJh4mUHwpMggVZB/Ca4mjv1LNUHU0fbdUOO5/xs6GmwVHJZurPawvdWCr1DBQFc1QdTT9lWq8ljgKsg8FoRsXDuJp0tJXpqK3VInX+hW/vZjk5xkL5rwYeo2fs7PhZcVTja1cycBtNX1lKjxNWm5cOBiErp09gNscQ3exktbrCjae9bHsMdFcpKf5ZhRNeQo8bTlsLPfTlq/AVqaiu1iJ2xzDtbMHgtDV0xE4zVq6SpS03FRgzlVwL1eBtVBJb5WGzspoGq9HYb6moKUgip4yFV0lSpxmLVdPR/wLhX17KuJlW1Us7mYdrh+ScFiScFp0eFqSedKewuO2FFzWZJwWHY+sOtzWJNzNOtqqYsk5FbH17kT2nTmxP/ObLz7YupzxIe9Z4MyJ/ZnvjjZURPaLSKSIqN6zyL3ZUNl7SqF7atjevv+nsL2ZUBEJ+Rs6+oxWuBqWjQAAAABJRU5ErkJggg=="}, 28 | {name: '编辑工具', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADt0lEQVQ4jZXUT0wTBhTH8UdCQvCwxAtD4x8UCypVxIAoilhEMiOJBxKjAQIiBmVIGbbUxtqOyIrWIRTRWFAobeWfUiilojCULR4Gjj+ZqCAXQwygmBg1nr87gOtVD7/Te++TvMN7IiIBCrU+LVJjmovUlPF9Mc0p1Po0EQkQEQmMKDHNZXYPoBmdRDs2xbnxV+jHp9GOTlI6NkXp2BTa0Un049OcG3+FdmwKzegkmd0DRJSY5kQkUEQkSFFsJL1/CJWrl+TmB6S09qFy+Cj942/efPrCm09f0A0MoXL4SGntI7n5ASpXL+n9QyiKjYhIkIhI8IYzBg71PCHxtockuxeVw0divZuZj5853uLjeIuPmY+fSax3o3L4SLJ7Sbzt4VDPEzacMSAiwSIiy8IL9KR2PCLhxj322NzsvdXFTusdJubfk+P0kOP0MPH2PTutd9h7q4s9NjcJN+6R2vGI8AI9IrJMRGTZ+nwdyS19xF9tZpe1jYTau8RZGsl3eZle+MD0wgdOubzEWRpJqL3LLmsb8VebSW7pY32+zg+ty9OSZO8hpqyeHZcdxP/uIt7iYJuxlgrvIBXeQbYZa4m3LNZ2XHYQU1ZPkr2HdXlaPxSWe5Y4aysFDV62X7hJtNFGrLmRrYbrVHQ/pqL7MVsN14k1NxJttLH9wk0KGrzEWVsJyz3rh9ZmFxNjdvJydoGR17OkXmoi2mQjSlfDRfcAF90DROlqiDbZSL3UxMjrWV7OLhBjdrI2u9gPrcksQnm+DufgMO6hf9mstqDUXWNjSSWm9oeY2h+ysaQSpe4ayl+u0P3Pc5yDwyjP17Ems8gPrT5WyGZ9HWEZGn5rv091z19Eqq8QobZgbO3F2NpLhNpCpPoK1p4/KW+7T1iGhs36OlYfK/RDq44UoDQ2EZ5rZGOeAdfgUzqHJjha6aCio5+Kjn6OVjrwDD/HNfiUTScvEJ5rRGlsYtWRAj+0Mj2fLWUOFKfNhJ80oThhILfGiW/kBc9m5nk2M49v5AW5NU4UJwyLPafNbClzsDI93w+tOJxHXFUbUZpqokqrUWqr2FRkJrKwnMiff11MYTmbiswotVVElVYTpakmrqqNFYfz/oeCf0zLfhtrtrHP7kFl97C/yUOKvYuUxk4ONHRwoKGDlMZOUuxd7G9a7Nln9xBrthF6KOfd1xMJWr47LSPkp6x3IQezCDmY+Y3JIuRg5vzy3WkZX482UER+EJFQEVn1nQldmg2UpacUuKQGL+37LQlemgkUkYD/AEq2dU4D+CN7AAAAAElFTkSuQmCC"}, 29 | {name: '图像影音', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADm0lEQVQ4jZXU3U8TVhiA8ZekicGLJSaTcCFqzNA4EzXGkKhZGiLq6gcyFOlkWFtcaKmytVhXAlTLR1kjgwY/Kh91VRxi3Yg4Nxt1mMxNGStYKYNSKiJTUcRtZn/AswvqmixezItfck5yzpOci/eIiCRs3qPfmqktntyu+4Q3kaktnty8R79VRBJERBRbNMZJ9/ku/HeC+HuCXPvlHjd6B/ghEKI7MMiN3gH8PXe5ersf/527+HuC+O8EcZ/vYovGOCkiChGRWao8PZ7L3djc7dibO6hu9eE4/TWfe7/B4fHxxdlO+oai9A1FKT/Rhr25A5u7Hc/lblR5ekRklohI4kb1Php9V7G6zlB2rA3bya+wu89T1dRBWeMZBkfHefHyb+pOX6TU9SVlx9qwus7Q6LvKRvU+RCRRRGR2eraG2rZLmJxNWOpasdS1UnK0eWZ9tJlbgQGqj3vZX+nCVOvm4NEWTM4matsukZ6tQURmi4jMVmbuxt7iw2hvxFDRwBGXl5s9QX4KhKj3XOBIg4fvum8TGAjTcaUbQ3k9Rnsj9hYfyszd8dBa1U5KXefQHnRgdZ7i0dPnPHk2zeNn0zz/4y+m/3zJk6kXPHo6xeOpaWz1HnSWWkpd51ir2hkPpWVsx+zwoi4q58atXiJjvzNyf4LIgwkiDx7FTDByf4LW9kvkGsrQmKoxO7ykZWyPh1YpVRhsJ8nUmrk3NEpoOEooPPZalfUt7Nj3GblFFRhsJ1mlVMVDy9dloLM28P7u/fwcCNEXGqE/FKF/8D9CETq6rrFtr5kPCg6hszawfF1GPLQ0TUm+2cmGnELO+q7QGxwiMBB+rVD4Pk1tnWxSG8k3O1mapoyHUleuIfdADet3FGKwVNM/OMLd3yIx0ZiZff/gCBe/vU569sfkHqghdeWaeGjhstXkFNnZsEvPe9s0tHd+z3B0nOHoQ8Ixw9GHDEfHCYWj7CooIT27gJwiOwuXrY6HUpasQF1cxaYPjazPKUSVW8iV6z8yNDqG90IXDafOcvP2r4TCUcwVTpRZWjaqi1AXV5GyZMW/ocTkRe8+y9JZ0B8+gcF2Ap21jnxTFR+ZKtlrqUF7yEG+qZK8T4+wp8SBvuIY+sPHydJZSF60dOrViMyak7QgLykldWru/MXMTZnx9rzU15o7L3XmzPzFJM1/5+mcpAV5r4ZWISJviUiyiMx7Q8mxuwqJfUqKWDUx9t7/IzF2RyEiCf8AaBijWJqLC6wAAAAASUVORK5CYII="}, 30 | {name: 'separator'}, 31 | {name: '常用目录' , image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACEElEQVQ4jd3SvWtTURzG8Q7ubv4BCi5tVUgTEB0FcXIRXXwDEdR2kCqFimALNhHEQmkUBbEUtUOpdSgOTmIFX9Lapk1sbm7TmLQ2NMHm5r7f3JfzdbA2wcFFJx944PyWzzkHfi0t/0eyU6FkYfqsW3x3vqnnXPnV4ZWFyT27Zsd37/y9b/padmwD8lTYESIABAgBW2fPrrD2obO++r7T+dX12V57PXG9KL3cf7IBTHbUhG/jfBvEzA9hFkawihMIT0EEBsLXEb76c/aqELh1eTKcbnxhPKIFroqZj2PkhtG+9LOZuEJlpgslNYCy2IeSvEF1vofqfDeeXSb7IqQ3AR2uZ22gpONU5+5QfnsNq/wJ4Wtbt2sIv9Z4AQJ5PGI3gOcRFwQEDgQW+CbC1/EtCacUx14bwPrag7l8CUM6jW9kkJ+Gm4DRcF34Fr72EU95jft9gvrGY+y1u1iFm1i5LszsGYyl4+ipI/h6EnmkCZAfhZ3A1XA3p6iXn+GU7mOvDmDlezCXL2JkTqGnj6EtHEKdO4CnzSI/bAbiYVu4CvXyKM76EHaxHyvfjSlfwMicQE8dRUseRP28j9rMXjwtgRxvAqTBUMlVcjVjZSwwlp+gyw/QpUH0TBQtfQst1Yu62I2a7EKdv4xTmRbZe6HaNrB0u/VqJtY+JkXbK1Kszf5jo222FGtTM9HW4b/Z/n+XHynp6NSPz0b4AAAAAElFTkSuQmCC"}, 32 | {name: 'firefox目录', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACEElEQVQ4jd3SvWtTURzG8Q7ubv4BCi5tVUgTEB0FcXIRXXwDEdR2kCqFimALNhHEQmkUBbEUtUOpdSgOTmIFX9Lapk1sbm7TmLQ2NMHm5r7f3JfzdbA2wcFFJx944PyWzzkHfi0t/0eyU6FkYfqsW3x3vqnnXPnV4ZWFyT27Zsd37/y9b/padmwD8lTYESIABAgBW2fPrrD2obO++r7T+dX12V57PXG9KL3cf7IBTHbUhG/jfBvEzA9hFkawihMIT0EEBsLXEb76c/aqELh1eTKcbnxhPKIFroqZj2PkhtG+9LOZuEJlpgslNYCy2IeSvEF1vofqfDeeXSb7IqQ3AR2uZ22gpONU5+5QfnsNq/wJ4Wtbt2sIv9Z4AQJ5PGI3gOcRFwQEDgQW+CbC1/EtCacUx14bwPrag7l8CUM6jW9kkJ+Gm4DRcF34Fr72EU95jft9gvrGY+y1u1iFm1i5LszsGYyl4+ipI/h6EnmkCZAfhZ3A1XA3p6iXn+GU7mOvDmDlezCXL2JkTqGnj6EtHEKdO4CnzSI/bAbiYVu4CvXyKM76EHaxHyvfjSlfwMicQE8dRUseRP28j9rMXjwtgRxvAqTBUMlVcjVjZSwwlp+gyw/QpUH0TBQtfQst1Yu62I2a7EKdv4xTmRbZe6HaNrB0u/VqJtY+JkXbK1Kszf5jo222FGtTM9HW4b/Z/n+XHynp6NSPz0b4AAAAAElFTkSuQmCC" }, 33 | {name: 'firefox配置文件', image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADTElEQVQ4jV3SW0xTBxjA8fOyhz3Ppz3s0fmwLCxshiUs0SzZgmQxMzgVpDwwp2TDzWwZilkiC5egCGzowiXoQgEJNx0akHFpi9qGCtK11BXOgV64tyscVNqec3r63wN6luxLvsf/L9/DJwgvx9S9uN/UE7SXjYYpGVqneGCVM3eWKegJyqbe0FJBT3CmoCc4ZeoNjph6g10nuwPZ6U1Tr73qhbxOqbjGGub/80LRCT/XmIsk8KwmsPt36Hy8QX7XYjT3lpj/H9DmK2+2RwAIbSVZk3Ui2zqbOzrbCZ24qqMmd9G4lsI6/4Jc83zYAI7d9Pza4Yyg6eDd0PFFdMSwjj+qE5J1lrd1luVd4bvfAygaVN33YwA5zTPtA64ocgycQZWpJQ3XkoZnVcO7oeHbSCKGk+jAuVY3trlNjjbPrBjAkQbniG1OJhjVsM4rTEgKjxYVHAEVZ0hlOqTinR3G13Ec8Y8KXK2f0HXt5GUD+Kz2wbxvbQf3isrovMKoqGARVWwLuzvj6mNtvATZfQ+er7Dl7sVR8+m6AWRXjSpyLInDrzAmKVgkFZuo8mBBZdo1QNRbhrI0wJr1CjFPP8nAQzw3T8UFQRCED891v55dMUxcS2GTFCxSAouUwComcLrH2Jz9CT32kNjCN0SdxfxtLsTdkv/P5NXP9wqCIAiZJd1vHakcRkmmsEgKFjGBVUow+WSETc8F9LiDHamAeCiPZ09Lcf+WpTsvH0gzzj/wfee+LyqH0FMpJhZVLJLK2Hgfa49LXsYm4sFctmcvIjZlc6r0qteI079q2pN51txT0+9lRdZpc8S5M3gb7/CP6LEJ4v5CEqF8ZM8FpMZDjNunyTzbftcAMk63HMsouhE7UXGPix1zXKquwztYyl9D9SxPHmXHn0fUdR7X9cO4fQHaRnxkFLXeMID9hU3VFe0O4/e7qz+GZwF8zTmMl77Jo8Ys7LVZNNyyI66rXL/9hA8KG68YwHv5DWeK6+9j/vMpd+1+yk+/i+K4hjL5C5MVB+n/+m3kFR/+iMbqlsalVhvppoZvDWDviZo9aXl15Wl59ea03LrBnI/e0CtN+1IjVYdoKctJZX1ZxcGiZg7/YKbg5z7Scuvm3jle+/6r/l9E3rT3AA8mrAAAAABJRU5ErkJggg==" }, 34 | ], 35 | 36 | //1.在这里定义好想要出现在主菜单下,或在主菜单子目录下的程序(subdir没有定义, 或在上面子目录名列表中找不到名称相匹配的[比如写错了], 就会出现在主菜单下面); 37 | //2. 可在中间加{name: 'separator'}, 分隔线如果定义了子目录名,就出现在子目录下面;没有定义就在主目录下面. 38 | //3. 这里定义的可以重复. 例如IE浏览器我想出现在windows工具下面, 又想出现在子菜单下面, 那么就定义二次: 39 | // {name: 'IE浏览器', path: 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE', args: ['%u'], subdir: 'windows工具' }, 40 | // {name: 'IE浏览器', path: 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE', args: ['%u'] }, 41 | // 就可以了, 建议先写完上面想要定义, 分类在子目录下的程序, 之后从中摘出你最常用的, 去掉后面的subdir定义, 放在最下面 42 | apps: [ 43 | {name: 'IE浏览器', path: 'C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE', args: ['%u'], subdir: 'windows工具' }, 44 | {name: '记事本', path: 'C:\\Windows\\notepad.exe', subdir: 'windows工具'}, 45 | {name: '计算器', path: 'C:\\Windows\\System32\\calc.exe', subdir: 'windows工具'}, 46 | {name: '命令行', path: 'C:\\WINDOWS\\system32\\cmd.exe', subdir: 'windows工具'}, 47 | /* 48 | {name: 'HyperSnap 7', path: 'E:\\software\\HyperSnap 7\\HprSnap7.exe', subdir: '常用工具'}, 49 | {name: 'Photoshop', path: 'E:\\software\\Photoshop7.0\\Photoshop.exe', subdir: '常用工具'}, 50 | {name: 'separator', subdir: '常用工具'}, 51 | {name: 'Total Commander', path: 'E:\\software\\Total Commander\\TOTALCMD.EXE', subdir: '常用工具' }, 52 | {name: 'Everything', path: 'E:\\software\\Everything\\Everything.exe', subdir: '常用工具' }, 53 | {name: 'HostsX', path: 'E:\\software\\HostsX\\HostsX.exe', subdir: '常用工具'}, 54 | {name: 'Lingoes', path: 'E:\\software\\Lingoes\\Lingoes.exe', subdir: '常用工具'}, 55 | {name: 'PDFXCview', path: 'E:\\software\\PDF Viewer\\PDFXCview.exe', subdir: '常用工具'}, 56 | 57 | {name: 'Goagent', path: 'E:\\software\\ProxyTools\\goagent\\local\\goagent.exe', subdir: '网络工具'}, 58 | {name: 'opera', path: 'E:\\software\\Opera\\opera.exe', args: ['%u'], subdir: '网络工具'}, 59 | {name: 'Becky!', path: 'E:\\software\\Becky!\\B2.exe', subdir: '网络工具'}, 60 | {name: 'QQ', path: 'E:\\software\\QQ2013\\Bin\\QQ.exe', subdir: '网络工具'}, 61 | {name: 'AliIM', path: 'E:\\software\\AliWangWang\\AliIM.exe', subdir: '网络工具'}, 62 | {name: 'Fetion', path: 'E:\\software\\Fetion2012\\Fetion.exe', subdir: '网络工具'}, 63 | {name: 'Thunder', path: 'E:\\software\\Thunder7.2.11.3788JayXon\\Program\\Thunder.exe', subdir: '网络工具'}, 64 | 65 | {name: 'foobar2000', path: 'E:\\software\\Foobar2000\\foobar2000.exe', subdir: '图像影音'}, 66 | {name: 'PotPlayer', path: 'E:\\software\\PotPlayer\\PotPlayerMini.exe', subdir: '图像影音'}, 67 | {name: 'Imagine', path: 'E:\\software\\Imagine\\Imagine.exe', subdir: '图像影音'}, 68 | {name: 'i_view32', path: 'E:\\software\\IrfanView\\i_view32.exe', subdir: '图像影音'}, 69 | {name: 'Inpaint.exe', path: 'E:\\software\\Inpaint\\Inpaint.exe', subdir: '图像影音'}, 70 | {name: 'MangaMeeya', path: 'E:\\software\\MangaMeeya\\MangaMeeya.exe', subdir: '图像影音'}, 71 | {name: 'openCanvas', path: 'E:\\software\\openCanvas\\oC55.chs.exe', subdir: '图像影音'}, 72 | 73 | {name: 'EmEditor', path: 'E:\\software\\EmEditor\\EmEditor.exe', subdir: '编辑工具'}, 74 | {name: 'SublimeText2', path: 'E:\\software\\SublimeText2\\SublimeText.exe', subdir: '编辑工具'}, 75 | {name: 'AkelPad', path: 'E:\\software\\AkelPad\\AkelPad.exe', subdir: '编辑工具'}, 76 | {name: 'SourceInsight', path: 'E:\\software\\SourceInsight\\Insight3.exe', subdir: '编辑工具'}, 77 | {name: 'WinHex', path: 'E:\\software\\WinHex\\WinHex.exe', subdir: '编辑工具'}, 78 | 79 | {name: 'Software', path: 'E:\\software', subdir:'常用目录'}, 80 | {name: 'Downloads', path: 'I:\\Downloads', subdir:'常用目录'}, 81 | {name: 'TDDownloads', path: 'I:\\TDDownload', subdir:'常用目录'}, 82 | */ 83 | {name: 'profile', path: '\\', subdir:'firefox目录'}, 84 | {name: 'chrome', path: '\\chrome', subdir:'firefox目录'}, 85 | {name: 'CSS', path: '\\chrome\\CSS', subdir:'firefox目录'}, 86 | {name: 'SubScript', path: '\\chrome\\SubScript', subdir:'firefox目录'}, 87 | {name: 'UserScriptLoader', path: '\\chrome\\UserScriptLoader', subdir:'firefox目录'}, 88 | 89 | {name: 'userChrome.css', path: '\\chrome\\userChrome.css', subdir:'firefox配置文件'}, 90 | {name: 'userContent.css', path: '\\chrome\\userContent.css', subdir:'firefox配置文件'}, 91 | {name: 'prefs.js', path: '\\prefs.js', subdir:'firefox配置文件'}, 92 | {name: 'user.js', path: '\\user.js', subdir:'firefox配置文件'}, 93 | 94 | // 建议把要放在子目录下的程序定义在上面, 下面的定义放在主菜单下的最常用的程序 95 | /* {name: 'separator'}, 96 | {name: 'HyperSnap 7', path: 'E:\\software\\HyperSnap 7\\HprSnap7.exe'}, 97 | {name: 'Photoshop', path: 'E:\\software\\Photoshop7.0\\Photoshop.exe'}, 98 | {name: 'Everything', path: 'E:\\software\\Everything\\Everything.exe'}, 99 | {name: 'HostsX', path: 'E:\\software\\HostsX\\HostsX.exe'}, 100 | {name: 'separator'}, 101 | {name: 'Goagent', path: 'E:\\software\\ProxyTools\\goagent\\local\\goagent.exe'}, 102 | {name: 'Thunder', path: 'E:\\software\\Thunder7.2.11.3788JayXon\\Program\\Thunder.exe'}, 103 | {name: 'EmEditor', path: 'E:\\software\\EmEditor\\EmEditor.exe'}, 104 | {name: 'SourceInsight', path: 'E:\\software\\SourceInsight\\Insight3.exe'}, 105 | {name: 'separator'}, 106 | {name: 'Software', path: 'E:\\software'}, 107 | */ 108 | {name: 'chrome', path: '\\chrome'}, 109 | ], 110 | }, 111 | 112 | subdirPopupHash : [], 113 | subdirMenuHash : [], 114 | _externalAppPopup : null, 115 | _isready : false, 116 | init : function () { 117 | this.handleRelativePath(this.toolbar.apps); 118 | 119 | var ExternalAppBtn = document.createElement('toolbarbutton'); 120 | ExternalAppBtn.id = "gExternalAppbuttonM-ID"; 121 | ExternalAppBtn.setAttribute("label", "外部程序按钮"); 122 | ExternalAppBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();"); 123 | ExternalAppBtn.setAttribute("tooltiptext", "外部程序按钮,可以自定义外部程序和路径"); 124 | ExternalAppBtn.setAttribute("class", "toolbarbutton-1 chromeclass-toolbar-additional"); 125 | ExternalAppBtn.setAttribute("type", "menu"); 126 | ExternalAppBtn.setAttribute("removable", "true"); 127 | ExternalAppBtn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADcklEQVQ4jWWT7U+aBxTFn+/8LfswkqbTJWucMZuN6zTrXupmUzur9X2uIGq164xWFOO68PJIsYCo6GQIxaFF0cegRkBofKhWoKXosCjVDbvalgS9Zx/arJv7JTc3J7nnfjqHYY6hNbuEPfopVmdbDGqt8wda6/yBzra43qOfYrVml/D4/T/IDA5Bm2ZCrRzl0m4+BE8gDE8gDO+b7Q6EoTJx6VbNhFpmcAj+YxbJDILKLhOnveOisRkPxpxuMjvdMDvdr/WMl8ZmvBib8ZLO5qKyjmFOJDO8fVLV/au6QWWBVG+HvHcYS9+VIVz1Ce43n8Mwq0CHdhxS/W9vxo4GlYVKO4bUDMMwTGWXWZhdrUx/06LF100aGqgpx37dO3Rw6wRemN4jF1sMjb2NamU/40KLgr6VdqFcJqfsakW6+PqAkDnbMsievMQis0yNzEsqLDeexgtzBlIrp5AKZ6H/thgPnv6IhY0voPflo8FZgDOSGzhZIsdp8W2WyW8yhIQVOsqsG0FeTR/tKzLwjMuiV+FsvNzJpX7zLfy+b6LVnatwhM9Q1+x5ZFzuoxNV/cgV6ULMqVpd6oN6M3KabCi8akQ7a4TS7IJmyA5W1YY5fhI7z514uKfAfPRzXBttRI7EiqwGK96vMaSYHIk59dG1u5R3/S4qjH5S8nF4t5L05NlLDE77qddqgXZyhIycEnJrPV3sMeJTKUd5bU58KLGkmKJuZyhfyqGgfRpiexgdy1uYeryH4O5zjEw7cPiKx/7TO0hsiHAQyUWZeg6FrAef9SzgnNQZYkrkC+zZmwtU0ruEclOI6rkNKPk4WdbimFsepMODARz91UxHu7lY95dQsf4eig08FfZ6UXRzgWXEWp/wS4U7XT7E44IxgPO/rODi+BrE06tIxktx9EcBjrazcPjwXZhmf0KlJYgKUxBFfffSlVrf62iLR1fVl03rVDsRoStzG7iytElidwTWFSVtrn+FROBj8npK0TK7TN9PRVFte0R1o6vqt1E28ALR+CNONBujRk8crfcT6A7toieUwI21J2jmY2jwxyDxbEHsikE0+ZgTGfhjfXDwgtbFmLrJu53uXt8lTTQJw2aS9JtJsNE/qTO4iyb/dvqHxZha5Dhm/jddvriwcy3BKiN7IXYjmVJFkyl5ZC/U+SDBtvvi/6vz31LBdk6sWYzpAAAAAElFTkSuQmCC"); 128 | 129 | var ExternalAppPopup = document.createElement('menupopup'); 130 | ExternalAppPopup.setAttribute('onpopupshowing', 'event.stopPropagation();gExternalAppbuttonM.onpopupshowing();'); 131 | this._externalAppPopup = ExternalAppPopup; 132 | ExternalAppBtn.appendChild(ExternalAppPopup); 133 | setTimeout(function () { //延时加载菜单,不对启动造成影响,也不影响第一次打开菜单时的响应速度 134 | gExternalAppbuttonM.loadSubMenu(); 135 | }, 3000); 136 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent( 137 | '\ 138 | #gExternalAppbuttonM-ID {\ 139 | -moz-appearance: none !important;\ 140 | border-style: none !important;\ 141 | border-radius: 0 !important;\ 142 | padding: 0 3px !important;\ 143 | margin: 0 !important;\ 144 | background: transparent !important;\ 145 | box-shadow: none !important;\ 146 | -moz-box-align: center !important;\ 147 | -moz-box-pack: center !important;\ 148 | min-width: 18px !important;\ 149 | min-height: 18px !important;\ 150 | }\ 151 | #gExternalAppbuttonM-ID > .toolbarbutton-icon {\ 152 | max-width: 18px !important;\ 153 | padding: 0 !important;\ 154 | margin: 0 !important;\ 155 | }\ 156 | #gExternalAppbuttonM-ID dropmarker{display: none !important;}\ 157 | ') + '"'), document.documentElement); 158 | 159 | if (this.moveablePositonOrInsertafter) { 160 | var navigator = document.getElementById("navigator-toolbox"); 161 | if (!navigator || navigator.palette.id !== "BrowserToolbarPalette") 162 | return; 163 | navigator.palette.appendChild(ExternalAppBtn); 164 | this.updateToolbar(); 165 | } else { 166 | var navigator = document.getElementById(this.insertafter); 167 | if (!navigator) 168 | return; 169 | navigator.insertBefore(ExternalAppBtn, navigator.firstChild); 170 | } 171 | }, 172 | loadSubMenu : function () { 173 | if (this._isready) 174 | return; 175 | if (this._externalAppPopup == null) 176 | return; 177 | var ExternalAppPopup = this._externalAppPopup; 178 | for (var i = 0; i < this.toolbar.subdirs.length; i++) { 179 | if (this.toolbar.subdirs[i].name == 'separator') { 180 | ExternalAppPopup.appendChild(document.createElement('menuseparator')); 181 | } else { 182 | var subDirItem = ExternalAppPopup.appendChild(document.createElement('menu')); 183 | var subDirItemPopup = subDirItem.appendChild(document.createElement('menupopup')); 184 | subDirItem.setAttribute('class', 'menu-iconic'); 185 | subDirItem.setAttribute('label', this.toolbar.subdirs[i].name); 186 | subDirItem.setAttribute('image', this.toolbar.subdirs[i].image); 187 | gExternalAppbuttonM.subdirPopupHash[this.toolbar.subdirs[i].name] = subDirItemPopup; 188 | gExternalAppbuttonM.subdirMenuHash[this.toolbar.subdirs[i].name] = subDirItem; 189 | } 190 | } 191 | 192 | for (var i = 0; i < this.toolbar.apps.length; i++) { 193 | var appsItems; 194 | if (this.toolbar.apps[i].name == 'separator') { 195 | appsItems = document.createElement('menuseparator'); 196 | } else { 197 | appsItems = document.createElement('menuitem'); 198 | appsItems.setAttribute('class', 'menuitem-iconic'); 199 | appsItems.setAttribute('label', this.toolbar.apps[i].name); 200 | appsItems.setAttribute('image', 'moz-icon:file://' + this.toolbar.apps[i].path + '?size=16;'); 201 | appsItems.setAttribute('oncommand', "gExternalAppbuttonM.exec(this.path, this.args);"); 202 | appsItems.setAttribute('tooltiptext', this.toolbar.apps[i].name); 203 | appsItems.path = this.toolbar.apps[i].path; 204 | appsItems.args = this.toolbar.apps[i].args; 205 | } 206 | if (this.toolbar.apps[i].subdir && gExternalAppbuttonM.subdirPopupHash[this.toolbar.apps[i].subdir]) 207 | gExternalAppbuttonM.subdirPopupHash[this.toolbar.apps[i].subdir].appendChild(appsItems); 208 | else 209 | ExternalAppPopup.appendChild(appsItems); 210 | } 211 | 212 | if (this.autohideEmptySubDirs) { 213 | for (let[name, popup]in Iterator(gExternalAppbuttonM.subdirPopupHash)) { 214 | if (popup.hasChildNodes()) { 215 | continue; 216 | } else { 217 | gExternalAppbuttonM.subdirMenuHash[name].setAttribute("hidden", "true"); 218 | } 219 | } 220 | } 221 | 222 | if (this.moveSubDirstoBottom) { 223 | let i = ExternalAppPopup.childNodes.length; 224 | while (ExternalAppPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) { 225 | ExternalAppPopup.appendChild(ExternalAppPopup.firstChild); 226 | } 227 | } 228 | this._isready = true; 229 | }, 230 | onpopupshowing : function () { 231 | if (!this._isready) 232 | this.loadSubMenu(); 233 | }, 234 | 235 | handleRelativePath : function (apps) { 236 | for (var i = 0; i < apps.length; i++) { 237 | if (apps[i].path) { 238 | apps[i].path = apps[i].path.replace(/\//g, '\\').toLocaleLowerCase(); 239 | var ffdir = Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsILocalFile).path; 240 | if (/^(\\)/.test(apps[i].path)) { 241 | apps[i].path = ffdir + apps[i].path; 242 | } 243 | } 244 | } 245 | }, 246 | 247 | exec : function (path, args) { 248 | args = args || []; 249 | var args_t = args.slice(0); 250 | for (var i = 0; i < args_t.length; i++) { 251 | args_t[i] = args_t[i].replace(/%u/g, gBrowser.currentURI.spec); 252 | } 253 | 254 | var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); 255 | file.initWithPath(path); 256 | if (!file.exists()) { 257 | Cu.reportError('File Not Found: ' + path); 258 | return; 259 | } 260 | 261 | if (!file.isExecutable()) { 262 | file.launch(); 263 | } else { 264 | var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); 265 | process.init(file); 266 | process.run(false, args_t, args_t.length); 267 | } 268 | }, 269 | updateToolbar : function () { 270 | let toolbars = Array.slice(document.querySelectorAll('#navigator-toolbox > toolbar')); 271 | toolbars.forEach(function (toolbar) { 272 | var currentset = toolbar.getAttribute("currentset"); 273 | if (currentset.split(",").indexOf("gExternalAppbuttonM-ID") < 0) 274 | return; 275 | toolbar.currentSet = currentset; 276 | try { 277 | BrowserToolboxCustomizeDone(true); 278 | } catch (ex) {} 279 | }); 280 | } 281 | }; 282 | gExternalAppbuttonM.init(); 283 | -------------------------------------------------------------------------------- /externalFuncButtonM.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name externalFuncButtonM.uc.js 3 | // @description External functions button 4 | // @include main 5 | // @author lastdream2013 6 | // @charset UTF-8 7 | // @version 20130616.0.13 minor fix 8 | // @version 20130511.0.11 tidy and merge moveable code 9 | // @version 20130507 0.1 first release 10 | // ==/UserScript== 11 | 12 | var gExternalFuncButtonM = { 13 | autohideEmptySubDirs: true, //自动隐藏没有一个子项目的子目录菜单 14 | moveSubDirstoBottom: false, //把主菜单下的子目录移动到最下面 15 | moveablePositonOrInsertafter: false, //true : ToolbarPalette moveable button false: insert appbutton in "insertafter" 16 | insertafter: 'alltabs-button', // useless if moveablePositonOrInsertafter is true; urlbar-icons addon-bar TabsToolbar alltabs-button 17 | toolbar : 18 | { 19 | //在这里定义好主菜单下子目录的名字,以及图标 可在中间加{name: 'separator'}建立一个目录与目录之间的分隔线 20 | subdirs : [ 21 | { 22 | name : 'firefox常用功能', 23 | image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADq0lEQVQ4jZXUW0wTZhTA8UNCYuBhiQmZNUwiUfF+t1wLvUFbWwqFVi4tK0ipQItFXKGFQEEMZE6iomLIyB7MDNFJjGwMMYQsJpvZ1MzFyECzzG0uQZoo2abP/z2I6+t4+D98D+eXnIfziYjEpas0hTka3UKOVs+K0ugW0lWaQhGJExGJz1RrFk4MXODyzVtcGZ9idOI21yanGZua4cZyY1MzXJucZnTiNlfGp7h88xYnBi6QqdYsiEi8iMiqjFw1JwdHaAh24gtFCHT00tTeQ1O4m0BH79t3uJum9h4CHb34QhEagp2cHBwhI1eNiKwSEUlQZqsI95/FE2jF2xLG09zKwKVPefholqWlv3j5aokHPz2if3AIT3Mr3pYQnkAr4f6zKLNViEiCiEji/swsjkf6cDcGcHr9XL1xk79fv2H+6S+MjU8wNj7B7Nw8/7x+w/Xxr3B6/bgbAxyP9LE/MwsRSRQRSdyjzMAX6sLhrqPn1AAvXy3x+dXr2JzVlLoOU+o6jK2ymv6BcywuRjl9fgiH24Mv1MUeZUYM2rXvAJ5AEIujkjvffsfdH+5jcVRg/7CW0qpayqq9OD2NlLk9lLpqKHQ4KXHW4AkE2bXvQAzavnsvrvqj5FtLmJ2b59LIZxhLyiitOoy1vIrf/njO78//5PzwCHX+ZqrqGjDby3HVH2X77r0xaMuOnRyqrkNtNHPv/gMuDo9QUFiCtcyFocjO3e/v4azxojcXk2+x0fvxabQmK4eq69iyY2cMStu6DVulm2ydgdGrXzB5exqN0YKp5BDag1YCwTZyDSbURgttnREePX5Mjt6IrdJN2tZtMWhD2mYsjkqyNHpq6/3c//EhrR1dqI0WtAetVB9p4JMzg8x8c4e5J08ZGh4hI0+HxVHJhrTNMSh14yZMNgc5OgPKHDXdvX38/OQJp86co7i8AlW+kSxtARl5OpTZeW9TaTDZHKRu3BSD1q1PxWyvQJVvIkdvRJmrobbex5dfT/Lrs2csRqOxFqO8WIySnqfDbK9g3frUGJSckkJZjRdDUSnGYjumYgd6czFaUyFakxWtyYrGWEiewUxugYm8AhNqo5myGi/JKSn/QQmK5OTFonIXR1pCNATb8bV14QtF8IciNIW78YcjNLZ2cuSjdrzHQtQ1B/Eea6Oo3IUiOTn67kRWrU5Kcq1RKKJr1q5lJb2vULxYnZTkene08SLynogoROSDFaZYno2X5U8pfllNWN73/5SwPBMvInH/AlIIOOfCXNavAAAAAElFTkSuQmCC" 24 | }, 25 | { 26 | name : 'about', 27 | image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADe0lEQVQ4jZXUb0gUZhzA8Z8giAYKvQiLRWh2eDPNhKvAU8/TS+/yTwqJVJL4h5XKUMQdp3TzTwQqipDhG9EIK2aOxpxjbKDeeaemnt5dFiuRrcI7PXVbo6L25rsXnrs3vZgvPvA8DzxfeF78HhGRoOOVAzknqu56E6uH2IsTVXe9xysHckQkSEQkOOHqoLdsyIlpwkPjpIfrFi9m6zottnVa7Ru02jdosa1jtq5z3eKlcdKDacJD2ZCThKuDXhEJFhEJia/op/jBKrp2J1mdLvTdbs71PCHn1jK5vU/J7X1Kzq1lzvU8Qd/tJqvTha7dSfGDVeIr+hGREBGR0LjSPgruPCejzYHu5iJZ7U6yO50YulwYut07ulxkdzrJaneiu7lIRpuDgjvPiSvtQ0RCRUTClBd7yOt9RlrjHFrzPJktDnRtDjJbF9A2z6NtnifdPIfm+mMymx1ozfOkNc6R1/sM5cUeRCRMRCRMcaEDfYcbdf00acZZUr6aQd0wTfbXs4w+9rL15iO/b7yj69sVkuttpBlnUddPo+9wo7jQEQjFnL9BZssSZ2qsqKrG+aJnkb7RVSyuDXx/fcSz/QHPHx/Y+vsfmvrdnKqe4EyNlcyWJWLO3wiEog1mNCYHqsoJTpX/zMuN97zefM9v6+9YWXvLytpbXvj9YH9NUulPqCon0JgcRBvMgdARnZHkujnii8eo6ZhhaeVPll74rbzZ4d/P/7pNWaud+OIxkuvmOKIzBkKH02o5fW0GZf4jZlyb2J2b2N1bnzTt2mLa5UOZ/4jT12Y4nFYbCB1KrkJVbkOhv8+o5SWTCz4mHTssfrv7yQUfY9ZXKPT3UZXbOJRcFQhFqipIKpki5uw9Cqu/40frK+aWtz/pl5k1ir78npiz90gqmSJSVREIHUgsIfGyBYXhIUczBonW9BGl6SU6/TbRWr/02ztnmj6OagdQGB6SeNnCgcSSQGh/XBEnr4yjzB0hNneE2LxhlPnDfF7wDXGFw8QV7qyV+cPE5g0TmzuCMneEk1fG2R9X9F8oNOJY/kZC8SDqWgvqOgspDVZSjVNoTDa0TXa0TXY0JhupxilSGqyo6yyoay0kFA8ScSzPtzsiIfsOpl4Kj9b7IqIM7EV4lGF938HUS7tDGywi4SISKSKf7VGk/26w+D+lYH811P/e/yPUfydYRIL+BSkIj6JbQMVJAAAAAElFTkSuQmCC" 28 | }, 29 | ], 30 | 31 | // 在这里定义firefox的功能按钮, command就是一小段程序, 可以从firefox api, 小书签或鼠标手势中摘取;可选自定义图标; 32 | // 同样, 建议先写完上面想要定义, 分类在子目录下的程序, 之后从中摘出你最常用的, 去掉后面的subdir定义, 放在最下面 33 | configs : [ 34 | { 35 | name : 'separator' 36 | }, 37 | { 38 | name : 'about:firefox', 39 | subdir : 'about', 40 | command : "openAboutDialog();", 41 | }, 42 | { 43 | name : 'about:about', 44 | subdir : 'about', 45 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:about')", 46 | }, 47 | { 48 | name : 'about:addons', 49 | subdir : 'about', 50 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:addons')", 51 | }, 52 | { 53 | name : 'about:cache', 54 | subdir : 'about', 55 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:cache')", 56 | }, 57 | { 58 | name : 'about:config', 59 | subdir : 'about', 60 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:config')", 61 | }, 62 | { 63 | name : 'about:memory', 64 | subdir : 'about', 65 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:memory')", 66 | }, 67 | { 68 | name : 'about:mozilla', 69 | subdir : 'about', 70 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:mozilla')", 71 | }, 72 | { 73 | name : 'about:plugins', 74 | subdir : 'about', 75 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:plugins')", 76 | }, 77 | { 78 | name : 'about:robots', 79 | subdir : 'about', 80 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:robots')", 81 | }, 82 | { 83 | name : 'about:support', 84 | subdir : 'about', 85 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:support')", 86 | }, 87 | { 88 | name : '选项', 89 | subdir : 'firefox常用功能', 90 | image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADE0lEQVQ4jaXMTUhqaQDG8RfufmZ2bYpDSYkfCzlConCyz4XaIUQPBKVtMsjVDEjQIsl4tbA61GRGC4PatIo+IMvoSOmx9JxFQYtcFCG0nbu9cN/0mUXM4sJlYJgH/ruHHyGEEEmSviwuLv7yX5Ik6QshhJBIJGI5OjrSVVX9WqlU/lJV9eu/9c/n+PhYj0QiFiKK4lq9Xsfa2hoSiQQopaCUYnl5GclkEpRSpFIppFIpUEqRSCSwurqKer0OURTXSDAYlHVdb5pMpu+dnZ0tk8nU6u7ubrW1tbU4jmtxHNdqb29vdXR0tCwWS6urq6tlMpm+a5rWDAaDMgkEArKu63C73WxoaAgOhwOCIIBSitnZWWxubmJqagozMzOwWCwYGBhAf38/0zQNgUBAJn6/X9Y0DYODg8xut2N+fh5LS0t4enrCw8MDKpUKyuUy0uk0KKXweDzo6+tjuq7/CLjdbuZyuZBIJPDx8YGXlxdks1nEYjHs7+/j7e0Nl5eX4Hkevb29rFarwe/3y2RsbEzWdR08z7OFhQU8Pj7i+fkZk5OT4DgORqMRVqsVlFJkMhns7OwgHo+zUqn0CYiiKN/f38PlcrHp6WlomoatrS1wHIdcLgdN0zAyMgJZlvH6+or393ecnJywWq0GURQ/gUqlAqfTydbX13F7e4tYLIaenh5omoZGo4F4PI5yuYxms4m9vT2Mj4+zarUKn88nE5/PJ9/d3cHhcLCJiQmoqorDw0MYjUZIkoRoNIq5uTk0Gg3kcjkIgoBwOMxKpdIn4PV610ulEmw2GwuFQkgmk6hWq9jd3YXT6YTBYMDKygpubm4QDochSRJOT0+Zoijwer3rxOPx/KmqanN4ePibwWBgoVCIbWxssIODA3Z2dsZkWWbRaJTJsszS6TRzuVzMarV+U1W1OTo6ukkEQfg9n8+jUCigUCigWCzi/Pwc+XweiqLg+voaiqLg6uoKxWIRiqLg4uIC+XwegiD8QQghv5rN5pjdbs/yPJ+x2WzbPM9v8zy/bbPZflbGbrdnzWZzjBDyG/m/+xsCyiIj0Yng5AAAAABJRU5ErkJggg==", 91 | command : "openPreferences();", 92 | }, 93 | { 94 | name : '书签管理', 95 | subdir : 'firefox常用功能', 96 | image : "chrome://browser/skin/places/allBookmarks.png", 97 | command : "PlacesCommandHook.showPlacesOrganizer('AllBookmarks');", 98 | }, 99 | { 100 | name : '历史', 101 | subdir : 'firefox常用功能', 102 | image : "chrome://browser/content/abouthome/history.png", 103 | command : "PlacesCommandHook.showPlacesOrganizer('History');", 104 | }, 105 | { 106 | name : 'separator', 107 | subdir : 'firefox常用功能', 108 | }, 109 | { 110 | name : '重启(清除启动缓存)', 111 | subdir : 'firefox常用功能', 112 | command : "Services.appinfo.invalidateCachesOnRestart() || Application.restart();", 113 | }, 114 | 115 | // 建议把要放在子目录下的功能按钮,定义在上面, 下面的定义放在主菜单下的最常用的功能按钮, 116 | { 117 | name : '破解右键限制', 118 | subdir : '', 119 | image :"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADXUlEQVQ4jW2Te0xTdxTHz723195721pKi7xu4bbcdtBWi3Wtijqr8TVwzOhQGYK6mVjnlk2WkaFEjQIZEvER4+YjbmSyxS0Dx8MxgYiDitIoYl1ggApxsqTs8ed0Lb+zPwybEL7J97/v93NOcnIApuikDEr/1oRVwY8d5Q/LXj7z4LDzs+4PzMUNWxJcAEBPzU9Sxxu6tYPF5r5QpUzGPonHUGn0c5fH4W+H4iM978X+ePH1ONu05a7sqMLHRTHhJ0VaHC2OwtEDCePDJUnPRvYm/jNaYiBPirT4uFCLg+9q/6zJSlgxqdy2WJ3zyKeJDPs0OLJbg8OFMeFja8y5voViom+BJH2aadp48y1DYGS3mjzcocZgvmasyivKAABQYQBN7wZhZDBPwKECFT7YrsZHOzWkOdtw1gugmBiyTQKuJVtXPZQvkF828qRxTXQtAADUO1X5fes50r+Bx4E8gQxsFnAgV8ChAoE0ro6eBNkjAt+Vpb7381oO777KPfsoXbRAy3yh+t4KJfa+xoWr3PHv316vDvWt47FvHY/9OTxpWKabBLnsnvlOcJUSe5expNJt3A5XPZz/TgaL7V7V7zl2mFHljPPcylSFgquVGFypxPtZSlKb8T/klCy4el5hx2/PZ/G0K6YMmuZy/kA6g20L+DE7wAwAgAq73tO5XAj1LGaxJ4PFu0tZcsmtPesFUJySWVfArRjvnsPgifTYcrhk4768kcZg5zxFeI8tyT6xaoVd77m+iAsFXArsdjIYmMeQGqfmwtc2obzLwaDfRpOSOclvw/EUVcFPaRTpsNF4xqE99+J5S616T4tLGbqRxmBnKo1+G0067DRpt9DY/BLz9M10swXyomHmd1bFr60yja02OnxU1u0CAGoCctCq91xxsKFrFhrbZBpbU2hsMVPkRKqu4b9cqaTd1GSmIs0mCpstdOS8zNccMWqW+GJh1sFEXvzcxH1xNYXCH0wUXpEo/MbE/rFttjX1xW2pMrOu+PtkKtyQTGGjRGGjCcYvS9Tf9SbqaZMEpD6JwnojkK8kxV87HaaV0/5DoRybfU5S9tcZgdQZKawVn7tOBPKtCJGjKVHtW+xW57TlCXkl4HZYxcx9FkPlYVl/8ZCsr/7QGrc/d7a8EACYqfl/ASscSowNpGaHAAAAAElFTkSuQmCC", 120 | command : 121 | function () 122 | { 123 | gBrowser.loadURI("javascript:(function(){var%20doc=document;var%20bd=doc.body;bd.onselectstart=bd.oncopy=bd.onpaste=bd.onkeydown=bd.oncontextmenu=bd.onmousemove=bd.onselectstart=bd.ondragstart=doc.onselectstart=doc.oncopy=doc.onpaste=doc.onkeydown=doc.oncontextmenu=null;doc.onselectstart=doc.oncontextmenu=doc.onmousedown=doc.onkeydown=function%20(){return%20true;};with(document.wrappedJSObject||document){onmouseup=null;onmousedown=null;oncontextmenu=null;}var%20arAllElements=document.getElementsByTagName('*');for(var%20i=arAllElements.length-1;i>=0;i--){var%20elmOne=arAllElements[i];with(elmOne.wrappedJSObject||elmOne){onmouseup=null;onmousedown=null;}}var%20head=document.getElementsByTagName('head')[0];if(head){var%20style=document.createElement('style');style.type='text/css';style.innerHTML=%22html,*{-moz-user-select:auto!important;}%22;head.appendChild(style);}void(0);})();") 124 | }, 125 | }, 126 | { 127 | name : '轻松下视频', 128 | subdir : '', 129 | image :"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADUElEQVQ4jSXMW09bBQDA8fM5TNh62tNzP225uAG938tCNhOCCj77oImvc4Dolokw67oMVkyhsCGXYZRyc4yBkA00U2fwY+iDGbABK7Q9fx/8fYCf0P1nN7HdBP7fkoR3Y6SfRUjtpIg/y5B6Gia2HSe9ESW6HSD2JE3ycYK2lQSJtSjdP3+AEN9N0LjchLluoG4o1D/2Ia8aKJs65rKKWfKilkzUkop3rhH5ewtz2sSa1oksphD8z+NY6wbWhoi5JmGsWsjrBo41J/KqibZooi3IGD+68c3UI80rmFMK3kmZSCmOEPs1hrbuxnrkwruqoy/7SC6l+OT5R/jmL+AuaZjzIuacG/NBA+4ZCc+kjDWmEZtPIGS2Q3h/sjBXLLRFD4mVdvaOXnDIP/Tt9GPNNeKadaFNe2m5H0eZ0nBNqsgFD/GZNoTUdgJlSUd5pJEsJfnr6AVV+5AKx+xzQt/WVXyTrYSLbfxysEtwyo+joKPlG8lMZhDiW21IKwrissjHux9yyN9UOeYNZ9RqcGK/ZGg7yx/7exyzz+XxFPqIgTfnJV2MIiQ3Y5g/6CgLBvUzTfRufsq+fYRtQ61SwbZtTjnhzD7jda3MlfFLmDkd/bZOy0QzQmArhuehhTWros0q1I/76Fm/xoF9SLViU+H/BLtKmde0T17GlVVwf+3EXwggpFcSaLMeXA9l5BkHxgMXDaMNDGze5NTe54wa1IAqlDnhSrEDaUDF/aVIaCSIkFmKYU1ZuKc1XN+pSGMm0cIlft/fo1w9BtuGM6BqU+YNncUupBsG52+6aB6JIARWwtQXDTxjGsqYxdv5IDsvn1K2X1GpVShzwJl9zCmHvOJf3pvoRPlMxfm5i2AujBBZSKAXDLSCgvKtGzWv0TTaQvBekujdNMHRDJl7HbQXOnmn2IWR9VLX76TuC5HWbAAhOpdCyZtoozLWXSdGzoH7joj4TR3Oobc4N3ge+bqMeF1C6lMR++uQekScvQ6igwGE5EwGzx0PRk5Hu63hvqUjDaiIAxKOIQfSjXNYvS5cfU6kHgXxWh3uqxLOPoXQV0GErtL7JCaihO+HaB4P4S/ECeXjhIaDBIYv0Dp8kWg2yMWcn5ZsBP+tZiKDYZoH/byb7+A/zBpdx7267WIAAAAASUVORK5CYII=", 130 | command : 131 | function () 132 | { 133 | gBrowser.loadURI("javascript:if(typeof%20yXzyxe58==typeof%20alert)yXzyxe58();window.open('http://www.youtubexia.com/?url='%20+encodeURIComponent(document.location.href),'getA','toolbar=no,%20location=no,%20directories=no,%20status=no,%20menubar=no,%20scrollbars=yes,%20resizable=yes,%20copyhistory=yes,%20width=800,%20height=600');void(0);") 134 | }, 135 | }, 136 | { 137 | name : 'PrintWhatYouLike', 138 | subdir : '', 139 | image :"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABt0lEQVQ4jaWRwWsTYRDFf7tNrZjYVLNJl7RQotRrxTZBgqFiQy+tSPHuyb9AEE+SXgXxLCLEiwh6DRQlQhsIulBbqSkm2oDeCkpiEJFmv93xIF27blopPhj4eLw3b+Yb+E9ovcji8mVJjZiE9D6PEyB3+n5A7yMWn2RkdDjOqVHzwMxLZx56vtDu4/bjSRkY6GfEjNF1VMAmIqzWPvKl9c3H67sP5bgkEyexXUXXsQNVWX3Hy1dv2Wh84krBEN8ENx9NSKi/j3DkKLayA+lXzz7zrXrxhu410H+nOwweP4btKLo96m8s3/uhzd46Id4EynUIh49gO8H0a5lSz0u9uNPWYM8VHlRnRdf+aK9nn/uMa9WqjI2PE0skfHzP7ntRLpclMzXF02KRSCRCJpfDME0Gh4Y0b4X9cLdQkJ+dDh+2tnCUotlo8LnZZDKb9TSBBq9XVqReq7Gxvs6FmRm+bm9TXVqiXq8zbBhMpNNEo9H9G5yfntYArEpF3lgW7zc3+d5uk0wmyc/NoXZ26LRah/iDUknWLIuxVAojFkNcl/zCgufTDzID5OfntXPpNIl4HHHdf8kPj18pO7Iti9L4wwAAAABJRU5ErkJggg==", 140 | command : 141 | function () 142 | { 143 | gBrowser.loadURI("javascript:(function(){if(window['ppw']&&ppw['bookmarklet']){ppw.bookmarklet.toggle();}else{window._pwyl_home='http://www.printwhatyoulike.com/';window._pwyl_pro_id=null;window._pwyl_bmkl=document.createElement('script');window._pwyl_bmkl.setAttribute('type','text/javascript');window._pwyl_bmkl.setAttribute('src',window._pwyl_home+'static/compressed/pwyl_bookmarklet_10.js');window._pwyl_bmkl.setAttribute('pwyl','true');document.getElementsByTagName('head')[0].appendChild(window._pwyl_bmkl);}})();") 144 | }, 145 | }, 146 | { 147 | name : '阅读助手', 148 | subdir : '', 149 | image :"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACE0lEQVQ4jaWTv0sbYRjHP+97l8slNVASEiMBk7qJIC0ScMjg0KE4NUsNhA7+DcWhW5WC+B9oFodaxK2bQwcXoaSNVHAJCB0CWqiSQqVJLnf3vh3uYpNGpz7j8+PL83y/30e8B81/hKnuKQgpEVICoJVCq7s7xwAEgJR4SuGHQwZgSAlKja07voEQuEqRnJ8nUyqB1vw4PqZ9dkZECND6HgAhQAg8pXiyscHjtTUitg1Av9vldGuL0/V1TCkDkBBI1EISNeAAs9UqT/f20FqjfT9oMgyEEHysVGgeHBAdnApIBfQBO59nolBgZmUFrRS+694S6bsuWilmKhUeFArY+Tx9QAHyN5AqFinX67xoNHAdJ7jNsm4BTMsCrfE8j0qjQbleJ7mwQA8wO0Bybo7E5CQAsUyGm8tL3F6PztUVAPF0mohtE8tkiKdSEM60Tk4wnsGb62YTBeQWF/l1cUGn3SaRyzExNUU8nUYYBtfn5wgpSWSzfNrc5Ov2Nvg+4m3I5w3wcn+fbLGIGYnwcHp6RK6frRbKdfler/OuWiUREmn2CVwngS87O5RLJT6srmJGoyMAnuPwfHeXz7UaUko8AoeK16GMCrBiMR4tLdE8PMQdkkoBFjC7vMy3oyP63S5yYJ9XQ8+kQ0mjQgR/MHCdEGilcLTGGgIGMF1GwzAMXN+H0ETDYRoG3j95c6ztjsG/pfHaH8m8z1R4EJkJAAAAAElFTkSuQmCC", 150 | command : 151 | function () 152 | { 153 | gBrowser.loadURI("javascript:(function(){readStyle='style-newspaper';readSize='size-large';readMargin='margin-wide';_readability_script=document.createElement('SCRIPT');_readability_script.type='text/javascript';_readability_script.src='http://lab.arc90.com/experiments/readability/js/readability.js?x='+(Math.random());document.getElementsByTagName('head')%5B0%5D.appendChild(_readability_script);_readability_css=document.createElement('LINK');_readability_css.rel='stylesheet';_readability_css.href='http://lab.arc90.com/experiments/readability/css/readability.css';_readability_css.type='text/css';_readability_css.media='screen';document.getElementsByTagName('head')%5B0%5D.appendChild(_readability_css);_readability_print_css=document.createElement('LINK');_readability_print_css.rel='stylesheet';_readability_print_css.href='http://lab.arc90.com/experiments/readability/css/readability-print.css';_readability_print_css.media='print';_readability_print_css.type='text/css';document.getElementsByTagName('head')%5B0%5D.appendChild(_readability_print_css);})();") 154 | }, 155 | }, 156 | { 157 | name : 'separator', 158 | }, 159 | { 160 | name : '下载管理', 161 | image : "chrome://browser/skin/places/downloads.png", 162 | command : "BrowserDownloadsUI();", 163 | }, 164 | { 165 | name : '附加组件', 166 | image : "chrome://mozapps/skin/extensions/extensionGeneric-16.png", 167 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:addons')", 168 | }, 169 | { 170 | name : 'about:config', 171 | image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABxElEQVQ4jZXQzYsScRzH8d/f16lTFCwRdOoSUYddtlrUaXTVEdR1xqfysLtUrC2EujNjbplPjIGtJIZB6YLMjqu105/w7tQhMB8+99f7C18hVpiiKGiaRjqdJplMsor5B6dSKWzbxnVdVFVdL6CqKuPxmMlkgmmaxOPx9QKapmHbNt1uF0VREEKISCRCOBxmd3d3eSyRSDAcDmk2m4RCIYLBIPl8nsFggCzLiwOyLBOLxej3+7TbbSqVCuVymVqtRqPRQJKk+QE5bSLnPhGNRrEsi06ng2VZtFot6vU61WoVn883Hz/TDLLmhOSJQ/j1N3q9HqVSiUAggCzLSJKE1+udjyXNIKs7VLq/KZ+5hI/HbGd6+P3+5c/yqQYp3eHdmcvL6pT900sK7V94Ds656/+4OOBN6CSLDuXPLocfpqjFC56bE45bP9nKjbjjNf8f2Eno7BUcjI7L4fspe4ULMrrDm8aMzRcjbnuMxde3ckP0zhX7p5fE3tqkTxzy9RmPsiM2dpZgIYS4r32n0L4iY0xIFh2O6jMeZkfceroCFkKIe4qF5+Cco9qMV9UZD1I/uPl4Rfx3G7LFdd9Xrj35wo3t9fAfyK1fDftrXK0AAAAASUVORK5CYII=", 172 | command : "getBrowser().selectedTab = getBrowser().addTab ('about:config')", 173 | }, 174 | { 175 | name : '错误控制台', 176 | image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAADbklEQVQ4jZXUS09TCRTA8UPShMBi1i7mQ7hhNcQMPmaiqVFDDDHER4ghWmxa+6BXevuilIulra0tfV36flFoeYmYGF3wCQQLOt+AGb/EfxaC3erivzy/5CzOEREZmLHYjLZZ5dTmesEvNauczlhsRhEZEBExWByzp7tv3/HpqMfh52MOeyccHX+hd/KV3sk/Z33l6PgLh70TDj8f8+mox+7bd1gcs6ciYhARGTTbHXw8OKCx3qXV2aS9uc3G9i6dnTd0d/fo7u7R2XnDxvYu7c1tWp1NGutdPh4cYLY7EJFBEZEhk/U5++8/UG60qLba1Nc7NDe+o2vdLda6W7Q6mzQ3utTXO1RbbcqNFvvvP2CyPkdEhkREhqdnzGzt7ZMtVdCrdYr1JqVGi0qrTXVtneraOpVWm1KjRbHeRK/WyZYqbO3tMz1jRkSGRUSGp56YaG/tkMjqpPQimUKZXKlKvlxDr9TRK3Xy5Rq5UpVMoUxKL5LI6rS3dph6YupDDx9PU2tvEI6niKUyxNM5ElmdZG6VVL5AKl8gmVslkdWJp3PEUhnC8RS19gYPH0/3oclHU5TqTRbCMbRYgnA8SeT1CtFkmlgqQyyVIZpME3m9QjieRIslWAjHKNWbTD6a6kMT9x+wUqqgLmj4tWWC4SihyCsWo3G0WAItlmAxGicUeUUwHMWvLaMuaKyUKkzcf9CHxu9NEknrOD0B5gIh1KCGN/QSv7ZMYClCYCmCX1vGG3qJGtSYC4RwegJE0jrj9yb70O27EyzG01gVFYfqx+UL8iIQwh3UUBeWUBeWcAc1XgRCuHxBHKofq6KyGE9z++5EHzLeGWd+OcEzh4JVUbG7fTg9gR/gOeD0BLC7fVgVlWcOhfnlBMY7433o+s1b+JeiPLXYMTsUrC439jkvTtXHrMfPrMePU/Vhn/NidbkxOxSeWuz4l6Jcv3mrD129YWQ+Esdkc2J2KlgVN3a3B6fqw+UN4PIGvkNuD1bFjdmpYLI5mY/EuXrD+AMaunTtr//m/EGS+QLpfIHsaolcsYJerlGo1ClU6ujlGrlihexqiXS+QDJfYM4f5NK1v7+dn8jgxZGRydE/x76Njl1hdOzyT3aFP8Yu/3txZGTy/GgNIvKbiFwQkd9/sQtnswY5e0qGM3XobN+faehsxiAiA/8DDnCW2sYeE5QAAAAASUVORK5CYII=", 177 | command : "toJavaScriptConsole();", 178 | }, 179 | ], 180 | }, 181 | 182 | subdirPopupHash : [], 183 | subdirMenuHash : [], 184 | _externalFuncPopup : null, 185 | _isready : false, 186 | unescapeHTML : function(input) { 187 | return input.replace(/&/g, '&') 188 | .replace(/"/g, '\"') 189 | .replace(/</g, '<') 190 | .replace(/>/g, '>') 191 | .replace(/'/g, '\'') 192 | .replace(/([^\\])\\([^\\])/g, '$1\\\\$2'); 193 | }, 194 | init : function () { 195 | 196 | var ExternalFuncBtn = document.createElement('toolbarbutton'); 197 | ExternalFuncBtn.id = "ExternalFuncButtonM-ID"; 198 | ExternalFuncBtn.setAttribute("label", "扩展小功能按钮"); 199 | ExternalFuncBtn.setAttribute("onclick", "event.preventDefault();event.stopPropagation();"); 200 | ExternalFuncBtn.setAttribute("tooltiptext", "扩展小功能按钮,可以自定义小函数功能"); 201 | ExternalFuncBtn.setAttribute("class", "toolbarbutton-1 chromeclass-toolbar-additional"); 202 | ExternalFuncBtn.setAttribute("type", "menu"); 203 | ExternalFuncBtn.setAttribute("removable", "true"); 204 | ExternalFuncBtn.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYUlEQVQ4jWNgYPj/n5GRPMzA8P8/AyPjfyj4hx3/w4H/Qw2BGPDv/7SzRVjxU1FVrPj/v3//GRj+UWYAxS4YTgb8+///f8ruD1jx369pWPH//6MGUNcAPFkJrwwkR1KYnQHdFt9E917n4QAAAABJRU5ErkJggg=="); 205 | 206 | 207 | var ExternalFuncPopup = document.createElement('menupopup'); 208 | ExternalFuncPopup.setAttribute('onpopupshowing', 'event.stopPropagation();gExternalFuncButtonM.onpopupshowing();'); 209 | this._externalFuncPopup = ExternalFuncPopup; 210 | ExternalFuncBtn.appendChild(ExternalFuncPopup); 211 | setTimeout(function () { //延时加载菜单,不对启动造成影响,也不影响第一次打开菜单时的响应速度 212 | gExternalFuncButtonM.loadSubMenu(); 213 | }, 3000); 214 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent( 215 | '\ 216 | #ExternalFuncButtonM-ID {\ 217 | -moz-appearance: none !important;\ 218 | border-style: none !important;\ 219 | border-radius: 0 !important;\ 220 | padding: 0 3px !important;\ 221 | margin: 0 !important;\ 222 | background: transparent !important;\ 223 | box-shadow: none !important;\ 224 | -moz-box-align: center !important;\ 225 | -moz-box-pack: center !important;\ 226 | min-width: 18px !important;\ 227 | min-height: 18px !important;\ 228 | }\ 229 | #ExternalFuncButtonM-ID > .toolbarbutton-icon {\ 230 | max-width: 18px !important;\ 231 | padding: 0 !important;\ 232 | margin: 0 !important;\ 233 | }\ 234 | #ExternalFuncButtonM-ID dropmarker{display: none !important;}\ 235 | ') + '"'), document.documentElement); 236 | 237 | if (this.moveablePositonOrInsertafter) { 238 | var navigator = document.getElementById("navigator-toolbox"); 239 | if (!navigator || navigator.palette.id !== "BrowserToolbarPalette") 240 | return; 241 | navigator.palette.appendChild(ExternalFuncBtn); 242 | this.updateToolbar(); 243 | } else { 244 | var navigator = document.getElementById(this.insertafter); 245 | if (!navigator) 246 | return; 247 | navigator.parentNode.insertBefore(ExternalFuncBtn, navigator.previousSibling); 248 | } 249 | }, 250 | loadSubMenu : function () { 251 | if (this._isready) 252 | return; 253 | if (this._externalFuncPopup == null) 254 | return; 255 | var ExternalFuncPopup = this._externalFuncPopup; 256 | for (var i = 0; i < this.toolbar.subdirs.length; i++) { 257 | if (this.toolbar.subdirs[i].name == 'separator') { 258 | ExternalFuncPopup.appendChild(document.createElement('menuseparator')); 259 | } else { 260 | var subDirItem = ExternalFuncPopup.appendChild(document.createElement('menu')); 261 | var subDirItemPopup = subDirItem.appendChild(document.createElement('menupopup')); 262 | subDirItem.setAttribute('class', 'menu-iconic'); 263 | subDirItem.setAttribute('label', this.toolbar.subdirs[i].name); 264 | subDirItem.setAttribute('image', this.toolbar.subdirs[i].image); 265 | gExternalFuncButtonM.subdirPopupHash[this.toolbar.subdirs[i].name] = subDirItemPopup; 266 | gExternalFuncButtonM.subdirMenuHash[this.toolbar.subdirs[i].name] = subDirItem; 267 | } 268 | } 269 | 270 | for (var i = 0; i < this.toolbar.configs.length; i++) { 271 | var configItems; 272 | if (this.toolbar.configs[i].name == 'separator') { 273 | configItems = document.createElement('menuseparator'); 274 | } else { 275 | configItems = ExternalFuncPopup.appendChild(document.createElement('menuitem')); 276 | configItems.setAttribute('class', 'menuitem-iconic'); 277 | configItems.setAttribute('label', this.toolbar.configs[i].name); 278 | configItems.setAttribute('image', this.toolbar.configs[i].image); 279 | if (typeof this.toolbar.configs[i].command == 'function') { 280 | configItems.setAttribute('oncommand', this.unescapeHTML(this.toolbar.configs[i].command.toSource()) + '.call(this, event);'); 281 | } else { 282 | configItems.setAttribute('oncommand', this.toolbar.configs[i].command); 283 | } 284 | configItems.setAttribute('tooltiptext', this.toolbar.configs[i].name); 285 | } 286 | if (this.toolbar.configs[i].subdir && gExternalFuncButtonM.subdirPopupHash[this.toolbar.configs[i].subdir]) 287 | gExternalFuncButtonM.subdirPopupHash[this.toolbar.configs[i].subdir].appendChild(configItems); 288 | else 289 | ExternalFuncPopup.appendChild(configItems); 290 | } 291 | 292 | if (this.autohideEmptySubDirs) { 293 | for (let[name, popup]in Iterator(gExternalFuncButtonM.subdirPopupHash)) { 294 | if (popup.hasChildNodes()) { 295 | continue; 296 | } else { 297 | gExternalFuncButtonM.subdirMenuHash[name].setAttribute("hidden", "true"); 298 | } 299 | } 300 | } 301 | 302 | if (this.moveSubDirstoBottom) { 303 | let i = ExternalFuncPopup.childNodes.length; 304 | while (ExternalFuncPopup.firstChild.getAttribute('class') != 'menuitem-iconic' && i-- != 0) { 305 | ExternalFuncPopup.appendChild(ExternalFuncPopup.firstChild); 306 | } 307 | } 308 | this._isready = true; 309 | }, 310 | onpopupshowing : function () { 311 | if (!this._isready) 312 | this.loadSubMenu(); 313 | }, 314 | updateToolbar: function () { 315 | let toolbars = Array.slice(document.querySelectorAll('#navigator-toolbox > toolbar')); 316 | toolbars.forEach(function (toolbar) { 317 | var currentset = toolbar.getAttribute("currentset"); 318 | if (currentset.split(",").indexOf("ExternalFuncButtonM-ID") < 0) 319 | return; 320 | toolbar.currentSet = currentset; 321 | try { 322 | BrowserToolboxCustomizeDone(true); 323 | } catch (ex) {} 324 | }); 325 | } 326 | }; 327 | 328 | gExternalFuncButtonM.init(); 329 | -------------------------------------------------------------------------------- /qrCreatorOnline.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @include chrome://browser/content/browser.xul 3 | // @name qrCreatorOnline.uc.js 4 | // @version 0.1 5 | // @charset UTF-8 6 | // @author lastdream2013 7 | // ==/UserScript== 8 | var qrCreatorOnline = { 9 | generateAddress: function(target_data) { 10 | return 'http://chart.apis.google.com/chart?cht=qr&chs=350x350&chl=' + encodeURIComponent(target_data); 11 | }, 12 | 13 | targetWindow: null, 14 | 15 | checkLength: function(arg) { 16 | if (arg ) { 17 | if ( arg.length == 0 ) { 18 | alert("没有要转化为二维码的内容!" ); 19 | return false; 20 | } 21 | else if (arg.length > 250) { 22 | alert("要转化为二维码的数据超长了!(大于250字节)" ); 23 | return false; 24 | }else { 25 | return true; 26 | } 27 | } 28 | else { 29 | return false; 30 | } 31 | }, 32 | 33 | popupImage: function(target_data, altText) { 34 | var img_node = content.document.getElementById('qrCreatorOnlineimageboxid'); 35 | if (img_node) { 36 | img_node.parentNode.removeChild(img_node); 37 | } 38 | img_node = this.pinImage(target_data, altText); 39 | 40 | content.document.body.appendChild(img_node); 41 | this.ImgDrag(img_node); 42 | content.document.addEventListener('click', function (e) { 43 | if(img_node && e.button==0 && e.target != img_node) { 44 | img_node.parentNode.removeChild(img_node); 45 | this.removeEventListener("click",arguments.callee,true); 46 | } 47 | }, true); 48 | }, 49 | 50 | pinImage: function(target_data, altText) { 51 | var img_node = new Image(); 52 | img_node.setAttribute('style', '-moz-box-shadow: 0 0 4px #000000'); 53 | with (img_node.style) { 54 | position = 'fixed'; 55 | left = '-moz-calc(50% - 183px)'; 56 | top = '-moz-calc(50% - 183px)'; 57 | zIndex = 99999; 58 | width = "350px"; 59 | height = "350px"; 60 | border = '8px solid rgba(0,0,0,.5)'; 61 | borderRadius = '5px'; 62 | background = 'transparent'; 63 | } 64 | img_node.setAttribute('id', 'qrCreatorOnlineimageboxid'); 65 | img_node.setAttribute('src', this.generateAddress(target_data)); 66 | img_node.setAttribute('alt', altText + ': ' + target_data); 67 | img_node.setAttribute('title', img_node.getAttribute('alt')); 68 | 69 | return img_node; 70 | }, 71 | 72 | onMenuItemCommand: function() { 73 | if(content.document.getElementById('qrCreatorOnlineimageboxid')) return; 74 | var target_data = ''; 75 | var altText = "QR码内容[网址]"; 76 | 77 | if (gContextMenu) { 78 | if (gContextMenu.isTextSelected) { 79 | target_data = content.getSelection().toString(); 80 | altText = "QR码内容[文本]"; 81 | } 82 | else if (gContextMenu.onLink) { 83 | target_data = gContextMenu.linkURL; 84 | } 85 | else if (gContextMenu.onImage) { 86 | target_data = gContextMenu.target.src; 87 | } 88 | else if ( ( content.document.location == "about:blank" || content.document.location == "about:newtab" ) ) { 89 | altText = "QR码内容[文本]"; 90 | target_data = prompt("请输入文本创建一个QR码(长度不超过250字节):", ""); 91 | } 92 | else { 93 | target_data = content.document.location; 94 | } 95 | } 96 | 97 | if (this.checkLength(target_data)) { 98 | this.popupImage(target_data, altText); 99 | } 100 | }, 101 | 102 | init: function() { 103 | this.ContextMenu(); 104 | var menu=document.getElementById("contentAreaContextMenu"); 105 | menu.addEventListener("popupshowing", this.optionsChangeLabel, false); 106 | }, 107 | 108 | ImgDrag: function (node){ 109 | var IsMousedown, LEFT, TOP, img_node = node; 110 | img_node.onmousedown = function(e) { 111 | IsMousedown = true; 112 | e = e||event; 113 | LEFT = e.clientX - img_node.offsetLeft; 114 | TOP = e.clientY - img_node.offsetTop; 115 | return false; 116 | } 117 | 118 | content.document.addEventListener("mousemove", function(e) { 119 | e = e||event; 120 | if (IsMousedown) { 121 | img_node.style.left = e.clientX - LEFT + "px"; 122 | img_node.style.top = e.clientY - TOP + "px"; 123 | } 124 | },false); 125 | 126 | content.document.addEventListener("mouseup", function(){ 127 | IsMousedown = false; 128 | },false); 129 | }, 130 | 131 | ContextMenu : function(){ 132 | var menu=document.getElementById("contentAreaContextMenu"); 133 | var menuItem=document.createElement("menuitem"); 134 | menuItem.setAttribute("id", "qrCreatorOnline.menu"); 135 | menuItem.addEventListener("command", function(){qrCreatorOnline.onMenuItemCommand();}, false); 136 | menuItem.setAttribute("label", "在线生成QR码"); 137 | menuItem.setAttribute("class", "menuitem-iconic"); 138 | menu.setAttribute("accesskey","S"); 139 | menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzUlEQVQ4jaWOQYqFMBBE+xgewBO4ceEiIAQaBBHxPjlrFkKWucGbxaf/T/zGYZiCoqraoozwTwhACIHjOCoCt94YQvgM7PterVou762OAGzbRkufvr0H1nWt1stsvtURgGVZvmh3Q6sjPEBVUdWnymvAe4/3ntKX+UkFYJ5nTJ98masXtOCcwzl3m00FYJqmLxrMt1QAxnGs/mz5N30PDMNAS0vedQSg7/vqBWW++mtXYoyoKl3XVQQqvd5UlRgjknMmpcR5nn9iSomcMz9lng2NV0gSXAAAAABJRU5ErkJggg=="); 140 | menu.insertBefore(menuItem, document.getElementById("context-openlinkintab")); 141 | 142 | }, 143 | optionsChangeLabel:function(){ 144 | var labelText; 145 | if (gContextMenu) { 146 | if (gContextMenu.isTextSelected) { 147 | labelText = "选区文本"; 148 | } 149 | else if (gContextMenu.onLink) { 150 | labelText = "链接地址"; 151 | } 152 | else if (gContextMenu.onImage) { 153 | labelText = "图象地址"; 154 | } 155 | else if ( content.document.location == "about:blank" || content.document.location == "about:newtab" ) { 156 | labelText = "手工输入"; 157 | } 158 | else { 159 | labelText = "当前网址"; 160 | } 161 | //Services.console.logStringMessage('[ content.document.location optionsChangeLabel ]: ' + content.document.location ); 162 | var currentEntry=document.getElementById("qrCreatorOnline.menu"); 163 | if(currentEntry){ let LABELTEXT = "在线生成QR码 : " + labelText ; currentEntry.setAttribute("label", LABELTEXT);} 164 | } 165 | }, 166 | }; 167 | 168 | qrCreatorOnline.init(); 169 | 170 | 171 | -------------------------------------------------------------------------------- /qrReaderOnline.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @include chrome://browser/content/browser.xul 3 | // @name qrReaderOnline.uc.js 4 | // @version 0.15 5 | // @charset UTF-8 6 | // @note version 20130627 7 | // @author lastdream2013 8 | // ==/UserScript== 9 | 10 | var qrReaderOnline={ 11 | unescapeHTML:function ( input ) { 12 | return String(input) 13 | .replace(/&/g, '&') 14 | .replace(/"/g, '"') 15 | .replace(/</g, '<') 16 | .replace(/>/g, '>') 17 | .replace(/'/g, '\''); 18 | }, 19 | 20 | initialize:function(){ 21 | var menu=document.getElementById("contentAreaContextMenu"); 22 | menu.addEventListener("popupshowing", qrReaderOnline.optionsShowHide, false); 23 | qrReaderOnline.createMenu(); 24 | }, 25 | getClickHandler:function(){ 26 | var url=qrReaderOnline.imgURL; 27 | let req = new XMLHttpRequest(); 28 | req.open("GET", 'http://zxing.org/w/decode?u=' + encodeURIComponent(url), true); 29 | req.send(null); 30 | req.onload = function () { 31 | if (req.status == 200) { 32 | var title = req.responseText.match(/(.+)<\/title>/i)[1]; 33 | if (title =="Decode Succeeded") { 34 | //Services.console.logStringMessage('[ req.responseText ]: ' + req.responseText ); 35 | try{ 36 | var resultstr = req.responseText.match(/Parsed Result<\/td><td>(.+)<\/td><\/tr><\/table><hr\/>/i)[1]; 37 | resultstr = resultstr.match(/<pre[^>]+>(.*)<\/pre>/i)[1]; 38 | resultstr = resultstr.replace(/<br\/>/ig, '\n'); 39 | qrReaderOnline.read(qrReaderOnline.unescapeHTML(resultstr)); 40 | } 41 | catch(e){ 42 | alert(e); 43 | } 44 | } 45 | else{ 46 | alert("解析失败:" + title); 47 | } 48 | } 49 | } 50 | }, 51 | 52 | read:function(d){ 53 | var p=/^(https?|ftp|file):\/\/[-_.~*'()|a-zA-Z0-9;:\/?,@&=+$%#]*[-_.~*)|a-zA-Z0-9;:\/?@&=+$%#]$/; 54 | if(p.test(d)){ 55 | var f=confirm("QR码为网络地址,确认打开?"+'\n\n'+d); 56 | if(f==true){ 57 | gBrowser.loadOneTab(d, null, null, null, true, false); 58 | } 59 | } 60 | else{ 61 | var r=confirm("QR代码值(按OK键将其复制到剪贴板):"+'\n\n'+d); 62 | if(r==true){ 63 | try{ 64 | Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(d); 65 | } 66 | catch(e){ 67 | alert(e); 68 | } 69 | } 70 | } 71 | }, 72 | createMenu:function(){ 73 | var menu=document.getElementById("contentAreaContextMenu"); 74 | var menuItem=document.createElement("menuitem"); 75 | menuItem.setAttribute("id", "qrReaderOnline.menu"); 76 | menuItem.addEventListener("command", function(){qrReaderOnline.getClickHandler();}, false); 77 | menuItem.setAttribute("label", "在线解析图像QR码"); 78 | menuItem.setAttribute("class", "menuitem-iconic"); 79 | menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA3UlEQVQ4jaWSzWnDQBBGH2kiLsAnIfXhQzoKGBZcgHpxBWpBPqoAGdSCrJfTbix5V4Zk4GNmvvlddvCfgiqQsOdnY5HMJaYpGfulQa74uXCbt2qQm1Sa+GLvrbj3tN8NHg8/ICH6JX7L4TTp/e4BdBx1HD1A0Y/6E3SaxK7zBHq9+pXRWy7iBNp1Ytvq5eIZNATPkBB9Q1jFDMFv0LYVm0arSuvaGyRY1wk5zqrSphH7XofBI3iEZDsMKzvGn2Hfi8vy9nSLN7Es4jwXk3N/vxo2z/un/HYDN6f8F/kB7L2cwHXEHwAAAAAASUVORK5CYII="); 80 | menu.insertBefore(menuItem, document.getElementById("context-openlinkintab")); 81 | 82 | }, 83 | optionsShowHide:function(){ 84 | if(gContextMenu){ 85 | var isViewableImage=false; 86 | qrReaderOnline.imgTarget=gContextMenu.target; 87 | var p=/^(https?|ftp):\/\/[-_.~*'()|a-zA-Z0-9;:\/?,@&=+$%#]*[-_.~*)|a-zA-Z0-9;:\/?@&=+$%#]$/; 88 | if(gContextMenu.onImage && ( p.test(gContextMenu.imageURL)) ){ 89 | // if(gContextMenu.onImage ){ 90 | isViewableImage=true; 91 | qrReaderOnline.imgURL=gContextMenu.imageURL; 92 | if(gContextMenu.onLink){qrReaderOnline.linkURL=gContextMenu.linkURL;} 93 | else{qrReaderOnline.linkURL='';} 94 | } 95 | var currentEntry=document.getElementById("qrReaderOnline.menu"); 96 | if(currentEntry){currentEntry.hidden=!isViewableImage;} 97 | 98 | } 99 | }, 100 | fun_OpenSite:function(url){ 101 | gBrowser.loadOneTab(url, null, null, null, true, false); 102 | }, 103 | }; 104 | 105 | qrReaderOnline.initialize(); 106 | 107 | 108 | -------------------------------------------------------------------------------- /quickProxyModokiMod.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name quickProxyModokiMod.uc.js 3 | // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 4 | // @description 快速代理设置 5 | // @include main 6 | // @compatibility Firefox 3.0 3.5 3.6 3.7a1pre WinXP 7 | // @charset UTF-8 8 | // @author Alice0775 9 | // @note fix compatibility for firefox23a1 10 | // @version 2012/01/31 11:00 by Alice0775 12.0a1 about:newtab 11 | // @version 2010/02/05 00:00 ウインドウが閉じてしまわないように 12 | // @version 2009/09/02 13:00 quickproxy.typeをセットしないで使おうとする方のため直前のproxy.typeをquickproxy.typeにするようにした。 13 | // @note 左クリック:オンオフ. 中クリック:起動時の設定 quickproxy.autooff, 右クリック:プロキシの設定 14 | // @note about:configのquickproxy.typeに値を予めセットしておく1(指定)または2(PAC) 15 | // @note 一発プロキシcontextProxySwitch.uc.xulを使うとより便利かも 16 | // ==/UserScript== 17 | 18 | (function (css) { 19 | if (window.quickProxy) { 20 | window.quickProxy.destroy(); 21 | delete window.quickProxy; 22 | } 23 | 24 | var quickProxy = { 25 | //-- config -- 26 | // 以下はFirefox3以上の場合に有効 27 | // [true]:オプションをタブで開く, false:ダイアログで開く 28 | optionInTab: true, 29 | // falseの時ダイアログを開く遅延 巧く開かないときは遅延を大きくする 30 | optionDelay: 800, 31 | //-- config -- 32 | _init: function(){ 33 | var overlay = '\ 34 | <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" \ 35 | xmlns:html="http://www.w3.org/1999/xhtml"> \ 36 | <toolbarpalette id="urlbar-icons">\ 37 | <image id="quickproxy-status" label="quickproxySwitch" \ 38 | onclick="quickProxy._click(event);" \ 39 | tooltiptext="" >\ 40 | </image>\ 41 | </toolbarpalette>\ 42 | </overlay>'; 43 | overlay = "data:application/vnd.mozilla.xul+xml;charset=utf-8," + encodeURI(overlay); 44 | window.userChrome_js.loadOverlay(overlay, quickProxy); 45 | addStyle(css); 46 | 47 | quickProxy.addPrefListener(quickProxy.buttonPrefListener); // 登録処理 48 | window.addEventListener('unload',function(){ 49 | quickProxy.removePrefListener(quickProxy.buttonPrefListener); 50 | } 51 | ,false); 52 | }, 53 | 54 | observe: function (subject, topic, data) { 55 | if (topic == "xul-overlay-merged") { 56 | var icon = document.getElementById("quickproxy-status"); 57 | var qp_autooff = quickProxy.getPref('quickproxy.autooff', 'bool', false); 58 | var Is_Proxy_On = quickProxy.getPref("network.proxy.type", 'int', 0); 59 | quickProxy.addPrefListener(quickProxy.buttonPrefListener); // 登録処理 60 | window.addEventListener('unload',function(){ 61 | quickProxy.removePrefListener(quickProxy.buttonPrefListener); 62 | } 63 | ,false); 64 | if (qp_autooff == true && quickProxy.getNumberOfWindow() == 1){ 65 | Is_Proxy_On = 0 66 | } 67 | quickProxy.setPref("network.proxy.type", 'int', Is_Proxy_On); 68 | 69 | quickProxy._updateUI(); 70 | //Application.console.log("quickProxy界面加载完毕!"); 71 | } 72 | }, 73 | 74 | getNumberOfWindow: function(){ 75 | var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] 76 | .getService(Components.interfaces.nsIWindowMediator); 77 | var enumerator = mediator.getEnumerator("navigator:browser"); 78 | var num = 0; 79 | while(enumerator.hasMoreElements()) { 80 | var win = enumerator.getNext(); 81 | num++; 82 | } 83 | return num; 84 | }, 85 | 86 | _switch: function() { 87 | var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0); 88 | var Proxy_Type = this.getPref("quickproxy.type", 'int', 1); 89 | if (Is_Proxy_On == 0){ 90 | Is_Proxy_On = Proxy_Type; 91 | }else{ 92 | Is_Proxy_On = 0; 93 | } 94 | this.setPref("network.proxy.type", 'int', Is_Proxy_On); 95 | this._updateUI(); 96 | }, 97 | 98 | _click: function(e){ 99 | if (e.button == 0){ 100 | this._switch(); 101 | } 102 | if (e.button == 2) { 103 | var aURL = "chrome://browser/content/preferences/connection.xul"; 104 | if (parseInt(Components.classes["@mozilla.org/xre/app-info;1"] 105 | .getService(Components.interfaces.nsIXULAppInfo) 106 | .version.substr(0,3) * 10,10) / 10 < 3) { 107 | //Fx2 108 | var aName =""; 109 | var aFeatures = 'modal,centerscreen,resizable=no'; 110 | var aParams = null; 111 | openDialog(aURL, aName, aFeatures, aParams); 112 | } else { 113 | if (this.optionInTab) { 114 | //Fx3 タブバージョン (タブが一つの時, 閉じるとFxも閉じてしまう) 115 | if ("isBlankPageURL" in window ? isBlankPageURL(gBrowser.currentURI.spec) : gBrowser.currentURI.spec == "about:blank") 116 | gBrowser.loadOneTab(aURL); 117 | else 118 | gBrowser.selectedTab = gBrowser.addTab(aURL); 119 | var Proxy_Type = this.getPref("network.proxy.type", 'int', 0); 120 | if(Proxy_Type > 0) this.setPref("quickproxy.type", 'int', Proxy_Type); 121 | this._updateUI(); 122 | e.preventDefault(); 123 | 124 | setTimeout(function(self){ 125 | if (gBrowser.mTabs.length == 1) 126 | gBrowser.addTab(); 127 | }, 200 , this); 128 | 129 | return; 130 | } else { 131 | //Fx3 ダイアログバージョン 132 | var prefBack = this.getPref("browser.preferences.instantApply", "bool", false); 133 | this.setPref("browser.preferences.instantApply", "bool", true); 134 | var w = openPreferences("paneAdvanced", {"advancedTab":"networkTab"}); 135 | setTimeout(function(self, w, prefBack){ 136 | self.optionOnload(w, prefBack); 137 | }, self.optionDelay, this, w, prefBack); 138 | 139 | var Proxy_Type = this.getPref("network.proxy.type", 'int', 0); 140 | if(Proxy_Type > 0) this.setPref("quickproxy.type", 'int', Proxy_Type); 141 | this._updateUI(); 142 | e.preventDefault(); 143 | return; 144 | } 145 | } 146 | } 147 | if (e.button == 1) { 148 | var qp_autooff = this.getPref('quickproxy.autooff', 'bool', true); 149 | var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] 150 | .getService(Components.interfaces.nsIPromptService); 151 | var check = {value: qp_autooff}; 152 | prompts.alertCheck(window, 'Window title', '', 153 | "启动时设置为禁用代理", check); //起動時は常にプロキシはオフ 154 | this.setPref('quickproxy.autooff', 'bool', check.value); 155 | } 156 | e.preventDefault(); 157 | }, 158 | 159 | optionOnload: function(w, prefBack){alert(2) 160 | this.setPref("browser.preferences.instantApply", "bool", prefBack); 161 | w.gAdvancedPane.showConnections(); 162 | }, 163 | 164 | _updateUI: function() { 165 | var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0); 166 | var icon = document.getElementById("quickproxy-status"); 167 | var text1 = ""; 168 | switch (Is_Proxy_On) { 169 | case 0: 170 | case 3: 171 | icon.setAttribute("state", "disable"); 172 | icon.setAttribute("tooltiptext", "左键:开|关代理; 中键:启动设置; 右键:代理设置"); 173 | return; 174 | case 1: 175 | var ip = this.getPref("network.proxy.http", "str", ""); 176 | var port = this.getPref("network.proxy.http_port", "int", 0); 177 | text1 = "\n当前代理:" + ip + ":" + port; 178 | break; 179 | case 2: 180 | text1 = "\n当前状态:自动代理配置(PAC)"; 181 | break; 182 | case 4: 183 | text1 = "\n当前状态:自动检测此网络的代理设置"; 184 | break; 185 | case 5: 186 | text1 = "\n当前状态:使用系统代理设置"; 187 | break; 188 | } 189 | icon.setAttribute("state", "enable"); 190 | icon.setAttribute("tooltiptext", "左键:开|关代理; 中键:启动设置; 右键:代理设置" + text1); 191 | }, 192 | 193 | getPref: function(aPrefString, aPrefType, aDefault){ 194 | var xpPref = Components.classes["@mozilla.org/preferences-service;1"] 195 | .getService(Components.interfaces.nsIPrefBranch); 196 | try{ 197 | switch (aPrefType){ 198 | case "str": 199 | return xpPref.getCharPref(aPrefString).toString(); break; 200 | case "int": 201 | return xpPref.getIntPref(aPrefString); break; 202 | case "bool": 203 | default: 204 | return xpPref.getBoolPref(aPrefString); break; 205 | } 206 | }catch(e){ 207 | } 208 | return aDefault; 209 | }, 210 | 211 | setPref: function(aPrefString, aPrefType, aValue){ 212 | var xpPref = Components.classes["@mozilla.org/preferences-service;1"] 213 | .getService(Components.interfaces.nsIPrefBranch); 214 | try{ 215 | switch (aPrefType){ 216 | case "str": 217 | return xpPref.setCharPref(aPrefString, aValue); break; 218 | case "int": 219 | aValue = parseInt(aValue); 220 | return xpPref.setIntPref(aPrefString, aValue); break; 221 | case "bool": 222 | default: 223 | return xpPref.setBoolPref(aPrefString, aValue); break; 224 | } 225 | }catch(e){ 226 | } 227 | return null; 228 | }, 229 | // 監視を開始する 230 | addPrefListener: function(aObserver) { 231 | try { 232 | var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2); 233 | pbi.addObserver(aObserver.domain, aObserver, false); 234 | } catch(e) {} 235 | }, 236 | 237 | // 監視を終了する 238 | removePrefListener: function(aObserver) { 239 | try { 240 | var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2); 241 | pbi.removeObserver(aObserver.domain, aObserver); 242 | } catch(e) {} 243 | }, 244 | 245 | buttonPrefListener:{ 246 | domain : 'network.proxy.type', 247 | //"grabScroll.XXX"という名前の設定が変更された場合全てで処理を行う 248 | 249 | observe : function(aSubject, aTopic, aPrefstring) { 250 | if (aTopic == 'nsPref:changed') { 251 | // 設定が変更された時の処理 252 | var type = quickProxy.getPref(aPrefstring, 'int', 0); 253 | if (type != 0) 254 | quickProxy.setPref("quickproxy.type", 'int', type); 255 | quickProxy._updateUI(); 256 | } 257 | } 258 | } 259 | } 260 | quickProxy._init(); 261 | window.quickProxy = quickProxy; 262 | 263 | function addStyle(css) { 264 | var pi = document.createProcessingInstruction( 265 | 'xml-stylesheet', 266 | 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"' 267 | ); 268 | return document.insertBefore(pi, document.documentElement); 269 | } 270 | 271 | })('\ 272 | #quickproxy-status {\ 273 | list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADsElEQVQ4jV1TW0yTBxj9siVzMWrUsWSGxZm4UZ26ueFG2MMw2R7GjOwWssBaUt0N5iWQyIAyhmw6cKLIHPeWwlpQfmxpuUhbob9jrLTcSikF7ZR0Qlv607UULKOu9OxBXRbPy0lOzjlP5xA9Ah6f4cWmdES9m6NI3Z+lfv7l9MboHWmNTz3qYxjmcaPRuOE/YWeq9AXhGZ2gocfuuzo6i+5RN1TGGfyiv40i+bArqaBTsld4+bWH/hrN8BYJo+cREVFMWlV0Xt3A9KhjAaZbfrC2eWjH5qAZ86BzxI2OYTfah5w4pxi/9042U/xB+vefZ1YbUqRt7EYiIvqoQF3FTnA4r7TgcGlvOO27jmCB1Bg5q7BArLODMcyg8boDP3ffwg8KG/LlZhRetoLRGF6nXckV60QSw+zRn/oQf7xtVfCt6s96pdEn1dkh7r6BSrUFxS1mnL5ixUnGBlGzFbnNE8iVmcNXtANxFPtFw/YPC7uCgpK+MeEZdvz60HQ4FI5g6OY8/gpGAABu3zLyavtR2GRG/iUrsqRjEMkfFLxySP7i29ntPWXtdmFhlX6kSTuOiWkv7J4V+P8Ggv8AhikOeWIDipVTyL80gRy5FSdbrFBoB9+kmJSaqITMtsQS+fCeE6WdAf6pLrQPezA1twIbtwqzM4SjF/twvOI35NQP4kSdCV9LBiGSmIJtWmMs8ZIk63Mr9cZWndmrYq3o7L+BbsNNfFNvgtYWgGKQw1vH5HhVWIuXBNXYnVaHnSkVyC5RphER0dbUyk2MzuJZWfLCy7mx4OPQ2jOOcrUNyhEv6noc+LioHW+kN2CvoBoJR2RI+LI28v4RsaCmmY2iramVm+Td5lmfdw4u5ywcMy6cbxlC+o9XkVHO4rRiEnkyM7Kq+8EvUiFf/Dtyyzsin4gYn6zLlELPJos3N2nGnAE/B87jBueZg9PlQZPGgmMXruHTMhbC0h4Ut4ygQGaGRPsHTjX0o7XXBvU10wGiDbs2K/Q21x23F2b7HBYXfHA5Z+D3crjj9EAzYMdFxRCyq/tRIB1ES+8k3N4FqH+dKmXZ+0uMlusmg8mZ5zKe3p2YL1YZAvP+RQSXArgb8CO0vIhwaBn3VoLAaggAYJhwTjEMu+7+K9ZE8fbxzxYS0Roi2kK09rP4977SXpDp/NbbHOYXglhaDiG4EobDcxdlcr0xZv/BqP8/cyMRPfmAtxPRc0S0jYhi1j6zJ5EXl8SPO5gu2HcgI2n9tvgdRPQEET32MPwveXRswBsq+TYAAAAASUVORK5CYII=");\ 274 | padding: 0 2px !important;\ 275 | }\ 276 | \ 277 | #quickproxy-status[state="disable"] {\ 278 | filter: url("chrome://mozapps/skin/extensions/extensions.svg#greyscale");\ 279 | }\ 280 | '); 281 | -------------------------------------------------------------------------------- /sendToGmail.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name sendToGmail.uc.js 3 | // @namespace ithinc#mozine.cn 4 | // @description Send the selection to Gmail 5 | // @include main 6 | // @compatibility Firefox 3.x 7 | // @author ithinc 8 | // @version LastMod 2009/3/15 20:30 Improvment on sending images 9 | // @version LastMod 2009/3/14 20:30 Add support for all Gmail display languages 10 | // @version LastMod 2009/3/13 21:30 Initial release 11 | // @Note null 12 | // ==/UserScript== 13 | 14 | /* :::: Send the selection to Gmail :::: */ 15 | 16 | function SendToGmail(from, to, cc, bcc, subject, body) { 17 | var gmailComposeURL = 'https://mail.google.com/mail/?ui=html&v=b&pv=tl&cs=b'; 18 | 19 | var req = new XMLHttpRequest(); 20 | req.open('GET', gmailComposeURL, true); 21 | req.onreadystatechange = function() { 22 | if (req.readyState == 4) { 23 | if (req.status == 200 && req.responseText.match(/<form[\s]+action="[^>"]+"[\s]+name=(f|"f")[^>]*>/i)) { 24 | if (!to && /([\w.]+)@gmail.com/.test(req.responseText)) to = RegExp.$1 + "+note@gmail.com"; 25 | 26 | var gmailSendURL = req.responseText.match(/<base[^>]*>/i).toString().split(/"/)[1] + req.responseText.match(/<form[\s]+action="[^>"]+"[\s]+name=(f|"f")[^>]*>/i).toString().split(/"/)[1]; 27 | var gmailSendParams = 'redir=?&nvp_bu_send=Send'; 28 | //gmailSendParams += '&from=' + encodeURIComponent(from); 29 | gmailSendParams += '&to=' + encodeURIComponent(to); 30 | gmailSendParams += '&cc=' + encodeURIComponent(cc); 31 | gmailSendParams += '&bcc=' + encodeURIComponent(bcc); 32 | gmailSendParams += '&subject=' + encodeURIComponent(subject); 33 | gmailSendParams += '&body=' + encodeURIComponent(body); 34 | 35 | var req2 = new XMLHttpRequest(); 36 | req2.open('POST', gmailSendURL, true); 37 | req2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 38 | req2.onreadystatechange = function() { 39 | if (req2.readyState == 4) { 40 | if (req2.status == 200) { 41 | // document.getElementById("statusbar-display").label = //req2.responseText.match(/<td[\s]+bgcolor="?#(f|F)(a|A)(d|D)163"?>[^<>]*<b>[^<>]*<\/b>/i).toString().split(/<|>/i)[4]; 42 | var alertsService=Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService); 43 | alertsService.showAlertNotification("chrome://global/skin/icons/information-32.png","SentToGmail",req2.responseText.match(/<td[\s]+bgcolor="?#(f|F)(a|A)(d|D)163"?>[^<>]*<b>[^<>]*<\/b>/i).toString().split(/<|>/i)[4],false,"",null,""); 44 | } 45 | else { 46 | alert("\u6D88\u606F\u53D1\u9001\u4E0D\u6210\u529F!"); 47 | } 48 | } 49 | } 50 | req2.send(gmailSendParams); 51 | } 52 | else { 53 | alert("\u60A8\u6CA1\u6709\u767B\u9646\u4F60\u7684Gmail!"); 54 | } 55 | } 56 | } 57 | req.send(null); 58 | } 59 | 60 | (function() { 61 | var mainContextMenu = document.getElementById("contentAreaContextMenu"); 62 | 63 | var menuitem = mainContextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sendpage")); 64 | menuitem.setAttribute("id", "context-sendpagetogmail"); 65 | menuitem.setAttribute("label", "\u53D1\u9001\u5F53\u524D\u7F51\u5740\u5230Gmail"); 66 | menuitem.setAttribute("accesskey", "G"); 67 | menuitem.setAttribute("oncommand", "SendToGmail('', '', '', '', gBrowser.selectedTab.label, gBrowser.currentURI.spec);"); 68 | 69 | var menuitem = mainContextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sendlink")); 70 | menuitem.setAttribute("id", "context-sendlinktogmail"); 71 | menuitem.setAttribute("label", "\u53D1\u9001\u94FE\u63A5\u5730\u5740\u5230Gmail"); 72 | menuitem.setAttribute("accesskey", "G"); 73 | menuitem.setAttribute("oncommand", "SendToGmail('', '', '', '', gContextMenu.linkText(), gContextMenu.linkURL);"); 74 | 75 | var menuitem = mainContextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sendimage")); 76 | menuitem.setAttribute("id", "context-sendimagetogmail"); 77 | menuitem.setAttribute("label", "\u53D1\u9001\u56FE\u8C61\u5730\u5740\u5230Gmail"); 78 | menuitem.setAttribute("accesskey", "G"); 79 | menuitem.setAttribute("oncommand", "SendToGmail('', '', '', '', gContextMenu.target.getAttribute('title') || gContextMenu.target.getAttribute('alt') || gContextMenu.target.currentURI.spec, gBrowser.currentURI.spec + '\\n\\n' + gContextMenu.target.currentURI.spec);"); 80 | 81 | var menuitem = mainContextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("frame-sep")); 82 | menuitem.setAttribute("id", "context-sendselecttogmail"); 83 | menuitem.setAttribute("label", "\u53D1\u9001 ... \u5230Gmail"); 84 | menuitem.setAttribute("accesskey", "G"); 85 | menuitem.setAttribute("oncommand", "SendToGmail('', '', '', '', gBrowser.selectedTab.label, gBrowser.currentURI.spec + '\\n\\n' + document.commandDispatcher.focusedWindow.getSelection());"); 86 | 87 | mainContextMenu.addEventListener("popupshowing", function(e) { 88 | document.getElementById("context-sendpagetogmail").setAttribute("hidden", "true"); 89 | document.getElementById("context-sendlinktogmail").setAttribute("hidden", "true"); 90 | document.getElementById("context-sendimagetogmail").setAttribute("hidden", "true"); 91 | document.getElementById("context-sendselecttogmail").setAttribute("hidden", "true"); 92 | 93 | if (gContextMenu.onLink) { 94 | document.getElementById("context-sendlinktogmail").removeAttribute("hidden"); 95 | } 96 | 97 | if (gContextMenu.onImage) { 98 | document.getElementById("context-sendimagetogmail").removeAttribute("hidden"); 99 | } 100 | 101 | if (gContextMenu.isTextSelected) { 102 | var selection = getBrowserSelection(16); 103 | if (selection && selection.length > 15) 104 | selection = selection.substr(0,15) + "..."; 105 | 106 | document.getElementById("context-sendselecttogmail").setAttribute("label", '\u53D1\u9001 "' + selection + '" \u5230Gmail'); 107 | document.getElementById("context-sendselecttogmail").removeAttribute("hidden"); 108 | } 109 | 110 | if (!gContextMenu.onLink && !gContextMenu.onImage && !gContextMenu.isContentSelected && !gContextMenu.onTextInput) { 111 | document.getElementById("context-sendpagetogmail").removeAttribute("hidden"); 112 | } 113 | }, false); 114 | })(); 115 | -------------------------------------------------------------------------------- /showLocationModEx.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name showLocationModEx.uc.js 3 | // @charset UTF-8 4 | // @description 显示国旗与IP 5 | // @include chrome://browser/content/browser.xul 6 | // @author 紫云飞 7 | // @note version20130719: mod by lastdream2013 8 | // ==/UserScript== 9 | 10 | (function(){ 11 | //改这里选择是否加载本地国旗图标库,不存在或路径错误自动切换从网络中读国旗图标 12 | var localFlagPath = "lib\\countryflags.js"; // 注意是相对路径: profile\chrome\lib\countryflags.js 13 | //改这里选择显示国旗图标/IP位置,如果是identity-box为地址栏前端显示,会自动加载隐藏page-proxy-favicon css配合显示效果 14 | var showLocationPos = "identity-box"; // urlbar-icons identity-box addon-bar status-bar 等等 15 | 16 | //下面的不知道不要动 17 | var IsUserLocalFlag = false; 18 | localFlagPath.path = localFlagPath.replace(/\//g, '\\'); 19 | var FullPath = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("UChrm", Ci.nsILocalFile).path; 20 | if (/^(\\)/.test(localFlagPath)) { 21 | FullPath = FullPath +localFlagPath; 22 | } 23 | else{ 24 | FullPath = FullPath + "\\" + localFlagPath; 25 | } 26 | 27 | var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); 28 | file.initWithPath(FullPath); 29 | if (file.exists()) { 30 | IsUserLocalFlag = true; 31 | userChrome.import(localFlagPath, "UChrm"); 32 | } 33 | 34 | location == "chrome://browser/content/browser.xul" && gBrowser.addEventListener("DOMWindowCreated", function (event) { 35 | 36 | if ( showLocationPos == "identity-box" ){ 37 | var cssStr =('\ 38 | #page-proxy-favicon,\ 39 | #identity-icon-label,\ 40 | #identity-icon-country-label {\ 41 | visibility: collapse !important;\ 42 | }\ 43 | #urlbar {height:24px !important;}\ 44 | '); 45 | var style = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(cssStr) + '"'); 46 | document.insertBefore(style, document.documentElement); 47 | } 48 | 49 | var self = arguments.callee; 50 | if (!self.showLocation) { 51 | window.addEventListener("TabSelect", self, false); 52 | self.showLocation = document.getElementById(showLocationPos); 53 | 54 | self.showFlag = self.showLocation.appendChild(document.createElement("image")); 55 | //单击时复制 56 | self.showFlag.addEventListener("click", function () { 57 | Components.classes['@mozilla.org/widget/clipboardhelper;1'].createInstance(Components.interfaces.nsIClipboardHelper).copyString(self.showFlag.tooltipText); 58 | }, false); 59 | 60 | //self.showFlag.style.width = "16px"; 61 | //self.showFlag.style.Maxheight = "16px"; 62 | if ( showLocationPos == "identity-box" ){ 63 | self.showFlag.style.marginLeft = "4px"; 64 | self.showFlag.style.marginRight = "2px"; 65 | } 66 | 67 | //设置等待时国旗图标 68 | self.showFlag.src = self.flag = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACG0lEQVQ4ja2TwW7aQBRF+ZDku0q/qChds5mxkDG2iY3H9jyTBFAWLAgRG7CwCawQi6BEQhgEFkiAuF3VaVXaSlWvdBazuGfx5r1c7n/H9/1rIvpCAUWS5E6S3FFAkU9+wff967+VP1FA6fPzMwaDAcbjMQaDAabTKSggEFEqpcxfLEvp5huNxnmxWGC73SIMQ9Tv6gjqAbrdLqT0Ub+rg4jOUro/S4QQV57nbZMkwel0wvF4xGazQafTgeu5GY1GA8PhEMITqRDiKhM4jnPTbrdxOBxwOByQJAlcz4UQ4heiKILruXAc52smsGzrpd/v4/X1FcPhEBQQ7Jp9kVarhdlsBsu2Xj4E1u3x/v4eRATLuv0tQT3AdDrFcrmEZd2eMoFZNXdm1cSP2DUbZtUEEYECglk1MRqNkKYp3t/fYZjGPhPohh7rhg7d0PH09IQ4jjGbzdBsNtHr9SBcAd3QMZlMMJ/PEYYhdEOPM0G5Ur7RKhoeHx+xWq2wXq+xXq/x9vaGVqsFraJBq2jQDT17l8vljyFyzq9UVd2qqoooirBarTLCMIRds6GqKgzTgOPUoKpqyjn/+MZcLpdTFCVfKpXOlm1huVwiSRIkSYLFYgGzauLh4QHNZhNaRTsrinJ5GxljeUVRUil99Ho9dLtduJ4LKX0QERRFSTnnny+Wv6dYLF4zxgqMsZhzvuec7xljMWOsUCwW/3xM/5JvTakQArDW8fcAAAAASUVORK5CYII="; 69 | self.isReqLocationHash = []; 70 | self.isReqFlagHash = []; 71 | self.showFlagTooltipHash = []; 72 | self.showFlagHash = []; 73 | self.flagPath = 'http://www.razerzone.com/asset/images/icons/flags/' //备用:self.flagPath = 'http://www.1108.hk/images/ext/' 74 | } 75 | try { 76 | var host = (event.originalTarget.location || content.location).hostname; 77 | if (!/tp/.test(content.location.protocol)) { 78 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 79 | return 80 | } 81 | var ip = Components.classes["@mozilla.org/network/dns-service;1"].getService(Components.interfaces.nsIDNSService).resolve(host, 0).getNextAddrAsString(); 82 | var server = (gBrowser.mCurrentBrowser.webNavigation.currentDocumentChannel.QueryInterface(Components.interfaces.nsIHttpChannel).getResponseHeader("server").match(/\w+/) || ["\u672A\u77E5"])[0]; 83 | 84 | if (!self.showFlagTooltipHash[host]) { 85 | (event.type == "TabSelect" || event.originalTarget == content.document); 86 | self.isReqLocationHash[host] = true; 87 | let req = new XMLHttpRequest(); 88 | req.open("GET", 'http://www.cz88.net/ip/index.aspx?ip=' + ip, true); 89 | req.send(null); 90 | req.onload = function () { 91 | if (req.status == 200) { 92 | var lmsg = req.responseText.match(/"InputIPAddrMessage">([^<]+)/); 93 | if ( lmsg ) 94 | var location = lmsg[1].replace(/\s*CZ88.NET.*/, "") + " \n"; 95 | else 96 | var location = ""; 97 | //设置文字提示内容 98 | self.showFlagTooltipHash[host] = location + server + " \n" + ip; 99 | host == content.location.hostname && (self.showFlag.tooltipText = self.showFlagTooltipHash[host]); 100 | } 101 | self.isReqLocationHash[host] = false; 102 | } 103 | } else { 104 | host == content.location.hostname && (self.showFlag.tooltipText = self.showFlagTooltipHash[host]); 105 | } 106 | 107 | if (!self.showFlagHash[host]) { 108 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 109 | self.isReqFlagHash[host] = true; 110 | let req = new XMLHttpRequest(); 111 | req.open("GET", 'http://freegeoip.net/json/' + ip, true); 112 | req.send(null); 113 | req.onload = function () { 114 | if (req.status == 200) { 115 | var responseObj =JSON.parse(req.responseText); 116 | self.showFlagHash[host] =responseObj.country_code.toLocaleLowerCase(); 117 | 118 | host == content.location.hostname; 119 | if (IsUserLocalFlag) { self.showFlag.src = CountryFlags[self.showFlagHash[host]]; } 120 | else { self.showFlag.src = self.flagPath + self.showFlagHash[host] + ".gif"; } 121 | } 122 | self.isReqFlagHash[host] = false; 123 | } 124 | } else { 125 | host == content.location.hostname; 126 | if (IsUserLocalFlag) { self.showFlag.src = CountryFlags[self.showFlagHash[host]]; } 127 | else { self.showFlag.src = self.flagPath + self.showFlagHash[host] + ".gif"; } 128 | } 129 | } catch (e) { 130 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 131 | } 132 | }, false) 133 | })(); 134 | -------------------------------------------------------------------------------- /showLocationModSpecial.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name showLocationModSpecial.uc.js 3 | // @charset UTF-8 4 | // @description 只显示国旗在前端,不过和https时的前面的图标不冲突 5 | // @include chrome://browser/content/browser.xul 6 | // @author 紫云飞 7 | // @note version20130719: mod by lastdream2013 8 | // ==/UserScript== 9 | 10 | (function(){ 11 | //改这里选择是否加载本地国旗图标库,不存在或路径错误自动切换从网络中读国旗图标 12 | var localFlagPath = "lib\\countryflags.js"; // 注意是相对路径: profile\chrome\lib\countryflags.js 13 | 14 | //下面的不知道不要动 15 | var IsUserLocalFlag = false; 16 | localFlagPath.path = localFlagPath.replace(/\//g, '\\'); 17 | var FullPath = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("UChrm", Ci.nsILocalFile).path; 18 | if (/^(\\)/.test(localFlagPath)) { 19 | FullPath = FullPath +localFlagPath; 20 | } 21 | else{ 22 | FullPath = FullPath + "\\" + localFlagPath; 23 | } 24 | 25 | var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); 26 | file.initWithPath(FullPath); 27 | if (file.exists()) { 28 | IsUserLocalFlag = true; 29 | userChrome.import(localFlagPath, "UChrm"); 30 | } 31 | 32 | location == "chrome://browser/content/browser.xul" && gBrowser.addEventListener("DOMWindowCreated", function (event) { 33 | var cssStr = ('\ 34 | #urlbar {height:24px !important;}\ 35 | '); 36 | var style = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(cssStr) + '"'); 37 | document.insertBefore(style, document.documentElement); 38 | var self = arguments.callee; 39 | if (!self.showLocation) { 40 | window.addEventListener("TabSelect", self, false); 41 | self.showLocation = document.getElementById("identity-box"); 42 | 43 | self.showFlag = self.showLocation.appendChild(document.createElement("image")); 44 | self.showFlag.setAttribute("hidden", "true"); 45 | 46 | self.showFlag.style.marginLeft = "4px"; 47 | self.showFlag.style.marginRight = "2px"; 48 | 49 | //设置等待时国旗图标 50 | self.showFlag.src = self.flag = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACG0lEQVQ4ja2TwW7aQBRF+ZDku0q/qChds5mxkDG2iY3H9jyTBFAWLAgRG7CwCawQi6BEQhgEFkiAuF3VaVXaSlWvdBazuGfx5r1c7n/H9/1rIvpCAUWS5E6S3FFAkU9+wff967+VP1FA6fPzMwaDAcbjMQaDAabTKSggEFEqpcxfLEvp5huNxnmxWGC73SIMQ9Tv6gjqAbrdLqT0Ub+rg4jOUro/S4QQV57nbZMkwel0wvF4xGazQafTgeu5GY1GA8PhEMITqRDiKhM4jnPTbrdxOBxwOByQJAlcz4UQ4heiKILruXAc52smsGzrpd/v4/X1FcPhEBQQ7Jp9kVarhdlsBsu2Xj4E1u3x/v4eRATLuv0tQT3AdDrFcrmEZd2eMoFZNXdm1cSP2DUbZtUEEYECglk1MRqNkKYp3t/fYZjGPhPohh7rhg7d0PH09IQ4jjGbzdBsNtHr9SBcAd3QMZlMMJ/PEYYhdEOPM0G5Ur7RKhoeHx+xWq2wXq+xXq/x9vaGVqsFraJBq2jQDT17l8vljyFyzq9UVd2qqoooirBarTLCMIRds6GqKgzTgOPUoKpqyjn/+MZcLpdTFCVfKpXOlm1huVwiSRIkSYLFYgGzauLh4QHNZhNaRTsrinJ5GxljeUVRUil99Ho9dLtduJ4LKX0QERRFSTnnny+Wv6dYLF4zxgqMsZhzvuec7xljMWOsUCwW/3xM/5JvTakQArDW8fcAAAAASUVORK5CYII="; 51 | self.isReqFlagHash = []; 52 | self.showFlagHash = []; 53 | self.flagPath = 'http://www.razerzone.com/asset/images/icons/flags/' //备用:self.flagPath = 'http://www.1108.hk/images/ext/' 54 | } 55 | 56 | try { 57 | var host = (event.originalTarget.location || content.location).hostname; 58 | if (!/tp/.test(content.location.protocol) ) { 59 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 60 | gProxyFavIcon.removeAttribute("src"); 61 | self.showFlag.setAttribute("hidden", "true"); 62 | return 63 | } 64 | var ip = Components.classes["@mozilla.org/network/dns-service;1"].getService(Components.interfaces.nsIDNSService).resolve(host, 0).getNextAddrAsString(); 65 | var server = (gBrowser.mCurrentBrowser.webNavigation.currentDocumentChannel.QueryInterface(Components.interfaces.nsIHttpChannel).getResponseHeader("server").match(/\w+/) || ["\u672A\u77E5"])[0]; 66 | 67 | if (!self.showFlagHash[host]) { 68 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 69 | self.isReqFlagHash[host] = true; 70 | let req = new XMLHttpRequest(); 71 | req.open("GET", 'http://freegeoip.net/json/' + ip, true); 72 | req.send(null); 73 | req.onload = function () { 74 | if (req.status == 200) { 75 | //self.showFlagHash[host] = (req.responseText.match(/"country_code": "([^"]+)/) || ["", "CN"])[1].toLocaleLowerCase(); 76 | var responseObj =JSON.parse(req.responseText); 77 | self.showFlagHash[host] =responseObj.country_code.toLocaleLowerCase(); 78 | host == content.location.hostname; 79 | if (IsUserLocalFlag) { self.showFlag.src = CountryFlags[self.showFlagHash[host]]; } 80 | else { self.showFlag.src = self.flagPath + self.showFlagHash[host] + ".gif"; } 81 | 82 | if ( gBrowser.currentURI.spec.indexOf("https://") >= 0 ) { 83 | gProxyFavIcon.removeAttribute("src"); 84 | self.showFlag.removeAttribute("hidden"); 85 | } 86 | else{ 87 | gProxyFavIcon.src = self.showFlag.src; 88 | self.showFlag.setAttribute("hidden", "true"); 89 | } 90 | } 91 | self.isReqFlagHash[host] = false; 92 | } 93 | } else { 94 | host == content.location.hostname; 95 | if (IsUserLocalFlag) { self.showFlag.src = CountryFlags[self.showFlagHash[host]]; } 96 | else { self.showFlag.src = self.flagPath + self.showFlagHash[host] + ".gif"; } 97 | if ( gBrowser.currentURI.spec.indexOf("https://") >= 0 ) { 98 | gProxyFavIcon.removeAttribute("src"); 99 | self.showFlag.removeAttribute("hidden"); 100 | } 101 | else{ 102 | gProxyFavIcon.src = self.showFlag.src; 103 | self.showFlag.setAttribute("hidden", "true"); 104 | } 105 | } 106 | 107 | } catch (e) { 108 | (event.type == "TabSelect" || event.originalTarget == content.document) && (self.showFlag.src = self.flag); 109 | } 110 | }, false) 111 | })(); 112 | -------------------------------------------------------------------------------- /sideBookmarkBarMod.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name sideBookmarkBarMod.uc.js 3 | // @namespace http://www.slimeden.com 4 | // @author Xiao Shan 5 | // @note test version 20130515: modify by lastdream2013 6 | // @note fix combility for firefox24a1 and windows xp system 7 | // @description Customize bookmarkbar to left side, arrange bookmarks vertically 8 | // @version 0.4.1 - 20110218 9 | // ==/UserScript== 10 | (function () { 11 | var sideBookmarkBar = document.createElement("vbox"); 12 | sideBookmarkBar.setAttribute("id", "sideBookmarkBar"); 13 | sideBookmarkBar.setAttribute("minwidth", "20px"); 14 | sideBookmarkBar.setAttribute("maxwidth", "20px"); 15 | var bookmarks = document.getElementById("personal-bookmarks"); 16 | 17 | // get personal-bookmarks from BrowserToolbarPalette 18 | if(!bookmarks) { 19 | var templateNode = gNavToolbox.palette.firstChild; 20 | while (templateNode) { 21 | if (templateNode.id == "personal-bookmarks") { 22 | break; 23 | } else { 24 | templateNode = templateNode.nextSibling; 25 | } 26 | } 27 | 28 | if (templateNode && templateNode.id == "personal-bookmarks") { 29 | bookmarks = templateNode; 30 | } else { 31 | return; 32 | } 33 | } 34 | bookmarks.setAttribute("orient", "vertical"); 35 | sideBookmarkBar.appendChild(bookmarks); 36 | 37 | document.getElementById("browser").insertBefore(sideBookmarkBar, document.getElementById("appcontent")); 38 | 39 | // put the BMB in the bottom of the sidebar 40 | var BMB = document.getElementById("bookmarks-menu-button"); 41 | 42 | if (BMB){ 43 | bookmarks.insertBefore(BMB, bookmarks.childNodes[0]); 44 | 45 | var BMBobserver = new MutationObserver(function(mutations) { 46 | for (let m of mutations) { 47 | // stop BMB button removed from bookmarks 48 | for (let e of m.removedNodes) { 49 | // Application.console.log("E.id: " + e.id); 50 | if ( e.id != BMB.id ) continue; 51 | if(e.parentNode && e.parentNode != bookmarks) { 52 | bookmarks.insertBefore(e, bookmarks.childNodes[0]); 53 | } 54 | } 55 | } 56 | }); 57 | BMBobserver.observe(bookmarks, { childList: true } ); 58 | } 59 | 60 | var menupopupobserver = new MutationObserver(function(mutations) { 61 | for (let m of mutations) { 62 | // open bookmark folder right sideby of sidebookmarkbar 63 | for (let a of m.addedNodes) { 64 | if("toolbarbutton" == a.localName && "bookmark-item" == a.className && "true" == a.getAttribute("container")) { 65 | if (a.firstChild && a.firstChild.localName == "menupopup") { 66 | a.firstChild.setAttribute("position", "end_before"); 67 | } 68 | } 69 | } 70 | } 71 | }); 72 | menupopupobserver.observe(bookmarks, { childList: true, subtree: true } ); 73 | 74 | // make the bookmark items arranged vertically 75 | var bookmarkItems = document.getElementById("PlacesToolbarItems"); 76 | bookmarkItems.setAttribute("orient", "vertical"); 77 | bookmarkItems.parentNode.setAttribute("orient", "vertical"); 78 | bookmarkItems.setAttribute("style", "padding: 0px 0px 0px 0px !important;"); 79 | 80 | var placesToolbar = document.getElementById("PlacesToolbar"); 81 | placesToolbar.setAttribute("orient", "vertical"); 82 | 83 | bookmarks.appendChild(placesToolbar); 84 | PlacesToolbarHelper.init(); 85 | if ( typeof(BookmarksMenuButton) != 'undefined' ) BookmarksMenuButton.customizeDone(); 86 | 87 | // make the drop indicator horizontal 88 | try { 89 | eval("PlacesToolbar.prototype._onDragOver = " + PlacesToolbar.prototype._onDragOver.toString().replace(/ind\.clientWidth/g,'ind.clientHeight').replace(/left/g,'top').replace(/right/g,'bottom').replace(/translateX/g,'translateY').replace(/translate\(/,'matrix(0,1,-1,0, 40px,')); 90 | }catch(e) {} 91 | 92 | // enable bookmark folder tooltip 93 | try{ 94 | eval("BookmarksEventHandler.fillInBHTooltip = " + BookmarksEventHandler.fillInBHTooltip.toString().replace(/(!cropped) (&& !url)/, '$1 && aDocument.tooltipNode.localName == "treechildren" $2')); 95 | }catch(e) {} 96 | 97 | //css 98 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet','type="text/css" href="data:text/css;utf-8,' + encodeURIComponent( 99 | '\ 100 | #bookmarks-menu-button .toolbarbutton-text { display:none !important; }\ 101 | #personal-bookmarks .toolbarbutton-text {display: none !important;}\ 102 | #personal-bookmarks .toolbarbutton-icon {display: -moz-box !important; margin:0px 1px 0px 0px!important;}\ 103 | #PlacesToolbarItems toolbarseparator {\ 104 | -moz-appearance:none !important;\ 105 | min-height: 1px !important;\ 106 | max-height: 1px !important;\ 107 | background: gray !important;\ 108 | margin:0px 1px 0px 0px!important;\ 109 | }\ 110 | #bookmarks-menu-button .toolbarbutton-menubutton-button {\ 111 | -moz-box-orient: vertical !important;\ 112 | margin:0px 1px 0px 0px!important;\ 113 | }\ 114 | #bookmarks-menu-button.toolbarbutton-1 {\ 115 | -moz-box-orient: vertical !important;\ 116 | margin:0px 1px 0px 0px!important;\ 117 | }\ 118 | ')+ '"'), document.documentElement); 119 | })(); 120 | --------------------------------------------------------------------------------