素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

LDRの未読数をfaviconに表示するGreasemonkeyスクリプト

ページが見つかりません | Mozilla Developer NetworkとtoDataURLメソッドを使えば、テキストを画像にすることができる。これを使って、LDRの未読数を、リアルタイムに表示することができる。

未読数が変化する瞬間をObject.prototype.watchで取得したり、ブラウザにfaviconを再描画させるためにappendChildしたり、わりと強引。未読数は4桁までじゃないと画像が切れる。

FaviconizeTabと一緒に使うと幸せになれます。


追記:id:os0xさんのコメントを見て、若干修正。widthとheightを毎回設定しないと再描画されないみたい。

// ==UserScript==
// @name           ldr favicon hack
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http://reader.livedoor.com/reader/
// ==/UserScript==
(function() {
  unsafeWindow.document.watch('title',
  function(id, before, after) {
    updateFavicon();
    return after
  });
  var favicon = document.evaluate('//head/link[@rel="shortcut icon"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  var canvas = document.createElement('canvas');
 var head = document.getElementsByTagName('head')[0];

  function updateFavicon() {
    var unread = unsafeWindow.subs.model.get_unread_count();
    canvas.width = canvas.height = 16;
    with(canvas.getContext('2d')) {
      clearRect(0, 0, 16, 16);
      mozTextStyle = 22 + (unread.toString().length) * -4 + "px sans-serif";
      translate(0, 14);
      mozDrawText(unread);
    }
    favicon.href = canvas.toDataURL();
    head.appendChild(favicon);

  }
})();

下のコードは非効率的です。

// ==UserScript==
// @name           ldr favicon hack
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http://reader.livedoor.com/reader/
// ==/UserScript==
unsafeWindow.document.watch('title',
function(id, before, after) {
  updateFavicon();
  return after
});
function updateFavicon() {
  var unread = unsafeWindow.subs.model.get_unread_count();
  var canvas = document.createElement('canvas');
  canvas.width = 16;
  canvas.height = 16;
  with(canvas.getContext('2d')) {
    mozTextStyle = 22 + (unread.toString().length) * -4 + "px sans-serif";
    translate(0, 14);
    mozDrawText(unread);
  }
  var favicon = document.evaluate('//head/link[@rel="shortcut icon"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  favicon.href = canvas.toDataURL();
  document.getElementsByTagName('head')[0].appendChild(favicon)

}