HTML の権限要素

コミュニティグループ報告書草案,

このバージョン:
https://wicg.github.io/PEPC/permission-elements.html
課題追跡:
GitHub
仕様内にインライン表示
編集者:
Daniel Vogelheim (Google LLC)

概要

ページ内でブラウザーの権限を要求するための HTML 要素。

本仕様は、ページ内からブラウザーの権限およびそれに関連する 機能をユーザーが制御できるようにするという共通の目的を持つ、 一連の新しい HTML 要素を規定する。

この新しい要素に対する適切なスタイルおよび UI の制約により、ユーザーは それをクリックすることの意味を理解できるため、ブラウザーは権限に関する判断を行う ユーザーの意図について高い確信を得られる。 これらの権限要素は、現在のスクリプトによって開始される権限フローよりも、 アクセシブルで、安全で、ユーザーフレンドリーであることを目指している。

この文書の位置付け

この仕様は、Web Platform Incubator コミュニティグループによって公開された。 これは W3C 標準ではなく、W3C 標準化トラック上にもない。 以下の W3C コミュニティ貢献者ライセンス契約 (CLA) では、限定的なオプトアウトが認められており、その他の条件も適用されることに注意されたい。 W3C コミュニティグループおよびビジネスグループについて詳しく知る。

1. はじめに

ユーザー エージェントは、ウェブサイトに強力な機能を公開する。これらは 一部のユースケースにとって重要であるものの、容易に悪用され得る機能である。そのような強力な機能の 典型例といえるものがカメラへのアクセスであり、これは オンライン会議などの多くのユースケースに不可欠だが、求められていないカメラの 起動は重大なプライバシー上の問題となる。これに対処するため、ユーザー エージェントは権限を使用して、特定の アクセスを許可するかどうかをユーザーに尋ねる。

これらの権限要求は、当初かなり直接的な受け渡しとして始まった。サイトが 何らかの機能を要求すると、ユーザーエージェントは直ちにユーザーに その要求について判断するよう求めていた。一方で、スパムや悪用により、ユーザーエージェントは ユーザーのセキュリティ、プライバシー、および 注意を保護するため、より明確な方針を取らざるを得なくなった。現状では、ユーザーは多数の権限要求を受け取り、 それらの要求がどのような結果をもたらすかがユーザーには不明確であることが多い。

本仕様は、不正利用に対する組み込みの保護を備えたページ内要素を通じて、 強力な機能へのアクセスを要求し開始する新しい仕組みを導入する。 これは、権限要求を実際に使用される文脈に結び付けることを目指しており、 それによって「権限スパム」を減らすと同時に、 実装に対してユーザーの意図を示すより良いシグナルを提供する。

2. HTML 権限要素の共通動作: InPagePermissionMixin

本仕様の要素は、いくつかの共通動作を示し、それらは InPagePermissionMixin およびそれに関連する状態、 アルゴリズム、レンダリング規則によって表現される。

InPagePermissionMixin インターフェイスミックスインは、次のように定義される。

interface mixin InPagePermissionMixin {
  readonly attribute boolean isValid;
  readonly attribute InPagePermissionMixinBlockerReason invalidReason;
  readonly attribute PermissionState initialPermissionStatus;
  readonly attribute PermissionState permissionStatus;

  attribute EventHandler onpromptaction;
  attribute EventHandler onpromptdismiss;
  attribute EventHandler onvalidationstatuschange;
};

このミックスインを使用する要素は、次の 内容属性をサポートすることが期待される。

isValid
要素を現在アクティブ化できるかどうかを照会する。
invalidReason
要素を現在アクティブ化できない理由を表す文字列を返す。
onpromptdismiss
要素との対話によって生じた権限プロンプトをユーザーが閉じたときに通知する。
onpromptaction
要素との対話によって生じた権限プロンプトにユーザーが回答したとき (肯定的または否定的)に通知する。
onvalidationstatuschange
検証状態が変化したときに通知する。

isValid 属性は、 権限要素が現在ブロックされていないかどうかを反映する。

invalidReason 属性は、権限 要素の内部状態を反映する 列挙属性である。その値集合はInPagePermissionMixinBlockerReasonである。

グローバルなlang属性は、 ローカライズされたテキストを選択するために要素によって監視される。

要素上のグローバルな tabindex 内容属性の 既定 値は 0 である。

次に示すものは、InPagePermissionMixinを含む要素で サポートしなければならないイベントハンドラー(および対応するイベントハンドラーイベント型)である。

onpromptaction Event
onpromptdismiss Event
onvalidationstatuschange Event

2.1. Mixin の内部状態

HTML 権限要素は、ユーザーが要求可能な権限によって制限される 機能を表し、 ユーザーはそれらをアクティブ化して、サイトがそれらへのアクセスを開始できるようにする。 このような要求がページのスクリプトではなく ユーザーによって開始されることは、これらの要素の中核である。これを強制するため、 要素はアクティブ化イベントが信頼済みであるかを確認する。 さらに、要素が(部分的に)遮蔽されているか、 最近移動されたかなど、いくつかの条件を監視する。要素はこれを追跡するため、 内部[[BlockerList]] を維持する。

InPagePermissionMixin 要素は、次の内部スロットを持つ。

2.2. ナビゲーバブルにおけるMixinをサポートする 状態

InPagePermissionMixinをサポートするため、 ナビゲーバブルは 要素の順序付き集合である[[PermissionElements]]を維持する。この順序付き 集合は、unsuccesful_registration型のブロッカーを評価するために使用される。

2.3. Mixin のアクティブ化とアクティブ化ブロッカー

権限要素群の重要な目的は、ユーザーの 意識的な選択を反映することであり、ユーザーが容易にだまされて それをアクティブ化しないようにする必要がある。そのため、権限要素は ブロッカー理由のリストを維持し、それによって要素のアクティブ化が 永続的または一時的に妨げられることがある。

