├── .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 |
102 |
--------------------------------------------------------------------------------
/ExportHTMLFolder.uc.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
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 | \
32 | \
33 | \
34 | \
35 | \
36 | \
37 | \
38 | \
39 | \
40 | \
41 | \
42 | \
43 | \
44 | \
45 | \
46 | \
47 | \
48 | \
49 | \
50 | \
51 | \
54 |
\
55 | \
56 | \
57 | \
58 | \
59 | \
62 |
\
63 | \
64 | \
65 | \
66 | \
69 | \
72 |
\
73 | \
74 | \
75 | \
76 | \
79 | \
82 |
\
83 | \
84 | \
85 | \
86 | \
89 | \
92 |
\
93 | \
94 | \
95 | \
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 |
83 |
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 |
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 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/contextHistoryMenu.uc.xul:
--------------------------------------------------------------------------------
1 |
2 |
4 | %browserDTD;
5 | ]>
6 |
7 |
8 |
48 |
49 |
--------------------------------------------------------------------------------
/contextHistoryMenuLite.uc.xul:
--------------------------------------------------------------------------------
1 |
2 |
4 | %browserDTD;
5 | ]>
6 |
7 |
8 |
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><\/tr><\/table> /i)[1];
37 | resultstr = resultstr.match(/]+>(.*)<\/pre>/i)[1];
38 | resultstr = resultstr.replace(/ /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 | \
36 | \
37 | \
40 | \
41 | \
42 | ';
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(/ |