私の拡張機能では、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.com
URL が表示され続けることです。
質問 #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 の読み込みとこれを解決する方法の違いは何ですか?