これらの動作の大部分は、すべての権限要素で同一であるべきである。 簡潔さのため、1 つまたは一部の要素にのみ適用されるブロッカーも含める。

enum InPagePermissionMixinBlockerReason {
  // ブロッカー理由なし。
  "",

  // すべての InPagePermissionMixin 使用者がサポートするブロッカー理由。
  "illegal_subframe", "unsuccesful_registration",
  "recently_attached", "intersection_changed",
  "intersection_out_of_viewport_or_clipped",
  "intersection_occluded_or_distorted", "style_invalid",

  // HTMLPermissionElement 固有のブロッカー理由。
  "type_invalid",
};

権限要素は、要素を(現在)アクティブ化できない理由である「ブロッカー」を追跡する。 これらのブロッカーには、永続、一時、および期限付きという 3 種類の存続期間がある。

永続 ブロッカー

要素が永続ブロッカーを持つと、永続的に無効化される。 これは、ウェブサイト所有者が修正することを期待される問題に使用される。 例として、 fencedframe 内の permission 要素がある。

一時 ブロッカー

これは、ブロック条件が発生しなくなるまでのみ有効な ブロッカーである。例として、 現在表示範囲内にない permission 要素がある。すべての一時ブロッカーは、条件が適用されなくなると 期限付きブロッカー に変わる。

期限付き ブロッカー

これは、一定期間のみ有効なブロッカーである。これは 「クリックジャッキング」のような悪用シナリオをブロックするために使用される。例として、 最近移動された permission 要素がある。

ブロッカー名 ブロッカー型 条件の例 順序ヒント
type_invalid 永続 サポートされていない権限型 が設定された場合。 1
illegal_subframe 永続 要素が fencedframe 内で使用されている場合。 2
unsuccesful_registration 一時 同じ 強力な機能に対する他の要素が多すぎる状態で、同じ 文書に挿入された場合。 3
recently_attached 期限付き 要素が DOM に取り付けられた直後の場合。 4
intersection_changed 期限付き 要素が移動されている場合。 6
intersection_out_of_viewport_or_clipped 一時 要素がビューポート内にない、または完全には収まっていない場合。 7
intersection_occluded_or_distorted 一時 要素がビューポート内に完全に収まっているが、 それでも完全には見えない場合(たとえば、一部が他のコンテンツの背後にある場合)。 8
style_invalid 一時 9
InPagePermissionMixinBlockerReason reasonおよび省略可能なフラグexpiresを用いて ブロッカーを追加するには、次の手順を実行する。
  1. 表明: reason""ではない。 (InPagePermissionMixinBlockerReasonの空文字列は、 ブロッカーが存在しないことを示す。なぜブロックしないブロッカーの空文字列を追加するのか?)

  2. timestampを None とする。

  3. expiresの場合、timestamp現在の高分解能時刻ブロッカー遅延を加えた値とする。

  4. reasonおよびtimestampを持つエントリーを、内部[[BlockerList]]付加する。

ブロッカー遅延は 500ms である。
InPagePermissionMixinBlockerReason reasonを用いて 期限付きブロッカーを追加するには、次の手順を実行する。
  1. 表明: reasonは、ブロッカー 理由表で「期限付き」として掲載されている。

  2. reasonおよび true を用いてブロッカーを追加する

InPagePermissionMixinBlockerReason reasonを用いて 一時ブロッカーを追加するには、次の手順を実行する。
  1. 表明: reasonは、ブロッカー 理由表で「一時」として掲載されている。

  2. reasonおよび false を用いてブロッカーを追加する

InPagePermissionMixinBlockerReason reasonを用いて 永続ブロッカーを追加するには、次の手順を実行する。
  1. 表明: reasonは、ブロッカー 理由表で「永続」として掲載されている。

  2. reasonおよび false を用いてブロッカーを追加する

elementからInPagePermissionMixinBlockerReason reasonを持つ ブロッカーを削除するには、次の手順を実行する。
  1. 表明: reasonは、 ブロッカー 理由表で「一時」として掲載されている。

  2. element[[BlockerList]]内の各entryについて、次を実行する。

    1. entryの理由がreason等しい場合、 entryelement[[BlockerList]]から 削除する

  3. reasonおよび true を用いてブロッカーを追加する

InPagePermissionMixin elementブロッカーを決定するには、次の手順を実行する。
  1. blockersを、ブロッカー順序付けアルゴリズムを用いて element[[BlockerList]]ソートした結果とする。

  2. blockersでなく、 blockers[0]がブロック中である場合、 blockers[0]を返す。

  3. 何も返さない。

2 つのブロッカーaおよびbに対する ブロッカー順序付けを決定するには、 次の手順を実行する。
  1. really large numberを 99 とする。

  2. 表明: ブロッカー理由表内の順序ヒントは、 いずれもreally large number以上ではない。

  3. aブロック中である場合、 a hintを、ブロッカー 理由表にあるa理由の 順序ヒントとする。そうでない場合、a hintreally large numberとする。

  4. bブロック中である場合、 b hintを、ブロッカー 理由表にあるb理由の 順序ヒントとする。そうでない場合、b hintreally large numberとする。

  5. a hintb hint以下であるかどうかを返す。

InPagePermissionMixinブロッカーリストのentryは、次の場合に ブロック中である。
  1. entryブロッカーのタイムスタンプがない場合、

  2. または、entryブロッカーのタイムスタンプがあり、その ブロッカーのタイムスタンプ現在の高分解能時刻以上である場合。

注: 本仕様は、ブロッカーをリスト[[BlockerList]]として維持するが、 これは無制限に増加する可能性がある(一部のブロッカー型は単に期限切れになるだけで、 削除されないため)。 この構造は効率性ではなく、説明の簡潔さを目的として選択されている。 このブロッカー構造の詳細は、ここで定義される一部のアルゴリズムを除いて 観測できないため、実装がこれをより効率的に処理するための 多くの余地があるはずである。

2.4. Mixin のアルゴリズム

