ドキュメント ピクチャインピクチャ仕様

草案コミュニティグループレポート,

このバージョン:
https://wicg.github.io/document-picture-in-picture/
課題追跡:
GitHub
仕様内インライン
編集者:
(Google Inc.)

概要

この仕様は、Web開発者が常に最前面に表示されるウィンドウ内にHTMLDocumentを配置できるようにします。

この文書のステータス

この仕様は Web Platform Incubator Community Group により公開されています。 W3C標準ではなく、W3C標準トラックにもありません。 W3Cコミュニティコントリビューターライセンス契約(CLA)のもとで限定的なオプトアウトが可能であり、他にも条件がありますのでご注意ください。 W3Cコミュニティおよびビジネスグループについて詳細をご確認ください。

1. はじめに

このセクションは規範的ではありません。

現在、HTMLVideoElement を ピクチャインピクチャウィンドウ(requestPictureInPicture())に表示するためのWeb APIが存在します。このため、ウェブサイトはカスタムのピクチャインピクチャ体験(PiP)を提供する能力が制限されています。 この機能を拡張し、ウェブサイトが常に最前面に表示されるウィンドウ上で完全なDocument を提供できるようにしたいと考えています。

この新しいウィンドウは、既存の open() メソッドを使って開かれる、同一オリジンの白紙ウィンドウに似ていますが、いくつかの違いがあります:

2. 依存関係

この仕様に記載されたIDL断片は、Web IDL仕様で定められた通り、適合するIDL断片として解釈される必要があります。[WEBIDL]

3. セキュリティに関する考慮事項

3.1. セキュアコンテキスト

このAPIは [SECURE-CONTEXTS] のみで利用可能です。

3.2. なりすまし

ユーザーエージェントは、DocumentPictureInPicture ウィンドウ上に十分なUIを提供し、悪意のあるウェブサイトが他のウィンドウの上に表示される能力を乱用して他サイトやシステムUIのなりすましを防止することが求められます。

3.2.1. 位置指定

ユーザーエージェントは、ウェブサイトがウィンドウの位置を設定できないようにする必要があります。これにより、ウェブサイトが意図的にウィンドウを他ページのUIの一部と思わせる場所に配置することを防ぎます。特に、moveTo()moveBy() APIは、ドキュメントピクチャインピクチャウィンドウでは無効化されなければなりません。

3.2.2. オリジンの可視性

ユーザーエージェントは、DocumentPictureInPicture ウィンドウをどのオリジンが制御しているかを常にユーザーに明確に伝える必要があります。これにより、ユーザーはコンテンツの出所を認識できます。例えば、ユーザーエージェントはウィンドウのタイトルバーにウェブサイトのオリジンを表示することが考えられます。

3.2.3. 最大サイズ

ユーザーエージェントは、常に最前面に表示されるウィンドウでウェブサイトが画面全体を覆いユーザーをピクチャインピクチャウィンドウに閉じ込めることを防ぐため、ドキュメントピクチャインピクチャウィンドウの最大サイズを制限すべきです。これによりユーザーのデスクトップのなりすましも防止できます。

3.3. IFrame

このAPIは 最上位トラバーサブル でのみ利用できます。ただし、DocumentPictureInPicture Window には HTMLIFrameElement を含めることができ、 クロスオリジンHTMLIFrameElement も利用可能です。

4. プライバシーに関する考慮事項

4.1. フィンガープリント

PiPウィンドウを閉じてから後で再度開いた場合、前回のPiPウィンドウのサイズや場所を再利用することでユーザー体験を向上できることがあります。しかし、ユーザーエージェントは異なるオリジン間でサイズや位置を再利用しないことが推奨されます。これは悪意のあるウェブサイトによるフィンガープリントの手段となる可能性があるためです。

5. API

[Exposed=Window]
partial interface Window {
  [SameObject, SecureContext] readonly attribute DocumentPictureInPicture
    documentPictureInPicture;
};

