픽처 인 픽처

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-picture-in-picture-20251202/
최신 공개 버전:
https://www.w3.org/TR/picture-in-picture/
에디터스 드래프트:
https://w3c.github.io/picture-in-picture/
이전 버전:
히스토리:
https://www.w3.org/standards/history/picture-in-picture/
피드백:
GitHub
에디터:
(Google LLC)
이전 에디터:
(Google LLC)
웹 플랫폼 테스트:
permissions-policy/
picture-in-picture/

요약

이 명세는 웹사이트가 항상 다른 창 위에 떠 있는 비디오 창을 생성할 수 있도록 하는 API를 제공합니다. 이를 통해 사용자는 다른 콘텐츠 사이트나 기기 내의 애플리케이션과 상호작용하면서 미디어를 계속 시청할 수 있습니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 드래프트 색인에서 확인할 수 있습니다.

이 명세에 대한 피드백과 의견을 환영합니다. GitHub Issues에서 이 명세에 관한 논의를 선호합니다. 또는 Media Working Group의 메일링 리스트 public-media-wg@w3.org (아카이브)로 의견을 보낼 수 있습니다. 이 드래프트는 워킹 그룹에서 논의가 필요한 일부 미해결 이슈들을 강조합니다. 이러한 이슈의 결과에 대해, 또는 유효성에 대해 어떠한 결정도 내려지지 않았습니다.

이 문서는 Media Working Group권고안 진행 절차를 이용해 워킹 드래프트로 발행한 것입니다. 이 문서는 W3C 권고안이 되는 것을 목표로 합니다.

워킹 드래프트로 발행되었다고 해서 W3C 및 회원의 지지를 의미하지는 않습니다.

이 문서는 드래프트 문서이며 언제든지 업데이트, 교체 또는 다른 문서에 의해 폐기될 수 있습니다. 이 문서를 진행 중인 작업 외의 용도로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹의 산출물과 관련하여 공개 특허 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 특정 개인이 필수 청구가 포함된 특허를 알고 있다고 생각하는 경우, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.

1. 소개

이 섹션은 규범적이지 않습니다.

많은 사용자는 장치에서 다른 콘텐츠, 사이트 또는 애플리케이션과 상호작용하면서 미디어를 계속 소비하고 싶어합니다. 이러한 활동을 위한 일반적인 UI 편의 기능은 Picture-in-Picture(PiP)로, 비디오가 항상 다른 창 위에 표시되는 별도의 작은 창에 포함됩니다. 이 창은 사용자 에이전트가 표시되지 않아도 계속 보입니다. Picture-in-Picture는 데스크톱 및 모바일 운영체제에서 흔히 볼 수 있는 플랫폼 수준 기능입니다.

이 명세는 HTMLVideoElement 를 확장하여 웹사이트가 다음과 같은 속성 집합을 통해 이 동작을 시작하고 제어할 수 있도록 합니다:

2. 예시

2.1. 커스텀 Picture-in-Picture 버튼 추가

<video id="video" src="https://example.com/file.mp4"></video>

<button id="togglePipButton"></button>

<script>
  const video = document.getElementById("video");
  const togglePipButton = document.getElementById("togglePipButton");

  // Picture-in-Picture가 지원되지 않거나 비활성화된 경우 버튼을 숨깁니다.
  togglePipButton.hidden =
    !document.pictureInPictureEnabled || video.disablePictureInPicture;

  togglePipButton.addEventListener("click", async () => {
    // 아직 Picture-in-Picture에 있는 요소가 없으면 비디오에 대해 요청합니다.
    // 그렇지 않으면 나갑니다.
    try {
      if (document.pictureInPictureElement) {
        await document.exitPictureInPicture();
      } else {
        await video.requestPictureInPicture();
      }
    } catch (err) {
      // 비디오가 Picture-in-Picture 모드로 진입/종료에 실패했습니다.
    }
  });
</script>

2.2. 비디오 Picture-in-Picture 변경 모니터링

<video id="video" src="https://example.com/file.mp4"></video>