InPagePermissionMixin elementisValid ゲッターの手順は、次のとおりである。
  1. elementブロッカーが Nothing であるかどうかを返す。

InPagePermissionMixin elementinvalidReasonゲッターの手順は、 次のとおりである。
  1. elementブロッカーが Nothing である場合、""を返す。

  2. そうでない場合、elementブロッカーの理由文字列を返す。

InPagePermissionMixin elementinitialPermissionStatus ゲッターの手順は、次のとおりである。
  1. elementの内部[[InitialPermissionStatus]]を返す。

InPagePermissionMixin elementpermissionStatus ゲッターの手順は、次のとおりである。
  1. elementについて 現在の権限状態を取得した結果を返す。

InPagePermissionMixin elementについて 現在の権限状態を取得する方法は、 ミックスインを含む個々の要素に依存する。 したがって、各要素は独自のアルゴリズムを定義しなければならない。

2.5. Mixin のイベントアルゴリズム

elementについて 必要に応じて onvalidstatechange をディスパッチするには、 次の手順を実行する。
  1. oldState[[LastNotifiedValidState]]とする。

  2. newStateを、elementブロッカーが Nothing であるかどうかとする。

  3. [[LastNotifiedValidState]]newStateに設定する。

  4. oldReason[[LastNotifiedInvalidReason]]とする。

  5. newReasonを、elementinvalidReasonであるかどうかとする。

  6. [[LastNotifiedInvalidReason]]newReasonに設定する。

  7. oldState != newStateまたはoldReason != newReasonの場合、 次を実行する。

    1. eventを新しいEventとする。

    2. eventを、 type "onvalidationstatuschange"、 bubbles true、および cancelable true で初期化する。

    3. eventelementディスパッチする。

elementについて onpromptaction をディスパッチするには、次の手順を実行する。
  1. eventを新しいEventとする。

  2. eventを、 type "onpromptaction"、 bubbles true、および cancelable true で初期化する。

  3. eventelementディスパッチする。

elementについて onpromptdismiss をディスパッチするには、 次の手順を実行する。
  1. eventを新しいEventとする。

  2. eventを、 type "onpromptdismiss"、 bubbles true、および cancelable true で初期化する。

  3. eventelementディスパッチする。

3. 共通のレンダリングおよびスタイル設定の制限

権限要素は委譲不可能なウィジェットであり、主に button のようにレンダリングされる。 ボタンのラベルは、ページではなく主にブラウザーによって 決定されることが期待され、[[Features]]に列挙された 1 つ以上の 強力な機能を、テキストおよび アイコンとして表す。要素は、基礎となる強力な機能の現在の状態に関する情報も 伝える場合がある。実際のレンダリングは、各要素によって定義される。

ページは権限要素のスタイル設定に影響を与えられるが、 悪用を防ぐための制約がある(たとえば、フォントおよび ラベル自体の最小サイズと最大サイズ)。ページは、 lang 属性を介してテキストのロケールを選択することもできる。

権限要素はフォールバックコンテンツをサポートし、 その要素をまだサポートしていないブラウザーによって表示される。 それぞれの権限要素をサポートするブラウザーであっても、 フォールバックコンテンツを表示する条件があることに注意されたい。

3.1. 表示

ユーザーエージェント UI を詳細に説明した 前例はあまりない。 ユーザーエージェントにより多くの自由を残す方がよいかもしれない。

権限要素には、ブラウザーが選択したコンテンツ、テキスト、および場合によっては アイコンが含まれる。それらをアクティブ化すると、多くの場合、 ユーザーに選択を求める。 これにより、ユーザーが操作できる 2 つのユーザーインターフェイスが提供される。 ユーザー エージェントは、要素のレンダリングと、その後の権限 プロンプトを、要素の意図を最も適切に伝えると判断する任意の方法で 決定する大幅な自由を持つ。

権限要素の表示に関する UI の選択肢には、次が含まれる。

ユーザー エージェントには、実行されているプログラムまたはプラットフォームでの類似の用法と 一貫する方法で、強力な機能に名前を付けたり説明したりすることが推奨される。

非常に非規範的な例には、次のものがある。

3.2. スタイル設定

権限要素は、それらに適用できるスタイル設定を制限する。 これらの制約には、次の 3 種類がある。

  1. 条件が満たされない場合、要素は非アクティブ化される。

  2. ユーザーエージェント定義のスタイルシートが、特定のスタイル設定を強制する。

  3. ユーザーエージェントは、CSS で簡単に表現できない追加スタイルの境界を強制する。 たとえば、スタイル境界が 要素の算出スタイルを基準として表される場合である。

3.2.1. 要素を非アクティブ化する条件

これらの条件のいずれかが満たされない場合、型 style_invalidを持つ 一時ブロッカーが追加される

'color', 'background-color' 既定では、ユーザーエージェントの既定のbutton色に設定される。 2 色間のコントラスト比は、少なくとも 3 である必要がある。 アルファは 1 でなければならない。
'font-size' 指定値<relative-size>として表されている場合:

「アルファ」を定義する。

3.2.2. ユーザーエージェント定義スタイルシート

権限要素は、次のスタイルでレンダリングされることが期待される。

@namespace "http://www.w3.org/1999/xhtml";
permission, geolocation {
  opacity: 1.0;
  line-height: normal !important;
  whitespace: nowrap !important;
  user-select: none !important;
  appearance: auto !important;
  box-sizing: content-box !important;
  vertical-align: middle !important;
  text-emphasis: initial !important;
  text-shadow: initial !important;
}

3.2.3. ユーザーエージェントが定義する追加のスタイル境界

権限要素は、スタイルにいくつかの境界を定義する。たとえば、 フォントサイズには制約があり、スタイル境界を以下に説明する。

表記上の便宜のため、要素の算出 値を、要素の継承値に inherit キーワードを介してアクセスできるのと同様に、CSS 規則内でcomputedを用いて アクセスできるものと想定する。 この場合、次のシートがスタイル境界を表す。

