masahal さんが書きました:
Progeress Listenerの方でもやってみたんですが、どうもリダイレクト前のURIを取得してしまったり、
リダイレクト先の URI を取得したいということだったのでしょうか。
STATE_REDIRECTING というのは、リクエストしてみたら Moved なレスポンスが返ってきた、という状況です。
(続けて、そこで指定された URI を自動的に読み込むところまでも含めて リダイレクト と呼ぶ場合もありますが、STATE_REDIRECTING はそうではありません。)
なので、STATE_REDIRECTING が発生するリクエストというのは、リダイレクト元に対するリクエストです。
「そこで指定された URI を自動的に読み込む」ときの URI を取得したいのであれば、STATE_REDIRECTING が発生した後で始まるリクエストの URI を取得する必要があります。
(ただし、それが直後に始まる(=別のリクエストは間に割り込んでこない)ことが保証されているのかどうかは、不明です。)
なお、「直後」とかを自分で実装しようとすると、自分で状態を保存しておく必要ができてしまいますが、安直にやろうとすれば、nsIChannel の originalURI にリダイレクト元の URI が入っていることを利用すると
コード:
var redirectListener = {
QueryInterface : function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener)
|| aIID.equals(Components.interfaces.nsISupportsWeakReference)
|| aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange : function(aWebProgress, aRequest, aFlag, aStatus) {
if (aFlag & Components.interfaces.nsIWebProgressListener.STATE_START) {
if (aRequest instanceof Components.interfaces.nsIChannel) {
if (aRequest.URI.spec != aRequest.originalURI.spec) {
alert(aRequest.name);
}
}
}
return 0;
},
onLocationChange : function() { return 0; },
onProgressChange : function() { return 0; },
onStatusChange : function() { return 0; },
onSecurityChange : function() { return 0; },
onLinkIconAvailable : function() { return 0; }
}
ともできます。
が、リダイレクトでなくても URI と originalURI が別物の場合もあるので、余計なものを拾っても大丈夫なようにするか、あるいは STATE_REDIRECTING の後でなければ無視するとか、が必要かもしれません。(あら、安直ではなくなってしまった。)
また、元と同じ URI にリダイレクト(=ループ)も検出できません。
余計なものを拾ってはいけなくて、かつリダイレクト後の URI が必要、ということなのであれば、Progress Listener はあきらめて nsIChannelEventSink の onChannelRedirect を使う方がいいのかもしれません。
masahal さんが書きました:
本来取得すべきでないリダイレクトを取得してしまったりするようなので、こっちもダメっぽいです。
どういったものが本来取得すべきで、どういったものがすべきでないのでしょうか?