HTML 권한 요소

커뮤니티 그룹 보고서 초안,

이 버전:
https://wicg.github.io/PEPC/permission-elements.html
이슈 추적:
GitHub
명세 내 인라인
편집자:
Daniel Vogelheim (Google LLC)

초록

페이지 내에서 브라우저 권한을 요청하기 위한 HTML 요소.

이 명세는 공통적으로 사용자가 페이지 내에서 브라우저 권한과 관련 기능을 제어할 수 있는 방법을 제공하는 것을 목표로 하는 새로운 HTML 요소 집합을 규정한다.

이 새로운 요소에 적절한 스타일 및 UI 제약을 적용하면 사용자가 요소를 클릭하는 것이 무엇을 의미하는지 이해할 수 있으므로, 브라우저는 사용자가 권한 결정을 내리려는 의도를 높은 수준으로 확신할 수 있다. 이러한 권한 요소는 현재의 스크립트로 트리거되는 권한 흐름보다 접근성이 높고, 더 안전하며, 사용자 친화적인 것을 목표로 한다.

이 문서의 상태

이 명세는 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행했다. 이 문서는 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 이벤트
onpromptdismiss 이벤트
onvalidationstatuschange 이벤트

2.1. Mixin 내부 상태

HTML 권한 요소는 사용자가 요청할 수 있는 권한에 의해 제한되는 기능을 나타낸다. 사용자는 이 기능을 활성화하여 사이트가 해당 기능에 접근하도록 허용할 수 있다. 이러한 요청이 페이지의 스크립트가 아니라 사용자에 의해 트리거되어야 한다는 점은 이 요소의 핵심이다. 이를 강제하기 위해 요소는 활성화 이벤트가 신뢰할 수 있는지 확인한다. 또한 요소가 일부라도 가려졌는지 또는 최근에 이동했는지와 같은 여러 조건을 감시한다. 요소는 이를 추적하기 위해 내부 [[BlockerList]]를 유지한다.

InPagePermissionMixin 요소에는 다음 내부 슬롯이 있다.

2.2. 탐색 가능 객체Mixin 지원 상태

InPagePermissionMixin을 지원하기 위해 탐색 가능 객체는 요소의 순서 있는 집합[[PermissionElements]]를 유지한다. 이 순서 있는 집합unsuccesful_registration 유형의 차단 요소를 평가하는 데 사용된다.

2.3. Mixin 활성화 및 활성화 차단 요소

권한 요소군의 핵심 목표는 사용자의 의식적인 선택을 반영하는 것이며, 사용자가 속임수로 쉽게 요소를 활성화하지 못하도록 해야 한다. 이를 위해 권한 요소는 요소의 활성화를 영구적으로 또는 일시적으로 방지할 수 있는 차단 이유 목록을 유지한다.

이러한 동작 대부분은 모든 권한 요소에서 동일해야 한다. 단순화를 위해 하나 또는 일부 요소에만 적용되는 차단 요소도 포함한다.

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",
};

권한 요소는 요소를 현재 활성화할 수 없는 이유인 "차단 요소"를 추적한다. 이러한 차단 요소에는 영구, 임시 및 만료형의 세 가지 수명이 있다.

영구 차단 요소

