コードを更新する

他の問題とは無関係の更新

これは、拡張機能サービス ワーカーに含まれないコードに必要な変更について説明する 3 つのセクションの最初のセクションです。このセクションでは、他の問題とは関係のない、必要なコード変更について説明します。次の 2 つのセクションでは、ブロック中のウェブリクエストの置き換えセキュリティの強化について説明します。

tabing.executeScript() を scripting.executeScript() に置き換える

Manifest V3 では、executeScript()tabs API から scripting API に移動されます。これには、実際のコード変更に加えて、マニフェスト ファイルの権限の変更も必要です。

executeScript() メソッドには次のものが必要です。

  • "scripting" 権限。
  • ホスト権限または "activeTab" 権限。

scripting.executeScript() メソッドは、tabs.executeScript() の場合と類似しています。いくつか違いがあります。

  • 以前の方法では 1 つのファイルしか受け取れませんでしたが、新しい方法ではファイルの配列を受け取ることができます。
  • また、InjectDetails の代わりに ScriptInjection オブジェクトを渡します。両者の間には複数の違いがあります。たとえば、tabId がメソッド引数としてではなく ScriptInjection.target のメンバーとして渡されるようになりました。

次の例は、その方法を示しています。

Manifest V2
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

chrome.tabs.executeScript(
  tab.id,
  {
    file: 'content-script.js'
  }
);

バックグラウンド スクリプト ファイル。

Manifest V3
async function getCurrentTab()
let tab = await getCurrentTab();

chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['content-script.js']
});

拡張機能の Service Worker で、

tabing.insertCSS() と tab.removeCSS() を scripting.insertCSS() と scripting.removeCSS() に置き換える

Manifest V3 では、insertCSS()removeCSS()tabs API から scripting API に移行します。そのためには、コードの変更に加えて、マニフェスト ファイル内の権限も変更する必要があります。

  • "scripting" 権限。
  • ホスト権限または "activeTab" 権限。

scripting API の関数は tabs の関数に似ています。ただし、いくつかの違いがあります。

  • これらのメソッドを呼び出すときは、InjectDetails ではなく CSSInjection オブジェクトを渡します。
  • tabId は、メソッド引数ではなく CSSInjection.target のメンバーとして渡されるようになりました。

次の例は、insertCSS() でこれを行う方法を示しています。removeCSS() の手順も同じです。

Manifest V2
chrome.tabs.insertCSS(tabId, injectDetails, () => {
  // callback code
});

バックグラウンド スクリプト ファイル。

Manifest V3
const insertPromise = await chrome.scripting.insertCSS({
  files: ["style.css"],
  target: { tabId: tab.id }
});
// Remaining code. 

拡張機能の Service Worker で、

ブラウザ アクションとページ アクションをアクションに置き換える

ブラウザとページの操作は、Manifest V2 では別々の概念でした。最初は役割の異なる役割を担っていましたが、それぞれの役割の差は時間の経過とともに減少しています。Manifest V3 では、これらのコンセプトは Action API に統合されています。そのためには、manifest.json と拡張機能コードに、Manifest V2 バックグラウンド スクリプトとは異なる変更が必要です。

Manifest V3 のアクションはブラウザのアクションに最も近い。ただし、action API では、pageAction とは異なり、hide()show() は提供されません。引き続きページ アクションが必要な場合は、宣言型コンテンツを使用してエミュレートするか、タブ ID を指定して enable() または disable() を呼び出します。

「browser_action」と「page_action」を「action」に置き換える

manifest.json で、"browser_action" フィールドと "page_action" フィールドを "action" フィールドに置き換えます。"action" フィールドの詳細については、リファレンスをご覧ください。

Manifest V2
{
  ...
  "page_action": { ... },
  "browser_action": {
    "default_popup": "popup.html"
   }
  ...
}
Manifest V3
{
  ...
  "action": {
    "default_popup": "popup.html"
  }

  ...
}

browserAction API と pageAction API をアクション API に置き換える

Manifest V2 では browserAction API と pageAction API を使用していましたが、今後は action API を使用する必要があります。

