以下の変更を施した:
- バックグラウンドにおいて、chrome.self がなくなっている。これは chrome.extension のエイリアスだった。したがって単に chrome.extension に書き換える
- extension 内に納められた html ファイルを通常のページから参照する際、どのファイルが参照可能であるかを manifest.json の web_accessible_resources で指定するようになったので、wasavi_frame.html を指定
- manifest.json の background_page がちょっと複雑な文法と共に background へ変更になったので、追従
- extension 内に納められた html ファイルにインラインで javascript を記述しても、それは絶対に実行されなくなった。この制限は緩和できない。script 要素を src 属性付きで記述するしかない。
- eval() が禁止された。しかし、content security policy の仕様に従うなら、manifest.json で content_security_policy に script-src ‘unsafe-eval’ とかなんとか書けば使用できると思うのだが、そういう仕様なのかバグなのか、書いても使用できない。
wasavi の中では 1 箇所だけ eval() ……というか new Function() を使っている。textarea にフォーカスがあるときにキー入力がされたとして、それが wasavi 起動のためのショートカットかどうかを判定する部分だ。
ショートカット自身はバックグラウンドが保持し、必要に応じて通常のページ上のエージェントに送られるのだが、送られるのはオプションページで指定するような “<c-enter>” とかいった文字列ではなく、それを javascript の式に変換した “return e.keyCode==13;” といった文字列で、エージェント側でこれを元に new Function() し、ショートカットの判定に使う。これはまさに w3c のドキュメントがいうところの performance optimizations に該当する。w3c のドキュメントでは eval が使えなかったらパフォーマンスで劣るけどもっと安全な方法にフォールバックすればいいんじゃない? なんて虫のいいことが書いてある。
しかたがないので new Function() せずに済ます方法に書き換えた。