Favicon Picker3を使わず動的にブックマークのfaviconを変える

RADIO-iのホームページfaviconが設定されてないのでブックマークしても白紙のfaviconが表示されます。これでは寂しいのでfaviconを付けましょう!

いろいろ調べたところuserChrome.cssでちょちょいとは出来ないようです。対象はchrome://browser/content/bookmarks/bookmarksPanel.xulです。

favicon適用手順

  1. このページ(http://www.radio-i.co.jp/)をブックマークに入れてください。
  2. アドレスバーにchrome://browser/content/browser.xulをコピペしてエンター。これはchrome権限を得るためです。
  3. Firebugのコンソールに以下を入力して実行。サイドバーのブックマークを開いておくと変化がわかりやすいです。
var ioservice = Components.classes["@mozilla.org/network/io-service;1"]
                          .getService(Components.interfaces.nsIIOService);
var pageURI = ioservice.newURI("http://www.radio-i.co.jp/", null, null);
var faviconURI = ioservice.newURI("http://cherenkov.hp.infoseek.co.jp/tmp/radioi.png", null, null);
var faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
							.getService(Components.interfaces.nsIFaviconService);
faviconService.setAndLoadFaviconForPage(pageURI, faviconURI, true);

数秒経つとfaviconが反映されます。このサンプルでは、「ブックマークのURLが"http://www.radio-i.co.jp/"のfaviconを"http://cherenkov.hp.infoseek.co.jp/tmp/radioi.png"にする」です。faviconURIの中にdataスキームを入れてもいけます。
インポート用のHTMLを作らなくてもいいのでオススメです。

この操作によってplaces.sqliteのmoz_placesテーブルの当該url(pageURI)のfavicon_id(moz_faviconsテーブルに対応している)が書き換えられたことを確認しました。

元に戻す

var ioservice = Components.classes["@mozilla.org/network/io-service;1"]
                          .getService(Components.interfaces.nsIIOService);
var pageURI = ioservice.newURI("http://www.radio-i.co.jp/", null, null);
var faviconURI = ioservice.newURI("chrome://mozapps/skin/places/defaultFavicon.png", null, null);
var faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"]
							.getService(Components.interfaces.nsIFaviconService);
faviconService.setAndLoadFaviconForPage(pageURI, faviconURI, true);

これでブランクなアイコンに戻ります。元からfaviconが設定されているページなら次にアクセスしたときにそれが適用されます。

課題

  • 上記の方法でfaviconを設定してもサイドバーとメニュー上(?)のブックマークにfaviconが付くだけ。サイトにアクセスしたときに、タブとアドレスバーにも表示させたい。Favicon Picker 3ではこれが出来る。どうやるんだ(´・ω・`)
  • ICON属性付きのHTMLをインポートしたほうが手っ取り早いか・・。なんか信用できないんですよね。ブックマークレットの時はurlを微調整するたびにリセットされるし(あたりまえ、今回関係ない)。

まとめ

RADIO-iへの愛です*1

*1:RADIO-愛・・。