新しい HTML 要素のオリジン トライアル

使用許可を求めるための命令的な方法は多数ある ウェブアプリでの位置情報へのアクセスなどの 強力な機能が必要ですこれらのメソッドには、 そこで Chrome の権限チームは、さまざまな課題の解決を 新しい宣言型の方法である、専用の HTML <permission> 要素に置き換えます。この 要素は Chrome 126 のオリジン トライアル段階にあり、最終的には 標準化します。

権限をリクエストするための命令型メソッド

ウェブアプリが 強力な機能がある一方で、 許可を求める必要があります。たとえば Google マップでは、 Geolocation API、 ブラウザはユーザーにプロンプトを表示し、多くの場合、その判断内容を保存するオプションが用意されています。 これは をご覧ください。

事前リクエストではなく、初回使用時に暗示的に求める

Geolocation API は強力な API であり、 説明します。たとえば、アプリが navigator.geolocation.getCurrentPosition() メソッドでは、最初の呼び出し時に権限プロンプトが自動的にポップアップ表示されます。 もう一つの例は、 navigator.mediaDevices.getUserMedia()

たとえば、 Notification API または Device Orientation and Motion API、 一般に、次のような静的なメソッドを使用して明示的に権限をリクエストします。 Notification.requestPermission() または DeviceMotionEvent.requestPermission()

権限を求めるための命令型の方法に関する課題

権限スパム

これまでウェブサイトでは navigator.mediaDevices.getUserMedia() または Notification.requestPermission()、 同時にnavigator.geolocation.getCurrentPosition()でも、ウェブサイトが が読み込まれました。ユーザーが操作を行う前に権限プロンプトがポップアップ表示される 表示されます。これは権限スパムと呼ばれることがあり、どちらにも影響します。 明示的に要求するだけでなく、最初の使用時に暗黙的に要求する できます。

ウェブサイトの読み込み時にマイクの権限を求めるメッセージが表示されます。

ブラウザでのリスク軽減策とユーザー操作の要件

権限スパムにより、ブラウザ ベンダーはボタンなどのユーザー操作を要求 クリックや keydown イベントを認識してから権限プロンプトを表示します。この この方法により、ブラウザでユーザーが認識しきれないほどの 特定のユーザー操作によって権限プロンプトが 表示されます。ユーザーは不満でページをクリックしただけである可能性がある ページの読み込みに時間がかかったか [Find me] ボタンをクリックします。また、一部のウェブサイトは、 ユーザーをだましてコンテンツをクリックさせながらプロンプトを表示する。

もう一つの軽減策として、Google Chat のメッセージを完全にブロックする プロンプトを非モーダル プロンプトで表示したり、 おすすめします。

表示中の Chrome ブラウザの

権限のコンテキスト化

もう一つの課題は、特に大画面では、権限プロンプトに スペースの上部には、 アプリが描画できるブラウザ ウィンドウの領域の外側にあります。です。 ブラウザ上部のプロンプトを見逃すことが ウィンドウの下の方にあるボタンをクリックしたときに ウィンドウが自動的に閉じますこの問題 ブラウザのスパム対策を講じていると、しばしば悪化します。

Google マップに位置情報の利用許可を求めるメッセージが表示されている。メッセージを表示した位置情報へのアクセスボタンが、遠くにある。

簡単に元に戻せない

最後に、ユーザーが行き止まりになりがちです。対象 たとえば、ユーザーが機能へのアクセスをブロックした場合、 [サイト情報] プルダウンを使用して、 ブロックされた権限をオンに戻すことができます。最悪の場合はどちらのオプションも 更新した設定が有効になるまで、ページを完全に再読み込みする必要があります。 サイトの構成を変更するための簡単なショートカットをサイトに用意していない ユーザーに説明し、 次の Google マップの下部に表示される設定を変更してください。 スクリーンショット。

Google マップに表示される Chrome サイトの権限を取り消すコントロール。

