function addToHistory(uri){ var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"] .getService(Components.interfaces.nsINavHistoryService); var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); historyService.addPageWithDetails(ioService.newURI(uri, null, null), "", new Date().getTime() * 1000); } gBrowser.mPanelContainer.addEventListener("click", function(e){ if (e.button == 2) return; var s = e.target.href; if (!s) return; if (s.lastIndexOf("http://a.hatena.ne.jp/go?", 0) == 0){ addToHistory(s); s = s.slice(25, -14); } else if (s.lastIndexOf("http://ime.nu/", 0) == 0){ s = "http://" + s.substring(14); } else if (s.lastIndexOf("http://www.pixiv.net/jump.php?", 0) == 0){ s = s.substring(30); } else { return; } e.target.href = s; }, true);
Firefox3.5とuserChrome.js0.8で開発、動作確認。
はてなアンテナでhttp://a.hatena.ne.jp/go?〜を経由せずに目的地へ行くスクリプト。
ついでに2ちゃんねるとpixivにも対応。
#こういうの、リダイレクトとは違うよね。何て言うんだろ。
はてなアンテナ用のスクリプトは、探せばいくつかみつかるのだが、
リンクターゲットを書き換えてしまうので、リンクの色で未読アンテナを区別できない。
アンテナのリンクに時刻が入っているのには、重要な意味があったのだ。
それに、リンクにマウスを乗せたときime.nuが表示されないというのも、不便な面があると思った。そこで、リンクのクリックイベントを捉え、そのタイミングで行き先を変えることにした。
ところが、当然ながらhttp://a.hatena.ne.jp/go?〜にアクセスしないのでリンクの色は訪問済みにならない。それでnsINavHistoryServiceのaddVisitを試したがうまくいかず(そのときはリンクの色が変わるが履歴に追加されない)、setPageDetailsを試したが、そんな関数はないと言われ、
自分のやり方が間違っているせいなのか、Firefox3.5で仕様が変わったせいなのか、
原因の切り分けができずにあちこちさまよった。
結局、関数一覧を吐かせてsetPageDetailsに似た名前のaddPageWithDetailsを発見。
まあ、MDCでsetPageDetailsの説明に書いてあった関数なんだけど。
なぜgetTime()の値を1000倍するのかもよくわからないが、とにかく動いた。
厳密にはこれもリンク先を(クリックした後に)変えてしまうのだけど、
クリックすれば訪問したということだし、更新すれば正しいリンクに戻るので、
リンクの色という点では問題がなくなった。
userChrome.jsは、自分用に細かくカスタマイズできていいのだが、
自分専用のものは自分しかメンテナンスできないので、Firefoxの仕様が変わったときなどは面倒だ(しょっちゅういじっていれば苦にならないのだが)。