fub.net 0.9.2.2(人柱版)
なんだかセキュリティに少し自信が無いので人柱版としか言えない。
- GM_xmlhttpRequestのonload functionからGM_xmlhttpRequestを呼び出すことができていなかったので修正。
- これをやられるとcallerが循環してしまうようで、stacktraceでのチェックが出来なくなってしまった。
- GM_xmlhttpRequestの呼び出し元のチェックを微調整。
- callerを辿って最上位のfunctionがuser.jsで適用したものと同じかどうかチェックしていたが、上の話があって辿る途中に最初の呼び出し元が出てきたら許可の方向性に変更。少し弱い気がする。
- Array.prototypeを書き換えるようにした。
- forEachが使えるようになるはず。言われるがままにやったが動作確認はしていない。
fub用に書き換えた全サイトはてブ化
http://madchester.s54.xrea.com/archives/hb_addict_fub.user.js
具体的な改造ポイントは以下の通り。
- document.contentTypeはIEには無いので使ってない。
- 同じようなものも無いようだ。あんまり真剣に調べなかったが。
- IEではsetAttributeでstyleを指定しても反映されない気がするので別の方法を使用。
- xxx.style.color = "#ffffff"; とかでもいいんですが、ちょっと工夫してスタイルシートを足した。
- evaluateによるXPathは使えないから困った。
- と思ったのだが、そもそもそんな重要な使い方ではなかったのでbodyの最後にappendChildした。
- 背景色とか前景色とかアンカーの色とかを適当に設定した。
- なんか全然見えないサイトがあったので。
- はてなIDの自動取得は削った。
- 意味がよく分からなかったので。
書き換えたスクリプトのオリジナルはこちら。
http://junkfield.client.jp/
初期設定の説明とかあるので見当が付かない人は読んで見当を付けてください。
つーか、はてなブックマークエントリー情報取得APIでやったほうが望ましいのかなあ?
俺は全然流行についていけないタイプだ。
UserScriptからのみ使える関数定義などの仕組み
http://subtech.g.hatena.ne.jp/secondlife/20060925/1159181124
ちょっと質問なのですが、この Array.prototype 拡張が適用されるのってどのタイミングなのでしょうか?通常の html のロード時にすでに書き換わってると既存の JS コードで問題が発生する場合があります。Scripts/*.js が適用される直前タイミングなら問題ないのですが…。というか自分で確認しろよという話が>おれ
せっかくなのでちゃんと説明すると、UserScriptは汚染を防ぐために匿名関数に包んでいると思いますが、
fubでは読み込んだuser.jsファイル毎に中身を「(function(){」〜「})();」で再度匿名関数に包んでいます。
その際末尾の「})();」の前に本体側で突っ込みたいGM互換関数等を入れています。
なのでページ側の空間を汚染することは無いと思います。(違ってたらツッコミ入れてください)
また、上記仕組みからuser.jsの行数より大きい行番号でエラーが出ている場合は、本体側が突っ込んだ
コード内でエラーが出ていることになりますので、その際は作者にご相談ください。
最初の「(function(){」の末尾に改行コードを入れず、本体が勝手に追加するスクリプトは末尾に付けることで、
エラー行番号はずれないようにしているつもりです。
forEachダメですね
動作確認ぐらいしてからリリースしろ、という話だ。
http://subtech.g.hatena.ne.jp/secondlife/20060925/1159192535
なるほどー。でも組み込みオブジェクトのプロトタイプに追加ってグローバルに汚染される気もします…。というわけで fub 0.9.2.2(人柱の最新版)で、*.user.js の匿名関数の一番最後で
alert(Array.prototype.forEach);
を実行してみたんですが、undefined に…。あれ、自分の方法が違うのでしょうか?
なんでだろ?定義が下にあるからダメなのか、もっとくだらない理由でダメなのか。
実際どういう風になっているかはこんなuser.jsを実行すれば出てきます。(DebugConsoleに表示します)
// ==UserScript== // @name fubtest // ==/UserScript== (function(){ GM_log(arguments.callee.caller.toString()); })();
ところでprototype書き換えは空間に関わらず汚染されるんですか?うへえ。
じゃあどうするのがいいんだ。
ちなみに俺が「@include http://*と」書かないのはマッチングするのが無駄だと思うからで、
もちろんhttpsで使いたくない場合はそう書いていいです。GMの仕様書では@includeは無くてもいい仕様だったはず。