[Exposed=Window, SecureContext]
interface DocumentPictureInPicture : EventTarget {
  [NewObject] Promise<Window> requestWindow(
    optional DocumentPictureInPictureOptions options = {});
  readonly attribute Window window;
  attribute EventHandler onenter;
};

dictionary DocumentPictureInPictureOptions {
  [EnforceRange] unsigned long long width = 0;
  [EnforceRange] unsigned long long height = 0;
  boolean disallowReturnToOpener = false;
  boolean preferInitialWindowPlacement = false;
};

[Exposed=Window, SecureContext]
interface DocumentPictureInPictureEvent : Event {
  constructor(DOMString type, DocumentPictureInPictureEventInit eventInitDict);
  [SameObject] readonly attribute Window window;
};

dictionary DocumentPictureInPictureEventInit : EventInit {
  required Window window;
};

DocumentPictureInPicture オブジェクトは、ウェブサイトが新しい常時最前面の Window を作成・オープンできる他、その Window の開閉に関するイベントをリッスンすることができます。

Window オブジェクトには documentPictureInPicture API が関連付けられており、これは DocumentPictureInPicture の新しいインスタンスが Window と共に作成されます。

documentPictureInPicture ゲッターの手順:
  1. thisdocumentPictureInPicture API を返す。

DocumentPictureInPicture オブジェクトには last-opened window(初期値はnullで、requestWindow() メソッドの手順で設定される Window オブジェクト)が関連付けられています。

window ゲッターの手順:
  1. winthislast-opened window とする。

  2. winnull でなく、winclosed 属性が false なら、win を返す。

  3. null を返す。

requestWindow(options) メソッドの手順:
  1. Document Picture-in-Picture supportfalse なら、"NotSupportedError" DOMException をスローする。

  2. thisrelevant global objectnavigable最上位トラバーサブル でない場合、"NotAllowedError" DOMException をスローする。

  3. thisrelevant global objectnavigableIs Document Picture-in-Picture 真理値が true の場合、"NotAllowedError" DOMException をスローする。

  4. thisrelevant global objecttransient activation がない場合、"NotAllowedError" DOMException をスローする。

  5. options["width"] が存在し0より大きく、options["height"] が存在しないか0の場合、RangeErrorをスローする。

  6. options["height"] が存在し0より大きく、options["width"] が存在しないか0の場合、RangeErrorをスローする。

  7. Consume user activationthisrelevant global object で実行する。

  8. winthislast-opened window とする。winnull でなく、winclosed 属性が false なら、閉じる winnavigable を実行する。

  9. 必要に応じて、ユーザーエージェントは既存のピクチャインピクチャウィンドウを閉じることができる。

  10. pip traversable新しい最上位トラバーサブルを作成 の結果とし、thisrelevant global objectnavigableactive browsing context と "_blank" を引数とする。

結果となるDocumentURL は `about:blank` ですが、document base URLrequestWindow() を呼び出した イニシエータ側のURLとなります。通常の `about:blank` ポップアップでこの継承動作を実装していないブラウザもありますが、 ドキュメントピクチャインピクチャウィンドウでは仕様通りこの継承が行われるよう実装者に推奨します。そうしないと互換性問題が生じます。

  1. pip traversableactive documentmodethisrelevant global objectassociated Documentmode に設定する。

  2. pip traversableIs Document Picture-in-Picture 真理値を true に設定する。

  3. options["width"] が存在し0より大きい場合:

    1. 必要に応じて、ユーザーに使いやすいウィンドウサイズになるよう、options["width"] が大き過ぎる場合は丸めたり無視してもよい。

    2. 必要に応じて、pip traversableactive browsing context のウィンドウの左右の表示領域の距離を options["width"] ピクセルに設定してもよい。

  4. options["height"] が存在し0より大きい場合:

    1. 必要に応じて、ユーザーに使いやすいウィンドウサイズになるよう、options["height"] が大き過ぎる場合は丸めたり無視してもよい。

    2. 必要に応じて、pip traversableactive browsing context のウィンドウの上下の表示領域の距離を options["height"] ピクセルに設定してもよい。

