*JavaScriptコードモジュールの概要 -通常のJavaScriptは読み込まれたwindow(document)ごとにオブジェクトが作成される。でもJavaScriptコードモジュールはFirefoxに一つだけ(シングルトン)。初めて呼ばれた時に一度だけ初期化されてオブジェクトが作成され、その一つを複数のwindowが参照する。 -windowに依存しない為、ブラウザのwindowオブジェクトやdocumentオブジェクトが参照出来ない(つまりwindow.setTimeoutもdocument.getElementByIdもwindow.XMLHttpRequest使えない)。XPCOMに頼る必要がある。 -[[JavaScript コードモジュール | Mozilla Developer Street (modest)>https://dev.mozilla.jp/2010/06/codemodules/]] -[[Firefox 3 的なFUELとJSMを存分に使って拡張機能開発をしよう! - 肉とご飯と甘いもの @ sotarok>http://d.hatena.ne.jp/sotarok/20090127/firefox_3_fuel_jsm]] -[[Firefox の拡張機能で全てのウィンドウで共通の 1 つの処理を行う (または異なるウィンドウ間で情報の共有を行う) - vivid memo>http://d.hatena.ne.jp/vividcode/20110115/1295116342]] -[[Mitsugu Oyama のソフトウェア倉庫 > もじる > jsm 関連メモ>http://myscript.zouri.jp/mozilla/jsm.htm]] -[[JavaScript code modules - Mozilla | MDN>https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules]] *本体組み込みのJavaScriptコードモジュール -[[Services.jsm - Mozilla | MDN>https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Services.jsm]]・・・これだけは必ず使っとけ、みたいな。 -[[XPCOMUtils.jsm - Mozilla | MDN>https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/XPCOMUtils.jsm]]・・・定型文を省略できる -[[Timer.jsm - Mozilla | MDN>https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Timer.jsm]] -[[Labs/JS Modules - MozillaWiki>https://wiki.mozilla.org/Labs/JS_Modules]] -読み込むためのURL(Firefox21以降) resource://gre/modules/***.jsm //omni.ja内のmodulesフォルダ resource://app/modules/***.jsm //browser/omni.ja内のmodulesフォルダ resource:///modules/はresource://app/modules/を指してるだけ *JavaScriptコードモジュールの作成 -拡張子jsmで作成 #highlight(javascript){{ var EXPORTED_SYMBOLS = ["myJSM_1", "myJSM_2"]; var myJSM_1 = "sample"; var myJSM_2 = {}; var myJSM_3 = {}; }} -EXPORTED_SYMBOLS配列に登録したオブジェクトだけが外部からアクセス出来る。 -上の例で言えばmyJSM_1とmyJSM_2は外部からアクセスできるが、myJSM_3はこのモジュール内のみのローカルなオブジェクトで外部からはアクセス出来ない。 *JavaScriptコードモジュールの読み込み **その場で読み込む #highlight(javascript){ Components.utils.import("resource://gre/modules/Services.jsm");} 初期化などで必ず使われる場合はこれ。 **使われる時になったら読み込まれる #highlight(javascript){ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm");} ユーザーの操作によって使われるかもしれない、という時はこれ。 *問題点 -日本語が文字化けする。UTF-8で読み込んでくれてないっぽい。loadSubScriptなら文字コード指定してスクリプトを読み込んでくれるけど、Cu.importだとそういうオプションが無い。