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) }