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
要素は、次の内部スロットを持つ。
-
[[Features]]は null、 または強力な機能の順序付き集合である。ほとんどの権限 要素ではこれは固定集合である可能性が高いが、一部では可変であり得る。 これを内部スロットにすることで、それらすべてに対して動作するアルゴリズムを 記述できる。 -
[[InitialPermissionStatus]]は、[[Features]]に対する初期のPermissionStateを格納するPermissionStateである。 -
[[BlockerList]]は、 ブロッカーのタイムスタンプと ブロッカーの理由を含む レコードのリストである。ブロッカーの理由はInPagePermissionMixinBlockerReasonであるが、 空文字列ではない。 -
[[IntersectionObserver]]は、IntersectionObserverへの参照である。 -
[[IntersectionRect]]は、 最後に確認された交差領域、すなわちビューポートに対するpermissionの位置を格納するDOMRectReadOnlyである。 -
[[LastNotifiedValidState]]は、isValidについて最後に通知された状態を格納する真偽値である。 -
[[LastNotifiedInvalidReason]]は、invalidReasonについて最後に通知された状態を格納する文字列である。[[LastNotifiedValidState]]および[[LastNotifiedInvalidReason]]は、onvalidationstatuschangeイベントをディスパッチする必要があるかを判断するために 使用される。
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" , // HTMLPermissionElement 固有のブロッカー理由。"style_invalid" , };"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を用いて
ブロッカーを追加するには、次の手順を実行する。
-
表明: reasonは
""ではない。 (InPagePermissionMixinBlockerReasonの空文字列は、 ブロッカーが存在しないことを示す。なぜブロックしないブロッカーの空文字列を追加するのか?) -
timestampを None とする。
-
reasonおよびtimestampを持つエントリーを、内部
[[BlockerList]]に 付加する。
InPagePermissionMixinBlockerReason
reasonを用いて
期限付きブロッカーを追加するには、次の手順を実行する。
-
reasonおよび true を用いてブロッカーを追加する。
InPagePermissionMixinBlockerReason
reasonを用いて
一時ブロッカーを追加するには、次の手順を実行する。
-
reasonおよび false を用いてブロッカーを追加する。
InPagePermissionMixinBlockerReason
reasonを用いて
永続ブロッカーを追加するには、次の手順を実行する。
-
reasonおよび false を用いてブロッカーを追加する。
InPagePermissionMixinBlockerReason
reasonを持つ
ブロッカーを削除するには、次の手順を実行する。
-
elementの
[[BlockerList]]内の各entryについて、次を実行する。-
entryの理由がreasonに 等しい場合、 entryをelementの
[[BlockerList]]から 削除する。
-
-
reasonおよび true を用いてブロッカーを追加する。
InPagePermissionMixin
elementの
ブロッカーを決定するには、次の手順を実行する。
-
blockersを、ブロッカー順序付けアルゴリズムを用いて elementの
[[BlockerList]]を ソートした結果とする。 -
何も返さない。
InPagePermissionMixinの
ブロッカーリストのentryは、次の場合に
ブロック中である。
-
entryにブロッカーのタイムスタンプがない場合、
-
または、entryにブロッカーのタイムスタンプがあり、その ブロッカーのタイムスタンプが 現在の高分解能時刻以上である場合。
注: 本仕様は、ブロッカーをリスト[[BlockerList]]として維持するが、
これは無制限に増加する可能性がある(一部のブロッカー型は単に期限切れになるだけで、
削除されないため)。
この構造は効率性ではなく、説明の簡潔さを目的として選択されている。
このブロッカー構造の詳細は、ここで定義される一部のアルゴリズムを除いて
観測できないため、実装がこれをより効率的に処理するための
多くの余地があるはずである。
2.4. Mixin
のアルゴリズム
InPagePermissionMixin
elementのinvalidReasonゲッターの手順は、
次のとおりである。
InPagePermissionMixin
elementの
initialPermissionStatus
ゲッターの手順は、次のとおりである。
-
elementの内部
[[InitialPermissionStatus]]を返す。
InPagePermissionMixin
elementについて
現在の権限状態を取得する方法は、
ミックスインを含む個々の要素に依存する。
したがって、各要素は独自のアルゴリズムを定義しなければならない。
2.5. Mixin
のイベントアルゴリズム
-
oldStateを
[[LastNotifiedValidState]]とする。 -
newStateを、elementのブロッカーが Nothing であるかどうかとする。
-
[[LastNotifiedValidState]]をnewStateに設定する。 -
oldReasonを
[[LastNotifiedInvalidReason]]とする。 -
newReasonを、elementの
invalidReasonであるかどうかとする。 -
[[LastNotifiedInvalidReason]]をnewReasonに設定する。 -
oldState != newStateまたはoldReason != newReasonの場合、 次を実行する。
-
eventを新しい
Eventとする。 -
eventを、 type "
onvalidationstatuschange"、 bubbles true、および cancelable true で初期化する。 -
eventをelementに ディスパッチする。
-
-
eventを新しい
Eventとする。 -
eventを、 type "
onpromptaction"、 bubbles true、および cancelable true で初期化する。 -
eventをelementに ディスパッチする。
-
eventを新しい
Eventとする。 -
eventを、 type "
onpromptdismiss"、 bubbles true、および cancelable true で初期化する。 -
eventをelementに ディスパッチする。
3. 共通のレンダリングおよびスタイル設定の制限
権限要素は委譲不可能なウィジェットであり、主に
button
のようにレンダリングされる。
ボタンのラベルは、ページではなく主にブラウザーによって
決定されることが期待され、[[Features]]に列挙された
1 つ以上の
強力な機能を、テキストおよび
アイコンとして表す。要素は、基礎となる強力な機能の現在の状態に関する情報も
伝える場合がある。実際のレンダリングは、各要素によって定義される。
ページは権限要素のスタイル設定に影響を与えられるが、
悪用を防ぐための制約がある(たとえば、フォントおよび
ラベル自体の最小サイズと最大サイズ)。ページは、
lang
属性を介してテキストのロケールを選択することもできる。
権限要素はフォールバックコンテンツをサポートし、 その要素をまだサポートしていないブラウザーによって表示される。 それぞれの権限要素をサポートするブラウザーであっても、 フォールバックコンテンツを表示する条件があることに注意されたい。
3.1. 表示
ユーザーエージェント UI を詳細に説明した 前例はあまりない。 ユーザーエージェントにより多くの自由を残す方がよいかもしれない。
権限要素には、ブラウザーが選択したコンテンツ、テキスト、および場合によっては アイコンが含まれる。それらをアクティブ化すると、多くの場合、 ユーザーに選択を求める。 これにより、ユーザーが操作できる 2 つのユーザーインターフェイスが提供される。 ユーザー エージェントは、要素のレンダリングと、その後の権限 プロンプトを、要素の意図を最も適切に伝えると判断する任意の方法で 決定する大幅な自由を持つ。
権限要素の表示に関する UI の選択肢には、次が含まれる。
-
[[Features]]に列挙された強力な機能に、 要素の言語で名前を付ける。これは、lang属性が存在する場合、常にその属性によって示される言語になることに注意されたい。 -
強力な機能の 1 つ以上の型を示すアイコン。
-
対象の強力な機能の現在の権限状態。 たとえば、権限がすでに
grantedである場合、permission要素には 「位置情報はすでに使用中」とラベル付けされる場合がある。 -
「スクリム」を備えたモーダルプロンプト。 (すなわち、プロンプトの背後にあるページを暗くする。) 通常、これはかなり破壊的である。しかし、ここでの目的は、 ユーザーが意図してこの選択を行うことを確実にすることである。
ユーザー エージェントには、実行されているプログラムまたはプラットフォームでの類似の用法と 一貫する方法で、強力な機能に名前を付けたり説明したりすることが推奨される。
非常に非規範的な例には、次のものがある。
-
<permission lang="de" types="geolocation">: 「位置情報を使用」。 -
<permission types="microphone">(英語のページ内): 「マイクを使用。🎤」。 -
対応する権限状態が
deniedであるときに<permission types="microphone">をアクティブ化した場合、 テキストを 「ブロックを続行」に変更する。
3.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.5 em ); /* word-spacing は 0..0.5em の範囲 */ letter-spacing:clamp ( -0.05 em , commputed, 0.2 em ); /* letter-spacing は -0.05..0.2em の範囲 */ min-height:clamp ( 1 em , computed, none); max-height : clamp ( none, computed, 3 em ); min-width : clamp ( none, computed, calc ( fit-content)); border-width : clamp ( none, computed, 1 em ); 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 では容易に表現できない条件に基づいて適用される規則がある。
heightが
autoの場合、次を適用する。
@namespace "http://www.w3.org/1999/xhtml" ; permission{ padding-top : clamp ( 1 em , computed, none); padding-bottom : calc ( padding-top); }
widthが
autoの場合、次を適用する。
@namespace "http://www.w3.org/1999/xhtml" ; permission{ padding-left : clamp ( none, computed, 5 em ); padding-right : calc ( padding-left); }
要素が次のすべてを満たしていない場合、以下のシートを適用する。
-
少なくとも
1pxの境界線幅、 -
color と background-color のコントラスト比が少なくとも 3、
-
およびアルファが 1。
@namespace "http://www.w3.org/1999/xhtml" ; permission{ max-width : clamp ( none, computed, calc ( 3 * fit-content)); }
次の CSS プロパティは、通常どおり使用できる。
-
borderおよびすべての border 一括指定 プロパティ、 border-top、border-right、border-bottom、border-left
-
flex およびその個別指定、flex-grow、flex-shrink、flex-basis
-
outlineおよびその個別指定の大部分、 個別指定である outline-colorとoutline-style。
outline-offsetは、上記の規則によってクランプされることに注意されたい。 -
overscroll-behaviorおよびその 個別指定、 overscroll-behavior-inline、overscroll-behavior-block、 overscroll-behavior-x、overscroll-behavior-y
-
scroll-marginおよびその個別指定、 scroll-margin-top、scroll-margin-right、scroll-marginbottom'、 scroll-margin-left
-
scroll-paddingおよびその個別指定、 scroll-padding-top、scroll-padding-right、scroll-padding-bottom、 scroll-padding-left、scroll-padding-inline-start、 scroll-padding-block-start、scroll-padding-block-start、 scroll-padding-inline-end、scroll-padding-block-end
上記または本節の規則に掲載されておらず、 ここで言及されたプロパティのいずれかと論理的に同等でもないプロパティは、 無視される。
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 ;
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; // ""。変更されていない内部状態を反映する。
type
ゲッターの手順は、次のとおりである。
-
[[Features]]が null の場合、""を返す。 -
[[Features]]内のすべての強力な機能名を、 " "で区切って連結した文字列を返す。
type
セッターの手順は、次のとおりである。
-
[[Features]]が null でない場合、戻る。 -
[[Features]]を«»に設定する。 -
featuresを、入力文字列を用いて 型文字列を構文解析した結果とする。
-
featuresが None の場合、戻る。
-
各強力な機能名を、
[[Features]]順序付き集合に 付加する。 -
[[InitialPermissionStatus]]を、 現在の権限状態を取得した結果に設定する。
機能(または機能のグループ)がサポートされているかを照会するには、次の手順を実行する。
DOMString
typeを持つ HTMLPermissionElement のisTypeSupported()
メソッドの手順は、次のとおりである。
-
featuresを、typeを用いて 型文字列を構文解析した結果とする。
-
featuresが None でないかどうかを返す。
-
listを、typeを空白で区切られた 強力な機能名の文字列として構文解析した結果とする。
-
何らかのエラーが発生した場合、None を返す。
-
ユーザーエージェントが、
HTMLPermissionElementに対して強力な機能の集合をサポートするか確認する。 サポートしない場合、None を返す。 -
listを返す。
4.3.
permission
要素のアルゴリズム
HTMLPermissionElement
のconstructor()の手順は、
次のとおりである。
-
内部
[[Features]]スロットを null に初期化する。 -
内部
[[BlockerList]]を«»に初期化する。 -
内部
[[LastNotifiedValidState]]を false で初期化する。 -
内部
[[LastNotifiedInvalidReason]]を空 文字列で初期化する。 -
内部
[[InitialPermissionStatus]]を、 現在の権限状態を取得した結果に初期化する。
HTMLPermissionElement
の挿入手順は、次のとおりである。
-
[[Features]]が null の場合、[[Features]]を«»に設定する。 -
内部
[[BlockerList]]を«»に初期化する。 -
内部
[[IntersectionRect]]を undefined で初期化する。 -
内部
[[IntersectionObserver]]を、 IntersectionObserver コールバックおよび «[ "rootMargin" →"-4px"]»を用いて、新しいIntersectionObserverを 構築した結果で初期化する。 -
[[IntersectionObserver]].observe(this)を呼び出す。 -
[[Features]]が空である場合、理由type_invalidを用いて 永続ブロッカーを追加する。 -
thisが許容可能な型でない場合、
unsuccesful_registrationを用いて 一時ブロッカーを追加する。 -
理由
recently_attachedを用いて 期限付きブロッカーを追加する。 -
thisの ノードナビゲーバブルのトラバーサブルナビゲーバブルが フェンス付きナビゲーバブルである場合、
illegal_subframeを用いて 永続ブロッカーを追加する。
HTMLPermissionElement
の削除手順は、次のとおりである。
permission
elementにeventが与えられたときの
アクティブ化動作は、次のとおりである。
-
表明: elementの
[[Features]]は null ではない。 -
elementの
[[Features]]が空である場合、戻る。 -
event.
isTrustedが false の場合、戻る。 -
element.
isValidが false の場合、戻る。 -
descriptorを、elementについて 権限記述子を構築した結果とする。
-
前の手順がユーザーによってキャンセルまたは閉じられた場合、 onpromptdismiss をディスパッチするを this上で実行し、 戻る。
[PERMISSIONS] 仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応する
grant/denyの回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、明示的な拒否(たとえば「拒否」ボタン)と、 要求ダイアログのキャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。 -
onpromptaction をディスパッチするをthis上で実行する。
HTMLPermissionElement
elementについて
権限記述子を構築するには、次の手順を実行する。
[Permissions]
仕様は、記述子がパラメーターなしの
単一の権限(enableHighAccuracyに相当するものなど)を記述すると想定している。
ここでは、より表現力のある権限モデルを
想定している。これは、おそらく上流の
[Permissions]で解決し、
さらにここで適応する必要がある。
-
resultを新しい
PermissionDescriptorとする。 -
resultに次を設定する。
-
elementの
[[Features]]に含まれる 強力な機能名を含める。
-
-
resultを返す。
IntersectionObserverCallback
を実装し、次の手順を実行する。
-
表明:
IntersectionObserverのrootは文書である。 -
entriesを、最初のコールバック引数の値である
交差オブザーバーエントリーの リストとする。 -
entryをentriesの最後の項目とする。
-
entry.
isVisibleの場合、次を実行する。 -
そうでない場合、次を実行する。
-
entry.
intersectionRatio>= 1 の場合、次を実行する。-
reasonを
intersection_occluded_or_distortedとする。
-
-
そうでない場合、次を実行する。
-
reasonを
intersection_out_of_viewport_or_clippedとする。
-
-
reasonを用いて一時 ブロッカーを追加する。
-
-
[[IntersectionRect]]がentry.intersectionRectと等しくない場合、intersection_changedを用いて 期限付きブロッカーを追加する。 -
[[IntersectionRect]]を entry.intersectionRectに設定する。
-
表明: elementのノードナビゲーバブルの
[[PermissionElements]]はelementを 含む。 -
countを 0 とする。
-
elementのノードナビゲーバブルの
[[PermissionElements]]内の 各currentについて、次を実行する。-
currentがelementである場合、 中断する。
-
element.
[[Features]]がcurrent.[[Features]]に 等しい場合、 countを 1 増加させる。
-
-
countが 3 未満であるかどうかを返す。
-
documentの
[[PermissionElements]]内の 各currentについて、次を実行する。-
currentが許容可能な型である場合、 currentから
unsuccesful_registrationを持つ ブロッカーを削除する。
-
HTMLPermissionElement
elementについて
現在の権限状態を取得するには、
次の手順を実行する。
-
typesをelementの内部
[[Features]]とする。 -
currentを
grantedとする。 -
typesの各typeについて、次を実行する。
-
stateを、typeについて 現在の権限状態を取得した結果とする。
-
次の順序を仮定し、 currentをcurrentとstateの小さい方とする。
granted>prompt>denied。
-
-
currentを返す。
「有効な権限型なし」に対する PermissionState が何であるべきかは明確ではない。 ここでは Chrome の実装に基づいて "prompt" を選択しているが、 この選択は任意である。
5. geolocation要素
HTML
geolocation
要素は、
"geolocation"へのアクセスを要求できる。
- カテゴリー:
- フローコンテンツ。
- フレージングコンテンツ。
- 対話型コンテンツ。
- 知覚可能コンテンツ。
- フレージングコンテンツ。
- この要素を使用できる文脈:
- フレージングコンテンツが期待される場所。
- コンテンツモデル:
- フローコンテンツ。
- 内容属性:
- グローバル属性。
- 権限要素の属性。
autolocate— 直ちに位置を取得するかどうか(権限がすでに付与されている場合)。watch— 位置を一度だけ読み取るか、継続的に監視するか。 - 権限要素の属性。
- アクセシビリティに関する考慮事項:
- DOM インターフェイス:
HTMLGeolocationElement
isValid
および
invalidReason、
グローバルな
langおよび
tabindex
内容属性、ならびに
onpromptaction、
onpromptdismiss、
および
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
は次の内部スロットを持つ。
-
定数
[[watchIDs]]。 これは位置を要求するアルゴリズムで使用される。 -
[[position]]。 これは最新のGeolocationPositionを含む。 -
[[positionError]]。 これは最新のGeolocationPositionErrorを含む。
5.2. geolocation
要素のアルゴリズム
HTMLGeolocationElement
のconstructor()の手順は、
次のとおりである。
-
内部
[[Features]]スロットを« "geolocation" »に初期化する。 -
内部
[[BlockerList]]を«»に初期化する。 -
内部
[[LastNotifiedValidState]]を false で初期化する。 -
内部
[[LastNotifiedInvalidReason]]を空 文字列で初期化する。 -
内部
[[InitialPermissionStatus]]を、 現在の権限状態を取得した結果に初期化する。 -
内部
[[watchIDs]]を« watchID »に初期化する。ここで、 watchIDは、0 より大きい実装定義のunsigned longである。 -
内部
[[position]]を null に初期化する。 -
内部
[[positionError]]を null に初期化する。
HTMLGeolocationElement
の挿入手順は、次のとおりである。
-
内部
[[BlockerList]]を«»に初期化する。 -
内部
[[IntersectionRect]]を undefined で初期化する。 -
内部
[[IntersectionObserver]]を、 IntersectionObserver コールバックおよび «[ "rootMargin" →"-4px"]»を用いて、新しいIntersectionObserverを 構築した結果で初期化する。 -
[[IntersectionObserver]].observe(this)を呼び出す。 -
[[Features]]が空である場合、理由type_invalidを用いて 永続ブロッカーを追加する。 -
thisが許容可能な型でない場合、
unsuccesful_registrationを用いて 一時ブロッカーを追加する。 -
理由
recently_attachedを用いて 期限付きブロッカーを追加する。 -
thisの ノードナビゲーバブルのトラバーサブルナビゲーバブルが フェンス付きナビゲーバブルである場合、
illegal_subframeを用いて 永続ブロッカーを追加する。
HTMLGeolocationElement
の削除手順は、次のとおりである。
HTMLGeolocationElement
elementにeventが与えられたときの
アクティブ化動作は、次のとおりである。
-
表明: elementの
[[Features]]は null ではない。 -
elementの
[[Features]]が空である場合、戻る。 -
event.
isTrustedが false の場合、戻る。 -
element.
isValidが false の場合、戻る。 -
descriptorを、elementについて 権限記述子を構築した結果とする。
-
前の手順がユーザーによってキャンセルまたは閉じられた場合、 onpromptdismiss をディスパッチするを this上で実行し、 戻る。
[Permissions] 仕様は、使用する権限を要求する処理が 常に成功すると想定している。すなわち、ユーザーは常に 選択を行い、アルゴリズムはその選択に対応する
grant/denyの回答を常に提供すると想定している。しかし、ユーザーにそれを強制することはできない。 一部のユーザーエージェントは、明示的な拒否(たとえば「拒否」ボタン)と、 要求ダイアログのキャンセルまたは終了(たとえば右上隅の「X」ボタン)に対して、 異なる UI 操作手段を持つ場合がある。ここでは、 基礎となる仕様に明確なフックがないにもかかわらず、 これら 2 つの操作を区別する。 -
onpromptaction をディスパッチするを this上で実行する。
position
ゲッターの手順は、[[position]]の値を
返すことである。
error
ゲッターの手順は、[[positionError]]の値を
返すことである。
-
現在の 権限状態を取得した結果が
grantedでない場合、戻る。 -
autolocateが true でない場合、戻る。
-
positionCallbackを、次の手順を実行する
PositionCallbackとする。-
thisの
[[positionError]]を undefined に設定する。 -
thisの
[[position]]を、PositionCallbackの position 引数に設定する。 -
onlocation をディスパッチするをthisに対して実行する。
-
-
errorCallbackを、次の手順を実行する
PositionErrorCallbackとする。-
thisの
[[position]]を undefined に設定する。 -
thisの
[[positionError]]を、PositionCallbackの positionError 引数に設定する。 -
onlocation をディスパッチするをthisに対して実行する。
-
-
positionOptionsを«[]»とする。
-
geolocationを、関連する大域オブジェクトの
Geolocationとする。 -
-
geolocation、positionCallback、 errorCallback、positionOptions、およびthisの
[[watchIDs]]を用いて 位置を要求する。
-
-
そうでない場合、次を実行する。
-
geolocation、positionCallback、 errorCallback、およびpositionOptionsを用いて 位置を要求する。
-
5.3.
geolocation
要素のイベントアルゴリズム
-
eventを新しい
Eventとする。 -
eventを
type"onlocation"で 初期化する。 -
eventをelementに ディスパッチする。
6. セキュリティおよびプライバシーに関する考慮事項
注: セキュリティおよびプライバシーに関する考慮事項は、 こちらおよび こちらの、 解説文書に記載されている。 本節には最終的に、それらの解説文書の節を仕様に適した形で 書き起こした内容が含まれる予定である。