<script>
  const video = document.getElementById("video");

  video.addEventListener("enterpictureinpicture", (event) => {
    // 비디오가 Picture-in-Picture 모드로 진입했습니다.
    const pipWindow = event.pictureInPictureWindow;
    console.log(`Picture-in-Picture 창 너비: ${pipWindow.width}`);
    console.log(`Picture-in-Picture 창 높이: ${pipWindow.height}`);
  });

  video.addEventListener("leavepictureinpicture", () => {
    // 비디오가 Picture-in-Picture 모드를 종료했습니다.
  });
</script>

2.3. Picture-in-Picture 창 크기 변경에 따른 비디오 크기 업데이트

<video id="video" src="https://example.com/file.mp4"></video>

<button id="pipButton"></button>

<script>
  const video = document.getElementById("video");
  const pipButton = document.getElementById("pipButton");

  pipButton.addEventListener("click", async () => {
    try {
      await video.requestPictureInPicture();
    } catch (error) {
      // 비디오가 Picture-in-Picture 모드로 진입하지 못했습니다.
    }
  });

  video.addEventListener("enterpictureinpicture", (event) => {
    // 비디오가 Picture-in-Picture 모드로 진입했습니다.
    const pipWindow = event.pictureInPictureWindow;
    updateVideoSize(pipWindow.width, pipWindow.height);
    pipWindow.addEventListener("resize", onPipWindowResize);
  });

  video.addEventListener("leavepictureinpicture", (event) => {
    // 비디오가 Picture-in-Picture 모드를 종료했습니다.
    const pipWindow = event.pictureInPictureWindow;
    pipWindow.removeEventListener("resize", onPipWindowResize);
  });

  function onPipWindowResize(event) {
    // Picture-in-Picture 창이 크기 조정되었습니다.
    const { width, height } = event.target;
    updateVideoSize(width, height);
  }

  function updateVideoSize(width, height) {
    // TODO: pip 창의 너비와 높이에 따라 비디오 크기를 업데이트합니다.
  }
</script>

3. 개념

3.1. 내부 슬롯 정의

사용자 에이전트는 다음을 가집니다:

  1. 활성 Picture-in-Picture 세션의 시작자 0개 이상의 origin 목록으로, 처음에는 비어 있습니다.

참고: 사용자 에이전트가 여러 Picture-in-Picture 창을 지원하는 경우, 목록에 중복 항목이 허용됩니다.

어떤 origin이 활성 Picture-in-Picture 세션의 시작자 목록에 있는 origin 중 하나와 동일 origin-domain인 경우, 해당 origin은 활성 Picture-in-Picture 세션을 가지고 있다고 합니다.

3.2. 픽처 인 픽처 요청

request Picture-in-Picture 알고리즘video로 호출될 때, 사용자 에이전트는 다음 단계를 반드시 진행해야 합니다:

  1. Picture-in-Picture 지원false인 경우, NotSupportedError 를 throw하고 이 단계를 중단합니다.

  2. 문서가 사용 허가됨 상태가 아니면서 정책 제어 기능 이름이 "picture-in-picture"인 경우, SecurityError 를 throw하고 이 단계를 중단합니다.

  3. videoreadyState 속성이 HAVE_NOTHING인 경우, InvalidStateError 를 throw하고 이 단계를 중단합니다.

  4. video에 비디오 트랙이 없는 경우, InvalidStateError 를 throw하고 이 단계를 중단합니다.

  5. videodisablePictureInPicture 가 true인 경우, 사용자 에이전트는 InvalidStateError 를 throw하고 이 단계를 중단할 수 있습니다.

  6. pictureInPictureElementnull이고 관련 글로벌 객체this일시적 활성화가 없는 경우, NotAllowedError 를 throw하고 이 단계를 중단합니다.

  7. videopictureInPictureElement인 경우, 이 단계를 중단합니다.

  8. pictureInPictureElementvideo로 설정합니다.

  9. Picture-in-Picture 창PictureInPictureWindow 의 새 인스턴스로 생성하고, pictureInPictureElement와 연관시킵니다.

  10. 관련 설정 객체origin활성 Picture-in-Picture 세션의 시작자 목록에 추가합니다.

  11. 태스크를 큐에 추가하여 이벤트를 발생 시키고, enterpictureinpicture 이름을 가진 PictureInPictureEventvideo에 bubbles 속성은 true로, pictureInPictureWindow 속성은 Picture-in-Picture 창으로 초기화하여 사용합니다.

  12. pictureInPictureElementfullscreenElement인 경우, 전체화면 종료를 권장합니다.