options["preferInitialWindowPlacement"] が存在し真であれば、ユーザーエージェントはこの指示を使い、前回閉じた pip traversable ウィンドウの位置やサイズを考慮せず、 13・14のような動作を優先してもよい。

  1. options["disallowReturnToOpener"] が存在しtrueなら、ユーザーエージェントはピクチャインピクチャウィンドウ上で、ユーザーがオープナーウィンドウへ戻れるUI部品を表示しないようにすべきです。

動画およびドキュメントピクチャインピクチャどちらでも、ユーザーエージェントは元ページに戻りPiPウィンドウを閉じるためのボタンを表示することがよくあります。この操作は大抵は妥当ですが(特に動画PiPでは動画がメインドキュメントに戻るため)、ドキュメントピクチャインピクチャウィンドウでは必ずしも妥当とは限りません。disallowReturnToOpener は、ウェブサイトがその体験に対しこの操作が妥当かどうかユーザーエージェントへ意思表示するヒントです。

  1. pip traversableactive browsing context のウィンドウを他のウィンドウの上に浮かせるように設定する。

  2. thislast-opened windowpip traversableactive window に設定する。

  3. グローバルタスクをキューするDOM 操作タスクソースthisrelevant global object で、イベントを発火し、名前は enter 、型は DocumentPictureInPictureEventwindow 属性は pip traversableactive window で初期化。

  4. pip traversableactive window を返す。

ウィンドウのサイズはウェブサイトが設定できますが、初期位置はユーザーエージェントが管理します。

enter

DocumentPictureInPicture でPiPウィンドウが開かれた時に発火します。

6. 概念

6.1. ドキュメントピクチャインピクチャのサポート

各ユーザーエージェントは ドキュメントピクチャインピクチャサポート 真理値を持ち、その値は 実装依存(ユーザーの設定によって変化する場合がある)です。

6.2. DocumentPictureInPicture ウィンドウ

最上位トラバーサブルドキュメントピクチャインピクチャかどうか 真理値を持ち、その値は初期状態でfalseですが、requestWindow() メソッドの手順でtrueに設定されることがあります。

6.3. ドキュメントピクチャインピクチャウィンドウの閉じ方

close に十分な合意が得られたら統合すること。

close の手順2、 「toUnload に対してアンロードがユーザーキャンセルか判定した結果が true なら return」 を次のように修正する:

  1. もし traversableドキュメントピクチャインピクチャかどうか真理値が true ならこの手順をスキップする。それ以外の場合は、アンロードがユーザーキャンセルか判定 の結果が true なら return。

6.4. 既存のPiPウィンドウを閉じる

既存のピクチャインピクチャウィンドウを閉じるには:

  1. ユーザーエージェントの 最上位トラバーサブル集合 の各 top-level traversable に対して:

    1. もし top-level traversableドキュメントピクチャインピクチャかどうか真理値が true なら、close top-level traversableを実行。

    2. もし top-level traversableactive documentpictureInPictureElementnullでなければ、ピクチャインピクチャ終了アルゴリズムtop-level traversableactive documentに対して実行。

    3. top-level traversableactive document子孫ナビゲーブルnavigable に対して:

      1. もし navigableactive documentpictureInPictureElementnullでなければ、ピクチャインピクチャ終了アルゴリズムnavigableactive documentに対して実行。

6.5. PiPウィンドウは1つだけ

どの最上位トラバーサブルも同時に開いているドキュメントピクチャインピクチャウィンドウは最大1つでなければならない。最上位トラバーサブル でそのactive windowdocumentPictureInPicture APIlast-opened windownullでなければ、 さらにドキュメントピクチャインピクチャウィンドウを開こうとしたとき、ユーザーエージェントは既存のlast-opened windowrequestWindow()メソッドの手順に従い閉じなければならない。

ただし、全最上位トラバーサブルでピクチャインピクチャモードのウィンドウがひとつだけ許可されるかどうかは、実装とプラットフォームによる。 そのため、すでに最上位トラバーサブルドキュメントピクチャインピクチャかどうか真理値がtrueだったり active documentpictureInPictureElementnullでない場合にピクチャインピクチャ要求が来たらどうなるかは実装依存である。ユーザーエージェントは既存のピクチャインピクチャウィンドウを閉じる動作や 複数のピクチャインピクチャウィンドウを作成する動作もあり得る。