@namespace "http://www.w3.org/1999/xhtml";
permission {
  outline-offset: clamp(0, computed, none); /* 負の outline-offset は不可。 */
  font-weight: clamp(200, computed, none);  /* 200 未満の font-weight は不可。 */
  word-spacing: clamp(0, computed, 0.5em);  /* word-spacing は 0..0.5em の範囲 */
  letter-spacing: clamp(-0.05em, commputed, 0.2em);  /* letter-spacing は -0.05..0.2em の範囲 */

  min-height: clamp(1em, computed, none);
  max-height: clamp(none, computed, 3em);
  min-width: clamp(none, computed, calc(fit-content));

  border-width: clamp(none, computed, 1em);

  font-style: if(computed = "normal" or computed = "italic", computed, "normal");
  display: if (computed = "inline-block" or computed = "none", computed, "inline-block");
  cursor: if (computed = "pointer" or computed = "not-allowed", computed, "pointer")
}

さらに、CSS では容易に表現できない条件に基づいて適用される規則がある。

heightautoの場合、次を適用する。

@namespace "http://www.w3.org/1999/xhtml";
permission {
  padding-top: clamp(1em, computed, none);
  padding-bottom: calc(padding-top);
}

widthautoの場合、次を適用する。

@namespace "http://www.w3.org/1999/xhtml";
permission {
  padding-left: clamp(none, computed, 5em);
  padding-right: calc(padding-left);
}

要素が次のすべてを満たしていない場合、以下のシートを適用する。

@namespace "http://www.w3.org/1999/xhtml";
permission {
  max-width: clamp(none, computed, calc(3 * fit-content));
}

次の CSS プロパティは、通常どおり使用できる。

上記または本節の規則に掲載されておらず、 ここで言及されたプロパティのいずれかと論理的に同等でもないプロパティは、 無視される。

3.3. フォールバック

特定の権限要素をサポートしないユーザー エージェントは、それらをHTMLUnknownElement として認識し、その子を 通常の HTML としてレンダリングする。 このような要素をサポートするユーザー エージェントは、通常、§ 3 共通のレンダリングおよびスタイル設定の制限で説明されているように 要素をレンダリングするべきだが、 1 つの条件では、依然としてフォールバックコンテンツをレンダリングする必要がある。

内部[[BlockerList]]が、 ブロッカーの理由type_invalidであるレコードを 含む場合、 permission 要素は、通常の permissionの レンダリングの代わりに、フォールバックコンテンツをレンダリングするべきである。

ここに例を追加する。

4. permission要素

注: permission 要素は、任意の強力な機能または機能の組み合わせに対応できる、 当初提案されたページ内権限要素である。 将来の標準化に関する議論を先取りすることは望まないが、現時点では、 この要素は以降の章で詳述される、より具体的な 要素を優先して削除されると予想している。

permission 要素は、任意の強力な機能を要求できる。

カテゴリー:
フローコンテンツ
フレージングコンテンツ
対話型コンテンツ
知覚可能コンテンツ
この要素を使用できる文脈:
フレージングコンテンツが期待される場所。
コンテンツモデル:
フローコンテンツ
内容属性:
グローバル属性
権限要素の属性
type — この要素が適用される権限の型。
lang — グローバルなlang 属性と同様。
アクセシビリティに関する考慮事項:
DOM インターフェイス:
HTMLPermissionElement

アクセシビリティに関する 考慮事項を追加する。

属性、 イベントハンドラー、および無効理由の名前を、 現在の提案と照合する。

permission 要素のコンテンツが存在する場合、それはフォールバックコンテンツである。

type属性は、 permission 要素がアクティブ化されたときの動作を制御する。これは 列挙属性であり、 その値は強力な機能名前である。これには 欠落値の既定状態も、無効値の既定状態もない。

lang属性は、 グローバルなlang属性と同じである。これは、 ローカライズされたテキストを選択するため、 permission 要素によって監視される。

permission 要素上のグローバルな tabindex 内容属性の 既定 値は 0 である。

[Exposed=Window]
interface HTMLPermissionElement : HTMLElement {
  [HTMLConstructor] constructor();
  [CEReactions, Reflect] attribute DOMString type;
  static boolean isTypeSupported(DOMString type);
};
HTMLPermissionElement includes InPagePermissionMixin;

type 属性は、 type 要素属性を反映する

isTypeSupported(type) 静的操作は、指定されたDOMString type、 すなわち指定された 列挙強力な機能がサポートされるかどうかを決定する。 これは、 permission 要素を作成し、指定された type 文字列を割り当てた場合に動作するか、それともtype_invalid 永続ブロッカーによってブロックされた要素を 作成するかを予測する。

4.1. permission 要素の内部状態

permission 要素は、§ 2.1 Mixin の内部状態で説明されている InPagePermissionMixinと 同じ内部スロットを持つ。

4.2. permission 要素の注目すべき動作

permission 要素には、そのセキュリティ特性をサポートするため、 いくつかの意外な動作がある。

4.2.1. type プロパティ

権限型は変更できない。権限型を自由に変更すると ユーザーを混乱させる可能性があるため、それを防止したい。しかし、 ページは permission 要素を動的に作成する場合があるため、それを変更する API を提供する必要はある。そのため、新しく初期化された状態と、 空または無効な(権限のない)状態を区別し、前者では型の設定を許可し、 後者では許可しない。

例:

// 有効な型を変更する:
var pepc = document.createElement("permission");
pepc.type = "camera";  // 問題ない。
pepc.type;  // "camera"。
pepc.type = "geolocation";  // 問題がある。初回の代入であれば問題なかった。
pepc.type;  // "camera"。変更されていない内部状態を反映する。

// 無効な型を設定する:
pepc = document.createElement("permission");
pepc.type = "icecream";  // アイスクリームは強力なブラウザー機能ではない。問題がある。
pepc.type;  // ""。内部状態を反映する。
pepc.type = "camera";  // 型はすでに設定されているため、引き続き問題がある。
                       // 初回の代入であれば問題なかった。
