Manifest V3 のオフスクリーン ドキュメント

Ian Stanion
Ian Stanion

バックグラウンド ページから拡張機能 Service Worker への移行で機能を置き換えるため、デベロッパーは Chrome 109 以降で chrome.offscreen API とマニフェスト権限を使用できます。この権限をリクエストすると、ユーザー エクスペリエンスを中断する新しいウィンドウやタブを煩わしく開かずに、DOM API を使用するオフスクリーン ドキュメントを作成できます。chrome.offscreen API が Chrome 拡張機能で利用可能になりました。

Chromium では、Manifest V3 拡張機能は Service Worker ベースですが、Service Worker は完全なドキュメントベースのページ(バックグラウンド ページやイベント ページを含む)と同じ API とメカニズムをサポートしていません。また、コンテンツ スクリプトを使用してウェブページの DOM API にアクセスすると、拡張機能はページごとに異なるコンテンツ セキュリティ ポリシーの影響を受けます。この問題を解決するため、オフスクリーン ドキュメントを導入します。これにより、Manifest V3 拡張機能が専用の API を介して、最小限のスコープで、比較的権限のないオフスクリーン ドキュメントを実行時に開くことができるため、DOM 関連の機能と API をサポートできます。

機能情報

オフスクリーン ドキュメントは、サービス ワーカーでサポートされていないユースケース(音声再生など)を処理するように特別に設計されているため、このページの存続期間と付与される権限は、拡張機能のサービス ワーカーとは別になります。このページには、アクションの実行を停止すると破棄されるという点で、マニフェスト V2 のイベントページと同様のライフタイム メカニズムがあります。また、ユーザー エージェントは、指定された目的に固有の存続期間にさらに制限を加える場合があります。オフスクリーン ドキュメントは、DOM API でのみアクセスできる API のギャップを埋めるために設計されています。そのため、このコンテキストで拡張機能 API を直接公開する必要はありません。拡張機能がこれらの API を「バックグラウンド ページの置き換え」として使用する可能性を低減するため、オフスクリーン ドキュメントに公開されるのは chrome.runtime Messaging API のみです。(デベロッパーは、サービス ワーカーを介してオフスクリーン ドキュメントをクライアントとして宣言することで、ウェブ メッセージングを使用することもできます)。一部のユースケース(特にサイト スクレイピング)では、クロスオリジン フレームにアクセスする必要があるため、これらのドキュメントには、拡張機能ページと同じルールに従ってクロスオリジン フレームを埋め込むことができます。オフスクリーン ドキュメントでは、拡張機能で指定されたコンテンツ スクリプトをこれらのフレームで実行して、通常のウェブページと同様に必要なコンテンツをスクレイピングできます。

理由、目的の必須

オフスクリーン ドキュメントを作成する場合は、理由を明記し、さらに正当な理由を示す必要があります。これらの理由は API リファレンス ドキュメントに記載されており、ドキュメントの存続期間をさまざまな方法で処理します。たとえば、現在、音声再生のために開いたドキュメントには、クリップボード管理のために開いたドキュメントとは異なるルールが有効期限に適用されています。オフスクリーン ドキュメントの目的について、理由に詳細を追加することもできます。理由は、ドキュメントに影響を与えるパラメータではなく、デベロッパーが記述する文字列です。デベロッパーがフィードバックやユースケースを共有するにつれて、API に追加の理由が追加される可能性があります。

今後の展開

実装を容易にするため、この API の最初のバージョンでは、拡張機能とプロファイルごとに一度に 1 つのページのみをサポートしています。今後のバージョンでは、複数ページをサポートするように緩和される可能性があります。現在、拡張機能がアクティブなシークレット モードで分割モードで実行されている場合、通常のプロファイルとシークレット モードのプロファイルの両方に、それぞれ 1 つのオフスクリーン ドキュメントを設定できます。また、拡張機能ワーカーに DOM 機能を追加することも予定されています。オフスクリーン API を使用する関数と、後でスワップするためのサービス ワーカー内の同等のコメント付き関数をペアにして、拡張機能を「将来に備えて」準備できます。

// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
    await chrome.offscreen.createDocument({
      url: 'offscreen.html',
      reasons: [chrome.offscreen.Reason.CLIPBOARD],
      justification: 'Write text to the clipboard.',
    });
  }


// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
  navigator.clipboard.writeText(value);
}

また、DOM 機能と API がサービス ワーカーに追加されるにつれて、サービス ワーカーの現在の状態や、オフスクリーン ドキュメントを使用する理由に応じて、ドキュメントを作成する理由のリストが追加または削除されます。

まとめ

オフスクリーン ドキュメントを使用すると、現在サービス ワーカーでは実現できない DOM またはウィンドウの操作アクセスを必要とする拡張機能を使用できます。また、新しいユースケースを追加したり、将来解決するユースケースを削除したりできる柔軟なアプローチも提供します。拡張機能では、特定のユースケースに提案されているオフスクリーン ドキュメント API を使用する必要があります。拡張機能のメインのバックグラウンド コンテキストは、マニフェストで指定されたサービス ワーカーのままにする必要があります。オフスクリーン ドキュメントは API アクセスが制限されているため、メインの拡張機能ロジックを保存する場所としては適していません。画面外ドキュメントの存続期間は、作成した Service Worker とは関係ありません。サービス ワーカーの存続期間に関する考慮事項と、拡張機能のサービス ワーカーの存続期間に関連するユースケースについては、別のブログ投稿で説明します。オフスクリーン ドキュメントを使用する理由は、サービス ワーカー自体に機能と API が追加されるにつれて変化します。デベロッパーの皆様からのフィードバックをお待ちしております。

写真: Kari SheaUnsplash