6.6. 元のドキュメントやPiPドキュメントが破棄された時にPiPウィンドウを閉じる

関連付けられたドキュメントピクチャインピクチャウィンドウを閉じる、与えられた Document documentに対して:

  1. navigabledocumentnode navigableとする。

  2. もしnavigable最上位トラバーサブルでなければこれらの手順を中止。

  3. もしnavigableドキュメントピクチャインピクチャかどうか真理値がtrueなら close navigableを実行してこの手順を中止。

  4. winnavigableactive windowdocumentPictureInPicture APIlast-opened windowとする。

  5. もしwinnullでなく、winclosed属性がfalseなら、close winnavigableを実行。

destroy に十分な合意が得られたら統合すること。

destroy の最後に「ステップ10」を追加:

  1. 関連付けられたドキュメントピクチャインピクチャウィンドウを閉じる、与えられたdocumentに対して。

開いているドキュメントピクチャインピクチャウィンドウがあるページを閉じた時、そのPiPウィンドウも閉じることを保証するためです。

6.7. 元のドキュメントやPiPドキュメントが遷移した時にPiPウィンドウを閉じる

navigate に十分な合意が得られたら統合すること。

navigate のステップ16.3、 「Queue a global task on the navigation and traversal task source given navigable’s active window to abort navigable’s active document.」 の後ろにステップ16.4を挿入:

  1. グローバルタスクをキューするナビゲーションとトラバーサルタスクソースnavigableactive windowに対し、abort navigableactive documentおよび関連付けられたドキュメントピクチャインピクチャウィンドウを閉じるnavigableactive documentに対して実行。

  2. もしnavigable最上位トラバーサブルで、そのドキュメントピクチャインピクチャかどうか真理値がtrueならこれらの手順を中止。

開いているドキュメントピクチャインピクチャウィンドウがあるページを遷移した時、そのPiPウィンドウも閉じることを保証します。また、ドキュメントピクチャインピクチャウィンドウ内のドキュメントを遷移した時もPiPウィンドウが閉じられることを保証します。

6.8. PiPウィンドウのサイズ変更

ドキュメントピクチャインピクチャウィンドウをプログラムでサイズ変更することは便利ですが、常時最前面の特性のため、サイズ変更の自由度が高いと迷惑・侵襲的な使われ方をされるおそれがあります。 そのため、ウィンドウサイズ変更APIの利用にはユーザー操作を消費する形にして一部懸念を緩和します。

resizeTo() に十分な合意が得られたら統合すること。

resizeTo() のステップ3「targetがスクリプトによって生成された補助ブラウジングコンテキストでないなら return」の後ろに次の新手順を追加:

  1. もし target最上位トラバーサブルドキュメントピクチャインピクチャかどうかtrueなら:

    1. thisrelevant global objecttransient activationがなければ、"NotAllowedError" DOMExceptionをスロー。

    2. consume user activationthisrelevant global objectで実行。

resizeBy() に十分な合意が得られたら統合すること。

resizeBy() のステップ3「targetがスクリプトによって生成された補助ブラウジングコンテキストでないなら return」の後ろに次の新手順を追加:

  1. もし target最上位トラバーサブルドキュメントピクチャインピクチャかどうかtrueなら:

    1. thisrelevant global objecttransient activationがなければ、"NotAllowedError" DOMExceptionをスロー。

    2. consume user activationthisrelevant global objectで実行。

6.9. オープナーウィンドウへのフォーカス

ピクチャインピクチャウィンドウからオープナータブへ再フォーカスできると便利なことが多いです。例えばウィンドウが小さい場合ユーザー体験に合わない場面などが想定されます。focus() APIを修正し、ピクチャインピクチャウィンドウからオープナーにフォーカスする時にシステムレベルのフォーカスも取得できるようにします。