pepc.type;  // ""。変更されていない内部状態を反映する。

HTMLPermissionElement のtype ゲッターの手順は、次のとおりである。
  1. [[Features]] が null の場合、""を返す。

  2. [[Features]]内のすべての強力な機能名を、 " "で区切って連結した文字列を返す。

HTMLPermissionElement のtype セッターの手順は、次のとおりである。
  1. [[Features]] が null でない場合、戻る。

  2. [[Features]] を«»に設定する。

  3. featuresを、入力文字列を用いて 型文字列を構文解析した結果とする。

  4. featuresが None の場合、戻る。

  5. 強力な機能名を、[[Features]] 順序付き集合付加する。

  6. [[InitialPermissionStatus]] を、 現在の権限状態を取得した結果に設定する。

注: サポートされる強力な機能の集合は、実装定義である。

機能(または機能のグループ)がサポートされているかを照会するには、次の手順を実行する。

引数DOMString typeを持つ HTMLPermissionElement のisTypeSupported() メソッドの手順は、次のとおりである。
  1. featuresを、typeを用いて 型文字列を構文解析した結果とする。

  2. featuresが None でないかどうかを返す。

指定された文字列type型文字列として 構文解析するには、次の手順を実行する。
  1. listを、typeを空白で区切られた 強力な機能名の文字列として構文解析した結果とする。

  2. 何らかのエラーが発生した場合、None を返す。

  3. ユーザーエージェントが、 HTMLPermissionElement に対して強力な機能の集合をサポートするか確認する。 サポートしない場合、None を返す。

  4. listを返す。

4.3. permission 要素のアルゴリズム

HTMLPermissionElementconstructor()の手順は、 次のとおりである。
  1. 内部[[Features]] スロットを null に初期化する。

  2. 内部[[BlockerList]] を«»に初期化する。

  3. 内部[[LastNotifiedValidState]] を false で初期化する。

  4. 内部[[LastNotifiedInvalidReason]] を空 文字列で初期化する。

  5. 内部[[InitialPermissionStatus]] を、 現在の権限状態を取得した結果に初期化する。

HTMLPermissionElement挿入手順は、次のとおりである。
  1. [[Features]] が null の場合、[[Features]] を«»に設定する。

  2. 内部[[BlockerList]] を«»に初期化する。

  3. ノードナビゲーバブル[[PermissionElements]]に、 this付加する。

  4. 内部[[IntersectionRect]] を undefined で初期化する。

  5. 内部[[IntersectionObserver]] を、 IntersectionObserver コールバックおよび «[ "rootMargin" → "-4px" ]»を用いて、新しいIntersectionObserverを 構築した結果で初期化する。

  6. [[IntersectionObserver]].observe(this)を呼び出す。

  7. [[Features]]空である場合、理由type_invalidを用いて 永続ブロッカーを追加する

  8. this許容可能な型でない場合、 unsuccesful_registrationを用いて 一時ブロッカーを追加する

  9. 理由 recently_attachedを用いて 期限付きブロッカーを追加する

  10. thisノードナビゲーバブルトラバーサブルナビゲーバブルフェンス付きナビゲーバブルである場合、 illegal_subframeを用いて 永続ブロッカーを追加する

  11. 必要に応じて onvalidstatechange をディスパッチするthis上で実行する。

HTMLPermissionElement削除手順は、次のとおりである。
  1. ノードナビゲーバブル[[PermissionElements]]から、 this削除する

  2. thisノードナビゲーバブルについて、 型の許容可能性を再確認する

  3. 必要に応じて onvalidstatechange をディスパッチするthis上で実行する。

permission elementeventが与えられたときの アクティブ化動作は、次のとおりである。
  1. 表明: element[[Features]] は null ではない。

  2. element[[Features]]空である場合、戻る。

  3. event.isTrusted が false の場合、戻る。

  4. element.isValid が false の場合、戻る。

  5. descriptorを、elementについて 権限記述子を構築した結果とする。

  6. descriptorによって記述される強力な機能を使用する権限を要求する

  7. 前の手順がユーザーによってキャンセルまたは閉じられた場合、 onpromptdismiss をディスパッチするthis上で実行し、 戻る。

    [PERMISSIONS] 仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応するgrant/deny の回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、明示的な拒否(たとえば「拒否」ボタン)と、 要求ダイアログのキャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。

  8. onpromptaction をディスパッチするthis上で実行する。

HTMLPermissionElement elementについて 権限記述子を構築するには、次の手順を実行する。

[Permissions] 仕様は、記述子がパラメーターなしの 単一の権限(enableHighAccuracyに相当するものなど)を記述すると想定している。 ここでは、より表現力のある権限モデルを 想定している。これは、おそらく上流の [Permissions]で解決し、 さらにここで適応する必要がある。

  1. resultを新しいPermissionDescriptorとする。

  2. resultに次を設定する。

  3. resultを返す。

HTMLPermissionElement のIntersectionObserver コールバックIntersectionObserverCallback を実装し、次の手順を実行する。
  1. 表明: IntersectionObserverroot文書である。

  2. entriesを、最初のコールバック引数の値である 交差オブザーバーエントリーリストとする。

  3. 表明: entriesではない。

  4. entryentriesの最後の項目とする。

  5. entry.isVisible の場合、次を実行する。

    1. intersection_occluded_or_distortedを持つ ブロッカーを削除する

    2. intersection_out_of_viewport_or_clippedを持つ ブロッカーを削除する

  6. そうでない場合、次を実行する。

    1. entry.intersectionRatio >= 1 の場合、次を実行する。

      1. reasonintersection_occluded_or_distortedとする。

    2. そうでない場合、次を実行する。

      1. reasonintersection_out_of_viewport_or_clippedとする。

    3. reasonを用いて一時 ブロッカーを追加する

  7. [[IntersectionRect]]entry.intersectionRect と等しくない場合、 intersection_changedを用いて 期限付きブロッカーを追加する

  8. [[IntersectionRect]]entry.intersectionRect に設定する。

  9. 必要に応じて onvalidstatechange をディスパッチするthis上で実行する。

