チュートリアル: Manifest V2 に移行する

マニフェスト バージョン 1 は Chrome 18 で非推奨となり、マニフェスト バージョン 1 のサポート スケジュールに従ってサポートが段階的に終了します。バージョン 1 からバージョン 2 への変更は、API の変更とセキュリティの変更という 2 つの大きなカテゴリに分類されます。

このドキュメントでは、Chrome 拡張機能をマニフェスト バージョン 1 からバージョン 2 に移行するためのチェックリストと、これらの変更の内容とその理由の詳細な概要について説明します。

API の変更チェックリスト

  • browser_actions プロパティと chrome.browserActions API のどちらを使用していますか?

  • browser_actions は、単数の browser_action プロパティに置き換えます。

  • chrome.browserActionschrome.browserAction に置き換えます。

  • icons プロパティを default_icon に置き換えます。

  • name プロパティを default_title に置き換えます。

  • popup プロパティを default_popup に置き換えます(文字列にする必要があります)。

  • page_actions プロパティと chrome.pageActions API のどちらを使用していますか?

  • page_actionspage_action に置き換えます。

  • chrome.pageActionschrome.pageAction に置き換えます。

  • icons プロパティを default_icon に置き換えます。

  • name プロパティを default_title に置き換えます。

  • popup プロパティを default_popup に置き換えます(文字列にする必要があります)。

  • chrome.self プロパティを使用していますか?

  • chrome.extension に置き換えます。

  • Port.tab プロパティを使用していますか?

  • Port.sender に置き換えます。

  • chrome.extension.getTabContentses() API または chrome.extension.getExtensionTabs() API を使用していますか?

  • chrome.extension.getViews( { "type" : "tab" } ) に置き換えます。

  • 拡張機能はバックグラウンド ページを使用していますか?

  • background_page プロパティを background プロパティに置き換えます。

  • ページのコードを含む scripts または page プロパティを追加します。

  • persistent プロパティを追加して false に設定し、バックグラウンド ページをイベントページに変換する

セキュリティ変更チェックリスト

  • HTML ページでインライン スクリプト ブロックを使用していますか?

  • <script> タグ内に含まれる JS コードを削除し、外部 JS ファイル内に配置します。

  • インライン イベント ハンドラ(onclick など)を使用していますか?

  • これらを HTML コードから削除し、外部 JS ファイルに移動して、代わりに addEventListener() を使用します。

  • 拡張機能のパッケージに含まれるリソース(画像やスクリプトなど)にアクセスする必要があるウェブページに、拡張機能がコンテンツ スクリプトを挿入しますか?

  • web_accessible_resources プロパティを定義し、リソース(必要に応じて、それらのリソースの個別のコンテンツ セキュリティ ポリシー)を一覧表示します。

  • 拡張機能は外部ウェブページを埋め込みますか?

  • サンドボックス プロパティを定義します。

  • コードまたはライブラリで eval()、新しい Function()innerHTMLsetTimeout() を使用しているか、動的に評価される JS コードの文字列を渡していますか?

  • JSON コードをオブジェクトにパースする場合は、JSON.parse() を使用します。

  • CSP に適したライブラリ(AngularJS など)を使用する。

  • マニフェストにサンドボックス エントリを作成し、サンドボックスで影響を受けるコードを実行します。postMessage() を使用して、サンドボックス化されたページと通信します。

  • jQuery や Google アナリティクスなどの外部コードを読み込んでいますか?

  • ライブラリをダウンロードして拡張機能にパッケージ化し、ローカル パッケージから読み込むことを検討してください。

  • マニフェストの「content_security_policy」部分で、リソースを提供する HTTPS ドメインを許可リストに登録します。

API の変更の概要

マニフェスト バージョン 2 では、ブラウザ アクション API とページ アクション API にいくつかの変更が加えられています。また、古い API の一部が新しい API に置き換えられています。

ブラウザ操作の変更

browser actions API では、名前が変更されています。

  • browser_actions プロパティと chrome.browserActions プロパティは、単数形の browser_action プロパティと chrome.browserAction プロパティに置き換えられました。
  • 以前の browser_actions プロパティには、iconsnamepopup プロパティがありました。これらは次のように置き換えられました。

  • default_icon: ブラウザ操作のバッジ アイコン

  • default_name: バッジにカーソルを合わせたときにツールチップに表示されるテキスト

  • default_popup: ブラウザ アクションの UI を表す HTML ページ(これは文字列でなければならず、オブジェクトにすることはできません)

ページの操作の変更

ブラウザ アクションの変更と同様に、ページ アクション API も変更されました。

  • page_actions プロパティと chrome.pageActions プロパティは、単数形の page_action プロパティと chrome.pageAction プロパティに置き換えられました。
  • 以前の page_actions プロパティには、iconsnamepopup の各プロパティがありました。これらは次のように置き換えられました。

  • default_icon: ページ操作のバッジ アイコン

  • default_name: バッジにカーソルを合わせたときにツールチップに表示されるテキスト

  • default_popup: ページ アクションの UI を表す HTML ページ(これは文字列で、オブジェクトにすることはできません)

削除された API と変更された API

