Google の検索履歴を記録する JavaScript を読んでみた

Google の検索履歴を記録する JavaScript を読んでみた

2007/04/01 4:59am

Google 検索履歴では、検索クエリーの履歴だけではなく、検索結果で実際にどのページをクリックしたか、も記録している。

検索結果ページのソースコードを読んでみると、履歴の保存は JavaScript で行われているようだ。

改行やインデントを加えて読みやすくしたソースコードを基に、履歴を保存する処理や興味深い部分を紹介する。

検索クエリーの保存

if (document.images) {
  new Image().src="/url?sa=Q&client=safari&rls=ja-jp&q=...";
}

まずは冒頭。新しい Image を生成することで http://www.google.com/url/ にアクセスさせている。

URL から推測するに検索クエリーを保存しているのだろう。

クリックされたページの URL を保存

クリックされたページの URL を保存する処理は、各リンクの onmousedown に JavaScript を仕込むことで実現している。

<a href="..." class=l onmousedown="return asq(event,this,'','','res','1','&amp;sig2=...')">

リンクをクリックすると asq 関数が実行されたのち、ページに遷移する、というわけだ。

asq 関数の実装

では、asq 関数はどのような実装になっているのだろう。それなりに長いので些末な部分は削除したソースは以下の通り。

window.asq = function(d,a,f,g,k,l,m) {
  if (window.XMLHttpRequest) {
    var c = window.encodeURIComponent ? encodeURIComponent : escape;
    var h = "", i = "";
    var b = new XMLHttpRequest;
    var e = d.altKey || d.metaKey;

    b.open(
      "GET",
      "/url?&url="+c(a.href.replace(/#.*/,"")).replace(/\+/g,"%2B")+"&ei=..."+m,
      true);

    if (!e) {
      b.onreadystatechange = function() {
        if (b.readyState == 4) {
          clearTimeout(j);
          a.dispatchEvent(d)
        }
      };
      var j = setTimeout(function() {
                b.abort();
                a.dispatchEvent(d)
              },
              2000);
    }

    b.send(null);
    return e
  }
  return true
};

XMLHttpRequest を使って、クリックされたページの URL を非同期送信している。強調した部分では、setTimeout でタイムアウト処理をしているようだ。

IE 6 以下の場合は?

見ての通り、asq 関数の実装は XMLHttpRequest オブジェクトがあるかどうかに依存している。

では、XMLHttpRequest オブジェクトではなく、ActiveXObject 経由で非同期通信を行う IE 6 などではどうするのだろう?

実は IE 6 などでアクセスすると、asq 関数ではなく、clk 関数というものが定義されるようになっている。この関数では検索クエリーの保存と同じように、Image オブジェクトによるアクセスが行われている。