| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src='/resources/testharness.js'></script> | |
| <script src='/resources/testharnessreport.js'></script> | |
| <script src='/common/get-host-info.sub.js'></script> | |
| <script src='/webcodecs/utils.js'></script> | |
| </head> | |
| <body> | |
| <script> | |
| const HELPER = '/webcodecs/videoFrame-serialization.crossAgentCluster.helper.html'; | |
| const CROSSORIGIN_BASE = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; | |
| const CROSSORIGIN_HELPER = CROSSORIGIN_BASE + HELPER; | |
| promise_test(async () => { | |
| const target = (await appendIframe(CROSSORIGIN_HELPER)).contentWindow; | |
| let frame = createVideoFrame(20); | |
| assert_false(await canSerializeVideoFrame(target, frame)); | |
| }, 'Verify frames cannot be passed accross the different agent clusters'); | |
| promise_test(async () => { | |
| const target = (await appendIframe(CROSSORIGIN_HELPER)).contentWindow; | |
| let frame = createVideoFrame(80); | |
| assert_false(await canTransferVideoFrame(target, frame)); | |
| }, 'Verify frames cannot be transferred accross the different agent clusters'); | |
| function appendIframe(src) { | |
| const frame = document.createElement('iframe'); | |
| document.body.appendChild(frame); | |
| frame.src = src; | |
| return new Promise(resolve => frame.onload = () => resolve(frame)); | |
| }; | |
| function createVideoFrame(ts) { | |
| let data = new Uint8Array([ | |
| 1, 2, 3, 4, 5, 6, 7, 8, | |
| 9, 10, 11, 12, 13, 14, 15, 16, | |
| ]); | |
| return new VideoFrame(data, { | |
| timestamp: ts, | |
| codedWidth: 2, | |
| codedHeight: 2, | |
| format: 'RGBA', | |
| }); | |
| } | |
| function canSerializeVideoFrame(target, vf) { | |
| return canPostVideoFrame(target, vf, false); | |
| }; | |
| function canTransferVideoFrame(target, vf) { | |
| return canPostVideoFrame(target, vf, true); | |
| }; | |
| function canPostVideoFrame(target, vf, transfer) { | |
| if (transfer) { | |
| target.postMessage(vf, '*', [vf]); | |
| assert_true(isFrameClosed(vf)); | |
| } else { | |
| target.postMessage(vf, '*'); | |
| } | |
| // vf.timestamp doesn't change after vf is closed, so it's fine to use it. | |
| target.postMessage({'id': vf.timestamp}, '*'); | |
| return new Promise(resolve => window.onmessage = e => { | |
| resolve(e.data == 'RECEIVED'); | |
| }); | |
| }; | |
| </script> | |
| </body> | |
| </html> |