| // 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.'); |