비디오 프레임이 페이지와 Picture-in-Picture 창에서 동시에 렌더링되지 않는 것이 권장되지만, 만약 렌더링된다면 반드시 동기화되어야 합니다.

비디오가 Picture-in-Picture 모드에서 재생될 때, 상태는 인라인 재생과 동일하게 전환되어야 합니다. 즉, 이벤트가 동시에 발생하고, 메서드 호출은 동일하게 동작해야 합니다. 하지만, 사용자 에이전트는 비디오 요소가 Picture-in-Picture와 호환되지 않는 상태로 진입할 경우 Picture-in-Picture에서 나갈 수 있습니다.

video에 적용된 스타일(opacity, visibility, transform 등)은 Picture-in-Picture 창에는 적용되지 않아야 합니다. 창의 종횡비는 비디오 크기를 기반으로 합니다.

Picture-in-Picture 창은 최대/최소 크기가 있는 것이 권장됩니다. 예를 들어 화면 한 변의 1/4에서 1/2 사이로 제한할 수 있습니다.

3.3. 픽처 인 픽처 종료

exit Picture-in-Picture 알고리즘이 호출되면, 사용자 에이전트는 다음 단계를 반드시 진행해야 합니다:

  1. pictureInPictureElementnull이면 InvalidStateError 를 throw하고 이 단계를 중단합니다.

  2. close window 알고리즘Picture-in-Picture 창에 대해 (pictureInPictureElement와 연관된) 실행합니다.

  3. 태스크를 큐에 추가하여 이벤트를 발생 시키고, leavepictureinpicture 이름을 가진 PictureInPictureEventvideo에 bubbles 속성은 true로, pictureInPictureWindow 속성은 Picture-in-Picture 창 (pictureInPictureElement와 연관된)으로 초기화하여 사용합니다.

  4. pictureInPictureElement 를 unset합니다.

  5. item관련 설정 객체origin과 일치하는 항목 하나를 활성 Picture-in-Picture 세션의 시작자 목록에서 제거합니다.

exit Picture-in-Picture 알고리즘이 호출될 때 비디오 재생 상태가 변경되는 것은 권장되지 않습니다. 웹사이트가 직접 시작한 경우에는 웹사이트가 경험을 제어해야 합니다. 하지만 사용자 에이전트는 비디오 재생 상태(예: 일시정지)를 변경할 수 있는 Picture-in-Picture 창 컨트롤을 제공할 수 있습니다.

문서 언로드 정리 단계 중 하나로, exit Picture-in-Picture 알고리즘을 실행합니다.

3.4. 픽처 인 픽처 비활성화

일부 페이지에서는 비디오 요소에 대해 Picture-in-Picture 모드를 비활성화하고 싶을 수 있습니다. 예를 들어, 특정 상황에서 사용자 에이전트가 Picture-in-Picture 컨텍스트 메뉴를 제안하지 않도록 하고 싶은 경우가 있습니다. 이러한 사용 사례를 지원하기 위해 비디오 요소의 콘텐츠 속성 목록에 disablePictureInPicture 속성이 추가됩니다.

disablePictureInPicture IDL 속성은 반드시 동일한 이름의 콘텐츠 속성을 반영해야 합니다.

비디오 요소에 disablePictureInPicture 속성이 있으면, 사용자 에이전트는 비디오 요소가 Picture-in-Picture 모드로 재생되거나 이를 위한 UI를 표시하는 것을 막을 수 있습니다.

