commandBookmarklet.jsのNoScript対応が怪しい
vimperator用のcommandBookmarklet.jsというプラグインでNoScript対応が追加された。さっそく試してみたんだけど、いくつか怪しい所があったので報告。
使ってるもののバージョン
- Firefox: 3.0.10
- vimperator: 2.0
- commandBookmarklet.js: 0.6.4
現象
作者さんの解説によると、以下の設定でNoScript対応が有効になるようだ。
let g:command_bookmarklet_use_sandbox = 1
でも、それを.vimperatorrcに書いてブックマークレットを実行すると、こんなエラーが出る。
Processing keypress event: TypeError: str.toLowerCase is not a function
原因
ソースコードを見ると、 command_bookmarklet_use_sandbox
の値は以下の stringToBoolean
関数に渡されていると思う。
function stringToBoolean(str, defaultValue) { return !str ? defaultValue : str.toLowerCase() === 'false' ? false : /^\d+$/.test(str) ? parseInt(str) : true; }
どう見ても文字列を渡すこと前提の関数だ。1
という整数値を渡しているので toLowerCase
なんてないよ、ってエラーが出てる。
対策
こんな風に文字列にすればいいんだろう。
let g:command_bookmarklet_use_sandbox = '1'
試してみたんだけど、うまくいくやつと、そうでないやつがあった。
うまくいくやつ
はてなの便利なツール はてなブックマークレットのページにある「はてブコメント表示」と「はてな記法を表示する」ってやつ。こいつらはちゃんと動いた。
ちなみにコードはこんな感じ。
// はてブコメント表示 javascript:location.href='http://b.hatena.ne.jp/entry/'+escape(location.href);
// はてな記法を表示する javascript:(function(){ var s=document.createElement('script'); s.charset='UTF-8'; s.src='http://www.hatena.ne.jp/tools/bookmarklet/HatenaSyntaxAppend/HatenaSyntaxAppend.js'; document.body.appendChild(s) })();
うまくいかなかったやつ
僕が作った a要素のリンクを無効化し、ただのテキストにするブックマークレット。こいつは動くことは動くんだけど、a要素のリンクが無効化された後、こんなエラーが表示された。
Processing keypress event: TypeError: reps[j] is undefined
ブックマークレットのコードの中で関係ありそうな所は以下。
/* a要素をTextNodeで置き換える */ for (var j = 0; reps.length; j++) { reps[j]['a'].parentNode.replaceChild( reps[j]['t'], reps[j]['a']); }
うーむ。確かに怪しげだけど、原因までは分からない。
.vimperatorrc でこんな感じに設定すればこのエラーは出なくなった。
let g:command_bookmarklet_use_sandbox = true
うーむ。これはこれで謎。
まとめ
結局よく分からなかった。とりあえず.vimperatorrcの設定は
let g:command_bookmarklet_use_sandbox = '1'
でいいんじゃないだろうか。たいていの素直なブックマークレットならエラーは出ないと思う。