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
オブジェクトによるアクセスが行われている。