프리렌더링 개편

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

현재 버전:
https://wicg.github.io/nav-speculation/prerendering.html
이슈 추적:
GitHub
명세 내 인라인
에디터:
(Google)
(Google)

요약

이 문서는 명확히 명세된 프리렌더링을 위한 명세 패치 모음입니다.

이 문서의 상태

이 명세는 웹 플랫폼 인큐베이터 커뮤니티 그룹에서 발행했습니다. 이는 W3C 공식 표준도 아니고 W3C 표준 트랙에 있지도 않습니다. W3C 커뮤니티 기여자 라이선스 계약 (CLA)에 따라 제한적 옵트아웃 및 기타 적용 조건이 있습니다. 자세한 내용은 W3C 커뮤니티 및 비즈니스 그룹을 참고하세요.

1. 추론 규칙

HTML § 7.6.1 Speculation rules를 다음과 같이 수정하여 프리렌더링을 지원합니다.

1.1. 파싱

추론 규칙 집합 구조체에 두 개의 항목을 추가로 확장합니다:

speculation rule 구조체에 한 개의 항목을 추가로 확장합니다:

speculation rule set 문자열 파싱을 아래와 같이 수정합니다:

구현체는 § 1.2 Processing model에서 수정된 대로 prerender 후보를 prefetch로 취급하는 것도 여전히 허용됩니다.

speculation rule 파싱에 다음 단계를 추가합니다:
  1. targetHint를 null로 둡니다.

  2. input["target_hint"]가 존재한다면:

    1. input["target_hint"]가 유효한 navigable target name 또는 키워드가 아니라면:

      1. 사용자 에이전트는 제공된 target hint가 유효하지 않음을 콘솔에 경고로 보고할 수 있습니다.

      2. null을 반환합니다.

    2. targetHintinput["target_hint"]로 설정.

그리고 마지막 단계에서 speculation rule을 반환할 때 target navigable name hinttargetHint로 설정합니다.

1.2. 프로세싱 모델

prerender 후보는 다음과 같은 추가 항목을 가진 speculative load candidate입니다:

speculative loads 고려 단계를, documentnode navigableprerendering navigable일 경우 조기에 종료하도록 수정하며, 추론적으로 로드된 페이지에서 speculative load를 실행하는 건 자원 낭비라는 설명을 추가합니다.
내부 speculative loads 고려 단계 알고리즘을 다음과 같이, prefetchCandidates를 조립한 직후에 단계들을 삽입하여 수정합니다:
  1. prerenderCandidates를 빈 list로 둡니다.

  2. ruleSetdocumentspeculation rule sets에서 반복:

    1. (rules, shouldBlockScripts)를 « (ruleSetprerender rules, false), (ruleSetprerender_until_script rules, true) »로 간주:

      1. rulerules에서 반복:

        1. urlruleURLs에서 반복:

          1. referrerPolicy = speculative load referrer policy 계산(rule, null)

          2. 추가: 새로운 prerender candidate, 값

            URL

            url

            No-Vary-Search hint

            ruleNo-Vary-Search hint

            eagerness

            ruleeagerness

            referrer policy

            referrerPolicy

            tags

            ruletags

            target navigable name hint

            ruletarget navigable name hint

            should block scripts

            shouldBlockScripts

            prerenderCandidates에 추가
        2. rulepredicate가 null이 아니면:

          1. links = 링크 매칭 탐색(document, rulepredicate)

          2. linklinks에서 반복:

            1. target = ruletarget navigable name hint

            2. target이 null이면 element의 target 얻기(link) 결과로 설정.

            3. referrerPolicy = speculative load referrer policy(rule, link)

            4. 추가: prerender candidate

              URL

              linkurl

              No-Vary-Search hint

              ruleNo-Vary-Search hint

              eagerness

              ruleeagerness

              referrer policy

              referrerPolicy

              tags

              ruletags

              target navigable name hint

              target

              should block scripts

              shouldBlockScripts

              prerenderCandidates에 추가
  3. speculativeLoadCandidates = prefetchCandidatesprerenderCandidates의 합집합으로 둔다.

not-still-being-speculated prefetch records를 취소하는 후속 단계를 prefetchCandidates 대신 speculativeLoadCandidates 기준으로 적용하라.

prerenderCandidateGroups 리스트도 prefetchCandidateGroups와 유사하게 만드는데 값으로 prerenderCandidates 사용.

실제 prefetch를 수행하는 단계를 prefetchCandidateGroups 대신 다음과 같이 변경합니다:

  1. speculativeLoadCandidateGroups = prefetchCandidateGroupsprerenderCandidateGroups의 합집합으로 한다.

  2. groupspeculativeLoadCandidateGroups에서 반복:

    1. 사용자 에이전트는 아래 단계를 실행할 수 있다:

      1. candidategroup[0]으로 둔다.

      2. tagsToSend = collecting tags from speculative load candidates(group)의 결과로 둔다.

      3. prefetchRecord를 새로운 prefetch record로 다음 값 설정하고 생성

        source

        "speculation rules"

        URL

        candidateURL

        No-Vary-Search hint

        candidateNo-Vary-Search hint

        referrer policy

        candidatereferrer policy

        tags

        tagsToSend

      4. candidateprefetch candidate라면 prefetchRecordanonymization policycandidateanonymization policy로 설정.

      5. candidateprerender candidate라면 아래 단계를 실행할 수 있음:

        1. prefetchRecordprerendering traversable를 "to be created"로 설정

        2. prefetchRecordprerendering target navigable name hintcandidatetarget navigable name hint로 설정.

        3. 리퍼러 기반 내비게이션 프리렌더 시작(document, prefetchRecord, candidateshould block scripts)

      6. 이전 단계가 실행되지 않았다면, 리퍼러 기반 내비게이션 프리페치 시작(document, prefetchRecord)

      (아래 "may" 단계의 실행 시점은 계속 논의에 포함됨.)

1.3. 트리거링

attribute change stepsaarea 요소에 대해 target 속성까지 모니터링하도록, 그리고 변경 시 speculative loads 고려가 이루어지도록 수정합니다.

2. 프리렌더링 인프라

2.1. Document 인터페이스 확장

[HTML]Document 중앙 정의를 다음과 같이 수정합니다:

partial interface Document {
    readonly attribute boolean prerendering;

    // Under "special event handler IDL attributes that only apply to Document objects"
    attribute EventHandler onprerenderingchange;
};

onprerenderingchange 속성은 이벤트 핸들러 IDL 속성이며, prerenderingchange 이벤트 핸들러 이벤트 타입과 대응됩니다. (해당 표는 현재 onreadystatechange만 포함하고 있습니다. 이에 대한 표도 [HTML]에서 갱신됩니다.)

[HTML]의 관례에 따라, prerendering 정의는 명세 내 다른 섹션에 위치합니다. 아래에 소개되는 새 섹션에 배치됩니다:

2.2. 프리렌더링 내비게이블

다음 절은 [HTML]Navigables 절에 새 하위 절로 추가됩니다.

모든 navigable에는 loading mode가 있으며, 아래 중 하나입니다:

"default"

