この記事はブラウザやメールで新しいページを読み込んだときにコードを実行したい XUL/JavaScript 開発者のためのものです。もし、コードをページを読み込んでいる時やタブを切り替えた時など、さらに高度な条件下で実行したいときは、 Progress Listeners を見てください。
Progress listeners により、拡張機能にドキュメントの表示やタブ切り替えのイベントを知らせることができます。 Progress listeners は nsIWebProgressListener interface を実行します。
オーバーレイの作成
まず、以下のXULドキュメントの一つ(あるいはあなたが対象としているアプリケーションによってはもっと)への overlay を作成します。
Application | URI to overlay |
---|---|
Firefox | chrome://browser/content/browser.xul |
Thunderbird | chrome://messenger/content/messenger.xul |
Navigator from Seamonkey | chrome://navigator/content/navigator.xul |
スクリプトの記述
overlay するスクリプトに、このコードを加えることで、 load
イベントリスナーを appcontent
element (ブラウザ) または messagepane
(メール) に追加します。
window.addEventListener("load", function() { myExtension.init(); }, false); var myExtension = { init: function() { var appcontent = document.getElementById("appcontent"); // ブラウザ if(appcontent) appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad, true); var messagepane = document.getElementById("messagepane"); // メール if(messagepane) messagepane.addEventListener("load", function () { myExtension.onPageLoad(); }, true); }, onPageLoad: function(aEvent) { var doc = aEvent.originalTarget; // doc は "onload" event を起こしたドキュメント // 読み込んだページに対する動作。 // doc.location は Location オブジェクト (このページの一番下のリンクを見てください。). // 特定のページでだけコードを実行するようにさせることができます。 if(doc.location.href.search("forum") > -1) alert("a forum page is loaded"); } }
現在の Firefox は onPageLoad function をドキュメントだけでなく、 xul:images
(tabbrowser の favicons) に対しても実行します。もしドキュメントのときだけ実行したいなら、 aEvent.originalTarget.nodeName == "#document"
の条件を使います.
拡張機能を初めて使うときやアップデートしたときにコードを実行する
browser に overlay するスクリプトに、以下のコードを加えて load イベントリスナーを追加します。
var Prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService); Prefs = Prefs.getBranch("extensions.my_extension_name."); var Overlay = { init: function(){ var ver = -1, firstrun = true; var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"] .getService(Components.interfaces.nsIExtensionManager); var current = gExtensionManager.getItemForID("[email protected]").version; //バージョン番号の取得 //"[email protected]" はあなたの拡張機能の GUID に置き換える必要があります。 try{ ver = Prefs.getCharPref("version"); firstrun = Prefs.getBoolPref("firstrun"); }catch(e){ //nothing }finally{ if (firstrun){ Prefs.setBoolPref("firstrun",false); Prefs.setCharPref("version",current); // ここに初めて実行したとき用のコードを挿入します。 // 下の例では新しいタブを開いてページを読み込んでいます。 // ミニチュートリアルを読み込むのに使っています。 window.setTimeout(function(){ gBrowser.selectedTab = gBrowser.addTab("about:mozilla"); }, 1500); //Firefox 2 の修正 - タブは時間が経過すると閉じます。 } if (ver!=current && !firstrun){ // !firstrun によりこのセクションは拡張機能を初めて使うときは実行されません。 Prefs.setCharPref("version",current); // バージョンが異なるとき、すなわちアップグレードしたときに実行するコードを挿入します。 } } window.removeEventListener("load",function(){ Overlay.init(); },true); } }; window.addEventListener("load",function(){ Overlay.init(); },true);
参照
- 実際に使われてる例として URIid extension を見てください。
- (単なる onload ではなく)もっと複雑なリスナーが必要なら、 Progress Listeners を使ってください。
- Location object
Quick Lookup: