/* :::::::: Sub-Script/Overlay Loader v3.0.60mod no bind version ::::::::::::::: */ // automatically includes all files ending in .uc.xul and .uc.js from the profile's chrome folder // New Features: // supports Greasemonkey-style metadata for userChrome scripts and overlays // supports a "main" shortcut for the main browser window in include/exclude lines // supports regexes in the include/exclude lines // scripts without metadata will run only on the main browser window, for backwards compatibility // // 1.Including function of UCJS_loader. // 2.Compatible with Fx2 and Fx3.0b5pre // 3.Cached script data (path, leafname, regex) // 4.Support window.userChrome_js.loadOverlay(overlay [,observer]) // // Modified by Alice0775 // // Date 2019/12/11 01:30 fix 72 revert the code for sidebar, use "load" in config.js(2019/12/11 01:30), // Date 2019/08/11 21:30 fix 70.0a1 Bug 1551344 - Remove XULDocument code // Date 2019/05/21 08:30 fix 69.0a1 Bug 1534407 - Enable browser.xhtml by default, Bug 1551320 - Replace all CreateElement calls in XUL documents with CreateXULElement // Date 2018/08/10 01:30 fix 63.0a1 // Date 2018/08/02 19:30 for userChrome.xml // Date 2018/05/30 18:00 ALWAYSEXECUTE .uc.js // Date 2018/05/06 22:00 fix wrong commit // Date 2018/05/06 22:00 remove workaround for editBookmarkPanel // Date 2018/03/21 08:00 revert USE_0_63_FOLDER // Date 2018/03/20 21:00 editBookmarkPanel etc Bug 1444228 - Remove editBookmarkOverlay.xul // Date 2015/06/28 13:00 about:preferences#privacy etc // Date 2014/12/28 19:00 workaround loading xul on second browser // Date 2014/12/13 21:00 remove a debug log // Date 2014/12/13 21:00 allow to load scripts into about: in dialog // Date 2014/12/13 21:00 require userchrome.js-0.8.014121301-Fx31.xpi // Date 2014/06/07 21:00 skip about:blank // Date 2014/06/07 19:00 turn off experiment by default // Date 2014/06/04 12:00 fixed possibility of shutdown crash Bug 1016875 // Date 2014/05/19 00:00 delay 0, experiment // Date 2013/10/06 00:00 allow to load scripts into about:xxx // Date 2013/09/13 00:00 Bug 856437 Remove Components.lookupMethod, remove REPLACEDOCUMENTOVERLAY // Date 2012/04/19 23:00 starUIをbindを使うように // Date 2012/04/19 21:00 starUI元に戻した // Date 2012/02/04 00:00 due to bug 726444 Implement the Downloads Panel. // Date 2012/02/04 00:00 due to bug 726440 // Date 2011/11/19 15:30 REPLACECACHE 追加 Bug 648125 // Date 2011/09/30 13:40 fix bug 640158 // Date 2011/09/30 13:00 fix bug 640158 // Date 2011/04/07 00:00 hackVersion // Date 2010/10/10 00:00 Bug 377498 mozIJSSubscriptLoader::loadSubScript charset 入ったけどメタデータ // @charset UTF-8 としとけばUTF-8で読み込む // Date 2010/03/31 00:00 XULDocumentのみに適用 // Date 2010/03/11 17:30 debugbuildで動かない場合がある件に対応。 // Date 2010/02/28 13:00 ↓が直っているので元に戻した。 // Date 2009/08/06 00:00 tree_style_tab-0.8.2009073102があるとxulのdocument.overlayが出来なくなる件に対応 // Date 2009/05/23 00:00 userChrome.js0.8.1実験中 v3.0.25mod // Date 2009/04/13 00:00 overlayのobserveの処理変更 v3.0.24mod // Date 2009/03/10 00:00 例外トラップ // Date 2009/02/15 15:00 chromehiddenなwindow(popup等)の場合にロードするかどうかを指定できるようにした。 // Date 2008/12/29 06:00 面倒だからdocument.overlayを置き換えるようにした。 // Date 2008/12/27 18:00 Webpanelにchromeを読み込んだときのエラーが出るのを修正(thanks 音吉) // Date 2008/09/16 00 00 面倒だからFirefox3 の場合はeditBookmarkOverlay.xulは先読みするように修正 // Date 2008/08/28 00 00 なぜか0.8.0+を使っている人がいたので, それに対応 // Date 2008/08/26 23:50 08/26 18:00 以降 Fx2で動かなくなったようなので, 直した // Date 2008/08/26 22:00 v3.0.11modで動かないなら,これ以降のものも動かないよ。たぶん // Date 2008/08/26 18:00 Fx3のStarUIをなんとかして欲しいな。 // Date 2008/08/18 04:00 AUTOREMOVEBOM = trueなら文字コード自動判定するようにした。 // Date 2008/08/16 15:00 BOMを自動的に取り除くかどうか指定できるようにした // Date 2008/07/29 23:00 なんかバグあったかも // Date 2008/07/25 00:00 USE_0_63_FOLDERおよびFORCESORTSCRIPTがtrueの場合は, フォルダも名順でソートするようにした // Date 2008/07/14 01:00 typo, regression // Date 2008/07/14 00:00 typo, regression // Date 2008/07/13 22:00 サイドバーweb-panelsにchromeウインドウを読み込んだ場合に対応 // Date 2008/03/23 12:00 80氏のフォルダ規則に対応, 0.8modバージョンにも対応 // ;(function () { "use strict" // -- config -- const EXCLUDE_CHROMEHIDDEN = false //chromehiddenなwindow(popup等)ではロード: しないtrue, する[false] const USE_0_63_FOLDER = true //0.63のフォルダ規則を使う[true], 使わないfalse const FORCESORTSCRIPT = false //強制的にスクリプトをファイル名順でソートするtrue, しない[false] const AUTOREMOVEBOM = false //BOMを自動的に, 取り除く:true, 取り除かない[false](元ファイルは.BOMとして残る) const REPLACECACHE = true //スクリプトの更新日付によりキャッシュを更新する: true , しない:[false] //=====================USE_0_63_FOLDER = falseの時=================== var UCJS = new Array("UCJSFiles", "userContent", "userMenu") //UCJS Loader 仕様を適用 (NoScriptでfile:///を許可しておく) var arrSubdir = new Array( "", "xul", "TabMixPlus", "withTabMixPlus", "SubScript", "UCJSFiles", "userCrome.js.0.8", "userContent", "userMenu" ) //スクリプトはこの順番で実行される //=================================================================== const ALWAYSEXECUTE = ["rebuild_userChrome.uc.xul", "rebuild_userChrome.uc.js"] //常に実行するスクリプト var INFO = true var BROWSERCHROME = "chrome://browser/content/browser.xhtml" //Firfox //"chrome://browser/content/browser.xul"; //Firfox //var BROWSERCHROME = "chrome://navigator/content/navigator.xul"; //SeaMonkey: // -- config -- /* USE_0_63_FOLDER true の時 * chrome直下およびchrome/xxx.uc 内の *.uc.js および *.uc.xul * chrome/xxx.xul 内の *.uc.js , *.uc.xul および *.xul * chrome/xxx.ucjs 内の *.uc.js は 特別に UCJS Loader 仕様を適用(NoScriptでfile:///を許可しておく) */ /* USE_0.63_FOLDER false の時 *[ フォルダは便宜上複数のフォルダに分けているだけで任意。 下のarrSubdirで指定する ] *[ UCJS Loaderを適用するフォルダをUCJSで指定する ] プロファイル-+-chrome-+-userChrome.js(このファイル) +-*.uc.jsまたは*.uc.xul群 | +-SubScript--------+-*.uc.jsまたは*.uc.xul群 | +-UCJSFiles--------+-*.uc.jsまたは*.uc.xul群 | (UCJS_loaderでしか動かないもの JavaScript Version 1.7/日本語) | +-xul--------------+-*.xul, *.uc.xulおよび付随File | +-userCrome.js.0.8-+-*.uc.jsまたは*.uc.xul群 (綴りが変なのはなぜかって? ) */ //chrome/aboutでないならスキップ if (!/^(chrome:|about:)/i.test(location.href)) return if (/^(about:(blank|newtab|home))/i.test(location.href)) return //コモンダイアログに対するオーバーレイが今のところ無いので時間短縮のためスキップすることにした if (location.href == "chrome://global/content/commonDialog.xul") return if (location.href == "chrome://global/content/alerts/alert.xul") return if (/\.html?$/i.test(location.href)) return window.userChrome_js = { USE_0_63_FOLDER: USE_0_63_FOLDER, UCJS: UCJS, arrSubdir: arrSubdir, FORCESORTSCRIPT: FORCESORTSCRIPT, ALWAYSEXECUTE: ALWAYSEXECUTE, AUTOREMOVEBOM: AUTOREMOVEBOM, INFO: INFO, BROWSERCHROME: BROWSERCHROME, EXCLUDE_CHROMEHIDDEN: EXCLUDE_CHROMEHIDDEN, REPLACECACHE: REPLACECACHE, get hackVersion() { delete this.hackVersion return (this.hackVersion = "0.8") //拡張のバージョン違いを吸収 this.baseUrl = /^(chrome:\/\/\S+\/content\/)\S+/i.test(Error().fileName).$1 if (!/^(chrome:\/\/\S+\/content\/)\S+/i.test(Error().fileName)) { } else if ( Error().fileName.indexOf("chrome://uc_js/content/uc_js.xul") > -1 || "chrome://userchrome_js_cache/content/userChrome.js" == Error().fileName ) { //0.8.0+ or 0.7 return (this.hackVersion = "0.8+") } else if (Error().fileName.indexOf("chrome://browser/content/browser.xul -> ") == 0) { return (this.hackVersion = "0.8.1") } else { return (this.hackVersion = "0.8mod") } }, //スクリプトデータを作成 getScripts: function () { const Cc = Components.classes const Ci = Components.interfaces const ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService) const fph = ios.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler) const ds = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties) var Start = new Date().getTime() //getdir if (this.USE_0_63_FOLDER) { var o = [""] this.UCJS = [] this.arrSubdir = [] var workDir = ds.get("UChrm", Ci.nsIFile) var dir = workDir.directoryEntries while (dir.hasMoreElements()) { var file = dir.getNext().QueryInterface(Ci.nsIFile) if (!file.isDirectory()) continue var dirName = file.leafName if (/(uc|xul|ucjs)$/i.test(dirName)) { o.push(dirName) if (/ucjs$/i.test(dirName)) { this.UCJS.push(dirName) } } } if (this.FORCESORTSCRIPT) { o.sort(cmp_name) } ;[].push.apply(this.arrSubdir, o) } var that = this var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService( Components.interfaces.nsIWindowMediator ) if (mediator.getMostRecentWindow("navigator:browser")) var mainWindowURL = that.BROWSERCHROME else if (mediator.getMostRecentWindow("mail:3pane")) var mainWindowURL = "chrome://messenger/content/messenger.xul" this.dirDisable = restoreState(getPref("userChrome.disable.directory", "str", "").split(",")) this.scriptDisable = restoreState(getPref("userChrome.disable.script", "str", "").split(",")) this.scripts = [] this.overlays = [] var findNextRe = /^\/\/ @(include|exclude)[ \t]+(\S+)/gm this.directory = { name: [], UCJS: [], enable: [] } for (var i = 0, len = this.arrSubdir.length; i < len; i++) { var s = [], o = [] try { var dir = this.arrSubdir[i] == "" ? "root" : this.arrSubdir[i] this.directory.name.push(dir) this.directory.UCJS.push(checkUCJS(dir)) var workDir = ds.get("UChrm", Ci.nsIFile) workDir.append(this.arrSubdir[i]) var files = workDir.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator) var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance( Ci.nsIFileInputStream ) while (files.hasMoreElements()) { var file = files.getNext().QueryInterface(Ci.nsIFile) if ( /\.uc\.js$|\.uc\.xul$/i.test(file.leafName) || (/\.xul$/i.test(file.leafName) && /\xul$/i.test(this.arrSubdir[i])) ) { var script = getScriptData( this.AUTOREMOVEBOM ? deleteBOMreadFile(file) : readFile(file, true), file ) script.dir = dir if (/\.uc\.js$/i.test(script.filename)) { script.ucjs = checkUCJS(script.file.path) s.push(script) } else { script.xul = '\n' o.push(script) } } } } catch (e) {} if (this.FORCESORTSCRIPT) { s.sort(cmp_fname) o.sort(cmp_fname) } ;[].push.apply(this.scripts, s) ;[].push.apply(this.overlays, o) } this.debug("Parsing getScripts: " + (new Date().getTime() - Start) + "msec") //nameを比較する関数 function cmp_name(a, b) { if (a.toLowerCase() == b.toLowerCase()) return a < b ? -1 : 1 else return a.toLowerCase() < b.toLowerCase() ? -1 : 1 } function cmp_fname(a, b) { return cmp_name(a.filename, b.filename) } //UCJSローダ必要か function checkUCJS(aPath) { for (var i = 0, len = that.UCJS.length; i < len; i++) { if (aPath.indexOf(that.UCJS[i], 0) > -1) return true } return false } //メタデータ収集 function getScriptData(aContent, aFile) { var charset, description var header = (aContent.match( /^\/\/ ==UserScript==[ \t]*\n(?:.*\n)*?\/\/ ==\/UserScript==[ \t]*\n/m ) || [""])[0] var match, rex = { include: [], exclude: [] } while ((match = findNextRe.exec(header))) { rex[match[1]].push( match[2] .replace(/^main$/i, mainWindowURL) .replace(/\W/g, "\\$&") .replace(/\\\*/g, ".*?") ) } if (rex.include.length == 0) rex.include.push(mainWindowURL) var exclude = rex.exclude.length > 0 ? "(?!" + rex.exclude.join("$|") + "$)" : "" match = header.match(/\/\/ @charset\b(.+)\s*/i) charset = "" //try if (match) charset = match.length > 0 ? match[1].replace(/^\s+/, "") : "" match = header.match(/\/\/ @description\b(.+)\s*/i) description = "" //try if (match) description = match.length > 0 ? match[1].replace(/^\s+/, "") : "" //}catch(e){} if (description == "" || !description) description = aFile.leafName var url = fph.getURLSpecFromFile(aFile) return { filename: aFile.leafName, file: aFile, url: url, //namespace: "", charset: charset, description: description, //code: aContent.replace(header, ""), regex: new RegExp("^" + exclude + "(" + (rex.include.join("|") || ".*") + ")$", "i"), } } //スクリプトファイル読み込み function readFile(aFile, metaOnly) { if (typeof metaOnly == "undefined") metaOnly = false var stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance( Ci.nsIFileInputStream ) stream.init(aFile, 0x01, 0, 0) var cvstream = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance( Ci.nsIConverterInputStream ) cvstream.init( stream, "UTF-8", 1024, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER ) var content = "", data = {} while (cvstream.readString(4096, data)) { content += data.value if (metaOnly && content.indexOf("// ==/UserScript==") > 0) break } cvstream.close() return content.replace(/\r\n?/g, "\n") } //スクリプトファイル文字コード変換読み込み function deleteBOMreadFile(aFile) { var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance( Components.interfaces.nsIScriptableUnicodeConverter ) UI.charset = "UTF-8" var bytes = readBinary(aFile) try { if (bytes.length > 3 && bytes.substring(0, 3) == String.fromCharCode(239, 187, 191)) { aFile.copyTo(null, aFile.leafName + ".BOM") bytes = bytes.substring(3, bytes.length) writeFile(aFile, bytes) return UI.ConvertToUnicode(bytes).replace(/\r\n?/g, "\n") } var charset = getCharset(bytes) //window.userChrome_js.debug(aFile.leafName + " " +charset); if (charset == "UTF-8" || charset == "us-ascii") { return UI.ConvertToUnicode(bytes).replace(/\r\n?/g, "\n") } else { UI.charset = charset aFile.copyTo(null, aFile.leafName + "." + UI.charset) bytes = UI.ConvertToUnicode(bytes) UI.charset = "UTF-8" writeFile(aFile, UI.ConvertFromUnicode(bytes)) return bytes.replace(/\r\n?/g, "\n") } } catch (ex) { return readFile(aFile) } } //バイナリ読み込み function readBinary(aFile) { var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance( Components.interfaces.nsIFileInputStream ) istream.init(aFile, -1, -1, false) var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance( Components.interfaces.nsIBinaryInputStream ) bstream.setInputStream(istream) return bstream.readBytes(bstream.available()) } //バイナリ書き込み function writeFile(aFile, aData) { var foStream = Components.classes[ "@mozilla.org/network/file-output-stream;1" ].createInstance(Components.interfaces.nsIFileOutputStream) // ファイル追記の際は、0x02 | 0x10 を使う foStream.init(aFile, 0x02 | 0x08 | 0x20, parseInt(664, 8), 0) // write, create, truncate foStream.write(aData, aData.length) foStream.close() return aData } //文字コードを得る function getCharset(str) { function charCode(str) { if (/\x1B\x24(?:[\x40\x42]|\x28\x44)/.test(str)) return "ISO-2022-JP" if (/[\x80-\xFE]/.test(str)) { var buf = RegExp.lastMatch + RegExp.rightContext if ( /[\xC2-\xFD][^\x80-\xBF]|[\xC2-\xDF][\x80-\xBF][^\x00-\x7F\xC2-\xFD]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF][^\x00-\x7F\xC2-\xFD]/.test( buf ) ) return /[\x80-\xA0]/.test(buf) ? "Shift_JIS" : "EUC-JP" if (/^(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])+$/.test(buf)) return "Shift_JIS" if (/[\x80-\xA0]/.test(buf)) return "UTF-8" return "EUC-JP" } else return "us-ascii" } var charset = charCode(str) if (charset == "UTF-8" || charset == "us-ascii") return charset //判定に失敗している場合があるので, 再チェック (鈍くさ); var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance( Components.interfaces.nsIScriptableUnicodeConverter ) try { UI.charset = "UTF-8" if (str === UI.ConvertFromUnicode(UI.ConvertToUnicode(str))) return "UTF-8" } catch (ex) {} try { UI.charset = charset if (str === UI.ConvertFromUnicode(UI.ConvertToUnicode(str))) return charset } catch (ex) {} return "UTF-8" } //prefを読み込み function getPref(aPrefString, aPrefType, aDefault) { var xpPref = Components.classes["@mozilla.org/preferences-service;1"].getService( Components.interfaces.nsIPrefService ) try { switch (aPrefType) { case "complex": return xpPref.getComplexValue(aPrefString, Components.interfaces.nsILocalFile) break case "str": return unescape(xpPref.getCharPref(aPrefString).toString()) break case "int": return xpPref.getIntPref(aPrefString) break case "bool": default: return xpPref.getBoolPref(aPrefString) break } } catch (e) {} return aDefault } //pref文字列変換 function restoreState(a) { try { var sd = [] for (var i = 0, max = a.length; i < max; ++i) sd[unescape(a[i])] = true return sd } catch (e) { return [] } } }, getLastModifiedTime: function (aScriptFile) { if (this.REPLACECACHE) { return aScriptFile.lastModifiedTime } return "" }, //window.userChrome_js.loadOverlay shutdown: false, overlayWait: 0, overlayUrl: [], loadOverlay: function (url, observer, doc) { window.userChrome_js.overlayUrl.push([url, observer, doc]) if (!window.userChrome_js.overlayWait) window.userChrome_js.load(++window.userChrome_js.overlayWait) }, load: function () { if (!window.userChrome_js.overlayUrl.length) return --window.userChrome_js.overlayWait var [url, aObserver, doc] = this.overlayUrl.shift() if (!!aObserver && typeof aObserver == "function") { aObserver.observe = aObserver } if (!doc) doc = document if (!(doc instanceof XULDocument)) return 0 var observer = { observe: function (subject, topic, data) { if (topic == "xul-overlay-merged") { //XXX We just caused localstore.rdf to be re-applied (bug 640158) if ("retrieveToolbarIconsizesFromTheme" in window) retrieveToolbarIconsizesFromTheme() if (!!aObserver && typeof aObserver.observe == "function") { try { aObserver.observe(subject, topic, data) } catch (ex) { window.userChrome_js.error(url, ex) } } if ("userChrome_js" in window) window.userChrome_js.load() } }, QueryInterface: function (aIID) { if ( !aIID.equals(Components.interfaces.nsISupports) && !aIID.equals(Components.interfaces.nsIObserver) ) throw Components.results.NS_ERROR_NO_INTERFACE return this }, } //if (this.INFO) this.debug("document.loadOverlay: " + url); try { if (window.userChrome_js.shutdown) return doc.loadOverlay(url, observer) } catch (ex) { window.userChrome_js.error(url, ex) } return 0 }, //xulを読み込む runOverlays: function (doc) { try { var dochref = doc.location.href.replace(/#.*$/, "") } catch (e) { return } var overlay for (var m = 0, len = this.overlays.length; m < len; m++) { overlay = this.overlays[m] if ( this.ALWAYSEXECUTE.indexOf(overlay.filename) < 0 && (!!this.dirDisable["*"] || !!this.dirDisable[overlay.dir] || !!this.scriptDisable[overlay.filename]) ) continue // decide whether to run the script if (overlay.regex.test(dochref)) { if (this.INFO) this.debug("loadOverlay: " + overlay.filename) this.loadOverlay(overlay.url + "?" + this.getLastModifiedTime(overlay.file), null, doc) } } }, //uc.jsを読み込む runScripts: function (doc) { try { var dochref = doc.location.href.replace(/#.*$/, "") } catch (e) { return } if (!(/*doc instanceof XULDocument ||*/ (doc instanceof HTMLDocument))) return var script, aScript, url const Cc = Components.classes const Ci = Components.interfaces const maxJSVersion = (function getMaxJSVersion() { var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService( Components.interfaces.nsIXULAppInfo ) var versionChecker = Components.classes[ "@mozilla.org/xpcom/version-comparator;1" ].getService(Components.interfaces.nsIVersionComparator) // Firefox 3.5 and higher supports 1.8. if (versionChecker.compare(appInfo.version, "3.5") >= 0) { return "1.8" } // Firefox 2.0 and higher supports 1.7. if (versionChecker.compare(appInfo.version, "2.0") >= 0) { return "1.7" } // Everything else supports 1.6. return "1.6" })() for (var m = 0, len = this.scripts.length; m < len; m++) { script = this.scripts[m] if ( this.ALWAYSEXECUTE.indexOf(script.filename) < 0 && (!!this.dirDisable["*"] || !!this.dirDisable[script.dir] || !!this.scriptDisable[script.filename]) ) continue if (!script.regex.test(dochref)) continue if (script.ucjs) { //for UCJS_loader if (this.INFO) this.debug("loadUCJSSubScript: " + script.filename) aScript = doc.createElementNS("http://www.w3.org/1999/xhtml", "script") aScript.type = "application/javascript; version=" + maxJSVersion.toString().substr(0, 3) aScript.src = script.url + "?" + this.getLastModifiedTime(script.file) try { doc.documentElement.appendChild(aScript) } catch (ex) { this.error(script.filename, ex) } } else { //Not for UCJS_loader if (this.INFO) this.debug("loadSubScript: " + script.filename) try { if (script.charset) Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader) .loadSubScript( script.url + "?" + this.getLastModifiedTime(script.file), doc.defaultView, script.charset ) else Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader) .loadSubScript( script.url + "?" + this.getLastModifiedTime(script.file), doc.defaultView ) } catch (ex) { this.error(script.filename, ex) } } } }, debug: function (aMsg) { Components.classes["@mozilla.org/consoleservice;1"] .getService(Components.interfaces.nsIConsoleService) .logStringMessage(aMsg) }, error: function (aMsg, err) { const CONSOLE_SERVICE = Components.classes["@mozilla.org/consoleservice;1"].getService( Components.interfaces.nsIConsoleService ) var error = Components.classes["@mozilla.org/scripterror;1"].createInstance( Components.interfaces.nsIScriptError ) if (typeof err == "object") error.init( aMsg + "\n" + err.name + " : " + err.message, err.fileName || null, null, err.lineNumber, null, 2, err.name ) else error.init(aMsg + "\n" + err + "\n", null, null, null, null, 2, null) CONSOLE_SERVICE.logMessage(error) }, } //少しでも速くするためスクリプトデータの再利用 var prefObj = Components.classes["@mozilla.org/preferences-service;1"].getService( Components.interfaces.nsIPrefService ) try { var pref = prefObj.getBoolPref("userChrome.enable.reuse") } catch (e) { var pref = true } var that = window.userChrome_js window.addEventListener( "unload", function () { that.shutdown = true }, false ) window.xxdebug = that.debug //that.debug(typeof that.getScriptsDone); if (pref) { //現在のメインウィンドウは一度もuserChrome.jsのスクリプトで初期化されていない? if (!that.getScriptsDone) { //Firefox or Thunderbard? var mediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService( Components.interfaces.nsIWindowMediator ) if (mediator.getMostRecentWindow("navigator:browser")) var windowType = "navigator:browser" else if (mediator.getMostRecentWindow("mail:3pane")) var windowType = "mail:3pane" var enumerator = mediator.getEnumerator(windowType) //他の身内のメインウィンドウではどうかな? while (enumerator.hasMoreElements()) { var win = enumerator.getNext() //身内のメインウインドウは初期状態でない? if (win.userChrome_js && win.userChrome_js.getScriptsDone) { //オブジェクトはたぶんこのウインドウのを複製すりゃいいんじゃぁないかな that.UCJS = win.userChrome_js.UCJS that.arrSubdir = win.userChrome_js.arrSubdir that.scripts = win.userChrome_js.scripts that.overlays = win.userChrome_js.overlays that.dirDisable = win.userChrome_js.dirDisable that.scriptDisable = win.userChrome_js.scriptDisable that.getScriptsDone = true break } } } } if (!that.getScriptsDone) { if (that.INFO) that.debug("getScripts") that.getScripts() that.getScriptsDone = true } else { if (that.INFO) that.debug("skip getScripts") } var href = location.href var doc = document //Bug 330458 Cannot dynamically load an overlay using document.loadOverlay //until a previous overlay is completely loaded if (that.INFO) that.debug("load " + href) //chromehiddenならロードしない if ( location.href === that.BROWSERCHROME && that.EXCLUDE_CHROMEHIDDEN && document.documentElement.getAttribute("chromehidden") != "" ) return if (typeof gBrowser != undefined) { that.runScripts(doc) setTimeout( function (doc) { that.runOverlays(doc) }, 0, doc ) } else { setTimeout( function (doc) { that.runScripts(doc) setTimeout( function (doc) { that.runOverlays(doc) }, 0, doc ) }, 0, doc ) } //Sidebar for Trunc if (location.href != that.BROWSERCHROME) return window.document.addEventListener( "load", function (event) { if (!event.originalTarget.location) return if (/^(about:(blank|newtab|home))/i.test(event.originalTarget.location.href)) return if (!/^(about:|chrome:)/.test(event.originalTarget.location.href)) return var doc = event.originalTarget var href = doc.location.href if (that.INFO) that.debug("load Sidebar " + href) setTimeout( function (doc) { that.runScripts(doc) setTimeout( function (doc) { that.runOverlays(doc) }, 0, doc ) }, 0, doc ) if (href != "chrome://browser/content/web-panels.xul") return if (!window.document.getElementById("sidebar")) return var sidebarWindow = window.document.getElementById("sidebar").contentWindow if (sidebarWindow) { loadInWebpanel.init(sidebarWindow) } }, true ) var loadInWebpanel = { sidebarWindow: null, init: function (sidebarWindow) { this.sidebarWindow = sidebarWindow this.sidebarWindow.document .getElementById("web-panels-browser") .addEventListener("load", this, true) this.sidebarWindow.addEventListener("unload", this, false) }, handleEvent: function (event) { switch (event.type) { case "unload": this.uninit(event) break case "load": this.load(event) break } }, uninit: function (event) { this.sidebarWindow.document .getElementById("web-panels-browser") .removeEventListener("load", this, true) this.sidebarWindow.removeEventListener("unload", this, false) }, load: function (event) { var doc = event.originalTarget var href = doc.location.href if (!/^chrome:/.test(href)) return if (that.INFO) that.debug("load Webpanel " + href) setTimeout( function (doc) { that.runScripts(doc) setTimeout( function (doc) { that.runOverlays(doc) }, 0, doc ) }, 0, doc ) }, } })()