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
요소에는 다음 내부 슬롯이 있다.
-
[[Features]]는 null 또는 순서 있는 집합으로 구성된 강력한 기능이다. 대부분의 권한 요소에서는 고정된 집합일 가능성이 높지만, 일부 요소에서는 가변적일 수 있다. 이를 내부 슬롯으로 만들면 모든 요소에 적용되는 알고리즘을 작성할 수 있다. -
[[InitialPermissionStatus]]는PermissionState이며,[[Features]]의 초기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
활성화 및 활성화 차단 요소
권한 요소군의 핵심 목표는 사용자의 의식적인 선택을 반영하는 것이며, 사용자가 속임수로 쉽게 요소를 활성화하지 못하도록 해야 한다. 이를 위해 권한 요소는 요소의 활성화를 영구적으로 또는 일시적으로 방지할 수 있는 차단 이유 목록을 유지한다.
이러한 동작 대부분은 모든 권한 요소에서 동일해야 한다. 단순화를 위해 하나 또는 일부 요소에만 적용되는 차단 요소도 포함한다.
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"
권한 요소는 요소를 현재 활성화할 수 없는 이유인 "차단 요소"를 추적한다. 이러한 차단 요소에는 영구, 임시 및 만료형의 세 가지 수명이 있다.
- 영구 차단 요소
-
요소에 영구 차단 요소가 생기면 해당 요소는 영구적으로 비활성화된다. 이는 웹 사이트 소유자가 해결해야 하는 문제에 사용된다. 예로는
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를 없음으로 설정한다.
-
expires가 참이면 timestamp를 현재 고해상도 시간에 차단 지연 시간을 더한 값으로 설정한다.
-
reason과 timestamp를 가진 항목을 내부
[[BlockerList]]에 추가한다.
InPagePermissionMixinBlockerReason
reason을 사용하여
만료형 차단 요소를 추가하려면:
InPagePermissionMixinBlockerReason
reason을 사용하여
임시 차단 요소를 추가하려면:
InPagePermissionMixinBlockerReason
reason을 사용하여
영구 차단 요소를 추가하려면:
InPagePermissionMixinBlockerReason
reason을 가진
차단 요소를 제거하려면:
-
element의
[[BlockerList]]에 있는 각 entry에 대해 반복한다.-
entry의 이유가 reason과 같으면, element의
[[BlockerList]]에서 entry를 제거한다.
-
-
reason과 true를 사용하여 차단 요소를 추가한다.
InPagePermissionMixin
element의
차단 요소를 결정하려면:
-
blockers를 차단 요소 순서 지정 알고리즘으로 element의
[[BlockerList]]를 정렬한 결과로 설정한다. -
아무것도 반환하지 않는다.
InPagePermissionMixin의
차단
요소 목록의 entry는 다음 조건에서
차단 중이다.
-
entry에 차단 타임스탬프가 없거나,
-
entry에 차단 타임스탬프가 있고 해당 차단 타임스탬프가 현재 고해상도 시간 이상이다.
참고: 이 명세는 차단 요소를 [[BlockerList]]
목록으로 유지하며, 일부 차단 요소 유형은 단순히 만료될 뿐 제거되지 않으므로
목록이 잠재적으로 무한히 커질 수 있다.
이 구조는 효율성보다는 설명의 단순성을 위해 선택되었다.
이 차단 구조의 세부 사항은 여기에서 정의한 소수의 알고리즘을 제외하면
관찰할 수 없으므로, 구현에서 이를 더 효율적으로 처리할 수 있는
충분한 여지가 있다.
2.4. Mixin
알고리즘
InPagePermissionMixin
element의 invalidReason getter 단계는 다음과 같다.
InPagePermissionMixin
element의
initialPermissionStatus
getter 단계는 다음과 같다.
-
element의 내부
[[InitialPermissionStatus]]를 반환한다.
InPagePermissionMixin
element의 현재 권한 상태를 가져오는 방법은
믹스인을 포함하는 특정 요소에 따라 달라진다.
따라서 각 요소는 자체 알고리즘을 정의해야 한다.
2.5. Mixin
이벤트 알고리즘
-
oldState를
[[LastNotifiedValidState]]로 설정한다. -
newState를 element의 차단 요소가 없음인지 여부로 설정한다.
-
[[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]]에
나열된 하나 이상의 강력한 기능을 텍스트와
아이콘으로 나타낸다. 요소는 기반이 되는 강력한
기능의 현재 상태에 관한 정보도 전달할 수 있다.
실제 렌더링은 각 요소에서 정의한다.
페이지는 권한 요소의 스타일 지정에 영향을 줄 수 있지만,
악용을 방지하기 위한 제약이 적용된다. 예를 들어 글꼴과 레이블 자체에는
최소 및 최대 크기가 적용된다. 페이지는 lang
속성을 통해 텍스트의 로캘을 선택할 수도 있다.
권한 요소는 대체 콘텐츠를 지원하며, 아직 해당 요소를 지원하지 않는 브라우저는 이를 표시한다. 해당 권한 요소를 지원하는 브라우저도 특정 조건에서는 대체 콘텐츠를 표시한다는 점에 유의한다.
3.1. 표현
사용자 에이전트 UI를 자세히 설명한 전례는 많지 않다. 사용자 에이전트에 더 많은 자유를 주는 편이 나을 수 있다.
권한 요소에는 브라우저가 선택한 콘텐츠, 텍스트 및 경우에 따라 아이콘이 포함된다. 이를 활성화하면 흔히 사용자에게 선택하도록 프롬프트를 표시한다. 이는 사용자가 상호작용할 수 있는 두 가지 사용자 인터페이스를 제공한다. 사용자 에이전트는 요소의 렌더링과 이후의 권한 프롬프트를 요소의 의도를 가장 잘 전달한다고 판단하는 방식으로 자유롭게 결정할 수 있다.
권한 요소 표현을 위한 UI 옵션은 다음과 같다.
-
[[Features]]에 나열된 강력한 기능의 이름을 요소의 언어로 표시한다.lang속성이 있으면 항상 해당 속성이 나타내는 언어가 사용된다. -
강력한 기능의 유형을 나타내는 아이콘.
-
해당 강력한 기능의 현재 권한 상태. 예를 들어 권한이 이미
granted이면permission요소의 레이블을 "위치 정보가 이미 사용 중임"으로 지정할 수 있다. -
"스크림"이 포함된 모달 프롬프트. 즉, 프롬프트 뒤의 페이지를 어둡게 표시한다. 일반적으로 상당히 방해가 되지만, 여기서는 사용자가 의도적으로 선택하도록 보장하는 것이 목표이다.
사용자 에이전트는 실행 중인 프로그램이나 플랫폼에서의 유사한 사용 방식과 일관된 방법으로 강력한 기능의 이름을 지정하거나 설명하는 것이 권장된다.
매우 비규범적인 예시는 다음과 같다.
-
<permission lang="de" types="geolocation">: "Standort verwenden". -
<permission types="microphone">(영어 페이지에서): "마이크 사용. 🎤". -
대응하는 권한 상태가
denied일 때<permission types="microphone">을 활성화하면 텍스트를 "계속 차단"으로 수정한다.
3.2. 스타일 지정
권한 요소는 적용할 수 있는 스타일 지정을 제한한다. 이러한 제약에는 세 가지 유형이 있다.
-
조건이 충족되지 않으면 요소가 비활성화된다.
-
사용자 에이전트 정의 스타일시트가 특정 스타일 지정을 강제한다.
-
사용자 에이전트는 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.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 공통 렌더링 및 스타일 지정 제한에
설명된 대로 요소를 렌더링해야 하지만, 다음 한 가지 조건에서는
대체 콘텐츠를 렌더링해야 한다.
내부 [[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 ;
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; // "". 변경되지 않은 내부 상태를 반영한다.
type
getter 단계는 다음과 같다.
-
[[Features]]가 null이면""을 반환한다. -
[[Features]]에 있는 모든 강력한 기능의 이름을 " "으로 구분하여 연결한 문자열을 반환한다.
type
setter 단계는 다음과 같다.
-
[[Features]]가 null이 아니면 반환한다. -
[[Features]]를 «»로 설정한다. -
features를 입력 문자열로 유형 문자열을 파싱한 결과로 설정한다.
-
features가 없음이면 반환한다.
-
각 강력한 기능 이름을
[[Features]]순서 있는 집합에 추가한다. -
[[InitialPermissionStatus]]를 현재 권한 상태를 가져온 결과로 설정한다.
기능 또는 기능 그룹이 지원되는지 질의하려면:
DOMString
type 인수를 사용하는 HTMLPermissionElement의 isTypeSupported()
메서드 단계는 다음과 같다.
-
features를 type으로 유형 문자열을 파싱한 결과로 설정한다.
-
features가 없음이 아닌지 반환한다.
-
list를 type을 공백으로 구분된 강력한 기능 이름의 문자열로 파싱한 결과로 설정한다.
-
오류가 발생했으면 없음을 반환한다.
-
강력한 기능 집합을 사용자 에이전트의
HTMLPermissionElement에서 지원하는지 확인한다. 지원하지 않으면 없음을 반환한다. -
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의
제거 단계는 다음과 같다.
-
this를 노드 탐색 가능 객체의
[[PermissionElements]]에서 제거한다. -
this의 노드 탐색 가능 객체에 대해 유형 허용 가능성을 다시 확인한다.
permission
element에 event가 주어졌을 때의 활성화 동작은 다음과 같다.
-
단언: element의
[[Features]]는 null이 아니다. -
element의
[[Features]]가 비어 있으면 반환한다. -
event.
isTrusted가 false이면 반환한다. -
element.
isValid가 false이면 반환한다. -
descriptor를 element에 대해 권한 설명자를 구성한 결과로 설정한다.
-
이전 단계가 사용자에 의해 취소되거나 닫혔으면 this에서 onpromptdismiss를 디스패치하고 반환한다.
[PERMISSIONS] 명세는 사용 권한 요청이 항상 성공한다고 가정한다. 즉, 사용자가 항상 선택하며 알고리즘은 그 선택에 대응하는
grant/deny응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다. -
this에서 onpromptaction을 디스패치한다.
HTMLPermissionElement
element의 권한 설명자를 구성하려면:
[Permissions]
명세는 설명자가 매개변수 없이 단일 권한을 설명한다고 가정한다.
예를 들어 enableHighAccuracy에
해당하는 값과 같다.
여기서는 더 표현력이 높은 권한 모델을 가정한다.
이 문제는 해결되어야 하며, 아마 상위 명세인
[Permissions]에서
해결하고 여기에 이를 반영해야 한다.
-
result를 새로운
PermissionDescriptor로 설정한다. -
result를 다음과 같이 채운다.
-
element의
[[Features]]에 포함된 강력한 기능의 이름을 포함한다.
-
-
result를 반환한다.
IntersectionObserverCallback을
구현하며 다음 단계를 실행한다.
-
단언:
IntersectionObserver의root는 문서이다. -
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]]. -
가장 최근의
GeolocationPosition을 포함하는[[position]]. -
가장 최근의
GeolocationPositionError를 포함하는[[positionError]].
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의
제거 단계는 다음과 같다.
-
this를 노드 탐색 가능 객체의
[[PermissionElements]]에서 제거한다. -
this의 노드 탐색 가능 객체에 대해 유형 허용 가능성을 다시 확인한다.
HTMLGeolocationElement
element에 event가 주어졌을 때의 활성화 동작은 다음과 같다.
-
단언: element의
[[Features]]는 null이 아니다. -
element의
[[Features]]가 비어 있으면 반환한다. -
event.
isTrusted가 false이면 반환한다. -
element.
isValid가 false이면 반환한다. -
descriptor를 element에 대해 권한 설명자를 구성한 결과로 설정한다.
-
이전 단계가 사용자에 의해 취소되거나 닫혔으면 this에서 onpromptdismiss를 디스패치하고 반환한다.
[Permissions] 명세는 사용 권한 요청이 항상 성공한다고 가정한다. 즉, 사용자가 항상 선택하며 알고리즘은 그 선택에 대응하는
grant/deny응답을 항상 전달한다고 가정한다. 그러나 사용자가 그렇게 하도록 강제할 수는 없다. 일부 사용자 에이전트는 명시적인 거부를 위한 UI 기능 (예: "거부" 버튼)과 요청 대화상자를 취소하거나 닫는 UI 기능 (예: 오른쪽 위의 "X" 버튼)을 서로 다르게 제공할 수 있다. 여기서는 기반 명세에 명확한 연결점이 없음에도 이 두 동작을 구분한다. -
this에서 onpromptaction을 디스패치한다.
position
getter 단계는 [[position]]의
값을 반환하는 것이다.
error
getter 단계는 [[positionError]]의
값을 반환하는 것이다.
-
현재 권한 상태를 가져온 결과가
granted가 아니면 반환한다. -
autolocate가 true가 아니면 반환한다.
-
positionCallback을 다음 단계를 수행하는
PositionCallback으로 설정한다.-
this의
[[positionError]]를 undefined로 설정한다. -
this의
[[position]]을PositionCallback의 position 인수로 설정한다. -
this에 onlocation을 디스패치한다.
-
-
errorCallback을 다음 단계를 수행하는
PositionErrorCallback으로 설정한다.-
this의
[[position]]을 undefined로 설정한다. -
this의
[[positionError]]를PositionCallback의 positionError 인수로 설정한다. -
this에 onlocation을 디스패치한다.
-
-
positionOptions를 «[]»로 설정한다.
-
geolocation을 관련 전역 객체의
Geolocation으로 설정한다. -
-
geolocation, positionCallback, errorCallback, positionOptions 및 this의
[[watchIDs]]를 사용하여 위치를 요청한다.
-
-
그렇지 않으면 다음을 수행한다.
-
geolocation, positionCallback, errorCallback 및 positionOptions를 사용하여 위치를 요청한다.
-
5.3.
geolocation
요소 이벤트 알고리즘
-
event를 새로운
Event로 설정한다. -
event를
type"onlocation"으로 초기화한다. -
event를 element에 디스패치한다.
6. 보안 및 개인정보 보호 고려 사항
참고: 보안 및 개인정보 보호 고려 사항은 여기와 저기, 즉 설명 문서에서 확인할 수 있다. 이 절에는 최종적으로 해당 설명 문서 절의 내용을 명세에 적합한 형태로 옮긴 내용이 포함될 것이다.