<!DOCTYPE html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true ] -->
<script>
function test() {
  if (window.testRunner) {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
  }

  if (window.IPC) {
    IPC.addOutgoingMessageListener("UI", (msg) => {
      if (msg.name == IPC.messages.VideoPresentationManagerProxy_SetHasVideo.name) {
        parseSetHasVideo(msg);
      }
    });

    o8=document.createElement('video');
    o8.src='resources/1080i60_SMPTE_8CH_audible.mov';
    document.body.appendChild(o8);
    o9=document.createElement('canvas');
  } else {
    console.log("Can't run test");
  }
}
function parseSetHasVideo(msg) {
  destinationId=msg['destinationID'];
  contextId=msg['arguments'][0]['value'];
  window.setTimeout(timeout1,200);
}
function timeout1() {
  o39=document.createElement('iframe');
  document.body.appendChild(o39);
  IPC.sendMessage('UI',destinationId,IPC.messages.VideoPresentationManagerProxy_SetupFullscreenWithID.name,
                  [{type: 'uint64_t',value: contextId},                                                                             // PlaybackSessionContextIdentifier contextId
                   {type: 'uint32_t',value: 8},                                                                                     // WebKit::LayerHostingContextID videoLayerID
                   {type: 'float',value: 338},{type: 'float',value: -429},{type: 'float',value: 117},{type: 'float',value: 1411},   // WebCore::FloatRect& screenRect
                   {type: 'float',value: 557},{type: 'float',value: 885},                                                           // WebCore::FloatSize& initialSize
                   {type: 'float',value: 215},{type: 'float',value: 537},                                                           // WebCore::FloatSize& videoDimensions
                   {type: 'float',value: 299},                                                                                      // float hostingDeviceScaleFactor
                   {type: 'uint32_t',value: 2n},                                                                                    // HTMLMediaElementEnums::VideoFullscreenMode videoFullscreenMode
                   {type: 'bool',value: 0},                                                                                         // bool allowsPictureInPicture
                   {type: 'bool',value: 1},                                                                                         // bool standby
                   {type: 'bool',value: 1}                                                                                          // bool blocksReturnToFullscreenFromPictureInPicture
                 ]);
  window.setTimeout(timeout2,200);
}
function timeout2() {
  window.open('empty.html',"InsertTab",'heigth=100,width=200');
  IPC.sendMessage('UI',destinationId,IPC.messages.VideoPresentationManagerProxy_SetupFullscreenWithID.name,
                  [{type: 'uint64_t',value: contextId},                                                                             // PlaybackSessionContextIdentifier contextId
                   {type: 'uint32_t',value: 8},                                                                                     // WebKit::LayerHostingContextID videoLayerID
                   {type: 'float',value: 2659},{type: 'float',value: 2032},{type: 'float',value: 69},{type: 'float',value: 713},    // WebCore::FloatRect& screenRect
                   {type: 'float',value: 3444},{type: 'float',value: 23},                                                           // WebCore::FloatSize& initialSize
                   {type: 'float',value: 463},{type: 'float',value: 938},                                                           // WebCore::FloatSize& videoDimensions
                   {type: 'float',value: 950},                                                                                      // float hostingDeviceScaleFactor
                   {type: 'uint32_t',value: 68n},                                                                                   // HTMLMediaElementEnums::VideoFullscreenMode videoFullscreenMode
                   {type: 'bool',value: 1},                                                                                         // bool allowsPictureInPicture
                   {type: 'bool',value: 0},                                                                                         // bool standby
                   {type: 'bool',value: 0}]);                                                                                       // bool blocksReturnToFullscreenFromPictureInPicture
  o70=document.createElement('iframe');
  document.body.appendChild(o70);
  o8.srcObject=o9.captureStream();
  window.setTimeout(timeout3,200);
}
function timeout3() {
  IPC.sendMessage('UI',IPC.webPageProxyID,IPC.messages.WebPageProxy_SetWindowFrame.name,[{type: 'float',value: 1142},{type: 'float',value: 1330},{type: 'float',value: 168},{type: 'float',value: 1869}]);
  window.setTimeout(timeout4,500);
}
function timeout4() {
  if (window.testRunner)
    testRunner.notifyDone();
}
</script>
<body onload='test()'>
<div>This test should not crash</div>
</body>
</html>