権限がエクスペリエンスにとって重要な場合(たとえば、マイクへのアクセスが Google Meet などのアプリでは煩わしいダイアログが表示される ブロックを解除する方法を指示します。

Chrome のサイト管理を開く方法を Google Meet で説明しています。

宣言型の <permission> 要素

この投稿でご紹介した課題に対処するため、Chrome 権限チームは は、新しい HTML 要素 <permission> のオリジン トライアルを開始しました。この 要素を使用すると、デベロッパーは、現時点では、 ウェブサイトで利用できる優れた機能の一部にすぎません。最もシンプルな形式では、 それを次の例のように使用します。

<permission type="camera" />

現在も議論が進んでいる <permission> を void にするか あります。void 要素は HTML 内の自己終了要素であり、 子ノードがあるためです。HTML では、終了タグはありません。

type 属性

type 属性に、リクエストする権限をスペース区切りのリストで指定します。ちなみに このドキュメントの作成時点では、指定できる値は 'camera''microphone'camera microphone(スペースで区切ります)。この要素はデフォルトでレンダリングされます。 基本的なユーザー エージェント スタイル設定のボタンに類似しています。

カメラ、マイク、カメラ、マイクの権限を含むさまざまな権限要素のボタン。

type-ext 属性

追加のパラメータを許可する一部の権限では、 type-ext 属性は、スペースで区切られた Key-Value ペアを受け入れます。たとえば、 precise:true: 位置情報の利用許可。

lang 属性

ボタンのテキストはブラウザによって提供されるもので、一貫性を持たせるため、 直接カスタマイズできません。ブラウザでテキストの言語が変更されます ドキュメントの継承された言語または親要素チェーンに基づく オプション lang 属性です。つまり、デベロッパーは <permission> をローカライズする必要がありません。 渡されます。<permission> 要素がオリジンを超えて続く場合 トライアルのステージでは、権限のタイプごとに複数の文字列やアイコンがサポートされている場合があります。 柔軟性を高めるためです<permission> の使用に関心がある場合 特定の文字列またはアイコンが必要な場合は、お問い合わせください。

動作

ユーザーが <permission> 要素を操作すると、 多岐にわたります。

  • これまで許可していなかった機能については、アクセスのたびに許可するか、 現在の訪問では引き続き許可します。

    今回またはアクセスのたびに機能を許可する権限プロンプト。

  • 以前にこの機能を許可していた場合は、引き続き許可するか、許可を取り消すことができます。 できます。

    許可を続行するか停止するかを選択する権限プロンプト。

  • 以前無効にしていた機能については、引き続き許可しない場合があります。 今度は許可します。

    今回は引き続き許可しないか、許可するかを確認する権限プロンプト。

<permission> 要素のテキストは、指定した値に基づいて自動的に更新されます。 ステータスです。たとえば、機能の使用が許可されている場合、 機能が許可されていることを示します。最初に権限を付与する必要がある場合は、 テキストが変更され、ユーザーがこの機能を使用するように招待されます。前のバージョンと 次のスクリーンショットのスクリーンショットでは、2 つの状態を確認できます。

テキスト付きの権限ボタン

CSS デザイン

ユーザーがボタンをサーフェスとして簡単に認識できるようにして、 <permission> 要素のスタイル設定は制限されています。スタイル設定が ユースケースに合わない場合は、ぜひお聞かせください なぜ、どのように!すべてのスタイル ニーズに対応できるわけではありませんが、Google は より後に、<permission> 要素のスタイル設定を安全に行えるようにする オリジン トライアル次の表に、制限があるプロパティの一部を示します。 特別なルールが適用されます。いずれかのルールに違反した場合、 <permission> 要素は無効になり、操作できなくなります。制限なし 使用しようとすると例外が発生します。この例外は、API 呼び出しで 使用できます。エラー メッセージには、検出されたエラーの詳細が なります。

プロパティ ルール

colorbackground-color

テキストと背景色をそれぞれ設定するために使用できます。「 はっきりと見えるように 2 色のコントラストが 判読可能なテキスト(コントラスト比 3 以上)。アルファ版チャンネルは 1 であること。

font-sizezoom

small と同等の範囲で設定する必要があります。 xxxlarge。設定しない場合、要素は無効になります。ズーム font-size を計算するときに考慮されます。

outline-offset

負の値は 0 に修正されます。
margin(すべて) 負の値は 0 に修正されます。

font-weight

200 に満たない値は 200 に修正されます。

font-style

normalitalic 以外の値は次のようになります。 normal に修正しました。

word-spacing

0.5em を超える値は次のように修正されます 0.5em0 を下回る値は以下に修正されます 0

display

inline-blocknone 以外の値 inline-block に修正されます。

letter-spacing

0.2em を超える値は次のように修正されます 0.2em-0.05em 未満の値: -0.05em に修正しました。

min-height

デフォルト値は 1em です。指定されている場合、 デフォルト値と指定された値の間の最大計算値 考慮されません。

max-height

デフォルト値は 3em です。指定されている場合、 デフォルト値と指定された値の間の最小計算値 考慮されません。

min-width

デフォルト値は fit-content です。指定すると、 デフォルト値と指定された値の間の最大の計算値 考慮されます

max-width

デフォルト値は 3 × fit-content です。条件 最小計算値(デフォルト値)と 考慮されます

padding-top

heightauto。この場合、1em を超える値は次のようになります 1em に修正され、padding-bottompadding-top の値に設定。

padding-left

widthauto。この場合、5em を超える値は次のようになります 5em に修正され、padding-rightpadding-left. の値に設定

transform

視覚効果を歪めることは許可されません。現在のところ、 2D 変換と比例アップスケーリングに対応

以下の CSS プロパティは通常どおり使用できます。

  • font-kerning
  • font-optical-sizing
  • font-stretch
  • font-synthesis-weight
  • font-synthesis-style
  • font-synthesis-small-caps
  • font-feature-settings
  • forced-color-adjust
  • text-rendering
  • align-self
  • anchor-name aspect-ratio
  • border(およびすべての border-* プロパティ)
  • clear
  • color-scheme
  • contain
  • contain-intrinsic-width
  • contain-intrinsic-height
  • container-name
  • container-type
  • counter-*
  • flex-*
  • float
  • height
  • isolation
  • justify-self
  • left
  • order
  • orphans
  • outline-*(前述の outline-offset の例外を除く)
  • overflow-anchor
  • overscroll-behavior-*
  • page
  • position
  • position-anchor
  • content-visibility
  • right
  • scroll-margin-*
  • scroll-padding-*
  • text-spacing-trim
  • top
  • visibility
  • x
  • y
  • ruby-position
  • user-select
  • width
  • will-change
  • z-index

さらに、論理的に同等のすべてのプロパティを使用できます(例: inline-sizewidth と同等です)、 相当します。

疑似クラス

<permission> のスタイルを設定できる 2 つの特別な疑似クラスがあります。 要素を定義します。

  • :granted: :granted 疑似クラスは、 権限が付与されました。
  • :invalid: :invalid 疑似クラスを使用すると、 すべての要素が無効な状態になっています。たとえば、 クロスオリジン iframe
で確認できます。
permission {
  background-color: green;
}

permission:granted {
  background-color: light-green;
}

/* Not supported during the origin trial. */
permission:invalid {
  background-color: gray;
}

JavaScript イベント

<permission> 要素は、 Permissions API。 リッスンできるイベントはいくつかあります。

  • onpromptdismiss: このイベントは、権限プロンプトがトリガーされたときに発生します。 ユーザーが閉じた要素(閉じるボタンのクリックなど) プロンプトの外側をクリックするなど)。

  • onpromptaction: このイベントは、権限プロンプトがトリガーされたときに発生します。 ユーザーがプロンプトでなんらかの操作を行うことで、要素が解決されました できます。これは必ずしも権限の状態が変化したことを 意味するわけではなく そのユーザーは、現状維持のアクション( 許可し続けます)。

  • onvalidationstatuschange: このイベントは、要素が "valid" から "invalid" に変更します。次の場合、要素は "valid" とみなされます。 ユーザーがクリックした場合、ブラウザはシグナルの完全性を信頼します。 それ以外の場合は "invalid"。たとえば、要素が 読み込みます。

