ロケーションバーの値が変更されるごとに、その値がダイアログで通知されます。タブで複数のページが開かれているときには、それぞれで通知されます。
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イベントは、ドキュメントに含まれるフレームなどの読み込み完了を待たずに発生します。