focus() に十分な合意が得られたら統合すること。

focus() のステップ3「Run the focusing steps with current」の後ろに次の新手順を追加:

  1. もし current最上位トラバーサブルの場合:

    1. pipWindowcurrentactive windowdocumentPictureInPicture APIlast-opened windowとする。

    2. もしpipWindownullでなく、pipWindowrelevant global objecttransient activationがあるなら:

      1. consume user activationpipWindowrelevant global objectで実行。

      2. currentシステムフォーカスを与える。

オープナーへのシステムフォーカス付与は必ずしもドキュメントピクチャインピクチャウィンドウの閉鎖を意味する必要はありません。ウェブサイトがフォーカス後にPiPウィンドウを閉じたい場合は、close() を利用できます。

6.10. CSS display-mode

CSS display-mode メディア特性 picture-in-picture により、Web開発者は(ウェブアプリの一部が)ピクチャインピクチャモードで表示されている時のみ適用されるCSSルールを記述できます。

6.11. ユーザーアクティベーションの伝播

ドキュメントピクチャインピクチャウィンドウの特性上、ウィンドウ内ボタンのイベントハンドラがオープナーのコンテキストで動作することがあります。 これにより、ウェブサイトがactivation consuming APIsを利用する際扱いづらくなります。 なぜなら、ドキュメントピクチャインピクチャウィンドウ側はtransient activationがある一方で、オープナーにはないことがあるためです。

これを容易にするため、activation notification手順を修正し、ドキュメントピクチャインピクチャウィンドウでユーザーアクティベーションを発生させた時にオープナーにも伝播させます。 さらにオープナーでアクティベーションが発生した際は、ドキュメントピクチャインピクチャウィンドウ内の同一オリジンフレームにも伝播させ、通常の子孫フレーム同様に活性化します。

activation notification手順に十分な合意が得られたら統合すること。

activation notificationのステップ4「windowsactive windowを追加、各子孫ナビゲーブルのactive windowのみ、ナビゲーブルactive documentオリジンdocumentのオリジン と同一オリジンのみ」 の後ろに次の3ステップを追加:

  1. もしdocumentnode navigable最上位トラバーサブルドキュメントピクチャインピクチャかどうか真理値がtrueなら、 windowsdocumentnode navigable最上位トラバーサブルactive browsing contextオープナーのブラウジングコンテキストactive windowを追加。

  2. document picture-in-picture windowdocumentnode navigable最上位トラバーサブルactive windowdocumentPictureInPicture APIlast-opened windowとする。

  3. もし document picture-in-picture windownull でなければ、 windowsdocument picture-in-picture windowactive windowを追加、ただし document picture-in-picture windowassociated document子孫ナビゲーブルで、ナビゲーブルactive documentオリジンdocument picture-in-picture windowassociated documentオリジンと同一オリジンの場合のみ追加。

加えて、このアクティベーションが2箇所(オープナー・ピクチャインピクチャウィンドウ)で使われることのないよう正しく消費されることも保証する必要があります。そのため consume user activation の手順を修正し、ピクチャインピクチャ側のユーザーアクティベーションを消費する時にオープナー側も消費し、オープナー側のユーザーアクティベーションを消費する時に関連するピクチャインピクチャ側も消費するようにします。

consume user activation手順に十分な合意が得られたら統合すること。

consume user activation のステップ3「navigablesinclusive descendant navigablesで定義」の後ろに次の3ステップを追加:

  1. もしtopドキュメントピクチャインピクチャかどうか真理値がtrueなら navigablestopactive browsing contextオープナーのブラウジングコンテキストactive documentのinclusive descendant navigablesを追加。

  2. document picture-in-picture windowtopactive windowdocumentPictureInPicture APIlast-opened windowとする。

  3. もし document picture-in-picture windownull でなければ、 navigablesdocument picture-in-picture windowassociated documentのinclusive descendant navigablesを追加。

7.

このセクションは規範的ではありません

7.1. 動画プレイヤーをPiPへ抽出する

7.1.1. HTML

