2012年中に公開しているChrome拡張機能を更新しないといけない件についての対応で世界時計のChrome拡張機能をアップデートしました。
manifest version 2対応でやったこと
実際のところはmanifest version 2対応より、ずっと放置していたレビューを読みなおして要望にいろいろ対応したのとChrome Store向けの画像作成の方が時間がかかっているのだけど・・・とりあえずmanifest version 2で対応したことについて。
manifest.jsonの変更
変更部分の抜粋です。
"background_page": "background.html",
"options_page": "options.html",
"browser_action": {
"default_icon": "icon.png",
"popup": "popup.html"
}
}
manifest_version
を指定して、content_security_policy
を追加。background_pageをbackground:page
に変更、browser_action:popup
をbrowser_action:default_popup
に変更。
"manifest_version": 2,
"content_security_policy": "script-src 'self'; object-src 'self'",
"background": {
"page": "background.html"
},
"options_page": "options.html",
"browser_action": {
"default_icon": "icon_16.png",
"default_popup": "popup.html"
}
}
外部サイトのスクリプトを拡張機能に同梱
manifest.jsonのcontent_security_policyで外部URLを指定せず、すべてのファイルを拡張機能に持つことに。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="jquery.min.js"></script>
粛々とhtmlから別ファイルに分離
Content Security Policyではhtml内に直接cssやscriptを記述することを禁止しているので外部ファイルから呼び出すように修正。
<script>
(function($){
$(document).ready(function() {
....
});
})(jQuery);
</script>
<script src="background.js"></script>
ライブラリのprototypeを上書きしてContent Security Policy対応
恐れていたのが使っているライブラリのファイルがContent Security Policy対応できていないパターン。
nextTick: function() {
setTimeout("CoolClock.config.clockTracker['"+this.canvasId+"'].tick()",this.tickDelay);
},
以下のようなjsファイルを後から読み込んで上書き。
(function(c){
c.nextTick = function() {
// Content Security Policy (CSP)
// http://code.google.com/chrome/extensions/contentSecurityPolicy.html
var me = this;
setTimeout(function(){
me.tick();
},this.tickDelay);
};
})(CoolClock.prototype);
こういうパターン多い気がする。
面倒ですがhtmlで沢山処理をしていなければ、manifest version 2対応はそれほど難しくはないと思います。なお、この拡張機能はgithubにコードを置いています。