이 navigable에 로드된 콘텐츠에는 특별한 고려 사항이 적용되지 않습니다.

"prerender"

이 navigable은 프리렌더링된 콘텐츠를 표시 중입니다.

기본적으로 navigableloading mode는 "default"입니다. loading mode가 "prerender"인 navigable은 prerendering navigable이라고 부릅니다. prerendering navigable이면서 최상위 traversable인 것은 prerendering traversable이라고 부릅니다.

프리렌더링 navigableactive browsing context보조 브라우징 컨텍스트가 될 수 없습니다.

현재 loading mode 값은 두 가지지만, fenced frames, portal, uncredentialed(교차사이트) prerendering 등 향후 로딩 모드 추가를 고려해 유연한 구조로 되어 있습니다. 실제로 필요없다는 것이 드러나면 boolean으로 바꿀 수도 있습니다.

모든 navigablescripting mode가 있으며, 아래 중 하나입니다:

"enabled"

스크립트가 정상적으로 실행됩니다.

"blocked-until-activation"

navigable이 활성화될 때까지 스크립트 실행이 차단됩니다.

기본적으로 navigablescripting mode는 "enabled"입니다.

scripting mode는 document가 아니라 navigable의 속성입니다. 이는 동일 navigable 내에서 navigation 이 일어나도 유지되어야 하며, about:blank 첫 문서나 활성화 전 client-side redirect 케이스 등에 필요합니다.

모든 prerendering traversableprerender 초기 응답 search variance가 있으며, URL search variance 또는 null이며, 초기값은 null입니다.

document.prerendering

페이지가 비대화형 프리렌더링 컨텍스트에서 표시 중인 경우 true를 반환합니다.

true→false로 값이 변할 수 있으며, 이 때 Document 에서 prerenderingchange 이벤트가 발생합니다. (이후 다시 true로 바뀌지는 않습니다.)

prerendering getter 단계는 this에 비null인 node navigable이 존재하고, 해당 navigable이 prerendering navigable이면 true, 아니면 false 반환.


모든 Documentpost-prerendering activation steps list를 가지며, list 자료구조로 각 항목은 일련의 알고리즘 단계 집합입니다. 편의를 위해 임의의 플랫폼 객체 platformObject에 대해 post-prerendering activation steps list를 다음과 같이 정의합니다:

만약 platformObject노드라면
  1. platformObjectnode documentpost-prerendering activation steps list를 반환.

그 외의 경우
  1. 단언: platformObjectrelevant global objectWindow 객체임.

  1. platformObjectrelevant global object연관 Documentpost-prerendering activation steps list 반환.

모든 Documentactivation start time을 가지며, 초기값은 타임값이 0인 DOMHighResTimeStamp 입니다.

모든 Document프리렌더링 중 교차 오리진 iframe 내비 허용을 가지며, boolean이고, 초깃값은 false입니다.

2.3. 프리렌더 알고리즘

사용자 에이전트는 리퍼러 문서 없이 프리렌더링을 시작할 수 있으며, 예로 주소창 또는 기타 브라우저 사용자 상호작용의 결과일 수 있습니다.

사용자 에이전트 기반 프리렌더링 시작URL startingURL에 대해 다음과 같이 수행합니다:

  1. 단언: startingURLschemeHTTP(S) scheme 중 하나임.

  2. prerenderingTraversable새 최상위 traversable 생성(null, 빈 문자열) 결과로 둡니다.

  3. prerenderingTraversableloading mode를 "prerender"로 설정.

  4. prefetchRecord를 새 prefetch record로 두며, URLstartingURL, anonymization policy는 null, referrer policy는 빈 문자열, No-Vary-Search hint기본 URL 검색 variance, source는 "browser UI", prerendering traversableprerenderingTraversable.

  5. 리퍼러 기반 네비게이션 프리페치 시작(prerenderingTraversableactive document, prefetchRecord) 실행.

  6. Navigate prerenderingTraversable to startingURL with prerenderingTraversableactive document.

    이 초기 navigation은 prerenderingTraversable이 자신을 navigation하는 것으로 취급하여 관련 모든 보안 검사 통과를 보장합니다.

  7. 사용자가 activationURL로 navigation 확인 의사를 표시하였고, activationURL에 대해 prefetchRecordURL 매칭이면:

    1. 사용자가 navigation 도중 새 사용자 가시적 최상위 traversable 생성을 원하면 (예: 주소창에서 Shift+Enter):

      1. 활성화용 successor 갱신(prerenderingTraversable, startingURL, activationURL).

      2. 프리렌더 탭/창 등 사용자 UI 갱신.

      3. 최종 활성화(prerenderingTraversable, startingURLorigin).

    2. 또는, 사용자가 기존 최상위 traversable predecessorTraversable에 navigation 활성화 표시 시:

      1. 활성화(prerenderingTraversable, predecessorTraversable, "push", startingURL, activationURL).

사용자가 그런 활성화를 전혀 표시하지 않을 수도 있고, 프리렌더 자원이 필요한 즉시 다른 작업을 위해 사용자 에이전트가 자원을 회수해야 할 수도 있습니다. 이런 경우 사용자 에이전트는 destroy prerenderingTraversable할 수 있습니다.

리퍼러 기반 네비게이션 프리렌더 시작Document referrerDoc, prefetch record prefetchRecord, boolean blockScripts가 주어졌을 때 다음을 수행합니다:
  1. 단언: prefetchRecordURLschemeHTTP(S) scheme 중 하나임.

  2. referrerDocnode navigable최상위 traversable이 아니면 return.

    현재로서 child navigable에서 프리렌더링은 명세/구현되지 않음. navigable 트리 내 노출 등 복잡한 고려 사항 있음.

  3. referrerDocbrowsing context보조 브라우징 컨텍스트면 return.

    prerendering traversable과 referrerDocbrowsing context opener 관계를 피하기 위함.

  4. referrerDocoriginprefetchRecordURLoriginsame site가 아니면 return.

    현재로서는 교차 사이트 프리렌더링 명세/구현 안 됨. (추후 개선 아이디어는 있음)

  5. referrerDoc매칭 프리페치 기록 있음이면 return.

  6. 단언: prefetchRecordprerendering traversable이 "to be created"임.

  7. prerenderingTraversable새 최상위 traversable 생성 결과로.

    사용자 에이전트는 prefetchRecordprerendering target navigable name hint새 최상위 traversable 생성 구현 힌트로 활용할 수 있음.

    이 값은 힌트에 불과. 실제 활성화된 traversable이 다를 수도 있음.

  8. prerenderingTraversableloading mode를 "prerender"로 설정.

  9. blockScripts가 true라면 prerenderingTraversablescripting mode를 "blocked-until-activation"로.

  10. prefetchRecordprerendering traversableprerenderingTraversable로 한다.

  11. prerenderingTraversableremove from referrerprefetchRecordprerendering traversable을 null로 설정하는 알고리즘을 부여.

    모든 최상위 traversable과 마찬가지로, prerendering traversable도 비응답, 제한 행위, 과도 리소스 등 이유로 언제든 제거 가능. 이 경우에도 prefetch record는 남아 향후 navigation 활용 가능.

  12. 리퍼러 기반 네비게이션 프리페치 시작(referrerDoc, prefetchRecord).

  13. Navigate prerenderingTraversable to prefetchRecordURL with referrerDoc, referrerPolicy= prefetchRecordreferrer policy.

