WebRequest API でワザとリクエスト送信を遅くしてみた
WebRequest APIドキュメントを見ると、幾つかは blocking
を指定して、同期的な実行にすることでリクエストヘッダだとかを書き換えたりできるようになってる。
この前 DoNtTrackME なる拡張を作ったんだけど、これもリクエストヘッダに、DNT: 1
を追加するものだった。
- これらを使えば、リクエストそのものを送らないようにとかできる
- AdblockとかNoScript的なこと
- ブロックしたいものとブロックするものとを判別するためにどうしてもホワイトリストまたはブラックリストが必要だよね。
- このリストが膨らんで判別に時間が掛かるようになったら、どうなるの?
ってことで、ちょっと試してみた。
スクリプト
background.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>DelayRequest</title> </head> <body> <script> console.log("Start DelayRequest"); chrome.webRequest.onBeforeRequest.addListener( function delay_onBeforeSendHeaders(details) { var type = details.type, url = details.url, now = new Date, n = 0; console.log("detect:", type, url, now.toISOString()); while ((n = Date.now() - now) < 1000) { n++; } console.log("send:", type, url, (new Date).toISOString()); return {}; }, { urls: [ "*://*/*" ] }, [ "blocking" ] ); chrome.webRequest.onCompleted.addListener( function delay_onCompleted (details) { var type = details.type, url = details.url, now = details.timeStamp; console.log("onComplete:", type, url, (new Date).toISOString()); }, { urls: [ "*://*/*" ] }, [ "responseHeaders" ] ); </script> </body> </html>
やっていること
- onBefreRequest
- ログ書き(detect)
- 約1秒ループ
- ログ書き(send)
- リターン
- onCompleted
- ログ書き(onComplete)
結果(example.comにアクセス)
ログ
detect: main_frame http://www.iana.org/domains/example/ 2012-02-22T13:37:25.836Z send: main_frame http://www.iana.org/domains/example/ 2012-02-22T13:37:26.836Z onComplete: main_frame http://www.iana.org/domains/example/ 2012-02-22T13:37:27.104Z detect: stylesheet http://www.iana.org/_css/2008.1/reset-fonts-grids.css 2012-02-22T13:37:27.193Z send: stylesheet http://www.iana.org/_css/2008.1/reset-fonts-grids.css 2012-02-22T13:37:28.193Z detect: stylesheet http://www.iana.org/_css/2008.1/screen.css 2012-02-22T13:37:28.193Z send: stylesheet http://www.iana.org/_css/2008.1/screen.css 2012-02-22T13:37:29.193Z detect: script http://www.iana.org/_js/prototype.js 2012-02-22T13:37:29.193Z send: script http://www.iana.org/_js/prototype.js 2012-02-22T13:37:30.193Z detect: script http://www.iana.org/_js/corners.js 2012-02-22T13:37:30.193Z send: script http://www.iana.org/_js/corners.js 2012-02-22T13:37:31.193Z detect: script http://www.iana.org/_js/common.js 2012-02-22T13:37:31.193Z send: script http://www.iana.org/_js/common.js 2012-02-22T13:37:32.193Z onComplete: stylesheet http://www.iana.org/_css/2008.1/reset-fonts-grids.css 2012-02-22T13:37:32.193Z onComplete: stylesheet http://www.iana.org/_css/2008.1/screen.css 2012-02-22T13:37:32.194Z onComplete: script http://www.iana.org/_js/prototype.js 2012-02-22T13:37:32.194Z onComplete: script http://www.iana.org/_js/corners.js 2012-02-22T13:37:32.195Z onComplete: script http://www.iana.org/_js/common.js 2012-02-22T13:37:32.442Z detect: image http://www.iana.org/_img/page-header-gradient.png 2012-02-22T13:37:32.513Z send: image http://www.iana.org/_img/page-header-gradient.png 2012-02-22T13:37:33.513Z detect: image http://www.iana.org/_img/iana-logo-pageheader.png 2012-02-22T13:37:33.513Z send: image http://www.iana.org/_img/iana-logo-pageheader.png 2012-02-22T13:37:34.513Z detect: image http://www.iana.org/_img/page-footer-gradient.png 2012-02-22T13:37:34.513Z send: image http://www.iana.org/_img/page-footer-gradient.png 2012-02-22T13:37:35.513Z detect: image http://www.iana.org/_img/icann-logo-micro.png 2012-02-22T13:37:35.513Z send: image http://www.iana.org/_img/icann-logo-micro.png 2012-02-22T13:37:36.513Z detect: image http://www.iana.org/_img/icons/email_edit.png 2012-02-22T13:37:36.513Z send: image http://www.iana.org/_img/icons/email_edit.png 2012-02-22T13:37:37.513Z onComplete: image http://www.iana.org/_img/page-header-gradient.png 2012-02-22T13:37:37.513Z onComplete: image http://www.iana.org/_img/iana-logo-pageheader.png 2012-02-22T13:37:37.513Z onComplete: image http://www.iana.org/_img/page-footer-gradient.png 2012-02-22T13:37:37.514Z onComplete: image http://www.iana.org/_img/icann-logo-micro.png 2012-02-22T13:37:37.514Z onComplete: image http://www.iana.org/_img/icons/email_edit.png 2012-02-22T13:37:37.801Z detect: stylesheet http://www.iana.org/_css/2008.1/print.css 2012-02-22T13:37:37.802Z send: stylesheet http://www.iana.org/_css/2008.1/print.css 2012-02-22T13:37:38.802Z onComplete: stylesheet http://www.iana.org/_css/2008.1/print.css 2012-02-22T13:37:39.109Z detect: other http://www.iana.org/favicon.ico 2012-02-22T13:37:39.121Z send: other http://www.iana.org/favicon.ico 2012-02-22T13:37:40.121Z onComplete: other http://www.iana.org/favicon.ico 2012-02-22T13:37:40.123Z
最初に main_frame となるHTMLドキュメントを取ってきて、かなりのタイムラグがあって順々にリクエストを送信している。
途中一気にとってきている部分は、僕がViChromeを入れていて、そのcontent scriptによるものなので無視してよい
main_frame以降は一気に並列で処理されるものと思っていたが、全然違ってシーケンシャルに近い形でリクエスト送信が行われている模様。正直驚いた。最終的に12秒ほどでやっとロードが完了するという、物凄く遅くなる結果とだった。
正直、速さが売りのChromeでコレはどうなんだ...と。Chromeが拡張機能にも制限を加えてやってきたのは、速さのためではなく、単にUIをシンプルにさせるためだったのだろうか...。
とりあえず、WebRequestを多用した拡張機能はたくさんは入れないほうが良いし、処理が複雑になりそうなことは避けた方が良さ気な感じだね〜。