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'

でいいんじゃないだろうか。たいていの素直なブックマークレットならエラーは出ないと思う。