<body>
  <div id="player-container">
    <div id="player">
      <video id="video" src="foo.webm"></video>
      <!-- プレーヤーの追加要素 -->
    </div>
  </div>
  <input type="button" onclick="enterPiP();" value="PiPに入る" />
</body>

7.1.2. JavaScript

// ピクチャインピクチャウィンドウのハンドル。
let pipWindow = null;

function enterPiP() {
  const player = document.querySelector('#player');

  // ウィンドウサイズを適切に設定するため、width/heightを指定。
  const pipOptions = {
    width: player.clientWidth,
    height: player.clientHeight,
  };

  documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {
    pipWindow = pipWin;

    // プレイヤーがPiPへ移行したことを示すコンテナのスタイル変更。
    playerContainer.classList.add('pip-mode');

    // プレイヤーをPiPウィンドウへ追加。
    pipWindow.document.body.append(player);

    // PiP終了イベント監視してプレイヤーを戻す。
    pipWindow.addEventListener('pagehide', onLeavePiP.bind(pipWindow), { once: true });
  });
}

// PiPウィンドウが閉じた時呼ばれる。
function onLeavePiP() {
  if (this !== pipWindow) {
    return;
  }

  // コンテナのPiPスタイルを除去。
  const playerContainer = document.querySelector('#player-container');
  playerContainer.classList.remove('pip-mode');

  // プレイヤーをメインウィンドウへ戻す。
  const player = pipWindow.document.querySelector('#player');
  playerContainer.append(player);

  pipWindow = null;
}

7.2. PiPウィンドウで要素にアクセスする

const video = pipWindow.document.querySelector('#video');
video.loop = true;

7.3. PiPウィンドウでイベントをリッスンする

より良いピクチャインピクチャ体験のため、ウェブサイトではユーザー入力イベント(クリックなど)に反応するカスタムボタンやコントロールを実装することがよくあります。

const pipDocument = pipWindow.document;
const video = pipDocument.querySelector('#video');
const muteButton = pipDocument.document.createElement('button');
muteButton.textContent = 'ミュート切替';
muteButton.addEventListener('click', () => {
  video.muted = !video.muted;
});
pipDocument.body.append(muteButton);

7.4. PiPを終了する

ウェブサイト側でユーザーがウィンドウの閉じるボタンを押さなくても、DocumentPictureInPictureWindow を閉じたい場合は、close() メソッドを利用できます:

// これでPiPウィンドウを閉じ、onLeavePiP()が実行されます。
// リスナー付き。
pipWindow.close();

7.5. PiPウィンドウが閉じる時に要素を取得する

PiPウィンドウを閉じる理由が何であれ(ウェブサイトが閉じる・ユーザーが閉じる)、要素をPiPウィンドウから元に戻したくなる場合がよくあります。これはpagehide イベントのハンドラで実装可能です。上記動画プレイヤー例onLeavePiP()でも示されています:

// PiPウィンドウが閉じた時呼ばれる。
function onLeavePiP() {
  if (this !== pipWindow) {
    return;
  }

  // コンテナのPiPスタイルを除去。
  const playerContainer = document.querySelector('#player-container');
  playerContainer.classList.remove('pip-mode');

  // プレイヤーをメインウィンドウへ戻す。
  const player = pipWindow.document.querySelector('#player');
  playerContainer.append(player);

  pipWindow = null;
}

7.6. PiPウィンドウをプログラムでサイズ変更する

ドキュメントピクチャインピクチャウィンドウはresizeTo()resizeBy() APIをサポートしていますが、PiPウィンドウ上でのユーザー操作が必要です:

const expandButton = pipWindow.document.createElement('button');
expandButton.textContent = 'PiPウィンドウを拡張';
expandButton.addEventListener('click', () => {
  // PiPウィンドウの幅を20px、高さを30px拡張。
  pipWindow.resizeBy(20, 30);
});
pipWindow.document.body.append(expandButton);

7.7. オープナータブに戻る

focus() APIを使えば、ピクチャインピクチャウィンドウからオープナータブにフォーカスを移動でき(要ユーザー操作):

