video-srcObject-change.html (2823B)
1 <!DOCTYPE html> 2 <meta charset="utf-8" /> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="/resources/testdriver.js"></script> 6 <script src="/resources/testdriver-vendor.js"></script> 7 <script src="/media-source/dedicated-worker/mediasource-message-util.js"></script> 8 <script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script> 9 10 <button id="navigateButton">Click here!</button> 11 <video id="testVideo" style="height:500px;width:500px"></img> 12 13 <script> 14 // Based on /media-source/dedicated-worker/mediasource-worker-play.html. 15 promise_test(async t => { 16 // Fail fast if MSE-in-Workers is not supported. 17 assert_implements( 18 MediaSource.hasOwnProperty('canConstructInDedicatedWorker'), 19 'MediaSource hasOwnProperty \'canConstructInDedicatedWorker\''); 20 assert_implements( 21 MediaSource.canConstructInDedicatedWorker, 22 'MediaSource.canConstructInDedicatedWorker'); 23 24 t.add_cleanup(() => { testVideo.srcObject = null; }); 25 26 const url = '/video-srcobject-change-1'; 27 let worker; 28 29 // Returns a promise that will be resolved with the MediaSource handle for 30 // the video. 31 function initVideoWorker() { 32 return new Promise(resolve => { 33 worker = new Worker('/media-source/dedicated-worker/mediasource-worker-play.js'); 34 worker.onerror = t.unreached_func('worker error'); 35 worker.onmessage = t.step_func(e => { 36 let subject = e.data.subject; 37 assert_true(subject != undefined, 'message must have a subject field'); 38 switch (subject) { 39 case messageSubject.ERROR: 40 assert_unreached('Worker error: ' + e.data.info); 41 break; 42 case messageSubject.HANDLE: 43 resolve(e.data.info); 44 break; 45 default: 46 assert_unreached('Unexpected message subject: ' + subject); 47 } 48 }); 49 }); 50 } 51 52 navigateButton.addEventListener("click", async () => { 53 history.pushState({}, '', url); 54 let handle = await initVideoWorker(); 55 testVideo.srcObject = handle; 56 testVideo.play(); 57 }, {once: true}); 58 59 const softNavPromise = 60 SoftNavigationTestHelper.getPerformanceEntries("soft-navigation"); 61 62 if (test_driver) { 63 test_driver.click(navigateButton); 64 } 65 66 const helper = new SoftNavigationTestHelper(t); 67 const entries = await helper.withTimeoutMessage( 68 softNavPromise, "Soft navigation entry never arrived.", 5000); 69 assert_equals(entries.length, 1, 'Expected exactly one soft navigation.'); 70 assert_true( 71 entries[0].name.endsWith(url), 72 'Unexpected Soft Navigation URL.'); 73 }, 'Soft Navigation Detection supports HTMLVideoElment.srcObject'); 74 </script>