最近 Firefox から一部のサイト利用時のみ Google Chrome を使うようになりました。
livedoor reader も その1つなんですが、kuyさんの『LDR Ad-Entry Blocker』を始め、chrome でお勧め!みたいに紹介されていた『LDR prefav』も動いていなかった...
どっかの段階で chrome 側の仕様が変わったのかなぁ、とソースを見てみた所 unsafeWindow すら sandbox 内のものになる為、サイト側の作っているオブジェクトに触れなくなってる模様。
LDR のエントリを操作するタイプの user.js はLDR.register_hook を使っている為全滅してるみたい...
イベントをフックする所が問題なんだから、定期的に監視するみたいな感じで出来るんじゃないかなーと思ったけど、既に素晴しい user.js があるのに、いちいち新しいコードを書くのは面倒だなーと思って、悪足掻きしてみたら動いた。
前置きが長い。
悪足掻きのきっかけはこの edvakf さんの記事。( 本記事とは関係ないけど、pixiv入社おめでとうございます!
ページ内に関数を定義する方法は、location.href='javascript:〜' とするか、script.textContent='〜', document.body.appendChild(script) とするしかない。
そういう事もできるのか。
という事でやってみた。
kuy さんの LDR Ad-Entry Blocker を、location.href に突っ込めるように1行にまとめて、文の終端をいくつか追加して、 javascript: を冒頭に置く。
(function(){ location.href= "javascript:function $x(x,c){c=c||document;var res=document.evaluate(x,c,null,4,null);for(var i,nodes=[];i=res.iterateNext();nodes.push(i));return nodes;}; var cfg = { patterns: [/^[\s【]*(AD|PR|AD|PR)[\s】]*[::]/i],style: {color: '#aaa', fontSize: '12px' }, interval: 1000, skip: true}; LDR.register_hook('AFTER_PRINTFEED', function() { var hist = []; var isComp = function(){ var len = hist.length; if(len < 3) return false; return hist[len-1] == hist[len-2] && hist[len-2] == hist[len-3]; }; var blocker = function(){ var titles = $x('//h2[@class=\"item_title\"]/a'); hist.push(titles.length); for(var i = 0; i < titles.length; i++){ var title = titles[i]; for(var j = 0; j < cfg.patterns.length; j++){ if((new RegExp(cfg.patterns[j])).test(title.innerHTML)){ setStyle(title, cfg.style); addClass(title.parentNode, 'laeb_blocked'); var childs = title.parentNode.parentNode.parentNode.childNodes; for(var k = 0; k < childs.length; k++){ if(childs[k].nodeType !== 1 || hasClass(childs[k], 'item_header')) continue; DOM.hide(childs[k]); } break; }; }; }; isComp() || setTimeout(blocker, cfg.interval); }; setTimeout(blocker, cfg.interval); }); if(cfg.skip){ var isEnd = function(dir){ var pos = get_active_item(); return dir ? pos == get_active_feed().items.length - 1 : pos == 0 }; var j_func = Keybind._keyfunc['j']; Keybind.add('j|enter', function(){ do{ j_func(); }while(!isEnd(true) && hasClass(get_active_item(true).element, 'laeb_blocked')); }); var k_func = Keybind._keyfunc['k']; Keybind.add('k|shift+enter', function(){ do{ k_func(); }while(!isEnd(false) && hasClass(get_active_item(true).element, 'laeb_blocked')); }); };"; })();
LDR Ad-Entry Blocker for Chrome -- Gist
おぞましい.........
.........
...
けどちゃんと動いたwwww
うけるなー。
コメントする