ロケーションの変更検出

ロケーションバーの値が変更されるごとに、その値がダイアログで通知されます。タブで複数のページが開かれているときには、それぞれで通知されます。

サンプルコード

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つの関数、

  • onStateChange()
  • onProgressChange()
  • onStatusChange()
  • onSecurityChange()

が実装されていますが、これは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イベントは、ドキュメントに含まれるフレームなどの読み込み完了を待たずに発生します。

Firefoxアドオンの情報サイトから、まとめて検索