Google の検索履歴を記録する JavaScript を読んでみた
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','&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 オブジェクトによるアクセスが行われている。