で確認できます。

これらのイベントのイベント リスナーを HTML にインラインで直接登録できます。 コード (<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />), または、<permission> 要素で addEventListener() を使用します。 見てみましょう。

<permission type="camera" />
<script>
  const permission = document.querySelector('permission');
  permission.addEventListener('promptdismiss', showCameraWarning);

  function showCameraWarning() {
    // Show warning that the app isn't fully usable
    // unless the camera permission is granted.
  }

  const permissionStatus = await navigator.permissions.query({name: "camera"});
  
  permissionStatus.addEventListener('change', () => {
    // Run the check when the status changes.
    if (permissionStatus.state === "granted") {
      useCamera();
    }
  });

  // Run the initial check.
  if (permissionStatus.state === "granted") {
    useCamera();
  }
</script>

機能検出

ブラウザが HTML 要素をサポートしていない場合、要素は表示されません。つまり HTML コードに <permission> 要素がある場合、 ブラウザは認識できません。JavaScript を使用してサポートを検出することが必要になる場合もあります。 たとえば、ユーザーがクリックすることでトリガーされる権限プロンプトを 通常の <button>

if ('HTMLPermissionElement' in window) {
  // The `<permission>` element is supported.
}

オリジン トライアル

サイトの <permission> 要素を実際のユーザーで試すには: オリジン トライアルに登録します。 オリジン トライアルのスタートガイド オリジン トライアルを使用するためのサイトを準備する方法をご覧ください。オリジン トライアル が Chrome 126 ~ 131(2025 年 2 月 19 日)に実施されます。

