新しい拡張機能メニューのテスト開始に備えて拡張機能を準備する

公開日: 2024 年 11 月 19 日

Google I/O 2024 では、拡張機能メニューの今後の変更に関する初期デザインをいくつかご紹介しました。この変更により、拡張機能がアクセスできるサイトをユーザーがより細かく管理できるようになります。これらの変更は、カナリア版のごく一部のユーザーを対象にテストを開始し、今後はより多くのユーザーに展開していく予定です。

これまで、この変更についてデベロッパーと話し合う際に、拡張機能がインストール時にホスト権限をリクエストする方法の変更が及ぼす影響について懸念の声が寄せられることがありました。新しいメニューは、デフォルトの動作には影響しません。拡張機能は、インストール時にリクエストされたすべてのホストへのアクセス権を継続的に付与されます。今回の変更は、ユーザーがすでに利用可能なコントロールを簡単に見つけられるようにすることを目的としています。

この記事では、ユーザーがページへのアクセスを拒否した場合に備えて、新しい API を使用して拡張機能を準備する方法と、その概要について説明します。

変更内容

ユーザーがより細かく管理できるように、新しい拡張機能メニューを導入します。拡張機能には引き続き、インストール時にリクエストされたすべてのホストへのアクセス権が付与されますが、ユーザーは拡張機能ごとにアクセスを簡単に管理できるようになります。

新しい拡張機能メニューのデザイン(作業中)
新しい拡張機能メニューのデザイン(作業中)

新しいメニュー(現在のデザインを示す画像。変更される可能性があります)では、ページで実行できる拡張機能がより明確に表示され、ユーザーはアクセス権を変更できます。特定のサイトですべての拡張機能が実行されないようにすることもできます。前述のとおり、利用可能な設定やデフォルト設定は変更されません。Google は、すでに利用可能な設定をユーザーが簡単に見つけられるようにすることに重点を置いています。

サイトアクセス リクエストを追加する

Google は、これらの変更を補完する新しい API を設計しました。この API は、WebExtensions コミュニティ グループの他のブラウザやデベロッパーからの重要なインプットを基に設計されています。

ユーザーがページへのアクセスを拒否した場合、拡張機能は新しい permissions.addSiteAccessRequest API を使用してアクセスをリクエストできるようになりました。拡張機能がこの操作を行うと、ツールバーの拡張機能のパズルピースの横に [許可] メッセージが表示されます。検討しているデザインの例を以下に示します。

example.com のサイトへのアクセス リクエスト
example.com のサイト アクセス リクエスト

ユーザーが拡張機能メニューで [許可] をクリックすると、拡張機能にホストへの永続的なアクセスが許可されます。ユーザーは、拡張機能メニューまたは chrome://extensions ページにアクセスして、今後再び配信を停止できます。ツールバーの [1 件許可しますか?] をクリックすると、すぐにアクセスを許可できます。

拡張機能は tabIdpermissions.addSiteAccessRequest を呼び出して、そのタブの権限リクエストを表示できます。特徴検出機能は、拡張機能で今すぐ安全に使用できます。この API は、新しいメニューのないユーザーには機能しませんが、新しいメニューが段階的にロールアウトされるため、新しいメニューを使用するユーザーにはメリットがあります。

chrome.tabs.onUpdated.addListener(async (tabId, changes) => {
  if (typeof changes.url !== 'string') return;

  const url = new URL(changes.url);

  // If we are on the /checkout page of example.com.
  if (url.origin === 'https://example.com' && url.pathname === '/checkout') {
    const hasPermission = await chrome.permissions.contains({
      origins: ['https://example.com/*']
    });

    // We already have host permissions.
    if (hasPermission) {
      return;
    }

    // Add a site access request if the API is available.
    if (chrome.permissions.addSiteAccessRequest) {
      chrome.permissions.addSiteAccessRequest({ tabId });
    }
  }
});

この例では、ユーザーが /checkout ページにいる場合にのみリクエストを追加します。完全なコードは、chrome-extensions-samples リポジトリで確認できます。

拡張機能は、ユーザーにアクセス権をリクエストするタイミングに注意する必要があります。ユーザーはノイズの多いリクエストを無視する傾向があり、Chrome は過剰なリクエストをスロットリングする可能性があります。ユーザーは、拡張機能がリクエストを表示する機能をオフにすることもできます。そのため、アクセス権は、ユーザーが拡張機能を使用する可能性が高いと確信できる特定の状況でのみリクエストしてください。

リクエストは特定のタブにバインドされ、ユーザーが別のオリジンに移動すると自動的に消去されます。対応する removeSiteAccessRequest メソッドを使用して、リクエストを明示的に消去できます(リクエストが特定のパスにアタッチされている場合など)。

この API は新しい拡張機能メニューにリンクされているため、新しいメニューが有効になっていない場合、呼び出しは無視されます。ただし、この API を今すぐお試しいただき、拡張機能に導入することをおすすめします。新しいメニューの変更が段階的に多くのユーザーに表示されるため、優れたユーザー エクスペリエンスを提供できます。

省略可能な権限の使用方法について詳しくは、権限のドキュメントをご覧ください。

試してみる

この API は、Chrome 133.0.6838.0 以降(現在は Chrome Canary で利用可能)でデフォルトで有効になっています。新しいメニューを有効にするには、chrome://flags で [Extensions Menu Access Control] フラグを有効にします。

なお、この機能は現在開発中であり、今後も進化と変更が加えられる可能性があります。最新の機能を確認するには、Chrome Canary でテストすることをおすすめします。

新しいデザインに関するフィードバックは、chromium-extensions メーリング リストで送信できます。いただいたフィードバックは、新しいメニューの開発に活用させていただきます。