辞書の等価性を 定義する必要があるか?

element許容可能な型であるかを決定するには、 次の手順を実行する。
  1. 表明: elementノードナビゲーバブル[[PermissionElements]]element含む

  2. countを 0 とする。

  3. elementノードナビゲーバブル[[PermissionElements]]内の 各currentについて、次を実行する。

    1. currentelementである場合、 中断する

    2. element.[[Features]]current.[[Features]]等しい場合、 countを 1 増加させる。

  4. countが 3 未満であるかどうかを返す。

documentについて 型の許容可能性を再確認するには、 次の手順を実行する。
  1. document[[PermissionElements]]内の 各currentについて、次を実行する。

    1. current許容可能な型である場合、 currentから unsuccesful_registrationを持つ ブロッカーを削除する

HTMLPermissionElement elementについて 現在の権限状態を取得するには、 次の手順を実行する。
  1. typeselementの内部[[Features]]とする。

  2. typesが null、またはtypesである場合、 promptを返す。

  3. currentgrantedとする。

  4. typesの各typeについて、次を実行する。

    1. stateを、typeについて 現在の権限状態を取得した結果とする。

    2. 次の順序を仮定し、 currentcurrentstateの小さい方とする。 granted > prompt > denied

  5. currentを返す。

「有効な権限型なし」に対する PermissionState が何であるべきかは明確ではない。 ここでは Chrome の実装に基づいて "prompt" を選択しているが、 この選択は任意である。

5. geolocation要素

HTML geolocation 要素は、 "geolocation"へのアクセスを要求できる。

カテゴリー:
フローコンテンツ
フレージングコンテンツ
対話型コンテンツ
知覚可能コンテンツ
この要素を使用できる文脈:
フレージングコンテンツが期待される場所。
コンテンツモデル:
フローコンテンツ
内容属性:
グローバル属性
権限要素の属性
autolocate — 直ちに位置を取得するかどうか(権限がすでに付与されている場合)。
watch — 位置を一度だけ読み取るか、継続的に監視するか。
アクセシビリティに関する考慮事項:
DOM インターフェイス:
HTMLGeolocationElement

isValid および invalidReason、 グローバルな langおよび tabindex 内容属性、ならびに onpromptactiononpromptdismiss、 および onvalidationstatuschange イベントハンドラーは、 § 2 HTML 権限要素の共通動作: InPagePermissionMixinの説明に従う。

autolocate属性は、 geolocation 要素が直ちに位置の取得を開始するべきかどうか (権限がすでに付与されている場合)を決定する。

watch属性は、 geolocation 要素が位置を一度だけ報告するか、継続的に報告するかを決定する。

[Exposed=Window]
interface HTMLGeolocationElement : HTMLElement {
  [HTMLConstructor] constructor();

  readonly attribute GeolocationPosition? position;
  readonly attribute GeolocationPositionError? error;
  [CEReactions, Reflect] attribute boolean autolocate;
  [CEReactions, Reflect] attribute boolean watch;

  attribute EventHandler onlocation;
};
HTMLGeolocationElement includes InPagePermissionMixin;

ユーザーが位置情報へのアクセスを許可することを決定した場合、 読み取り専用属性positionおよび errorは、 PositionCallback および PositionErrorCallback コールバックがそれぞれ返す場合と同様に、現在の GeolocationPosition およびGeolocationPositionError 値を反映する。

真偽値属性autolocateが true で、 "geolocation"権限がユーザーによってすでに付与されている場合、 geolocation 要素が文書に取り付けられたとき、直ちに位置を取得するべきである。 挿入時点で権限がまだ付与されていない場合、この属性は効果を持たない。

真偽値属性watch が true に設定されている場合、onlocation イベントは、watchPositionの動作に一致して、 位置が変化するたびに呼び出される。

位置が利用可能になると、onlocationイベントハンドラー上で、 Eventディスパッチされる。 イベントがディスパッチされると、位置または位置の取得失敗に関する情報を、 position または error 属性で利用できる。 watch 要素に応じて、これは一度(存在しない、または false の場合)、 あるいは継続的に(true の場合)発生する。

HTMLGeolocationElement は、Geolocation インターフェイスを反映することを目指す。 直接的な対応関係は、次のとおりである。

position PositionCallbackの結果。
error PositionErrorCallbackの結果。
watch watchPosition()を使用する。
¬ watch getCurrentPosition()を使用する。

5.1. geolocation 要素の内部状態

geolocation 要素は、§ 2.1 Mixin の内部状態で説明されている InPagePermissionMixinの すべての内部スロットを使用する。さらに、 geolocation は次の内部スロットを持つ。

5.2. geolocation 要素のアルゴリズム

HTMLGeolocationElementconstructor()の手順は、 次のとおりである。
  1. 内部[[Features]] スロットを« "geolocation" »に初期化する。

  2. 内部[[BlockerList]] を«»に初期化する。

  3. 内部[[LastNotifiedValidState]] を false で初期化する。

  4. 内部[[LastNotifiedInvalidReason]] を空 文字列で初期化する。

  5. 内部[[InitialPermissionStatus]] を、 現在の権限状態を取得した結果に初期化する。

  6. 内部[[watchIDs]] を« watchID »に初期化する。ここで、 watchIDは、0 より大きい実装定義unsigned long である。

  7. 内部[[position]] を null に初期化する。

  8. 内部[[positionError]] を null に初期化する。