いくつかの拡張機能 API が削除され、新しい API に置き換えられました。

  • background_page プロパティは background に置き換えられました。
  • chrome.self プロパティは削除されました。chrome.extension を使用してください。
  • Port.tab プロパティは Port.sender に置き換えられました。
  • chrome.extension.getTabContentses() API と chrome.extension.getExtensionTabs() API は chrome.extension.getViews( { "type" : "tab" } ) に置き換えられました。

セキュリティの変更の概要

マニフェスト バージョン 1 からバージョン 2 への移行に伴い、セキュリティ関連の変更がいくつかあります。これらの変更の多くは、Chrome でコンテンツ セキュリティ ポリシーが採用されたことに起因しています。このポリシーの影響を理解するには、このポリシーについて詳しくご確認ください。

インライン スクリプトとイベント ハンドラが許可されない

コンテンツ セキュリティ ポリシーの使用により、HTML コンテンツにインラインで配置された <script> タグは使用できなくなりました。これらは外部 JS ファイルに移動する必要があります。また、インライン イベント ハンドラもサポートされていません。たとえば、拡張機能に次のコードがあるとします。

<html>
<head>
  <script>
    function myFunc() { ... }
  </script>
</head>
</html>

このコードは実行時にエラーが発生します。これを修正するには、<script> タグのコンテンツを外部ファイルに移動し、src='path_to_file.js' 属性で参照します。

同様に、多くのウェブ デベロッパーが使用する一般的なイベント ハンドラも実行されません。たとえば、次のような一般的なインスタンスについて考えてみましょう。

<body onload="initialize()">
<button onclick="handleClick()" id="button1">

これらは Manifest V2 拡張機能では機能しません。インライン イベント ハンドラを削除し、外部 JS ファイルに配置して、代わりに addEventListener() を使用してイベント ハンドラを登録します。たとえば、JS コードで次のように使用します。

window.addEventListener("load", initialize);
...
document.getElementById("button1").addEventListener("click",handleClick);

これは、拡張機能の動作をユーザー インターフェース マークアップから分離するよりクリーンな方法です。

コンテンツを埋め込む

拡張機能に、外部で使用できるコンテンツや外部ソースから取得したコンテンツを埋め込む場合があります。

ウェブページの拡張機能コンテンツ: ウェブページに挿入されるコンテンツ スクリプトで使用されるリソース(画像、スクリプト、CSS スタイルなど)が拡張機能に埋め込まれている場合は、web_accessible_resources プロパティを使用してこれらのリソースを許可リストに登録し、外部ウェブページで使用できるようにする必要があります。

{
...
  "web_accessible_resources": [
    "images/image1.png",
    "script/myscript.js"
  ],
...
}

外部コンテンツの埋め込み: コンテンツ セキュリティ ポリシーでは、パッケージから読み込まれるローカル スクリプトとオブジェクトのみが許可されるため、外部攻撃者が拡張機能に不明なコードを導入することができません。ただし、jQuery や Google アナリティクス コードなど、外部で提供されるリソースを読み込む必要がある場合があります。これには次の 2 つの方法があります。

  1. 関連するライブラリ(jQuery など)をローカルにダウンロードし、拡張機能と一緒にパッケージ化します。
  2. マニフェストの「content_security_policy」セクションで HTTPS オリジンを許可リストに登録することで、CSP を制限付きで緩和できます。Google アナリティクスなどのライブラリを含めるには、次の手順を行います。

    {
      ...,
      "content_security_policy": "script-src 'self'
      https://ssl.google-analytics.com; object-src 'self'",
      ...
    }
    

動的スクリプト評価を使用する

新しい Manifest V2 スキームの最大の変更点の 1 つは、拡張機能で eval() や新しい Function() などの動的スクリプト評価手法を使用できなくなったこと、または setTimeout() など eval() を使用する関数に JS コードの文字列を渡せなくなったことです。また、Google マップや特定のテンプレート ライブラリなど、よく使用される JavaScript ライブラリでは、これらの手法の一部が使用されていることが知られています。

Chrome には、ページが独自のオリジンで実行するためのサンドボックスが用意されており、Chrome へのアクセスは拒否されます*。API を使用します。新しいコンテンツ セキュリティ ポリシーで eval() などを使用するには:

  1. マニフェスト ファイルにサンドボックス エントリを作成します。
  2. サンドボックス エントリに、サンドボックスで実行するページをリストします。
  3. postMessage() を介したメッセージ パスを使用して、サンドボックス化されたページと通信します。

詳細については、サンドボックス評価のドキュメントをご覧ください。

関連情報

マニフェスト バージョン 2 の変更は、デベロッパーがより安全で堅牢なアーキテクチャの拡張機能とアプリを構築できるように設計されています。マニフェスト バージョン 1 からバージョン 2 への変更の完全なリストについては、マニフェスト ファイルのドキュメントをご覧ください。サンドボックスを使用して安全でないコードを分離する方法については、サンドボックス評価の記事をご覧ください。コンテンツ セキュリティ ポリシーの詳細については、拡張機能に関するチュートリアルと HTML5Rocks の優れた紹介をご覧ください。