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
    1. ログ書き(detect)
    2. 約1秒ループ
    3. ログ書き(send)
    4. リターン
  • onCompleted
    1. ログ書き(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を多用した拡張機能はたくさんは入れないほうが良いし、処理が複雑になりそうなことは避けた方が良さ気な感じだね〜。