disablePictureInPicture 속성이 video 요소에 추가될 때, 사용자 에이전트는 다음 단계를 진행할 수 있습니다:

  1. requestPictureInPicture() 메서드가 반환한 대기 중인 promise를 InvalidStateError 로 거절합니다.

  2. videopictureInPictureElement인 경우, exit Picture-in-Picture 알고리즘을 실행합니다.

3.5. 전체화면과의 상호작용

pictureInPictureElement fullscreen flag가 설정되면 exit Picture-in-Picture 알고리즘을 실행하는 것이 권장됩니다.

3.6. 미디어 세션과의 상호작용

이 API는 Picture-in-Picture 창에서 사용할 수 있는 컨트롤을 사용자 정의하기 위해 [MediaSession] API와 함께 사용되어야 합니다.

3.7. 페이지 가시성과의 상호작용

pictureInPictureElement 가 설정된 경우, Document가 포커스를 가지지 않거나 숨겨져 있어도 Picture-in-Picture 창은 반드시 보여야 합니다. 사용자 에이전트는 사용자가 Picture-in-Picture 창을 수동으로 닫을 수 있는 방법을 제공해야 합니다.

Picture-in-Picture 창의 가시성은 사용자 에이전트가 system visibility statetraversable navigable에서 변경되었는지 판단할 때 고려되어서는 안 됩니다.

3.8. 하나의 Picture-in-Picture 창

Picture-in-Picture API가 있는 운영체제는 일반적으로 Picture-in-Picture 모드가 한 개의 창만 허용되도록 제한합니다. Picture-in-Picture 모드에서 오직 하나의 창만 허용할지는 구현 및 플랫폼에 따라 결정됩니다. 그러나 Picture-in-Picture 창의 개수 제한 때문에, 이 명세서는 특정 Document 가 오직 하나의 Picture-in-Picture 창만 가질 수 있다고 가정합니다.

이미 Picture-in-Picture 창이 열려 있을 때 Picture-in-Picture 요청이 들어오면 어떻게 처리할지는 구현에 맡겨집니다. 현재 Picture-in-Picture 창을 닫을 수도 있고, Picture-in-Picture 요청을 거부할 수도 있으며, 심지어 두 개의 Picture-in-Picture 창이 생성될 수도 있습니다. 어떤 상황이든, User Agent는 웹사이트에 Picture-in-Picture 상태 변경을 알리기 위한 적절한 이벤트를 반드시 발생시켜야 합니다.

4. API

4.1. HTMLVideoElement 확장

partial interface HTMLVideoElement {
  [NewObject] Promise<PictureInPictureWindow> requestPictureInPicture();

  attribute EventHandler onenterpictureinpicture;
  attribute EventHandler onleavepictureinpicture;

  [CEReactions] attribute boolean disablePictureInPicture;
};

requestPictureInPicture() 메서드는 호출되면 새로운 promise promise를 반환해야 하며, 다음 단계를 병렬로 실행해야 합니다:

  1. video는 메서드가 호출된 비디오 요소입니다.

  2. request Picture-in-Picture 알고리즘video로 실행합니다.

  3. 이전 단계에서 예외가 발생했다면, promise를 해당 예외로 거절하고 이후 단계를 중단합니다.

  4. promisepictureInPictureElement와 연관된 Picture-in-Picture 창으로 resolve합니다.

4.2. Document 확장

partial interface Document {
  readonly attribute boolean pictureInPictureEnabled;

  [NewObject] Promise<undefined> exitPictureInPicture();
};

pictureInPictureEnabled 속성 getter는 Picture-in-Picture 지원true이고 this가 속성 이름으로 표시된 기능 picture-in-picture사용 허가됨 상태라면 true를 반환하고, 그렇지 않으면 false를 반환해야 합니다.

Picture-in-Picture 지원은 사용자가 이를 비활성화한 환경설정이나 플랫폼의 제한이 있는 경우 false입니다. 그렇지 않으면 true입니다.

