Copyright © 2021-2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 문서는 Screen Capture API [screen-capture]의 확장인
getViewportMedia를 사용하여 브라우저 뷰포트를 미디어 스트림의 소스로 사용할 수 있는 방법을 정의한다.
이 절은 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 찾을 수 있다.
이 문서는 완성된 것이 아니다.
이 문서는 Web Real-Time Communications Working Group이 Recommendation 트랙을 사용하여 워킹 드래프트로 발행했다.
워킹 드래프트로 발행되었다고 해서 W3C와 그 회원이 지지한다는 의미는 아니다.
이는 초안 문서이며 언제든지 다른 문서에 의해 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.
이 문서는 W3C Patent Policy에 따라 운영되는 그룹에 의해 작성되었다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 그 페이지에는 특허 공개를 위한 지침도 포함되어 있다. 개인이 자신이 실제로 알고 있는 특허가 Essential Claim(s)을 포함한다고 믿는 경우, 그 개인은 W3C Patent Policy의 6절에 따라 해당 정보를 공개해야 한다.
이 문서는 2023년 11월 03일 W3C Process Document의 적용을 받는다.
이 절은 비규범적이다.
이 문서는 Screen Capture API [screen-capture]의 확장으로, 브라우저 뷰포트(현재 탭)를 비디오 트랙 형태로 획득할 수 있게 하는 기능을 설명한다. 경우에 따라 탭 오디오도 오디오 트랙 형태로 캡처된다. 이를 통해 진행 중인 WebRTC [WEBRTC] 화상 회의를 녹화하거나, 화상 회의 중인 사용자가 프레젠테이션을 선택기에서 찾지 않고 대신 프레젠테이션 애플리케이션의 버튼을 클릭하여 공유하는 등의 사용 사례를 가능하게 한다.
이 기능은 "크로스 오리진 격리" 문서에서만 사용할 수 있다. 이는 애플리케이션이 이 API를 사용하여, 사용자 에이전트 샌드박스가 제공하는 보호로 인해 접근 불가능해야 하는 다른 오리진의 잠재적 기밀 정보나 콘텐츠에 접근하는 것을 방지한다.
이 기능은 보안상 영향을 가지며, 권한 프롬프트가 필요하다. 렌더링된 뷰포트를 공유하면 링크 보라색 표시를 통한 브라우징 이력, 양식 자동완성과 같은 사용자 에이전트 또는 웹 확장 기능을 통한 주소나 결제 정보 같은 개인 정보, 또는 글꼴 크기와 같은 개인 선호가 노출될 수 있다.
비규범적이라고 표시된 절뿐 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적이다. 그 밖의 모든 것은 규범적이다.
이 문서의 키워드 MAY, MUST, 및 MUST NOT는 모두 대문자로 표시된 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석된다.
이 명세는 단일 제품, 즉 여기에 포함된 인터페이스를 구현하는 사용자 에이전트에 적용되는 적합성 기준을 정의한다.
ECMAScript [ECMA-262]를 사용하여 이 명세에 정의된 API를 구현하는 구현은, 이 명세가 Web IDL 명세 [WEBIDL]와 그 용어를 사용하므로, Web IDL 명세에 정의된 ECMAScript 바인딩과 일관된 방식으로 이를 구현해야 한다.
다음 예제는 이 문서에 정의된
navigator.mediaDevices.getViewportMedia 메서드를 사용하여 뷰포트 캡처를 요청하는 것을 보여준다.
try {
const stream = await navigator.mediaDevices.getViewportMedia();
videoElement.srcObject = stream;
} catch (e) {
console.log('Unable to acquire viewport capture: ' + e);
}
이 문서는 [GETUSERMEDIA]의 MediaStream, MediaStreamTrack,
MediaStreamConstraints
및
ConstrainablePattern의
정의와,
[screen-capture]의
표시 표면
및 브라우저 표시 표면의 정의를 사용한다.
뷰포트의 캡처는 getViewportMedia 메서드를
MediaDevices 인터페이스에 새로 추가함으로써 가능해진다. 이는 getDisplayMedia()와
유사하지만,
사용자를 선택기에 표시하는 대신 권한 프롬프트를 사용하여
최상위 문서의 뷰포트(현재 탭)만 캡처한다. 보안상의 이유로,
document-policy로 옵트인한 "크로스 오리진 격리" 문서에서만 작동한다.
WebIDLpartial interface MediaDevices {
Promise<MediaStream> getViewportMedia(
optional DisplayMediaStreamOptions options = {});
};
getViewportMedia
사용자에게 뷰포트(현재 탭)를 실시간 캡처할 권한을 요청한다.
사용자 에이전트는 권한이 부여된 후 생성된 미디어에 제공된 options를 MUST 적용해야 한다.
오디오의 경우, 사용자 에이전트는 가능한 경우 캡처에 현재 뷰포트의 오디오를
포함하는 옵션을 최종 사용자에게 제시할 수 있다(MAY). 오디오+비디오와 관련하여 getDisplayMedia()와
마찬가지로, 사용자 에이전트는 오디오 제약이 존재하더라도 오디오를 반환하지 않을 수 있다.
사용자 에이전트가 스트림의 수명 동안 오디오가 공유되지 않을 것임을 알고 있다면,
결과 스트림에 오디오 트랙을 포함해서는 안 된다(MUST NOT). 사용자 에이전트는 오디오 및 비디오 요청을
결과 스트림에 비디오 트랙만 반환하여 수락할 수 있으며(MAY),
또는 결과 스트림에 오디오 트랙과 비디오 트랙을 모두 반환하여 수락할 수도 있다(MAY).
사용자 에이전트는 오디오 전용 요청을 거부해야 한다(MUST).
getDisplayMedia()와
마찬가지로,
"granted"
권한은 영속화될 수 없다.
getViewportMedia()
메서드가 호출되면, 사용자 에이전트는 다음 단계를 실행해야 한다(MUST):
현재
설정 객체의 크로스
오리진
격리 기능이 false이면, 거부된 promise를 반환한다. 이 promise는
DOMException
객체로 거부되며, 그
name
속성 값은 SecurityError이다.
관련
전역 객체의 연결된
Document의 최상위
브라우징 컨텍스트의
required document policy에
Require-Document-Policy: viewport-capture 및
Document-Policy: viewport-capture가 포함되어 있지 않으면
(TODO: 올바른 알고리즘 사용), 거부된 promise를 반환한다. 이 promise는
DOMException
객체로 거부되며, 그
name
속성 값은 SecurityError이다.
관련
전역 객체가 this에 대해
일시적
활성화를 가지고 있지 않으면, 거부된 promise를 반환한다. 이 promise는 DOMException
객체로 거부되며, 그 name
속성 값은
InvalidStateError이다.
options를 메서드의 첫 번째 인수로 둔다.
options.video가 false이면, 새로
생성된 TypeError로
거부된 promise를 반환한다.
options에서 값 CS가 딕셔너리인 각 존재하는 멤버에 대해, 다음 단계를 실행한다:
CS에 advanced라는 이름의 멤버가 포함되어 있으면,
새로 생성된 TypeError로
거부된 promise를 반환한다.
CS가
표시
표면에 적용 가능한 제약 가능 속성을 지정하는 이름의 멤버를 포함하고,
그 값이 다시 min 또는
exact라는 이름의 멤버를 포함하는 딕셔너리이면,
새로 생성된 TypeError로
거부된
promise를 반환한다.
CS가
표시
표면에 적용 가능한 제약 가능 속성을 지정하는 이름의 멤버를 포함하고,
그 값이 다시 max라는 이름의 멤버를 포함하는 딕셔너리이며,
그 멤버의 값이 다시 그 제약 가능 속성의 floor
value보다 작으면,
failedConstraint를 그 멤버의 이름으로 두고,
message를 undefined 또는 정보 제공용 사람이 읽을 수 있는 메시지로 둔 다음,
OverconstrainedError(failedConstraint, message)를
호출하여 생성된
새 OverconstrainedError로
promise를
거부한다.
requestedMediaTypes를 options에서
딕셔너리 값 또는 true 값을 가진 미디어 타입의 집합으로 둔다.
관련
전역 객체의 연결된
Document가 완전히
활성이 아니거나
포커스를 가지고 있지 않으면,
거부된 promise를 반환한다. 이 promise는
DOMException
객체로 거부되며, 그 name
속성 값은 InvalidStateError이다.
p를 새 promise로 둔다.
다음 단계를 병렬로 실행한다:
requestedMediaTypes의 각 미디어 타입 T에 대해,
T 타입의 소스가 사용 가능하지 않으면,
reject
p with a new
DOMException
object whose name
attribute has the value NotFoundError.
현재 브라우징 컨텍스트에서 T 타입의 소스를 획득하기 위한
현재 권한
상태를 읽는다. 권한 상태가 "denied"이면,
아래의 권한 실패라고 표시된 단계로 점프한다.
선택적으로, 예를 들어 이전에 설정된 사용자 선호, 보안상의 이유 또는 플랫폼 제한에 따라, 아래의 권한 실패라고 표시된 단계로 점프한다.
사용
권한 요청
을 뷰포트 캡처에 대해 수행한다. 이는
PermissionDescriptor이며,
그
name은
"viewport-capture"로
설정되고, 그 결과 제공된
미디어의 집합이 된다.
제공된 미디어는 정확히 하나의 비디오 트랙을 포함해야 하며(MUST),
이 트랙은 관련
전역 객체의 연결된
Document의 최상위
브라우징 컨텍스트의
뷰포트의
브라우저
표시
표면에 대한 실시간 캡처여야 한다(MUST).
제공된 미디어는 최대 하나의 오디오 트랙을 포함해야 하며(MUST),
제공되는 경우, 그 오디오 트랙은 관련
전역 객체의
연결된
Document의 최상위
브라우징 컨텍스트의 활성
문서와,
관련
전역 객체의 연결된
Document의 최상위
브라우징 컨텍스트의 중첩된 브라우징
컨텍스트들 안에 있는 모든 활성
문서의 합에 의해 생성된 결합 오디오여야 한다(MUST).
이 오디오 트랙은 requestedMediaTypes에 오디오가 지정되지 않았거나
false로 지정된 경우 포함되어서는 안 된다(MUST NOT).
MediaStreamTrack의
소스는
변경되어서는 안 된다(MUST NOT).
요청의 결과가 "granted"이면,
제공된 미디어를 소싱하는 각 디바이스에 대해, 그 디바이스의 안정적이고 비공개인 id인
deviceId를 사용하여,
이미 true가 아니라면 [[devicesLiveMap]][deviceId]를
true로 설정하고, 이미 true가 아니라면
[[devicesAccessibleMap]][deviceId]를
true로 설정한다.
사용자 에이전트는 "granted"
권한 엔트리를 저장해서는 안 된다(MUST NOT).
결과가 "denied"이면,
아래의 권한 실패라고 표시된 단계로 점프한다. 사용자가 응답하지 않으면,
이 알고리즘은 이 단계에서 멈춘다.
사용자가 권한을 부여했지만 OS/프로그램/웹페이지 잠금과 같은 하드웨어 오류가
접근을 방해하면, p를 거부한다. 이때 새
DOMException
객체를 사용하며, 그 name
속성 값은 NotReadableError이고,
이 단계를 중단한다.
결과가 "granted"이지만,
위에 나열된 사유가 아닌 다른 어떤 사유로 디바이스 접근이 실패하면,
p를 거부한다. 이때 새
DOMException
객체를 사용하며, 그
name
속성 값은 AbortError이고,
이 단계를 중단한다.
stream을 사용자가 권한을 부여한
MediaStream
객체로 둔다.
적절한 제약으로 stream의 모든 트랙에 대해
ApplyConstraints
알고리즘을 실행한다. 이것이 실패하면, failedConstraint를
실패한 알고리즘의 결과로 두고,
message를 undefined 또는 정보 제공용
사람이 읽을 수 있는 메시지로 둔 다음,
OverconstrainedError(failedConstraint, message)를
호출하여
생성된 새 OverconstrainedError로
p를 거부한다.
[[Restrictable]]을
true로 설정한다.
p를 stream으로 해결하고 이 단계를 중단한다.
권한 실패: p를 새
DOMException
객체로 거부한다. 그 객체의
name
속성 값은 NotAllowedError이다.
p를 반환한다.
사용자 에이전트는 부분적으로 투명하게 캡처된 표시 표면 뒤의 콘텐츠를 캡처해서는 안 된다(MUST NOT).
사용자 에이전트는 캡처된 탭에서 방출된 오디오 이외의 오디오를 공유해서는 안 되며(MUST NOT), 전체 시스템의 오디오를 공유해서도 안 된다(MUST NOT).
getViewportMedia와 관련된 제약은
getDisplayMedia()와
관련된 제약뿐이며, 이는
5.4 캡처된 표시 표면을 위한 제약 가능 속성에 정의되어 있다.
뷰포트 캡처는 강력한 기능이며,
이름
"viewport-capture"으로
식별되고, 사용하려면 명시적 권한이 필요하다.
Permissions 명세와의 통합에 필요한 대로, 이 명세는 다음을 정의한다:
prompt"
및
"denied"이다.
사용자 에이전트는 이 설명자의 권한 상태를
"granted"로
설정해서는 결코 안 된다(MUST NOT).
이 명세는 문자열 "viewport-capture"로 식별되는
정책 제어 기능을 정의한다.
그 기본
허용 목록은 "self"이다.
문서의 권한
정책은 해당 문서의 어떤 콘텐츠가
getViewportMedia를 사용할 수
있는지를 결정한다.
어떤 문서에서 비활성화되어 있으면, 문서 안의 어떤 콘텐츠도
사용하도록
허용되지 않는다. 대상은 getViewportMedia이다. 이는
사용 권한 요청
알고리즘에 의해 강제된다.
이 명세는
프라이버시 표시기
요구사항을 확장하여,
getDisplayMedia()에
getViewportMedia를 포함한다.
이 절은 정보 제공용이다. 그러나 여기에 포함된 조언을 따르지 않을 경우 플랫폼 보안에 심각한 위험이 발생할 수 있음을 언급한다.
미정.
Referenced in: