diff options
Diffstat (limited to '')
-rw-r--r-- | testing/web-platform/tests/webcodecs/video-frame-serialization.any.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webcodecs/video-frame-serialization.any.js b/testing/web-platform/tests/webcodecs/video-frame-serialization.any.js new file mode 100644 index 0000000000..4968c43cda --- /dev/null +++ b/testing/web-platform/tests/webcodecs/video-frame-serialization.any.js @@ -0,0 +1,139 @@ +// META: global=window,dedicatedworker +// META: script=/common/media.js +// META: script=/webcodecs/utils.js + +var defaultInit = { + timestamp : 100, + duration : 33, +} + +function createDefaultVideoFrame() { + let image = makeImageBitmap(32,16); + + return new VideoFrame(image, defaultInit); +} + +test(t => { + let frame = createDefaultVideoFrame(); + + let clone = frame.clone(); + + assert_equals(frame.timestamp, clone.timestamp); + assert_equals(frame.duration, clone.duration); + assert_equals(frame.visibleRect.left, clone.visibleRect.left); + assert_equals(frame.visibleRect.top, clone.visibleRect.top); + assert_equals(frame.visibleRect.width, clone.visibleRect.width); + assert_equals(frame.visibleRect.height, clone.visibleRect.height); + + frame.close(); + assert_true(isFrameClosed(frame)); + clone.close(); + assert_true(isFrameClosed(clone)); +}, 'Test we can clone a VideoFrame.'); + +test(t => { + let frame = createDefaultVideoFrame(); + + let copy = frame; + let clone = frame.clone(); + + frame.close(); + + assert_equals(copy.timestamp, defaultInit.timestamp); + assert_equals(copy.duration, defaultInit.duration); + assert_true(isFrameClosed(copy)); + assert_equals(clone.timestamp, defaultInit.timestamp); + assert_false(isFrameClosed(clone)); + + clone.close(); +}, 'Verify closing a frame doesn\'t affect its clones.'); + +test(t => { + let frame = createDefaultVideoFrame(); + + frame.close(); + + assert_throws_dom("InvalidStateError", () => { + let clone = frame.clone(); + }); +}, 'Verify cloning a closed frame throws.'); + +async_test(t => { + let localFrame = createDefaultVideoFrame(); + + let channel = new MessageChannel(); + let localPort = channel.port1; + let externalPort = channel.port2; + + externalPort.onmessage = t.step_func((e) => { + let externalFrame = e.data; + externalFrame.close(); + externalPort.postMessage("Done"); + }) + + localPort.onmessage = t.step_func_done((e) => { + assert_equals(localFrame.timestamp, defaultInit.timestamp); + localFrame.close(); + }) + + localPort.postMessage(localFrame); +}, 'Verify closing frames does not propagate accross contexts.'); + +async_test(t => { + let localFrame = createDefaultVideoFrame(); + + let channel = new MessageChannel(); + let localPort = channel.port1; + let externalPort = channel.port2; + + externalPort.onmessage = t.step_func_done((e) => { + let externalFrame = e.data; + assert_equals(externalFrame.timestamp, defaultInit.timestamp); + externalFrame.close(); + }) + + localPort.postMessage(localFrame, [localFrame]); + assert_true(isFrameClosed(localFrame)); +}, 'Verify transferring frames closes them.'); + +async_test(t => { + let localFrame = createDefaultVideoFrame(); + + let channel = new MessageChannel(); + let localPort = channel.port1; + + localPort.onmessage = t.unreached_func(); + + localFrame.close(); + + assert_throws_dom("DataCloneError", () => { + localPort.postMessage(localFrame); + }); + + t.done(); +}, 'Verify posting closed frames throws.'); + +promise_test(async t => { + const open = indexedDB.open('VideoFrameTestDB', 1); + open.onerror = t.unreached_func('open should succeed'); + open.onupgradeneeded = (event) => { + let db = event.target.result; + db.createObjectStore('MyVideoFrames', { keyPath: 'id' }); + }; + let db = await new Promise((resolve) => { + open.onsuccess = (e) => { + resolve(e.target.result); + }; + }); + t.add_cleanup(() => { + db.close(); + indexedDB.deleteDatabase(db.name); + }); + + let transaction = db.transaction(['MyVideoFrames'], 'readwrite'); + const store = transaction.objectStore('MyVideoFrames'); + let frame = createDefaultVideoFrame(); + assert_throws_dom("DataCloneError", () => { + store.add(frame); + }); +}, 'Verify storing a frame throws.'); |