exitPictureInPicture() 메서드는 호출되면 새로운 promise promise를 반환해야 하며, 다음 단계를 병렬로 실행해야 합니다:

  1. exit Picture-in-Picture 알고리즘을 실행합니다.

  2. 이전 단계에서 예외가 발생했다면, promise를 해당 예외로 거절하고 이후 단계를 중단합니다.

  3. 해결 promise.

4.3. DocumentOrShadowRoot 확장

partial interface mixin DocumentOrShadowRoot {
  readonly attribute Element? pictureInPictureElement;
};

pictureInPictureElement 속성 getter는 다음 단계를 실행해야 합니다:

  1. thisshadow root이고, 그 hostconnected 상태가 아니면 null을 반환하고 이후 단계를 중단합니다.

  2. candidate를 Picture-in-Picture 요소를 this에 대해 리타겟팅(retargeting)한 결과로 합니다.

  3. candidatethis가 동일한 트리에 있으면, candidate를 반환하고 이후 단계를 중단합니다.

  4. null을 반환합니다.

4.4. 인터페이스 PictureInPictureWindow

[Exposed=Window]
interface PictureInPictureWindow : EventTarget {
  readonly attribute long width;
  readonly attribute long height;

  attribute EventHandler onresize;
};

PictureInPictureWindow 인스턴스는 Picture-in-Picture 창HTMLVideoElement와 연관하여 나타냅니다. 인스턴스가 생성될 때, PictureInPictureWindowstateopened로 설정됩니다.

close window 알고리즘PictureInPictureWindow 인스턴스에 대해 호출되면, 해당 stateclosed로 설정됩니다.

width 속성은 stateopened일 때 pictureInPictureElement와 연관된 Picture-in-Picture 창CSS 픽셀 단위 너비를 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.

height 속성은 stateopened일 때 pictureInPictureElement와 연관된 Picture-in-Picture 창CSS 픽셀 단위 높이를 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.

pictureInPictureElement와 연관된 Picture-in-Picture 창의 크기가 변경되면, 사용자 에이전트는 태스크를 큐에 추가하여 resize 이벤트를 pictureInPictureElement에서 발생시켜야 합니다.

4.5. 이벤트 타입

[Exposed=Window]
interface PictureInPictureEvent : Event {
    constructor(DOMString type, PictureInPictureEventInit eventInitDict);
    [SameObject] readonly attribute PictureInPictureWindow pictureInPictureWindow;
};

dictionary PictureInPictureEventInit : EventInit {
    required PictureInPictureWindow pictureInPictureWindow;
};
enterpictureinpicture

HTMLVideoElement 가 Picture-in-Picture로 진입할 때 발생합니다.

leavepictureinpicture

HTMLVideoElement 가 Picture-in-Picture 모드를 종료할 때 발생합니다.

resize

PictureInPictureWindow 의 크기가 변경될 때 발생합니다.

4.6. 태스크 소스

이 명세에서 큐에 추가되는 모든 태스크의 태스크 소스는 해당 비디오 요소의 미디어 요소 이벤트 태스크 소스입니다.

4.7. CSS 의사 클래스

:picture-in-picture 의사 클래스는 반드시 Picture-in-Picture 요소와 매치되어야 합니다. 이는 pictureInPictureElement 와는 다르며, shadow host chain에는 적용되지 않습니다.

5. 보안 고려사항

이 섹션은 규범적이지 않습니다.

스푸핑을 통한 잠재적 남용을 제한하기 위해, 이 API는 HTMLVideoElement 에만 적용됩니다. Picture-in-Picture 창과의 사용자 상호작용은 의도적으로 제한되어 있으며, 오직 Picture-in-Picture 창 자체 또는 재생 중인 미디어에만 영향을 미칩니다.

5.1. 보안 컨텍스트

이 API는 [SECURE-CONTEXTS]에 한정되지 않습니다. 그 이유는 사용자 에이전트가 일반적으로 미디어에 대해 브라우징 컨텍스트와 관계없이 모든 웹 애플리케이션에 이 기능을 네이티브로 제공하기 때문입니다.

5.2. 권한 정책

