--- title: Chrome との非互換性 slug: Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities tags: - WebExtensions - 初心者向け translation_of: Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities ---
{{AddonSidebar}}

Webextension を用いた拡張機能は Chrome や Opera の拡張機能と互換性があるように設計されています。可能な限り、それぞれのブラウザー向けに書かれた拡張機能は最低限の変更で Firefox で実行できるように設計されています。

しかしながら、Firefox は現在、Chrome と Opera でサポートされている機能と API の限られたセットのみをサポートしています。もっと多く機能を追加しようと努めていますが、まだサポートされていない機能もたくさんあり、まったくサポートしないものもいくつかあります。

JavaScript APIs

コールバックと chrome.* ネームスペース

Chrome では、拡張機能は chrome ネームスペースを使って特権 JavaScript API にアクセスします:

chrome.browserAction.setIcon({path: "path/to/icon.png"});

WebExtensions は同等の API に browser ネームスペースを使ってアクセスします:

browser.browserAction.setIcon({path: "path/to/icon.png"});

多くの API は非同期です。 Chrome では、非同期 API はコールバックを使用して値を返し、{{WebExtAPIRef("runtime.lastError")}}がエラーを通知します:

function logCookie(c) {
  if (chrome.extension.lastError) {
    console.error(chrome.extension.lastError);
  } else {
    console.log(c);
  }
}

chrome.cookies.set(
  {url: "https://developer.mozilla.org/"},
  logCookie
);

同様の WebExtensions API では promises を利用します:

function logCookie(c) {
  console.log(c);
}

function logError(e) {
  console.error(e);
}

var setCookie = browser.cookies.set(
  {url: "https://developer.mozilla.org/"}
);
setCookie.then(logCookie, logError);

Firefox はchromebrowserの両方のネームスペースをサポート

移植の助けとして、WebExtensions の Firefox 実装は、コールバックを使用したchrome、promise を使用したbrowserと同様にサポートします。これは、多くの Chrome 拡張機能が Firefox でそのまま動作することを意味します。ただし、これは WebExtensions 標準の一部ではなく、準拠するすべてのブラウザーでサポートされているとは限りません。

browser と promise を使って拡張機能を書いている場合、Chrome でも動かせるようにする polyfill を開発しました: https://github.com/mozilla/webextension-polyfill.

部分的にサポートされている API

ブラウザーの JavaScript API サポートのページには、Firefox でサポートされているすべての API の互換性テーブルが含まれています。特定の API アイテムのサポートに関する警告がある場合は、これらのテーブルにアスタリスク "*" が表示され、API アイテムのリファレンスページにその警告が説明されています。

このテーブルは、GitHub で JSON ファイルとして保存された互換性データから生成されます。

このセクションの残りの部分では、テーブルにまだ取り込まれていない互換性の問題について説明します。

notifications

proxy

tabs

webRequest

windows

その他の非互換性

CSS内の URL

Firefox は、挿入されたページからではなく、CSS ファイル自体からの相対パスで、挿入された CSS ファイルの URL を解決します。

付加的な非互換性

Firefox は、バックグラウンドページからのalert(), confirm() または prompt()の使用をサポートしていません。

web_accessible_resources

chrome では、リソースが web_accessible_resources にリストされている場合、chrome-extension://<your-extension-id>/<path/to/resource>としてアクセスできます。この場合 extension IDは、指定された拡張機能に対して固定されています。

Firefox ではそうではなく、Firefox のすべてのインスタンスごとに異なるランダムな UUID を使用してアクセスできるように実装されています:moz-extension://<random-UUID>/<path/to/resource> このランダム性により、特定の拡張機能の URL を別のドメインの CSP ポリシーに追加するなど、いくつかのことをできなくなります。

マニフェストの"key"プロパティ

パッケージされていない拡張機能を使用する場合、Chrome はマニフェストに"key"プロパティを追加して、異なるマシン間で extension ID を固定することができます。 これは主に web_accessible_resources で作業する場合に便利です。 Firefox は web_accessible_resources にランダムな UUID を使用するため、このプロパティはサポートされていません。

コンテンツスクリプトのリクエストは、コンテンツページではなく、拡張機能のコンテキストで発生する

chrome では、コンテンツスクリプトから/apiのような相対URL にリクエストが呼び出されたとき(たとえば、fetch()を使用して)、https://example.com/apiに送信されます。Firefox では、絶対URL を指定する必要があります。

manifest.json のキー

メインの manifest.json ページには、manifest.json のキーのブラウザーサポートを説明する表が含まれています。 特定のキーのサポートに関する警告がある場合、表にアスタリスク "*"付きで示され、キーのリファレンスページには注意事項が説明されています。

これらの表は、 GitHub で JSON ファイルとして保存された互換性データから生成されます。

ネイティブメッセージング

コマンドライン引数

Linux と Mac では、Chrome は chrome-extension://[extensionID] の形式で、起動した拡張機能のオリジンとなる1つの引数をネイティブアプリに渡します。 これにより、アプリは拡張機能を識別できます。

Windows では、Chrome は2つの引数を受け取ります。1つ目は拡張機能のオリジンで、2つ目はアプリを起動した Chrome ネイティブウィンドウへのハンドルです。

allowed_extensions

Chrome では、アプリマニフェストの allowed_extensions キーは、代わりにallowed_origins と呼ばれています。

アプリマニフェストの位置

Chrome は、別の場所でアプリのマニフェストを見つけることを期待しています。 Chrome ドキュメントの「ネイティブメッセージングホストの場所」をご覧ください。