ロケーションバーの値が変更されるごとに、その値がダイアログで通知されます。タブで複数のページが開かれているときには、それぞれで通知されます。
var progressListener = { oldURL: null, QueryInterface: XPCOMUtils.generateQI( [ 'nsIWebProgressListener', 'nsISupportsWeakReference' ] ), onStateChange: function( aWebProgress, aRequest, aStateFlags, aStatus ) {}, onProgressChange: function( aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress ) {}, onStatusChange: function( aWebProgress, aRequest, aStatus, aMessage ) {}, onSecurityChange: function( aWebProgress, aRequest, aState ) {}, onLocationChange: function( aProgress, aRequest, aURI, aFlags ) { if( aFlags & Components.interfaces.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT ) { // ドキュメントは変更されていない (アンカーのクリックなど) } if( aURI.spec != this.oldURL ) { alert( aURI.spec ); this.oldURL = aURI.spec; } } }; var myExtension = { init: function() { gBrowser.addProgressListener( progressListener ); }, uninit: function() { gBrowser.removeProgressListener( progressListener ); } }; window.addEventListener( 'load', function() { myExtension.init() }, false ); window.addEventListener( 'unload', function() { myExtension.uninit() }, false );Progress Listeners - Code snippets | MDN
QueryInterface: XPCOMUtils.generateQI( ... )
が一見しただけではわかりにくいですが、generateQI()は戻り値で関数を返すため、これはQueryInterface()関数の定義となっています。
何も処理しない4つの関数、
が実装されていますが、これはaddProgressListener()でリスナを登録するのに必要となります。
ロケーションの変化は、ドキュメントの読み込み完了を通知するDOMContentLoadedイベントでも捕捉できます。DOMContentLoaded - Event reference | MDN
スクリプトは以下のようになります。
var myExtension = { init: function() { if( gBrowser ) { gBrowser.addEventListener( 'DOMContentLoaded', this.onPageLoad, false ); } }, onPageLoad: function( aEvent ) { var doc = aEvent.originalTarget; // browser要素のDocument var win = doc.defaultView; // Document要素のWindow // 以下のいずれかの条件を満たすときは、対象外とする if( win != win.top // ウィンドウ階層のトップレベルではない || win.frameElement // ウィンドウが埋め込まれた要素である || doc.nodeName != '#document' // Documentノードではない ) return; alert( doc.location.href ); } } window.addEventListener( 'load', function() { myExtension.init() }, false );On page load - Mozilla | MDN
そしてこのスクリプトをXULで読み込み、それをブラウザのXULにオーバーレイします。
DOMContentLoadedイベントは、ドキュメントに含まれるフレームなどの読み込み完了を待たずに発生します。