デモ

デモと GitHub のソースコードをご確認ください。以下は、対応ブラウザでのエクスペリエンスのスクリーンショットです。

3 つの権限ボタンを表示する権限要素のデモ。

フィードバック

ご自身のユースケースで <permission> がどのように役立つか、ぜひお聞かせください。共感 自由回答形式の質問に リポジトリの問題、または新しい 1 です。リポジトリ内のパブリック シグナル <permission> 要素を使用すると、あなたが関心を持っていることを Google や他のブラウザに知らせることができます できます。

よくある質問

  • 権限を組み合わせた通常の <button> と比べると、どのような点で優れていますか? API はどうですか?<button> のクリックはユーザー操作ですが、ブラウザでは 権限を要求するリクエストに接続されているかどうかを確認します。もし ユーザーが <permission> をクリックした場合、ブラウザはクリックが発生したことを 関連するイベントが表示されます。これによりブラウザは リスクが高まりますたとえば、ユーザーが 権限のブロックを簡単に元に戻すことができます。
  • 他のブラウザが <permission> 要素をサポートしていない場合はどうなりますか?<permission> 要素はプログレッシブ エンハンスメントとして使用できます。オン 従来の権限フローを使用できます。たとえば 通常の <button> のクリックに基づきます。権限チームはさらに ポリフィルを扱いますGitHub リポジトリにスターを付ける 完了すると通知されます。
  • この問題は他のブラウザ ベンダーと議論されましたか?<permission> 要素 2023 年の W3C TPAC で活発に議論されました。 ブレイクアウト セッションをご覧ください。マイページ 読み取り可能な 公開セッションに関する注記をご覧ください。 また Chrome チームは、 関連リンクセクションをご覧ください。<permission> 要素は他のブラウザとも継続的に議論されているトピックです。 標準化したいと考えています
  • これは実際に void 要素にすべきでしょうか?まだ続いています 議論が進んでいる <permission> を void にするか あります。フィードバックがある場合は、問題に関与します。

謝辞

このドキュメントをレビューしたユーザー Balázs Engedy Thomas Nguyen 氏、 Penelope McLachlan Marian HarbachDavid Warren Rachel Andrew