diff options
Diffstat (limited to 'testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html')
-rw-r--r-- | testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html b/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html new file mode 100644 index 0000000000..967f02ec2c --- /dev/null +++ b/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html @@ -0,0 +1,70 @@ +<!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> |