HTMLGeolocationElement挿入手順は、次のとおりである。
  1. 内部[[BlockerList]] を«»に初期化する。

  2. ノードナビゲーバブル[[PermissionElements]]に、 this付加する。

  3. 内部[[IntersectionRect]] を undefined で初期化する。

  4. 内部[[IntersectionObserver]] を、 IntersectionObserver コールバックおよび «[ "rootMargin" → "-4px" ]»を用いて、新しいIntersectionObserverを 構築した結果で初期化する。

  5. [[IntersectionObserver]].observe(this)を呼び出す。

  6. [[Features]]空である場合、理由type_invalidを用いて 永続ブロッカーを追加する

  7. this許容可能な型でない場合、 unsuccesful_registrationを用いて 一時ブロッカーを追加する

  8. 理由 recently_attachedを用いて 期限付きブロッカーを追加する

  9. thisノードナビゲーバブルトラバーサブルナビゲーバブルフェンス付きナビゲーバブルである場合、 illegal_subframeを用いて 永続ブロッカーを追加する

  10. 必要に応じて onvalidstatechange をディスパッチするthis上で実行する。

  11. 必要に応じて自動的に位置を取得する

HTMLGeolocationElement削除手順は、次のとおりである。
  1. ノードナビゲーバブル[[PermissionElements]]から、 this削除する

  2. thisノードナビゲーバブルについて、 型の許容可能性を再確認する

  3. 必要に応じて onvalidstatechange をディスパッチするthis上で実行する。

HTMLGeolocationElement elementeventが与えられたときの アクティブ化動作は、次のとおりである。
  1. 表明: element[[Features]] は null ではない。

  2. element[[Features]]空である場合、戻る。

  3. event.isTrusted が false の場合、戻る。

  4. element.isValid が false の場合、戻る。

  5. descriptorを、elementについて 権限記述子を構築した結果とする。

  6. descriptorによって記述される強力な機能を使用する権限を要求する

  7. 前の手順がユーザーによってキャンセルまたは閉じられた場合、 onpromptdismiss をディスパッチするthis上で実行し、 戻る。

    [Permissions] 仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応するgrant/deny の回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、明示的な拒否(たとえば「拒否」ボタン)と、 要求ダイアログのキャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。

  8. onpromptaction をディスパッチするthis上で実行する。

  9. 位置を取得する

position ゲッターの手順は、[[position]]の値を 返すことである。
error ゲッターの手順は、[[positionError]]の値を 返すことである。
必要に応じて自動的に位置を取得するには、 次の手順を実行する。
  1. 現在の 権限状態を取得した結果が granted でない場合、戻る。

  2. autolocate が true でない場合、戻る。

  3. 位置を取得する

位置を取得するには、次の手順を実行する。
  1. positionCallbackを、次の手順を実行するPositionCallbackとする。

    1. this[[positionError]] を undefined に設定する。

    2. this[[position]] を、PositionCallbackの position 引数に設定する。

    3. onlocation をディスパッチするthisに対して実行する。

  2. errorCallbackを、次の手順を実行するPositionErrorCallbackとする。

    1. this[[position]] を undefined に設定する。

    2. this[[positionError]] を、PositionCallbackの positionError 引数に設定する。

    3. onlocation をディスパッチするthisに対して実行する。

  3. positionOptionsを«[]»とする。

  4. geolocationを、関連する大域オブジェクトGeolocationとする。

  5. thiswatch が true の場合、次を実行する。

    1. geolocationpositionCallbackerrorCallbackpositionOptions、およびthis[[watchIDs]]を用いて 位置を要求する

  6. そうでない場合、次を実行する。

    1. geolocationpositionCallbackerrorCallback、およびpositionOptionsを用いて 位置を要求する

5.3. geolocation 要素のイベントアルゴリズム

elementについて onlocation を ディスパッチするには、次の手順を実行する。
  1. eventを新しいEventとする。

  2. eventtype "onlocation"で 初期化する。

  3. eventelementディスパッチする。

6. セキュリティおよびプライバシーに関する考慮事項

注: セキュリティおよびプライバシーに関する考慮事項は、 こちらおよび こちらの、 解説文書に記載されている。 本節には最終的に、それらの解説文書の節を仕様に適した形で 書き起こした内容が含まれる予定である。

索引

この仕様で定義される 用語

参照により定義される 用語

参考文献

規範参考文献