이 명세는 "picture-in-picture"라는 이름의 정책 제어 기능을 정의하며, request Picture-in-Picture 알고리즘SecurityError 를 반환할 수 있는지, pictureInPictureEnabledtrue 또는 false인지 제어합니다.

이 기능의 기본 허용 목록*입니다.

6. 감사의 글

이 문서에 기여해 주신 Jennifer Apacible, Zouhir Chahoud, Marcos Cáceres, Philip Jägenstedt, Jeremy Jones, Chris Needham, Jer Noble, Justin Uberti, Yoav Weiss, Eckhart Wörner 님께 감사드립니다.

적합성

문서 규칙

적합성 요구 사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. 본 문서의 규범적 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”과 같은 주요 단어들은 RFC 2119에서 설명된 대로 해석되어야 합니다. 하지만, 가독성을 위해 이 단어들은 이 명세서에서 모두 대문자로 표기되지 않습니다.

명시적으로 규범적이지 않다고 표시된 섹션, 예시, 참고를 제외하고 이 명세의 모든 텍스트는 규범적입니다. [RFC2119]

이 명세서의 예시는 “for example”이라는 문구로 소개되거나, class="example"와 같이 규범적 텍스트에서 분리되어 있습니다. 예시:

다음은 참고용 예시입니다.

참고 문구는 “Note”라는 단어로 시작하며, class="note"와 같이 규범적 텍스트와 분리됩니다. 예시:

참고, 이것은 참고용 노트입니다.

적합 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구 사항(예: "앞의 공백 문자를 모두 제거" 또는 "false를 반환하고 이 단계를 중단")은 알고리즘을 도입하는 데 사용된 주요 단어("must", "should", "may" 등)의 의미로 해석해야 합니다.

알고리즘 또는 구체적 단계로 표현된 적합성 요구 사항은 최종 결과가 동일하다면 어떤 방식으로든 구현할 수 있습니다. 특히, 이 명세서에서 정의된 알고리즘은 이해하기 쉽도록 작성되었으며, 성능을 고려한 것이 아닙니다. 구현자는 최적화를 권장합니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값과 단위 모듈 4단계. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[DOM]
Anne van Kesteren. DOM 표준. Living Standard. URL: https://dom.spec.whatwg.org/
[FULLSCREEN]
Philip Jägenstedt. 전체화면 API 표준. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. 권한 정책. 2025년 10월 6일. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner. RFC에서 요구사항 수준을 나타내는 데 사용하는 주요 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 셀렉터 4단계. 2022년 11월 11일. WD. URL: https://www.w3.org/TR/selectors-4/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

참고용 참고 문헌

[MediaSession]
Thomas Steimel; youenn fablet. 미디어 세션. 2025년 9월 19일. WD. URL: https://www.w3.org/TR/mediasession/
[SECURE-CONTEXTS]
Mike West. 보안 컨텍스트. 2023년 11월 10일. CRD. URL: https://www.w3.org/TR/secure-contexts/

IDL 색인

partial interface HTMLVideoElement {
  [NewObject] Promise<PictureInPictureWindow> requestPictureInPicture();

  attribute EventHandler onenterpictureinpicture;
  attribute EventHandler onleavepictureinpicture;

  [CEReactions] attribute boolean disablePictureInPicture;
};

partial interface Document {
  readonly attribute boolean pictureInPictureEnabled;

  [NewObject] Promise<undefined> exitPictureInPicture();
};

partial interface mixin DocumentOrShadowRoot {
  readonly attribute Element? pictureInPictureElement;
};

[Exposed=Window]
interface PictureInPictureWindow : EventTarget {
  readonly attribute long width;
  readonly attribute long height;

  attribute EventHandler onresize;
};

[Exposed=Window]
interface PictureInPictureEvent : Event {
    constructor(DOMString type, PictureInPictureEventInit eventInitDict);
    [SameObject] readonly attribute PictureInPictureWindow pictureInPictureWindow;
};

dictionary PictureInPictureEventInit : EventInit {
    required PictureInPictureWindow pictureInPictureWindow;
};