활성화용 successor 갱신prerendering traversable successorTraversable, URL startingURL, URL activationURL이 주어졌을 때:

  1. successorDocumentsuccessorTraversableactive document로 둔다.

  2. startingURLsuccessorDocumentURL과 같고, startingURLactivationURL과 다르면:

    1. 단언: successorDocumentactivationURL로 URL을 변경할 수 있음.

    2. navigationsuccessorDocumentrelevant global objectnavigation API로 둔다.

    3. continue = push/replace/reload navigate 이벤트 발화(navigation, "replace", activationURL, true) 결과

    4. continue가 true면 URL & 히스토리 갱신 단계(successorDocument, activationURL) 실행

    No-Vary-Search 기반인 부정확 매칭에서 실제 URL과 프리렌더 URL을 일치시킬 수 있음.

활성화prerendering traversable successorTraversable, 최상위 traversable predecessorTraversable, history handling behavior historyHandling, URL startingURL, URL activationURL, 선택적 navigation ID navigationId가 주어졌을 때:

  1. 단언: successorTraversableactive documentis initial about:blank가 false임.

  2. navigationId가 없다면, navigationId임의 UUID 생성 결과로 설정.

  3. referrerOriginpredecessorTraversableactive documentorigin으로 둔다.

  4. predecessorTraversableongoing navigationnavigationId를 설정.

    이렇게 하면 predecessorTraversable의 기존 navigation은 모두 abort됨.

  5. 병렬로 다음 단계 실행:

    1. unloadPromptCanceled = 언로드 유저취소 여부 확인(predecessorTraversableactive document모든 자식 navigable)

    2. unloadPromptCanceled가 true이거나 predecessorTraversableongoing navigation이 더 이상 navigationId가 아니라면 중단.

    3. 글로벌 태스크 큐잉(navigation and traversal task source, predecessorTraversableactive window) → abort(predecessorTraversableactive document)

    4. 활성화용 successor 갱신(successorTraversable, startingURL, activationURL).

    5. 세션 히스토리 traversal 단계 추가(predecessorTraversable, 아래 단계):

      1. 단언: successorTraversable현재 세션 히스토리 step은 0.

      2. 단언: successorTraversable세션 히스토리 엔트리 크기는 1.

      3. successorEntry = successorTraversable세션 히스토리 엔트리[0]

      4. 제거(successorEntry, successorTraversable세션 히스토리 엔트리)

        이 시점에서 successorTraversable는 비어 있고 (성공적으로) 파괴될 수 있음. (단, successorEntry 등 관련 대상은 다음 단계까지 유지)

      5. 교차 문서 navigation 완료(predecessorTraversable, historyHandling, successorEntry)

        세션 히스토리 엔트리 전체를 이동시키기 때문에, 이 엔트리 내 documentbrowsing context까지 그룹이 변경됨. COOP(Co-Opener-Policy)와 유사하게 opener 관계가 해제됨.

      6. 유저 에이전트 UI(탭/창 등) 업데이트.

      7. 최종 활성화(successorTraversable, referrerOrigin)

      8. 여기에서 WebDriver BiDi와의 연계 고려 필요(w3c/webdriver-bidi#321 참조). 현재는 탐색 시작만 나오고 종료 제어 없음.

최종 활성화는 top-level traversable traversable, origin origin을 받아 다음을 수행:
  1. navigabletraversableactive document모든 자식 navigable에서 반복, 글로벌 태스크 큐에 추가(navigation and traversal task source, navigableactive window)하여 아래 단계 수행:

    1. originhintSetnavigableprerender-scoped Accept-CH cache 맵에서 반복:

      1. Set Accept-CH cache[origin] = hintSet

    2. navigablescripting mode가 "blocked-until-activation"이면:

      1. navigablescripting mode를 "enabled"로.

      2. navigableactive document에서 스크립트 실행 차단 해제.

      스크립트 실행 재개 및 큐된 태스크 처리 상세는 향후 추가 필요.

    3. doc = navigableactive document로 둠.

    4. 여기서 실제로 로딩 모드 변경 신호가 전달되어야 하며, 구현체는 이 태스크에서 document.prerendering 변화 반영 필요.

    5. docoriginorigin과 같으면 docactivation start time을 해당 현재 고해상도 시각으로.

    6. prerenderingchange 이벤트 발생(doc).

    7. stepsdocpost-prerendering activation steps list에서 반복:

      1. steps 실행.

        반환값은 무시 가능.

      2. 단언: steps 실행 중 예외 없음.

      여러 document가 같은 이벤트 루프 쓸 때만 순서 보장.

prerendering traversable에는 remove from referrer 필드가 있으며, null 또는 매개변수 없는 알고리즘이고 처음엔 null임.

prerendering traversable 파괴 시 참조 해제를 보장하기 위해, destroy a top-level traversable에 아래 스텝을 추가합니다:

  1. traversableprerendering traversable이고 traversableremove from referrer가 null 아니면 호출.

2.4. 내비게이블 생성 변경 사항

어떤 자식 내비게이블도 자신의 부모loading mode를 상속받도록 보장하기 위해, 새 자식 내비게이블 생성에 아래 단계를 추가합니다:
  1. navigableloading modeelementnode navigableloading mode로 설정합니다.

매칭되는 프리렌더된 프리페치 기록 찾기Document predecessorDocumentURL url이 주어졌을 때:
  1. recordToUse를 null로 둔다.

  2. recordpredecessorDocumentprefetch records에서 반복:

    1. recordprerendering traversableprerendering traversable이 아니면 continue

    2. recordprerendering traversableactive documentis initial about:blank가 true이면 continue

    3. recordURLurl과 같으면:

      1. recordToUserecord로 설정.

      2. break.

    4. recordToUse가 null이고 recordURL 매칭(url)이면:

      1. recordToUserecord로 설정.

  3. recordToUse가 null이 아니면:

    1. 제거(recordToUse, predecessorDocumentprefetch records)

  4. recordToUse를 반환.

매칭되는 프리렌더 프리페치 레코드 대기navigable navigable, URL url, 문자열 cspNavigationType, POST resource 또는 문자열 또는 null documentResource가 주어졌을 때:
  1. 단언: 이 단계는 병렬로 실행 중임.

  2. 다음 조건 중 하나라도 만족하면:

    • navigable최상위 traversable이 아님;

    • navigableprerendering traversable임;

    • navigablefenced frame임;

      fenced frame navigable 개념은 아직 정의되지 않았으며 정의되면 링크 필요.

    • cspNavigationType이 "other"가 아님;

    • documentResource가 null이 아님

    이 경우 null을 반환.

  3. predecessorDocumentnavigableactive document로 둔다.

  4. cutoffTime을 null로 둔다.

  5. while true:

    1. completeRecord = 매칭되는 프리렌더 프리페치 기록 찾기(predecessorDocument, url) 결과.

    2. completeRecord가 null이 아니라면 return completeRecord

    3. potentialRecords를 빈 list로 둔다.

    4. recordpredecessorDocumentprefetch records에서 반복:

      1. 아래 조건을 모두 만족하면 append record to potentialRecords:

    5. potentialRecordsempty이면 null을 반환

    6. predecessorDocumentprefetch records의 어떤 record의 prerendering traversableongoing navigation이 변할 때까지 기다림

    7. cutoffTime이 null이고 potentialRecords 중 일부의 prerendering traversableactive documentis initial about:blank가 false이면 cutoffTime현재 고해상도 시각(predecessorDocumentrelevant global object)로 설정

navigate 알고리즘에 패치를 적용하여, 일반적인 네비게이션 대신 prerendering traversable의 활성화를 허용합니다.

navigate에서, 병렬 실행 이후 첫 단계로 아래를 삽입하세요:
  1. record = 매칭되는 프리렌더 프리페치 레코드 대기(navigable, url, cspNavigationType, documentResource) 결과.

  2. record가 null이 아니면:

    1. matchingPrerenderedNavigable = recordprerendering traversable.

    2. startingURL = recordURL.

    3. 활성화(matchingPrerenderedNavigable, navigable, historyHandling, startingURL, url, navigationId).

    4. 이 단계들 종료.

패칭을 통한 네비 파라미터 생성에서 알고리즘 상단에 아래 단계를 추가하세요:
  1. initiatorOriginentrydocument stateinitiator origin으로 둔다.

아래 부분, "while true:" 첫 서브스텝 이후에 아래 단계들을 추가합니다:

  1. navigableprerendering navigable이고, currentURLorigininitiatorOriginsame site가 아니면:

    1. navigable최상위 traversable이면 null 반환.

    2. 그 외, navigabletop-level traversableactive document프리렌더링 중 교차 오리진 iframe 내비 허용이 false라면, 사용자 에이전트는 navigableloading mode가 "normal"이 될 때까지 이 알고리즘을 대기해야 한다. 대기 중(즉시 포함) 언제든지 destroy navigabletop-level traversable 및 이 알고리즘에서 null 반환 선택가능.

알고리즘 마지막 부분, locationURL 체크 이후 아래 단계를 추가합니다:

  1. navigableprerendering navigable이고, responseOrigininitiatorOriginsame origin이 아니면:

    1. loadingModes응답의 지원 loading mode 얻기 결과로 둔다.

    2. loadingModes에 `credentialed-prerender`가 없으면 null 반환.

      향후 uncredentialed-prerender 토큰도 허용할 수 있으나, 이는 교차사이트용이라 아직 실명세/구현 없음. 현스펙 기준 해당 토큰만 있으면 prerender 실패.

Document 객체 생성 및 초기화에서, "If navigationParams’s response has a Refresh header, then:" 뒤에 아래 단계를 추가하세요:
  1. navigationParamsnavigableprerendering navigable이면:

    1. loadingModes응답의 지원 로딩 모드 얻기 결과로 둔다.

    2. loadingModes에 `prerender-cross-origin-frames`가 있으면 document프리렌더링 중 교차 오리진 iframe 내비 허용을 true로 설정.

히스토리 엔트리의 문서 채우기 시도 알고리즘에서, failure 값을 설정하는 단계들 이후, 그 값을 참조하는 단계들 보다 앞에 아래를 추가하세요:
  1. navigableprerendering navigable이고 아래 중 하나라도 해당하면:

    이라면:

    1. destroy navigabletop-level traversable.

    2. return.

  2. navigableprerendering traversable이고, navigableprerender 초기 응답 search variance가 null이면:

    1. navigableprerender 초기 응답 search varianceURL search variance 취득(navigationParamsresponse) 결과로 설정.

외부 소프트웨어로 넘기기 알고리즘 맨 앞에 다음을 추가하세요:
  1. navigableprerendering navigable이면 외부 소프트웨어 패키지를 호출하지 않고 return.

리다이렉트 대신 활성화를 허용할 수도 있지만, 이는 복잡성 증가 및 미구현으로 이번엔 포함하지 않음.

3.3. 단순 세션 히스토리 유지

navigate 알고리즘을 패치하여 prerendering navigable의 세션 히스토리가 항상 단순하게 유지되도록, 모든 단계들보다 앞에 아래 단계를 추가하세요:
  1. navigableprerendering navigable이면 historyHandling을 "replace"로 설정.

URL 및 히스토리 갱신 단계에 아래 단계를 1단계 이후에 추가하세요:
  1. navigableprerendering navigable이면 historyHandling을 "replace"로 설정.

3.4. 워커 수명과의 상호작용

The worker’s lifetime에서 active needed worker 정의를 수정해서, prerendering navigable 오너가 있으면 active로 취급하지 않도록 합니다:

워커는 active needed worker라 불리려면 오너 중 하나가 Document 객체이고, 해당 fully active이며 그 node navigableprerendering navigable이 아닌 경우, 또는 active needed workers 중 하나일 때이다.

즉, 워커 스크립트는 로드되지만, 문서가 활성화될 때까지 실행은 일시중지된다.

3.5. Document 폐기 시 정리

Documentdestroy 알고리즘에 아래 단계를 추가하세요:

  1. 비움: documentpost-prerendering activation steps list.

4. 다른 명세 및 개념과의 상호작용

4.1. Page Visibility와의 상호작용

prerendering navigables의 문서는 항상 visibility state가 "hidden"이다.

아마 document.prerendering와 마찬가지로 이 값도 명시적으로 업데이트해야 할 것 같다.

4.2. 시스템 포커스와의 상호작용

Prerendering traversablessystem focus를 가지지 않는다.

4.3. PerformanceNavigationTiming 인터페이스 확장

PerformanceNavigationTiming 인터페이스를 아래와 같이 확장합니다:

partial interface PerformanceNavigationTiming {
    readonly attribute DOMHighResTimeStamp activationStart;
};

activationStart getter 단계는 다음과 같습니다:

  1. thisrelevant global object연관 Documentactivation start time을 반환한다.

4.4. 클라이언트 힌트 캐시와의 상호작용

Accept-CH cache는 사용자 에이전트가 전역 스토리지로 소유하는데, 프리렌더링 중엔 변경되지 않고, 활성화 후에는 올바르게 업데이트되어야 함을 보장해야 함. 아래 수정으로 이를 달성.

prerendering navigableprerender-scoped Accept-CH cache를 가지며, ordered map 형식으로 origin에서 client hints sets으로 매핑된다.

이 구조는 각 origin별로 받은 client hints를 저장하고, 활성화 시 글로벌 Accept-CH cache로 복사한다.

update the client hints set from cache 알고리즘에서 두 번째 단계를 아래 단계들로 대체합니다.
  1. navigablesettingsObjectglobal objectnavigable로 둔다.

  2. originMatchingEntriesAccept-CH cache에서 originsettingsObjectoriginsame origin인 엔트리로 둔다.

  3. navigableprerendering navigable이라면:

    1. prerenderAcceptClientHintsCachenavigableprerender-scoped Accept-CH cache로 둔다.

    2. originsettingsObjectorigin으로 둔다.

    3. prerenderAcceptClientHintsCache[origin]이 존재하면 originMatchingEntriesprerenderAcceptClientHintsCache 안에서 originoriginsame origin인 엔트리로 둔다.

create or override the cached client hints set 알고리즘에서 마지막 단계를 아래와 같이 수정합니다.
  1. navigablesettingsObjectglobal objectnavigable로 둔다.

  2. navigableprerendering navigable이면 set navigableprerender-scoped Accept-CH cache[origin]에 hintSet을 설정.

  3. 그 외에는 set Accept-CH cache[origin]에 hintSet을 설정.

4.5. Clear Site Data와의 상호작용

Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field에 아래 헤더 값 설명을 추가하세요:

"prerenderCache"

"prerenderCache" 타입은 서버가 특정 origin이 시작한 모든 prerender를 responseURL 기준으로 삭제하고자 함을 나타낸다.

이 타입은 "cache" 타입의 하위셋입니다.

구현 상세는 아래를 참고.

parse response’s Clear-Site-Data header의 파싱 단계에서 아래와 같이 수정하세요:

clear site data for response의 switch 문에, "prerenderCache" 케이스를 추가하고 clear prerender cache(origin)을 호출합니다.

프리렌더 캐시 비우기(origin origin)는 아래를 수행:
  1. top-level traversable traversable을 사용자 에이전트의 top-level traversable 집합에서 반복:

    1. navigablestraversableactive document모든 자식 navigable로 둔다.

    2. navigablenavigables에서 반복:

      1. activeDocumentnavigableactive document로 둠.

      2. activeDocumentoriginoriginsame origin이 아니면 continue

      3. prefetchRecordactiveDocumentprefetch records에서 반복:

        1. prefetchRecordprerendering traversable 이 null이면 continue

        2. Cancel and discard prefetchRecord(activeDocument).

4.6. Fetch와의 상호작용

HTTP-network-or-cache fetch를 수정하여, 기존에 `Sec-Purpose`를 설정하는 단계 다음에 다음 단계를 추가합니다:
  1. 그렇지 않으면, httpRequestclientenvironment settings object이고 그 global objectWindow이며, 그 Windownavigableprerendering navigable인 경우:

    1. purposeList로 하고, 그 안에 Token prefetch를 포함시킵니다.

    2. "prerender"라는 키와 값이 true인 파라미터를 purposeprefetch 토큰에 추가합니다.

    3. 구조화 필드 값 설정을 호출하여 (`Sec-Purpose`, purpose)를 httpRequestheader list에 설정합니다.

    이것은 프리렌더링 navigable 내의 서브리소스뿐만 아니라, 프리렌더링 navigable 자체가 내비게이션 중인 경우도 포함합니다.

5. `Supports-Loading-Mode` HTTP 응답 헤더

다음 절은 [HTML]Loading web pages 절의 하위절로 추가됩니다.

일부 경우, 교차 출처 웹 페이지는 새로운 컨텍스트에서 로드되도록 준비되어 있지 않을 수 있습니다. 그런 경우에 해당 페이지가 그러한 로딩 방식에 옵트인할 수 있도록, `Supports-Loading-Mode` HTTP 응답 헤더를 사용할 수 있습니다. 이 헤더는 structured header이며; 존재할 경우 그 값은 아래 열거된 하나 이상의 tokens이어야 합니다.

파싱은 실제로 list of tokens로 수행되며, 알 수 없는 토큰은 무시됩니다.

The `credentialed-prerender` 토큰은, 응답이 교차-출처 동일 사이트 리퍼러에 의해 시작된 경우에도 해당 응답을 사용하여 prerendering navigable을 만들 수 있음을 나타냅니다. 이 옵트인이 없으면, 그러한 프리렌더는 § 3.2 Navigation fetch changes에서 설명한 대로 실패합니다.

The `prerender-cross-origin-frames` 토큰은 응답이 모든 교차-출처 iframe을 프리렌더링하는 데 사용될 수 있음을 나타냅니다. 이 옵트인이 없으면, 그러한 프리렌더는 § 3.2 Navigation fetch changes에서 설명한 대로 연기됩니다.

응답에 대한 지원되는 로딩 모드 얻기response response에 대해 다음과 같이 동작합니다:

  1. responsenetwork error이면, 빈 리스트를 반환합니다.

  2. slmHeadergetting a structured field value 호출로부터 얻습니다; 인자로는 `Supports-Loading-Mode`와 "list" 그리고 responseheader list입니다.

  3. slmHeader의 요소 중 tokens인 모든 요소를 포함하는 list를 반환합니다.

6. 침해성 동작 방지

여러 동작들이 prerendering navigables에서 금지됩니다. 이는 프리렌더된 콘텐츠가 사용자가 적극적으로 상호작용하는 상태가 아니므로 사용자에게 침해적일 수 있기 때문입니다.

6.1. 스크립트 실행 일시정지

만약 navigablescripting mode가 "blocked-until-activation"이면, 사용자 에이전트는 그 navigable의 active document에서 스크립트를 실행해서는 안 됩니다. 이에는 <script> 요소 실행이 포함되지만 이에 국한되지 않습니다.

스크립트 실행이 어떻게 정확히 차단되고, 다양한 스크립트 관련 작업이 처리되지 않고 큐에 쌓이는지에 대한 메커니즘은 더 자세히 명시할 필요가 있습니다.

이 규정은 페이지가 활성화될 때까지 모든 JavaScript 실행을 실질적으로 일시정지합니다. 인라인 이벤트 핸들러에 대한 예상 동작은 논의 중입니다.

6.2. 리소스 다운로드

download the hyperlink 알고리즘을 수정하여, prerendering navigable 안에서의 다운로드가 활성화가 될 때까지 지연되도록, in parallel로 가는 단계 앞에 다음을 삽입합니다:

  1. subjectnode navigableprerendering navigable이면, 다음 단계를 subjectpost-prerendering activation steps list에 추가하고 반환합니다.

6.3. 사용자 프롬프트

cannot show simple dialogs 알고리즘을, Window window가 주어졌을 때 다음 단계를 맨 앞에 추가합니다:
  1. windownavigableprerendering navigable이면 true를 반환합니다.

print() 메서드 단계들을 수정하여, 다음 단계를 앞에 추가합니다:
  1. thisnavigableprerendering navigable이면 반환합니다.

6.4. 비동기 API 결과 지연

많은 명세들은, 주어진 알고리즘이 prerendering navigable 내에서 호출될 경우 그 작업의 대부분을 그 navigable의 top-level traversable활성화될 때까지 연기하도록 패치되어야 합니다. 많은 명세들이 이벤트 루프 사용에 대해 일관성이 없기 때문에 이를 일관되게 적용하는 것은 까다롭습니다. 그럼에도 불구하고 아래 절들은 우리가 시도한 최선의 방법을 제시합니다.

만약 scripting mode가 "blocked-until-activation"이면, 이러한 알고리즘을 호출하는 스크립트들은 애초에 활성화될 때까지 실행되지 않습니다.

6.4.1. [DelayWhilePrerendering] 확장 속성

비동기 메서드의 동작을 활성화 시까지 지연시키는 보일러플레이트를 추상화하기 위해, [DelayWhilePrerendering]라는 Web IDL 확장 속성을 도입합니다. 이 속성은 주어진 메서드가 활성화 전에 호출되면 즉시 보류 중인 프라미스를 반환하고 아무 것도 하지 않음을 의미합니다. 활성화 시에만 원래 메서드 단계가 실행되어 그 결과로 이전에 반환된 프라미스를 해결하거나 거부합니다.

[DelayWhilePrerendering] 확장 속성은 인자를 받지 않아야 하며, 반환 타입이 프라미스 타입 또는 undefined인 정규 또는 정적 연산에만 나타날 수 있어야 하고, 그 노출 세트는 오직 Window만 포함해야 합니다.

[DelayWhilePrerendering] 확장 속성이 붙은 연산의 메서드 단계는 다음으로 대체됩니다:
  1. realm을 현재 realm으로 둡니다.

  2. 만약 해당 연산이 regular operation이면, realmthis의 relevant realm으로 설정합니다.

  3. realmglobal objectnavigableprerendering navigable이면:

    1. promiserealm에서 생성된 새로운 프라미스로 합니다.

    2. 다음 단계들을 thispost-prerendering activation steps list에 추가합니다:

      1. result를, 동일한 this와 인자들로 원래 명시된 이 연산의 단계들을 실행한 결과로 둡니다.

      2. Resolvepromiseresult로 해결합니다.

    3. 만약 이 연산의 return type이 프라미스 타입이면, promise를 반환합니다.

  4. 그렇지 않으면, 동일한 this와 인자들로 원래 명시된 단계들을 실행한 결과를 반환합니다.

6.4.2. Service Workers

[DelayWhilePrerendering]update(), unregister(), register(scriptURL, options), postMessage(message, transfer), 및 postMessage(message, options) 에 추가합니다.

이는 프리렌더된 페이지가 기존 서비스 워커를 활용할 수 있게 하지만, 서비스 워커 등록 상태에는 어떠한 영향도 주지 않도록 합니다.

6.4.3. BroadcastChannel

[DelayWhilePrerendering]postMessage() 에 추가합니다.

6.4.4. 지오로케이션 API

getCurrentPosition() 메서드 단계를 수정하여, 다음 단계를 가장 앞에 추가합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면, 다음 단계를 thispost-prerendering activation steps list에 추가하고 return.

watchPosition() 메서드 단계를 수정하여, 다음 단계를 가장 앞에 추가합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면:

    1. watchId구현자 정의 unsigned long으로 두고, 이를 post-prerendering activation 지오로케이션 watch 프로세스 ID로 기록합니다.

    2. 다음 단계를 thispost-prerendering activation steps list에 추가하되, 생성된 watchId를 그 ID로 사용하게 하고 watchId를 반환합니다.

clearWatch(watchId) 메서드 단계를 수정하여, 다음 단계를 가장 앞에 추가합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면:

    1. watchIdpost-prerendering activation 지오로케이션 watch 프로세스 ID이면, 해당 단계들을 thispost-prerendering activation steps list에서 제거합니다.

    2. return.

6.4.5. 웹 시리얼 API

[DelayWhilePrerendering]requestPort() 에 추가하세요.

TODO: 아래는 일반화된 [DelayWhilePrerendering] 를 dedicated worker에서 owner document를 이용해 지원하면 쉽게 처리될 듯하다.

getPorts() 메서드 단계를 수정하여, promise가 생성된 직후 바로 다음에 아래 단계를 삽입하세요:
  1. documentthisrelevant global objectassociated Document로 두거나, thisrelevant global objectDedicatedWorkerGlobalScope면 owner document로 둡니다.

  2. document가 null이면, a promise rejected with "SecurityError" DOMException을 반환.

  3. documentnode navigableprerendering navigable이면, 아래 단계들을 documentpost-prerendering activation steps list에 추가하고 promise를 반환.

6.4.6. 알림 API

[DelayWhilePrerendering]requestPermission() 에 추가하세요.

Notification() 생성자 단계를 수정하여, in parallel로 가는 단계를 아래로 교체합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면, 아래 단계들을 thispost-prerendering activation steps list에 추가합니다. 그렇지 않으면 아래 단계를 in parallel로 실행합니다.

permission static getter 단계를 바꾸어 아래 단계로 대체합니다:
  1. current global objectnavigableprerendering navigable이면 "default"를 반환한다.

    이렇게 하면 구현체가 실제 permission 값을 동기적으로 조회하지 않아도 되고, 특히 prerendering navigable 경우 권한 상태를 바로 확인 못해도 됨. 웹 개발자는 Notification.requestPermission()을 사용할 수 있고, 위 변경에 따라 실질 처리는 활성화 후에만 됨. 그때 permission이 진짜 "granted" 또는 "denied"임이 드러날 수 있고, 일반 "default"와 달리 진짜로 유저에게 묻지 않을 수도 있지만, 웹 개발자 코드에선 볼 수 없으니 문제 없음.

  2. 그 외에는 알림 permission 상태 가져오기를 반환한다.

6.4.7. 웹 MIDI API

[DelayWhilePrerendering]requestMIDIAccess() 에 추가하세요.

6.4.8. Idle Detection API

[DelayWhilePrerendering]start() 에 추가하세요.

다른 주요 메서드인 IdleDetector.requestPermission()transient activation에 의존하지만, 명시 origin에 permission이 이미 부여됐더라도 프리렌더링 중엔 idle detector 시작을 지연시킴.

6.4.9. Generic Sensor API

start() 메서드 단계를 "state를 activating로 변경" 바로 뒤에 아래 단계를 삽입하세요:
  1. thisrelevant global objectnavigableprerendering navigable이면, 다음 단계들을 thispost-prerendering activation steps list에 추가하고 return.

  2. this.[[state]] 가 "idle"이면 return.

    프리렌더 지연 중 stop() 호출 시, 활성화 때는 아무 일도 안 함.

  3. 단언: this.[[state]] 가 "activating"임.

6.4.10. Web NFC

[DelayWhilePrerendering]write()scan() 에 추가하세요.

6.4.11. 배터리 상태 API

getBattery() 메서드 단계를 수정하여, 다음 단계를 가장 앞에 추가합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면, 아래 단계를 thispost-prerendering activation steps list에 추가하고 this.[[BatteryPromise]] 를 반환.

6.4.12. 스크린 오리엔테이션 API

apply orientation lock 알고리즘 단계를, in parallel 이전의 첫 단계들로 아래와 같이 교체하세요:
  1. promise를 새 promise로 둔다.

  2. thisrelevant global objectnavigableprerendering navigable이면, 아래 단계를 thispost-prerendering activation steps list에 추가하고 promise 반환.

  3. user agent가 스크린 오리엔테이션 lock 지원이 안 되면, reject(promise, "NotSupportedError" DOMException) 하고 promise 반환.

  4. 해당 documentactive sandboxing flag setsandboxed orientation lock browsing context flag가 있거나, user agentpre-lock 조건을 만족하지 않으면, reject(promise, "SecurityError" DOMException) 하고 promise 반환.

  5. document의 [[orientationPendingPromise]]를 promise로 설정.

[DelayWhilePrerendering]unlock() 에 추가하세요.

이 마지막 수정은 screen.orientation.lock() 다음에 screen.orientation.unlock() 호출 시 예상되는 결과가 나오도록 보장한다.

6.4.13. 게임패드

getGamepads() 메서드 단계를 수정하여 아래 단계를 가장 앞에 추가합니다:
  1. thisrelevant global objectnavigableprerendering navigable이면, 빈 시퀀스를 반환합니다.

gamepadconnectedgamepaddisconnected 이벤트에 대한 설명을 수정하여, Window 객체의 navigableprerendering navigable인 경우에는 이러한 이벤트를 dispatch하지 않아야 함을 명시합니다.

gamepadconnected 섹션을 다음과 같이 갱신하여, 모든 Document documentpost-prerendering activation steps list에 아래 단계를 추가합니다:
  1. document가 "gamepad" 기능을 allowed to use하고, documentrelevant settings objectsecure context이며, 연결된 게임패드가 있을 때, 각 연결된 게임패드에 대해 gamepadconnected 이벤트를 발생(documentrelevant global object 대상, GamepadEvent 사용, gamepad 속성은 연결된 게임패드 정보를 가진 Gamepad 새 객체로 초기화).

6.4.14. 암호화 미디어 확장(EME)

[DelayWhilePrerendering]requestMediaKeySystemAccess() 에 추가합니다.

6.4.15. 미디어 자동재생

playing the media resource 구간을 수정하여, HTMLMediaElementcurrent playback positionDocumentprerendering 상태가 아닐 때만 단조롭게 증가하도록 명시하세요.

6.4.16. 미디어 캡처 및 스트림

[DelayWhilePrerendering]getUserMedia(), getUserMedia()enumerateDevices() 에 추가합니다.

MediaDevices 섹션 내 디바이스 변경 알림 단계의 가장 앞에 아래 단계를 추가하세요:
  1. thisrelevant global objectnavigableprerendering navigable이면 return.

6.4.17. Web Audio API

명세에서는 allowed to start라는 개념을 사용하지만, 자세한 동작은 구현자 정의 상태입니다. 프리렌더링 중 자동 재생을 막으려면 AudioContext 인터페이스 섹션에 아래 규칙을 추가하세요.

AudioContext 는 프리렌더링 중엔 allowed to start 상태가 될 수 없습니다.

또한 AudioContext() 생성자 단계에서, 객체 반환 전 아래 단계를 수행합니다.

  1. 만약 context가 오직 프리렌더링으로 인해 allowed to start가 아니라면, 아래 단계들을 contextpost-prerendering activation steps list에 추가합니다.

    1. [[control thread state]]context에 대해 running으로 설정하세요.

    2. control 메시지 queue를 생성하여 context의 resume을 큐에 넣으세요.

개발자가 프리렌더링 중 resume() 을 호출할 수 있습니다. 이런 경우 context는 allowed to start가 아니어서 위에서 Promise[[pending resume promises]] 에 넣어두었다가, 위 활성화 단계에서 resolve 됩니다.

AudioScheduledSourceNode 인터페이스의 start(when)AudioBufferSourceNodestart(when, offset, duration)[[control thread state]] 를 변경할 수 있지만, context가 allowed to start가 아니면 알고리즘에서 해당 상태 변경이 이루어지지 않습니다. 이는 context가 시작될 때 node가 자동으로 시작될 수 있으므로 별 문제가 되지 않습니다.

6.4.18. 오디오 출력 장치 API

[DelayWhilePrerendering]selectAudioOutput() 에 추가하세요.

6.4.19. 푸시 API

[DelayWhilePrerendering]subscribe() 에 추가하세요.

6.4.20. 백그라운드 fetch

[DelayWhilePrerendering]fetch() 에 추가하세요.

6.4.21. 백그라운드 동기화

[DelayWhilePrerendering]register() 에 추가하세요.

6.4.22. 스토리지 API

[DelayWhilePrerendering]persist() 에 추가하세요.

6.4.23. WebUSB API

[DelayWhilePrerendering]getDevices()requestDevice() 에 추가하세요.

6.4.24. Web Bluetooth

[DelayWhilePrerendering]getDevices()requestDevice() 에 추가하세요.

6.4.25. WebHID API

[DelayWhilePrerendering]getDevices()requestDevice() 에 추가하세요.

6.4.26. WebXR 장치 API

[DelayWhilePrerendering]requestSession() 에 추가하세요.

6.4.27. 자격 증명 관리

[DelayWhilePrerendering]get(), store(), create() 에 추가하세요.

6.4.28. 웹 음성 API

[DelayWhilePrerendering]speak(utterance), cancel(), pause(), resume() 에 추가하세요.

[DelayWhilePrerendering]start(), stop(), abort() 에 추가하세요.

6.4.29. 웹 락 API

[DelayWhilePrerendering]request(name, callback), request(name, options, callback), query() 에 추가하세요.

6.4.30. 커스텀 스킴 핸들러

registerProtocolHandler(scheme, url) 메서드 단계를 수정하여, in parallel 가기 전 단계들을 아래로 교체합니다:
  1. (normalizedScheme, normalizedURLString)을 normalize protocol handler parameters (scheme, url, thisrelevant settings object) 결과로 둡니다.

  2. thisrelevant global objectnavigableprerendering navigable이면, 아래 단계를 thispost-prerendering activation steps list에 추가하고 return.

unregisterProtocolHandler(scheme, url) 메서드 단계를 수정하여, in parallel 가기 전 단계들을 아래와 같이 교체하세요:
  1. (normalizedScheme, normalizedURLString)을 normalize protocol handler parameters(scheme, url, thisrelevant settings object) 결과로 둡니다.

  2. thisrelevant global objectnavigableprerendering navigable이면, 아래 단계를 thispost-prerendering activation steps list에 추가하고 return.

6.5. 암묵적으로 제한된 API

일부 API는 별도의 수정이 필요하지 않습니다. 왜냐하면 prerendering navigable이나 그 active window, 또는 active document가 결코 갖지 않는 속성이 없으면 자동으로 실패하거나 no-op 동작을 하기 때문입니다. 이런 속성에는 다음이 포함됩니다:

어떤 API들이 점검(감사) 되었는지 보이기 위해, 여기 확인된 API들을 나열합니다.

transient activation 또는 sticky activation이 필요한 API:

system focus가 필요한 API:

"visible" visibility state가 필요한 API:

보다 복잡한 경우:

7. 보안 고려사항

HTML § 7.6.5 Security considerations를 참고하세요.

No-Vary-Search와 함께 쓸 경우의 명세 통합 보안 고려는 No-Vary-Search Security considerations를 참고하세요.

prerendering에 고유한 보안 사항을 별도로 추가해야 합니다. issue #319 참조.

8. 프라이버시 고려사항

HTML § 7.6.6 Privacy considerations를 참고하세요.

No-Vary-Search와 함께 쓸 경우의 명세 통합 프라이버시 고려는 No-Vary-Search Privacy considerations를 참고하세요.

prerendering 전용 프라이버시 고려를 별도로 추가해야 합니다. issue #319 참조. 한 가지 특히 주목할 점은 cross-partition prerendering이 프라이버시 복잡성 때문에 그냥 금지되어 있다는 것입니다.

색인

이 명세서에서 정의한 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[AUDIO-OUTPUT]
Guido Urdaneta; youenn fablet. Audio Output Devices API. URL: https://w3c.github.io/mediacapture-output/
[BACKGROUND-FETCH]
Background Fetch. Draft Community Group Report. URL: https://wicg.github.io/background-fetch/
[BACKGROUND-SYNC]
Web Background Synchronization. Draft Community Group Report. URL: https://wicg.github.io/background-sync/spec/
[BATTERY-STATUS]
Anssi Kostiainen. Battery Status API. URL: https://w3c.github.io/battery/
[CLEAR-SITE-DATA]
Mike West. Clear Site Data. URL: https://w3c.github.io/webappsec-clear-site-data/
[CLIENT-HINTS-INFRASTRUCTURE]
Client Hints Infrastructure. Draft Community Group Report. URL: https://wicg.github.io/client-hints-infrastructure/
[CLIPBOARD-APIS]
Rakesh Goulikar; Rohan Raja. Clipboard API and events. URL: https://w3c.github.io/clipboard-apis/
[CONSOLE]
Dominic Farolino; Robert Kowalski; Terin Stock. Console Standard. Living Standard. URL: https://console.spec.whatwg.org/
[CREDENTIAL-MANAGEMENT-1]
Nina Satragno; Marcos Caceres. Credential Management Level 1. URL: https://w3c.github.io/webappsec-credential-management/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ENCRYPTED-MEDIA-2]
Joey Parrish; Greg Freedman. Encrypted Media Extensions. URL: https://w3c.github.io/encrypted-media/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[FILE-SYSTEM-ACCESS]
File System Access. Draft Community Group Report. URL: https://wicg.github.io/file-system-access/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[GAMEPAD]
Steve Agoston; Matthew Reynolds. Gamepad. URL: https://w3c.github.io/gamepad/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. URL: https://w3c.github.io/sensors/
[GEOLOCATION]
Marcos Caceres; Reilly Grant. Geolocation. URL: https://w3c.github.io/geolocation/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HTML]
Anne van Kesteren; 등. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[IDLE-DETECTION]
Reilly Grant. Idle Detection API. CG-DRAFT. URL: https://wicg.github.io/idle-detection/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[KEYBOARD-LOCK]
Keyboard Lock. Draft Community Group Report. URL: https://wicg.github.io/keyboard-lock/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; 등. Media Capture and Streams. URL: https://w3c.github.io/mediacapture-main/
[NAVIGATION-TIMING-2]
Yoav Weiss; Noam Rosenthal. Navigation Timing Level 2. URL: https://w3c.github.io/navigation-timing/
The No-Vary-Search HTTP Response Header Field. Editor's Draft. URL: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-no-vary-search
[NOTIFICATIONS]
Anne van Kesteren. Notifications API Standard. Living Standard. URL: https://notifications.spec.whatwg.org/
[PAYMENT-REQUEST]
Marcos Caceres; Ian Jacobs; Stephen McGruer. Payment Request API. URL: https://w3c.github.io/payment-request/
[PICTURE-IN-PICTURE]
Francois Beaufort. Picture-in-Picture. URL: https://w3c.github.io/picture-in-picture/
[POINTERLOCK-2]
Mustaq Ahmed; Vincent Scheib. Pointer Lock 2.0. URL: https://w3c.github.io/pointerlock/
[PREFETCH]
Prefetch. Draft Community Group Report. URL: https://wicg.github.io/nav-speculation/prefetch.html
[PRESENTATION-API]
Mark Foltz. Presentation API. URL: https://w3c.github.io/presentation-api/
[PUSH-API]
Marcos Caceres; Kagami Rosylight. Push API. URL: https://w3c.github.io/push-api/
[RFC8941]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. February 2021. Proposed Standard. URL: https://httpwg.org/specs/rfc8941.html
[SCREEN-CAPTURE]
Jan-Ivar Bruaroey; Elad Alon. Screen Capture. URL: https://w3c.github.io/mediacapture-screen-share/
[SCREEN-ORIENTATION]
Marcos Caceres. Screen Orientation. URL: https://w3c.github.io/screen-orientation/
[SCREEN-WAKE-LOCK]
Kenneth Christiansen; Marcos Caceres. Screen Wake Lock API. URL: https://w3c.github.io/screen-wake-lock/
[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/
[SERIAL]
Web Serial API. Editor's Draft. URL: https://wicg.github.io/serial/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[SPEECH-API]
Web Speech API. Draft Community Group Report. URL: https://webaudio.github.io/web-speech-api/
[STORAGE]
Anne van Kesteren. Storage Standard. Living Standard. URL: https://storage.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEB-BLUETOOTH]
Jeffrey Yasskin. Web Bluetooth. URL: https://webbluetoothcg.github.io/web-bluetooth/
[WEB-LOCKS]
Kagami Rosylight. Web Locks API. URL: https://w3c.github.io/web-locks/
[WEB-NFC]
Web NFC API. Draft Community Group Report. URL: https://w3c.github.io/web-nfc/
[WEB-SHARE]
Marcos Caceres; Eric Willigers; Matt Giuca. Web Share API. URL: https://w3c.github.io/web-share/
[WEBAUDIO-1.0]
Paul Adenot; Hongchan Choi. Web Audio API. URL: https://webaudio.github.io/web-audio-api/
[WEBCRYPTO-2]
Daniel Huigens. Web Cryptography Level 2. URL: https://w3c.github.io/webcrypto/
[WEBDRIVER-BIDI]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/
[WEBHID]
WebHID API. Draft Community Group Report. URL: https://wicg.github.io/webhid/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBMIDI]
Chris Wilson; Michael Wilson. Web MIDI API. URL: https://webaudio.github.io/web-midi-api/
[WEBUSB]
WebUSB API. Draft Community Group Report. URL: https://wicg.github.io/webusb/
[WEBXR]
Brandon Jones; Manish Goregaokar; Rik Cabanier. WebXR Device API. URL: https://immersive-web.github.io/webxr/

비규범적 참고 문헌

[POINTERLOCK]
Vincent Scheib. Pointer Lock. URL: https://w3c.github.io/pointerlock/

IDL 색인

partial interface Document {
    readonly attribute boolean prerendering;

    // Under "special event handler IDL attributes that only apply to Document objects"
    attribute EventHandler onprerenderingchange;
};

partial interface PerformanceNavigationTiming {
    readonly attribute DOMHighResTimeStamp activationStart;
};

이슈 색인

fenced frame navigable의 개념이 아직 정의되지 않았으나, 정의 시 링크해야 합니다.
prerendering에 특화된 보안 고려사항을 추가해야 합니다. issue #319.
prerendering에 특화된 프라이버시 고려사항을 추가해야 합니다. issue #319. 특히 주목할 점은 프라이버시 복잡성 때문에 cross-partition prerendering이 단순 금지된다는 것입니다.