3

私の拡張機能では、URL の一部がいくつかのマーカーに置き換えられたブックマークを操作する必要があります。ユーザーがそのようなブックマークを開くと、拡張機能はこのマーカーを何らかの値に置き換えて、新しい場所を開く必要があります。これを実現するために、以下に示すように nsIWebProgressListener を使用しました。

bookmarksResolver: {
    onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
        if (aLocation) {
            try {
                // Replace markers
                var resolvedLocation = resolveReferences(location);
                if (resolvedLocation != location) { // Open new location if markers were found and replaced
                    aWebProgress.DOMWindow.location.replace(resolvedLocation);
                }
            }
            catch(ex) {
                   //Logging error
            }
        }
    },

    /* Stubs for other listeners */
    onStateChange: function(a, b, c, d) {},
    onProgressChange: function(a, b, c, d, e, f) {},
    onStatusChange: function(a, b, c, d) {},
    onSecurityChange: function(a, b, c) {},

    QueryInterface: function (aIID) {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
                aIID.equals(Components.interfaces.nsIWebProgressListener2) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports)) {
            return this;
        }
        else {
            throw Components.results.NS_NOINTERFACE;
        }
    }
},

問題は、奇妙なエラー ページが表示されるように URL のマーカーを置き換えようとするとhttps://[marker].site.com(netError.xhtml に構文エラーがあると言う)、マーカーが置き換えられた URL が開かれるのに、アドレス バーにhttps://[marker].site.comURL が表示され続けることです。

質問 #1: ここで onLocationChange を適切に使用していますか? たぶん、別の方法を使用する必要がありますか?

質問 #2: このエラーが発生しないようにするにはどうすればよいですか?


UPD: onLocationChange の代わりに onStateChange を使用し、フラグ STATE_TRANSFERRING | を使用しました。STATE_IS_DOCUMENT は、フラグ STATE_START | をキャッチするためです。STATE_IS_DOCUMENT により、リダイレクト前に重大な UI ハングが発生します。リクエストキャンセルメソッドの呼び出しも入れます。現在は次のようになっています。

bookmarksResolver: {
    onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
        var nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
        if (aStateFlags & nsIWebProgressListener.STATE_TRANSFERRING
                    && aStateFlags & nsIWebProgressListener.STATE_IS_REQUEST) {
            try {
                var location = aWebProgress.DOMWindow.location.href;
                var resolvedLocation = resolveReferences(location);
                if (resolvedLocation != location) {
                    aRequest.cancel(Components.results.NS_BINDING_REDIRECTED);
                    aWebProgress.DOMWindow.location.href = resolvedLocation;
                    logger.info('Old URL: [' + location + ']');
                    logger.info('Redirected to: [' + resolvedLocation + ']');
                }
            }
            catch(ex) {
                    //Logging error
            }
        }
    },

    /* Stubs for other listeners */
    onLocationChange: function(a, b, c, d) {},
    onProgressChange: function(a, b, c, d, e, f) {},
    onStatusChange: function(a, b, c, d) {},
    onSecurityChange: function(a, b, c) {},

    QueryInterface: function (aIID) {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
                aIID.equals(Components.interfaces.nsIWebProgressListener2) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports)) {
            return this;
        }
        else {
            throw Components.results.NS_NOINTERFACE;
        }
    }
},

RSS ページ以外はすべて機能します。古い場所と「リダイレクト先」のログ エントリは、マーカーが置き換えられ、新しい URL が正しいことを示しています。しかし、aWebProgress.DOMWindow.location.href何らかの理由で実際の URL (から取得したもの) が変更されず、置換が何度も実行されるため、それらは何度もリロードされます。RSS URL の読み込みとこれを解決する方法の違いは何ですか?

4

1 に答える 1

2

Q1: 私は好むだろうonStateChange

Q2:aRequest.cancel(Components.results.NS_BINDING_REDIRECTED)元のリクエストは平和的に終了するかもしれません。

于 2012-10-30T17:41:02.390 に答える