自分が見たURLを記録していきたい。そのためにGoogle Chromeのextensionを書いてみる。

どんなページに対してもなんか動作させたい場合には、content_scriptsmatchesに以下のように書けばよいらしい: manifest.json

{
  "manifest_version": 2,
  "name": "UrlLogger",
  "description": "Log URL history which you see.",
  "version": "0.1",
  "content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "js": ["myscript.js"]
  }],
  "permissions": [
    "http://localhost/"
  ]
}
  • mathceshttp://*/*としてやると全てのページにマッチする。httpsも同様
  • jsに指定したスクリプトが実行される
  • permissionsにURLの送り先のホストを指定しておく

実行されるスクリプトで、ページのURLをどっかに送ってやる。XHRを使う:

// myscript.js
(function() {
  'use strict';
  var page_url = location.href;
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://localhost:8080/?url=' + encodeURIComponent(page_url), true);
  xhr.send();
})();

ただ問題があって、httpのサイトを見た時には上のコードで送れるけど、httpsのサイトだと

Mixed Content: The page at ‘https://www.youtube.com/’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://localhost:8080/?url=https%3A%2F%2Fwww.youtube.com%2F’. This request has been blocked; the content must be served over HTTPS.

などというエラーが出てしまいログできない。httpsのページからhttpのXHRは投げられないらしい。JSONPでもだめで、これを回避するには送り先がhttpsを受け付けられるようにする必要があるが、面倒なのでどうしたものか…。