[COMPOSITING-2]
合成およびブレンディングモジュール レベル 2。 編集者草案。URL: https://drafts.csswg.org/compositing-2/
[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS ボックス配置モジュール レベル 3。URL: https://drafts.csswg.org/css-align/
[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Elika Etemad; Ian Kilpatrick. CSS アンカー位置指定モジュール レベル 1。URL: https://drafts.csswg.org/css-anchor-position-1/
[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS 背景および 境界線モジュール レベル 3。URL: https://drafts.csswg.org/css-backgrounds/
[CSS-BORDERS-4]
Elika Etemad; et al. CSS 境界線およびボックス装飾 モジュール レベル 4。URL: https://drafts.csswg.org/css-borders-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS 断片化モジュール レベル 3。URL: https://drafts.csswg.org/css-break/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS 色調整 モジュール レベル 1。URL: https://drafts.csswg.org/css-color-adjust-1/
[CSS-CONDITIONAL-5]
Chris Lilley; et al. CSS 条件付き規則 モジュール レベル 5。URL: https://drafts.csswg.org/css-conditional-5/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS 表示モジュール レベル 4。URL: https://drafts.csswg.org/css-display-4/
[CSS-FLEXBOX-1]
Elika Etemad; Tab Atkins Jr.; Rossen Atanassov. CSS フレキシブルボックスレイアウトモジュール レベル 1。URL: https://drafts.csswg.org/css-flexbox/
[CSS-FONTS-4]
Chris Lilley. CSS フォントモジュール レベル 4。 URL: https://drafts.csswg.org/css-fonts-4/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS リストおよびカウンター モジュール レベル 3。URL: https://drafts.csswg.org/css-lists-3/
[CSS-OVERSCROLL-1]
Majid Valipour. CSS オーバースクロール動作モジュール レベル 1。URL: https://drafts.csswg.org/css-overscroll-1/
[CSS-PAGE-3]
Elika Etemad. CSS ページ付きメディアモジュール レベル 3。URL: https://drafts.csswg.org/css-page-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 位置指定レイアウト モジュール レベル 3。URL: https://drafts.csswg.org/css-position-3/
[CSS-RUBY-1]
Elika Etemad; et al. CSS ルビ注釈レイアウトモジュール レベル 1。URL: https://drafts.csswg.org/css-ruby-1/
[CSS-SCROLL-ANCHORING-1]
Tab Atkins Jr.. CSS スクロールアンカリングモジュール レベル 1。URL: https://drafts.csswg.org/css-scroll-anchoring/
[CSS-SCROLL-SNAP-1]
Matt Rakow; et al. CSS スクロールスナップモジュール レベル 1。URL: https://drafts.csswg.org/css-scroll-snap-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS ボックスサイジングモジュール レベル 3。URL: https://drafts.csswg.org/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS ボックス サイジングモジュール レベル 4。URL: https://drafts.csswg.org/css-sizing-4/
[CSS-TEXT-4]
Elika Etemad; et al. CSS テキストモジュール レベル 4。URL: https://drafts.csswg.org/css-text-4/
[CSS-UI-4]
Tab Atkins Jr.; Florian Rivoal. CSS 基本ユーザーインターフェイス モジュール レベル 4。URL: https://drafts.csswg.org/css-ui-4/
[CSS-WILL-CHANGE-1]
Tab Atkins Jr.. CSS Will Change モジュール レベル 1。URL: https://drafts.csswg.org/css-will-change/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1 (CSS 2.1)仕様。URL: https://drafts.csswg.org/css2/
[DOM]
Anne van Kesteren. DOM 標準。現行標準。 URL: https://dom.spec.whatwg.org/
[FENCED-FRAME]
フェンス付きフレーム。コミュニティグループ報告書草案。 URL: https://wicg.github.io/fenced-frame/
[GEOLOCATION]
Marcos Caceres; Reilly Grant. 位置情報。 URL: https://w3c.github.io/geolocation/
[GEOMETRY-1]
Sebastian Zartner; Yehonatan Daniv. 幾何インターフェイス モジュール レベル 1。URL: https://drafts.csswg.org/geometry/
[HR-TIME-3]
Yoav Weiss. 高分解能時刻。URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; et al. HTML 標準。 現行標準。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準。現行標準。URL: https://infra.spec.whatwg.org/
[INTERSECTION-OBSERVER]
Stefan Zager; Emilio Cobos Álvarez; Traian Captan. Intersection Observer。URL: https://w3c.github.io/IntersectionObserver/
[MANIFEST-APP-INFO]
Aaron Gustafson. ウェブアプリマニフェスト - アプリケーション情報。URL: https://w3c.github.io/manifest-app-info/
[MEDIAQUERIES-5]
Tab Atkins Jr.; et al. メディアクエリ レベル 5。URL: https://drafts.csswg.org/mediaqueries-5/
[Permissions]
Marcos Caceres; Mike Taylor. 権限。URL: https://w3c.github.io/permissions/
[SVG2]
Amelia Bellamy-Royds; et al. スケーラブルベクターグラフィックス(SVG) 2。URL: https://svgwg.org/svg2-draft/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準。現行 標準。URL: https://webidl.spec.whatwg.org/

IDL 索引

interface mixin InPagePermissionMixin {
  readonly attribute boolean isValid;
  readonly attribute InPagePermissionMixinBlockerReason invalidReason;
  readonly attribute PermissionState initialPermissionStatus;
  readonly attribute PermissionState permissionStatus;

  attribute EventHandler onpromptaction;
  attribute EventHandler onpromptdismiss;
  attribute EventHandler onvalidationstatuschange;
};

enum InPagePermissionMixinBlockerReason {
  // ブロッカー理由なし。
  "",

  // すべての InPagePermissionMixin 使用者がサポートするブロッカー理由。
  "illegal_subframe", "unsuccesful_registration",
  "recently_attached", "intersection_changed",
  "intersection_out_of_viewport_or_clipped",
  "intersection_occluded_or_distorted", "style_invalid",

  // HTMLPermissionElement 固有のブロッカー理由。
  "type_invalid",
};

[Exposed=Window]
interface HTMLPermissionElement : HTMLElement {
  [HTMLConstructor] constructor();
  [CEReactions, Reflect] attribute DOMString type;
  static boolean isTypeSupported(DOMString type);
};
HTMLPermissionElement includes InPagePermissionMixin;

[Exposed=Window]
interface HTMLGeolocationElement : HTMLElement {
  [HTMLConstructor] constructor();

  readonly attribute GeolocationPosition? position;
  readonly attribute GeolocationPositionError? error;
  [CEReactions, Reflect] attribute boolean autolocate;
  [CEReactions, Reflect] attribute boolean watch;

  attribute EventHandler onlocation;
};
HTMLGeolocationElement includes InPagePermissionMixin;

課題索引

ユーザーエージェント UI を詳細に説明した前例はあまりない。 ユーザーエージェントにより多くの自由を残す方がよいかもしれない。
「アルファ」を定義する。
ここに例を追加する。
アクセシビリティに関する考慮事項を追加する。
属性、イベントハンドラー、および無効理由の名前を、 現在の提案と照合する。
[PERMISSIONS]仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応するgrant/deny の回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、 明示的な拒否(たとえば「拒否」ボタン)と、要求ダイアログの キャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。
[Permissions]仕様は、記述子が パラメーターなしの単一の権限( enableHighAccuracyに相当するものなど)を記述すると想定している。 ここでは、より表現力のある権限モデルを 想定している。これは、おそらく上流の [Permissions]で解決し、 さらにここで適応する必要がある。
辞書の等価性を定義する必要があるか?
「有効な権限型なし」に対する PermissionState が 何であるべきかは明確ではない。ここでは Chrome の実装に基づいて "prompt" を選択しているが、 この選択は任意である。
[Permissions]仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応するgrant/deny の回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、 明示的な拒否(たとえば「拒否」ボタン)と、要求ダイアログの キャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。