const returnToTabButton = pipWindow.document.createElement('button');
returnToTabButton.textContent = 'オープナータブに戻る';
returnToTabButton.addEventListener('click', () => {
  window.focus();
});
pipWindow.document.body.append(returnToTabButton);

7.8. CSSピクチャインピクチャディスプレイモードの使用例

次の例は、PiPウィンドウ内の body 要素のマージンを除去し、タイトルのフォントサイズを小さくしてコンテンツをウィンドウにフィットさせる方法を示します:

@media all and (display-mode: picture-in-picture) {
  body {
    margin: 0;
  }
  h1 {
    font-size: 0.8em;
  }
}

7.9. 戻るボタンの非表示

多くのユーザーエージェントは、動画やドキュメントピクチャインピクチャウィンドウでオープナーに戻ってウィンドウを閉じるボタンを表示しますが、これは一部のウェブサイトのドキュメントピクチャインピクチャ体験では適していない場合もあります。disallowReturnToOpener オプションでこのボタンを非表示にできます。

await documentPictureInPicture.requestWindow({
  disallowReturnToOpener: true
});

7.10. 初期ウィンドウ配置の優先

ドキュメントピクチャインピクチャウィンドウは開いている間にユーザーがサイズ変更や再配置する場合があります。閉じてから再度開いた時、ユーザーエージェントは前回の位置・サイズをヒントとして使い、ウィンドウをデフォルト位置以外に配置する場合もあります。

前回のウィンドウ位置・サイズを使って欲しくない場合、preferInitialWindowPlacement をtrueに指定してヒントを出すことができます。例えば、新規の活動用に新しいPiPウィンドウを開く場合などです。これによりユーザーエージェントはデフォルト位置やサイズ、あるいはサイトが指定したサイズヒント通りに表示する場合があります。

await documentPictureInPicture.requestWindow({
  preferInitialWindowPlacement: true
});

8. 謝辞

Frank Liberato、Mark Foltz、Klaus Weidner、François Beaufort、Charlie Reis、Joe DeBlasio、Domenic Denicola、Yiren Wang各氏の意見や貢献、また本ドキュメントと議論に寄せられた知見に感謝します。

適合性

ドキュメントの規則

適合要件は記述的な論述と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" により規範テキストと分離されます。

これは参考注記です。

索引

この仕様で定義された用語

参照で定義された用語

参考文献

規格文献

[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. URL: https://drafts.csswg.org/cssom-view/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; et al. Media Queries Level 5. URL: https://drafts.csswg.org/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考文献

[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/

IDL索引

[Exposed=Window]
partial interface Window {
  [SameObject, SecureContext] readonly attribute DocumentPictureInPicture
    documentPictureInPicture;
};

[Exposed=Window, SecureContext]
interface DocumentPictureInPicture : EventTarget {
  [NewObject] Promise<Window> requestWindow(
    optional DocumentPictureInPictureOptions options = {});
  readonly attribute Window window;
  attribute EventHandler onenter;
};

dictionary DocumentPictureInPictureOptions {
  [EnforceRange] unsigned long long width = 0;
  [EnforceRange] unsigned long long height = 0;
  boolean disallowReturnToOpener = false;
  boolean preferInitialWindowPlacement = false;
};

[Exposed=Window, SecureContext]
interface DocumentPictureInPictureEvent : Event {
  constructor(DOMString type, DocumentPictureInPictureEventInit eventInitDict);
  [SameObject] readonly attribute Window window;
};

dictionary DocumentPictureInPictureEventInit : EventInit {
  required Window window;
};

課題索引

十分な合意が得られ次第、close に統合してください。
十分な合意が得られ次第、destroy に統合してください。
十分な合意が得られ次第、navigate に統合してください。
十分な合意が得られ次第、resizeTo() に統合してください。
十分な合意が得られ次第、resizeBy() に統合してください。
十分な合意が得られ次第、focus() に統合してください。
十分な合意が得られ次第、activation notification の手順に統合してください。
十分な合意が得られ次第、consume user activation の手順に統合してください。