前回はお世話になりました。
独学でXPCOMのリファレンスやMDCで勉強していたのですが、どうしても解決できなかったので
再度質問させてください。
今回も同じテーマで、画像の読み込みを遅延させ(正確にはリクエストを一時中断し遅らせる)
ユーザの体感表示速度を向上させるような拡張機能(アドオン)を作りたいと思っています。
方針としては、nsIObserverServiceを用いてリクエスト作成時に
リクエストのヘッダを調べ、Acceptにimageが含まれていたら画像を取得しようとしてると判断し
nsIRequestのsuspendメソッドでそのリクエストを中断させたいと思っています。
以下がそのソースになります
コード:
var httpRequestObserver =
{
observe: function(aSubject, aTopic, aState)
{
try {
if (aTopic == 'http-on-modify-request') { // リクエストが作成されたらここへ分岐
var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
var httpRequest = httpChannel.QueryInterface(Components.interfaces.nsIRequest);
if (httpChannel.getRequestHeader("Accept").match("image")) this.delay(httpRequest);
} else if (aTopic == 'http-on-examine-response') {
}
}
catch (err)
{
}
},
delay: function(Request){
// Request.cancel(Components.results.NS_ERROR_ABORT);
Request.suspend(); // リクエストを中断
setTimeout(Request.resume,10000); // リクエストを10秒後に再開
}
};
/* オブサーバXPCOMを登録 */
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.addObserver(httpRequestObserver, "http-on-modify-request", false);
参考にしたページをみると使用法に間違いはなさそうなのですが
実際はsuspend()しても、すぐ画像を取得してしまい効果がみられません。
一方で、cancel()をした場合は、思い通りにリクエストを中断し画像は表示されませんでした。
どうすればsuspendメソッドが思い通りに動くようになるのでしょうか?
JavaScript、拡張機能開発ともに経験が浅く、所々変な記述もみられるかもしれませんが、アドバイスいただけたら幸いです。
参考にしたページ
MDC:Setting HTTP request headers
XUL Planet:nsIRequest