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

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

このドキュメントでは、Chrome 拡張機能を Manifest バージョン 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 プロパティを定義し、リソースを一覧表示します(必要に応じて、これらのリソースに 個別のコンテンツ セキュリティ ポリシーを設定します)。

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

  • sandbox プロパティを定義します。

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

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

  • CSP に対応したライブラリ(AngularJS など)を使用します。

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

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

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

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

API の変更の概要

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

ブラウザ操作の変更

ブラウザ アクション API では、名前が変更されています。

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

  • ブラウザ アクション バッジ アイコンの default_icon

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

  • ブラウザ アクションの UI を表す HTML ページの default_popup(文字列にする必要があります。オブジェクトにすることはできません)

ページ操作の変更

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

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

  • ページ アクション バッジ アイコンの default_icon

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

  • ページ アクションの UI を表す HTML ページの default_popup(文字列にする必要があります。オブジェクトにすることはできません)

削除および変更された 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" } ) に置き換えられました。

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

Manifest バージョン 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() を使用してメッセージを渡して、サンドボックス化されたページと通信します。

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

関連情報

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