요소에 영구 차단 요소가 생기면 해당 요소는 영구적으로 비활성화된다. 이는 웹 사이트 소유자가 해결해야 하는 문제에 사용된다. 예로는 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를 없음으로 설정한다.

  3. expires가 참이면 timestamp현재 고해상도 시간차단 지연 시간을 더한 값으로 설정한다.

  4. reasontimestamp를 가진 항목을 내부 [[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같으면, element[[BlockerList]]에서 entry제거한다.

  3. reason과 true를 사용하여 차단 요소를 추가한다.

InPagePermissionMixin element차단 요소를 결정하려면:
  1. blockers차단 요소 순서 지정 알고리즘으로 element[[BlockerList]]정렬한 결과로 설정한다.

  2. blockers비어 있지 않고 blockers[0]이 차단 중이면 blockers[0]을 반환한다.

  3. 아무것도 반환하지 않는다.

두 차단 요소 ab차단 요소 순서를 결정하려면:
  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 getter 단계는 다음과 같다.
  1. element차단 요소가 없음인지 반환한다.

InPagePermissionMixin elementinvalidReason getter 단계는 다음과 같다.
  1. element차단 요소가 없음이면 ""을 반환한다.

  2. 그렇지 않으면 element차단 요소의 이유 문자열을 반환한다.

InPagePermissionMixin elementinitialPermissionStatus getter 단계는 다음과 같다.
  1. element의 내부 [[InitialPermissionStatus]]를 반환한다.

InPagePermissionMixin elementpermissionStatus getter 단계는 다음과 같다.
  1. element현재 권한 상태를 가져온 결과를 반환한다.

InPagePermissionMixin element현재 권한 상태를 가져오는 방법은 믹스인을 포함하는 특정 요소에 따라 달라진다. 따라서 각 요소는 자체 알고리즘을 정의해야 한다.

2.5. Mixin 이벤트 알고리즘

element에 대해 onvalidstatechange를 디스패치할 수 있으면 디스패치하려면:
  1. oldState[[LastNotifiedValidState]]로 설정한다.

  2. newStateelement차단 요소가 없음인지 여부로 설정한다.

  3. [[LastNotifiedValidState]]newState로 설정한다.

  4. oldReason[[LastNotifiedInvalidReason]]으로 설정한다.

  5. newReasonelementinvalidReason인지 여부로 설정한다.

  6. [[LastNotifiedInvalidReason]]newReason으로 설정한다.

  7. oldState != newState이거나 oldReason != newReason이면 다음을 수행한다.

    1. event를 새로운 Event로 설정한다.

    2. eventtype "onvalidationstatuschange", bubbles true 및 cancelable true로 초기화한다.

    3. eventelement디스패치한다.

element에 대해 onpromptaction을 디스패치하려면:
  1. event를 새로운 Event로 설정한다.

  2. eventtype "onpromptaction", bubbles true 및 cancelable true로 초기화한다.

  3. eventelement디스패치한다.

element에 대해 onpromptdismiss를 디스패치하려면:
  1. event를 새로운 Event로 설정한다.

  2. eventtype "onpromptdismiss", bubbles true 및 cancelable true로 초기화한다.

  3. eventelement디스패치한다.

3. 공통 렌더링 및 스타일 지정 제한

권한 요소는 대체 불가능한 위젯이며 주로 button처럼 렌더링된다. 버튼 레이블은 대체로 페이지가 아닌 브라우저가 결정하며, [[Features]]에 나열된 하나 이상의 강력한 기능을 텍스트와 아이콘으로 나타낸다. 요소는 기반이 되는 강력한 기능의 현재 상태에 관한 정보도 전달할 수 있다. 실제 렌더링은 각 요소에서 정의한다.

페이지는 권한 요소의 스타일 지정에 영향을 줄 수 있지만, 악용을 방지하기 위한 제약이 적용된다. 예를 들어 글꼴과 레이블 자체에는 최소 및 최대 크기가 적용된다. 페이지는 lang 속성을 통해 텍스트의 로캘을 선택할 수도 있다.

권한 요소는 대체 콘텐츠를 지원하며, 아직 해당 요소를 지원하지 않는 브라우저는 이를 표시한다. 해당 권한 요소를 지원하는 브라우저도 특정 조건에서는 대체 콘텐츠를 표시한다는 점에 유의한다.

3.1. 표현

사용자 에이전트 UI를 자세히 설명한 전례는 많지 않다. 사용자 에이전트에 더 많은 자유를 주는 편이 나을 수 있다.

권한 요소에는 브라우저가 선택한 콘텐츠, 텍스트 및 경우에 따라 아이콘이 포함된다. 이를 활성화하면 흔히 사용자에게 선택하도록 프롬프트를 표시한다. 이는 사용자가 상호작용할 수 있는 두 가지 사용자 인터페이스를 제공한다. 사용자 에이전트는 요소의 렌더링과 이후의 권한 프롬프트를 요소의 의도를 가장 잘 전달한다고 판단하는 방식으로 자유롭게 결정할 수 있다.

권한 요소 표현을 위한 UI 옵션은 다음과 같다.

사용자 에이전트는 실행 중인 프로그램이나 플랫폼에서의 유사한 사용 방식과 일관된 방법으로 강력한 기능의 이름을 지정하거나 설명하는 것이 권장된다.

매우 비규범적인 예시는 다음과 같다.

3.2. 스타일 지정

권한 요소는 적용할 수 있는 스타일 지정을 제한한다. 이러한 제약에는 세 가지 유형이 있다.

  1. 조건이 충족되지 않으면 요소가 비활성화된다.

  2. 사용자 에이전트 정의 스타일시트가 특정 스타일 지정을 강제한다.

  3. 사용자 에이전트는 CSS로 쉽게 표현할 수 없는 추가 스타일에 범위를 강제한다. 예를 들어 스타일 범위가 요소의 계산된 스타일을 기준으로 표현되는 경우이다.

3.2.1. 요소를 비활성화하는 조건

다음 조건 중 하나라도 충족되지 않으면 style_invalid 유형으로 임시 차단 요소를 추가한다.

'color', 'background-color' 기본적으로 사용자 에이전트의 기본 button 색상으로 설정된다. 두 색상 간 명암비는 최소 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. 추가 사용자 에이전트 정의 스타일 범위

권한 요소는 스타일에 여러 범위를 정의한다. 예를 들어 글꼴 크기에는 제약이 있다. 스타일 범위는 아래에서 설명한다.

표기상 편의를 위해 요소의 계산된 값을 CSS 규칙에서 computed로 접근할 수 있다고 가정한다. 이는 요소의 상속된 값에 inherit 키워드로 접근하는 것과 같다. 그러면 다음 스타일시트는 스타일 범위를 표현한다.

@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 공통 렌더링 및 스타일 지정 제한에 설명된 대로 요소를 렌더링해야 하지만, 다음 한 가지 조건에서는 대체 콘텐츠를 렌더링해야 한다.

내부 [[BlockerList]]type_invalid차단 이유를 가진 레코드를 포함하면, permission 요소는 permission의 일반적인 렌더링 대신 대체 콘텐츠를 렌더링해야 한다.

여기에 예시를 추가한다.

4. permission 요소

참고: permission 요소는 처음 제안된 페이지 내 권한 요소이며, 모든 강력한 기능 또는 기능 조합과 함께 사용할 수 있다. 향후 표준 논의를 선점하려는 것은 아니지만, 현재는 이 요소가 다음 장에서 자세히 설명하는 더 구체적인 요소를 위해 제거될 것으로 예상한다.

permission 요소는 임의의 강력한 기능을 요청할 수 있다.

범주:
플로 콘텐츠.
구문 콘텐츠.
대화형 콘텐츠.
감지 가능한 콘텐츠.
이 요소를 사용할 수 있는 컨텍스트:
구문 콘텐츠가 예상되는 위치.
콘텐츠 모델:
플로 콘텐츠.
콘텐츠 속성:
전역 속성
권한 요소 속성
type — 이 요소가 적용되는 권한 유형.
lang — 전역 lang 속성과 같다.
접근성 고려 사항:
DOM 인터페이스:
HTMLPermissionElement

접근성 고려 사항을 추가한다.

현재 제안과 비교하여 속성, 이벤트 핸들러 및 유효하지 않은 이유의 이름을 확인한다.

permission 요소의 콘텐츠가 있으면 이는 요소의 대체 콘텐츠이다.

type 속성은 permission 요소가 활성화될 때의 동작을 제어한다. 이는 열거형 속성이며, 그 값은 강력한 기능이름이다. 이 속성에는 누락 값 기본값 상태도, 유효하지 않은 값 기본값 상태도 없다.

lang 속성은 전역 lang 속성과 같다. permission 요소는 지역화된 텍스트를 선택하기 위해 이 속성을 관찰한다.

tabindex 전역 콘텐츠 속성에 대한 기본 값permission 요소에서 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";  // type이 이미 설정되었으므로 여전히 가능하지 않다.
                       // 최초 할당이었다면 가능했을 것이다.
pepc.type;  // "". 변경되지 않은 내부 상태를 반영한다.

HTMLPermissionElement의 type getter 단계는 다음과 같다.
  1. [[Features]]가 null이면 ""을 반환한다.

  2. [[Features]]에 있는 모든 강력한 기능의 이름을 " "으로 구분하여 연결한 문자열을 반환한다.

HTMLPermissionElement의 type setter 단계는 다음과 같다.
  1. [[Features]]가 null이 아니면 반환한다.

  2. [[Features]]를 «»로 설정한다.

  3. features를 입력 문자열로 유형 문자열을 파싱한 결과로 설정한다.

  4. features가 없음이면 반환한다.

  5. 강력한 기능 이름을 [[Features]] 순서 있는 집합추가한다.

  6. [[InitialPermissionStatus]]현재 권한 상태를 가져온 결과로 설정한다.

참고: 지원되는 강력한 기능 집합은 구현 정의이다.

기능 또는 기능 그룹이 지원되는지 질의하려면:

DOMString type 인수를 사용하는 HTMLPermissionElement의 isTypeSupported() 메서드 단계는 다음과 같다.
  1. featurestype으로 유형 문자열을 파싱한 결과로 설정한다.

  2. features가 없음이 아닌지 반환한다.

주어진 문자열 type유형 문자열로 파싱하려면:
  1. listtype을 공백으로 구분된 강력한 기능 이름의 문자열로 파싱한 결과로 설정한다.

  2. 오류가 발생했으면 없음을 반환한다.

  3. 강력한 기능 집합을 사용자 에이전트HTMLPermissionElement에서 지원하는지 확인한다. 지원하지 않으면 없음을 반환한다.

  4. list를 반환한다.

4.3. permission 요소 알고리즘

HTMLPermissionElement constructor() 단계는 다음과 같다.
  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. this에서 onvalidstatechange를 디스패치할 수 있으면 디스패치한다.

HTMLPermissionElement제거 단계는 다음과 같다.
  1. this노드 탐색 가능 객체[[PermissionElements]]에서 제거한다.

  2. this노드 탐색 가능 객체에 대해 유형 허용 가능성을 다시 확인한다.

  3. this에서 onvalidstatechange를 디스패치할 수 있으면 디스패치한다.

permission elementevent가 주어졌을 때의 활성화 동작은 다음과 같다.
  1. 단언: element[[Features]]는 null이 아니다.

  2. element[[Features]]비어 있으면 반환한다.

  3. event.isTrusted가 false이면 반환한다.

  4. element.isValid가 false이면 반환한다.

  5. descriptorelement에 대해 권한 설명자를 구성한 결과로 설정한다.

  6. descriptor가 설명하는 강력한 기능을 사용할 권한을 요청한다.

  7. 이전 단계가 사용자에 의해 취소되거나 닫혔으면 this에서 onpromptdismiss를 디스패치하고 반환한다.

    [PERMISSIONS] 명세는 사용 권한 요청이 항상 성공한다고 가정한다. 즉, 사용자가 항상 선택하며 알고리즘은 그 선택에 대응하는 grant/deny 응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다.

  8. this에서 onpromptaction을 디스패치한다.

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. this에서 onvalidstatechange를 디스패치할 수 있으면 디스패치한다.

사전 동등성을 정의해야 하는가?

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. statetype에 대한 현재 권한 상태를 가져온 결과로 설정한다.

    2. 다음 순서를 가정하여 currentcurrentstate 중 더 작은 값으로 설정한다. granted > prompt > denied.

  5. current를 반환한다.

'유효한 권한 유형 없음'의 PermissionState가 무엇이어야 하는지 명확하지 않다. 여기서는 Chrome 구현을 근거로 "prompt"를 선택했지만 이 선택은 임의적이다.

5. geolocation 요소

HTML geolocation 요소는 "geolocation"에 대한 접근을 요청할 수 있다.

범주:
플로 콘텐츠.
구문 콘텐츠.
대화형 콘텐츠.
감지 가능한 콘텐츠.
이 요소를 사용할 수 있는 컨텍스트:
구문 콘텐츠가 예상되는 위치.
콘텐츠 모델:
플로 콘텐츠.
콘텐츠 속성:
전역 속성.
권한 요소 속성.
autolocate — 권한이 이미 부여된 경우 즉시 위치를 가져올지 여부.
watch — 위치를 한 번 읽을지 지속해서 감시할지 여부.
접근성 고려 사항:
DOM 인터페이스:
HTMLGeolocationElement

isValidinvalidReason, 전역 langtabindex 콘텐츠 속성, 그리고 onpromptaction, onpromptdismissonvalidationstatuschange 이벤트 핸들러는 § 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;

사용자가 위치 정보에 대한 접근을 허용하기로 결정하면 읽기 전용 속성인 positionerror는 각각 PositionCallbackPositionErrorCallback 콜백이 반환했을 현재 GeolocationPositionGeolocationPositionError 값을 반영한다.

불리언 속성 autolocate가 true이고, 사용자가 "geolocation" 권한을 이미 부여했으면 geolocation 요소가 문서에 연결될 때 위치를 즉시 가져와야 한다. 삽입 시점에 권한이 아직 부여되지 않았다면 이 속성은 아무 효과가 없다.

불리언 속성 watch가 true로 설정되면 위치가 변경될 때마다 onlocation 이벤트가 호출되며, 이는 watchPosition의 동작과 일치한다.

위치를 사용할 수 있게 되면 onlocation 이벤트 핸들러에서 Event디스패치된다. 이벤트가 디스패치될 때 위치 또는 위치를 가져오지 못한 것에 대한 정보는 position 또는 error 속성에서 사용할 수 있다. watch 요소에 따라 이 동작은 한 번 발생하거나(없거나 false인 경우) 지속해서 발생한다(true인 경우).

HTMLGeolocationElementGeolocation 인터페이스를 반영하는 것을 목표로 한다. 다음과 같이 직접 대응한다.

position PositionCallback의 결과.
error PositionErrorCallback의 결과.
watch watchPosition()을 사용한다.
¬ watch getCurrentPosition()을 사용한다.

5.1. geolocation 요소의 내부 상태

geolocation 요소는 § 2.1 Mixin 내부 상태에서 설명한 InPagePermissionMixin의 모든 내부 슬롯을 사용한다. 또한 geolocation에는 다음 내부 슬롯이 있다.

5.2. geolocation 요소 알고리즘

HTMLGeolocationElement constructor() 단계는 다음과 같다.
  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. this에서 onvalidstatechange를 디스패치할 수 있으면 디스패치한다.

  11. 가능하면 자동으로 위치를 가져온다.

HTMLGeolocationElement제거 단계는 다음과 같다.
  1. this노드 탐색 가능 객체[[PermissionElements]]에서 제거한다.

  2. this노드 탐색 가능 객체에 대해 유형 허용 가능성을 다시 확인한다.

  3. this에서 onvalidstatechange를 디스패치할 수 있으면 디스패치한다.

HTMLGeolocationElement elementevent가 주어졌을 때의 활성화 동작은 다음과 같다.
  1. 단언: element[[Features]]는 null이 아니다.

  2. element[[Features]]비어 있으면 반환한다.

  3. event.isTrusted가 false이면 반환한다.

  4. element.isValid가 false이면 반환한다.

  5. descriptorelement에 대해 권한 설명자를 구성한 결과로 설정한다.

  6. descriptor가 설명하는 강력한 기능을 사용할 권한을 요청한다.

  7. 이전 단계가 사용자에 의해 취소되거나 닫혔으면 this에서 onpromptdismiss를 디스패치하고 반환한다.

    [Permissions] 명세는 사용 권한 요청이 항상 성공한다고 가정한다. 즉, 사용자가 항상 선택하며 알고리즘은 그 선택에 대응하는 grant/deny 응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다.

  8. this에서 onpromptaction을 디스패치한다.

  9. 위치를 가져온다.

position getter 단계는 [[position]]의 값을 반환하는 것이다.
error getter 단계는 [[positionError]]의 값을 반환하는 것이다.
가능하면 자동으로 위치를 가져오려면:
  1. 현재 권한 상태를 가져온 결과가 granted가 아니면 반환한다.

  2. autolocate가 true가 아니면 반환한다.

  3. 위치를 가져온다.

위치를 가져오려면:
  1. positionCallback을 다음 단계를 수행하는 PositionCallback으로 설정한다.

    1. this[[positionError]]를 undefined로 설정한다.

    2. this[[position]]PositionCallback의 position 인수로 설정한다.

    3. thisonlocation을 디스패치한다.

  2. errorCallback을 다음 단계를 수행하는 PositionErrorCallback으로 설정한다.

    1. this[[position]]을 undefined로 설정한다.

    2. this[[positionError]]PositionCallback의 positionError 인수로 설정한다.

    3. thisonlocation을 디스패치한다.

  3. positionOptions를 «[]»로 설정한다.

  4. geolocation관련 전역 객체Geolocation으로 설정한다.

  5. thiswatch가 true이면 다음을 수행한다.

    1. geolocation, positionCallback, errorCallback, positionOptionsthis[[watchIDs]]를 사용하여 위치를 요청한다.

  6. 그렇지 않으면 다음을 수행한다.

    1. geolocation, positionCallback, errorCallbackpositionOptions를 사용하여 위치를 요청한다.

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; 외. 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; 외. CSS 색상 조정 모듈 레벨 1. URL: https://drafts.csswg.org/css-color-adjust-1/
[CSS-CONDITIONAL-5]
Chris Lilley; 외. 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; 외. 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; 외. 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; 외. 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 변경 예정 모듈 레벨 1. URL: https://drafts.csswg.org/css-will-change/
[CSS2]
Bert Bos; 외. 종속형 스타일시트 레벨 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; 외. 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. 교차 관찰자. URL: https://w3c.github.io/IntersectionObserver/
[MANIFEST-APP-INFO]
Aaron Gustafson. 웹 앱 매니페스트 - 애플리케이션 정보. URL: https://w3c.github.io/manifest-app-info/
[MEDIAQUERIES-5]
Tab Atkins Jr.; 외. 미디어 쿼리 레벨 5. URL: https://drafts.csswg.org/mediaqueries-5/
[Permissions]
Marcos Caceres; Mike Taylor. 권한. URL: https://w3c.github.io/permissions/
[SVG2]
Amelia Bellamy-Royds; 외. 확장 가능한 벡터 그래픽(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 응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다.
[Permissions] 명세는 설명자가 매개변수 없이 단일 권한을 설명한다고 가정한다. 예를 들어 enableHighAccuracy에 해당하는 값과 같다. 여기서는 더 표현력이 높은 권한 모델을 가정한다. 이 문제는 해결되어야 하며, 아마 상위 명세인 [Permissions]에서 해결하고 여기에 이를 반영해야 한다.
사전 동등성을 정의해야 하는가?
'유효한 권한 유형 없음'의 PermissionState가 무엇이어야 하는지 명확하지 않다. 여기서는 Chrome 구현을 근거로 "prompt"를 선택했지만 이 선택은 임의적이다.
[Permissions] 명세는 사용 권한 요청이 항상 성공한다고 가정한다. 즉, 사용자가 항상 선택하며 알고리즘은 그 선택에 대응하는 grant/deny 응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다.