Manifest V2
chrome.browserAction.onClicked.addListener(tab => { ... });
chrome.pageAction.onClicked.addListener(tab => { ... });
Manifest V3
chrome.action.onClicked.addListener(tab => { ... });

コールバックを Promise に置き換える

Manifest V3 では、多くの拡張機能 API メソッドが Promise を返します。Promise は、非同期メソッドから返される値のプロキシまたはプレースホルダです。Promise を使用したことがない場合は、MDN で Promise の詳細をご確認ください。このページでは、Chrome 拡張機能でこれらの API を使用する際に知っておくべきことについて説明します。

下位互換性を確保するため、Promise のサポートが追加された後も、多くのメソッドは引き続きコールバックをサポートします。同じ関数呼び出しで両方を使用することはできません。コールバックを渡すと、関数は Promise を返しません。Promise を返す場合は、コールバックを渡さないでください。イベント リスナーなど、一部の API 機能では引き続きコールバックが必要になります。メソッドがプロミスをサポートしているかどうかを確認するには、API リファレンスで「Promise」ラベルを探します。

コールバックから Promise に変換するには、コールバックを削除し、返された Promise を処理します。以下の例は、オプションの権限のサンプルnewtab.js の例)から抜粋したものです。コールバック バージョンは、サンプルの request() 呼び出しがコールバックを伴うものを示しています。Promise バージョンは、async と await で書き換えることができます。

コールバック
chrome.permissions.request(newPerms, (granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});
Promise
const newPerms = { permissions: ['topSites'] };
chrome.permissions.request(newPerms)
.then((granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});

Manifest V2 バックグラウンド コンテキストを想定している関数を置き換える

他の拡張機能のコンテキストは、メッセージの受け渡しを使用する場合に限り、拡張機能 Service Worker とやり取りできます。そのため、バックグラウンド コンテキストを想定している呼び出しを置き換える必要があります。具体的には、次の呼び出しを置き換える必要があります。

  • chrome.runtime.getBackgroundPage()
  • chrome.extension.getBackgroundPage()
  • chrome.extension.getExtensionTabs()

拡張機能のスクリプトでは、メッセージ パスを使用して、サービス ワーカーと拡張機能の他の部分との間で通信する必要があります。現在、これは sendMessage() を使用して拡張機能サービス ワーカーに chrome.runtime.onMessage を実装することで実現できます。長期的には、これらの呼び出しを postMessage() と Service Worker のメッセージ イベント ハンドラに置き換える計画を立てる必要があります。

サポートされていない API を置き換える

下記のメソッドとプロパティは、Manifest V3 での変更が必要です。

Manifest V2 のメソッドまたはプロパティ 次に置換
chrome.extension.connect() chrome.runtime.connect()
chrome.extension.connectNative() chrome.runtime.connectNative()
chrome.extension.getExtensionTabs() chrome.extension.getViews()
chrome.extension.getURL() chrome.runtime.getURL()
chrome.extension.lastError メソッドが Promise を返す場合は promise.catch() を使用
chrome.extension.onConnect chrome.runtime.onConnect
chrome.extension.onConnectExternal chrome.runtime.onConnectExternal
chrome.extension.onMessage chrome.runtime.onMessage
chrome.extension.onRequest chrome.runtime.onMessage
chrome.extension.onRequestExternal chrome.runtime.onMessageExternal
chrome.extension.sendMessage() chrome.runtime.sendMessage()
chrome.extension.sendNativeMessage() chrome.runtime.sendNativeMessage()
chrome.extension.sendRequest() chrome.runtime.sendMessage()
chrome.runtime.onSuspend(バックグラウンド スクリプト) 拡張機能サービス ワーカーではサポートされていません。代わりに beforeunload ドキュメント イベントを使用してください。
chrome.tabs.getAllInWindow() chrome.tabs.query()
chrome.tabs.getSelected() chrome.tabs.query()
chrome.tabs.onActiveChanged chrome.tabs.onActivated
chrome.tabs.onHighlightChanged chrome.tabs.onHighlighted
chrome.tabs.onSelectionChanged chrome.tabs.onActivated
chrome.tabs.sendRequest() chrome.runtime.sendMessage()
chrome.tabs.Tab.selected chrome.tabs.Tab.highlighted