| <!DOCTYPE html> |
| <html> |
| <title>Test posting VideoFrames.</title> |
| <body></body> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/media.js"></script> |
| <script> |
| |
| function makeImageBitmap(width, height) { |
| let canvas = document.createElement('canvas'); |
| canvas.width = width; |
| canvas.height = height; |
| |
| let ctx = canvas.getContext('2d'); |
| ctx.fillStyle = 'rgba(50, 100, 150, 255)'; |
| ctx.fillRect(0, 0, width, height); |
| |
| return createImageBitmap(canvas); |
| } |
| |
| var defaultInit = { |
| timestamp : 100, |
| duration : 33, |
| } |
| |
| async function createDefaultVideoFrame() { |
| let image = await makeImageBitmap(32,16); |
| |
| return new VideoFrame(image, defaultInit); |
| } |
| |
| async_test(async function(t) { |
| let frame = await createDefaultVideoFrame(); |
| |
| let clone = frame.clone(); |
| |
| assert_equals(frame.timestamp, clone.timestamp); |
| assert_equals(frame.duration, clone.duration); |
| assert_equals(frame.cropWidth, clone.cropWidth); |
| assert_equals(frame.cropHeight, clone.cropHeight); |
| assert_equals(frame.cropWidth, clone.cropWidth); |
| assert_equals(frame.cropHeight, clone.cropHeight); |
| |
| frame.destroy(); |
| clone.destroy(); |
| |
| t.done(); |
| }, 'Test we can clone a VideoFrame.'); |
| |
| async_test(async function(t) { |
| let frame = await createDefaultVideoFrame(); |
| |
| let copy = frame; |
| let clone = frame.clone(); |
| |
| frame.destroy(); |
| |
| assert_not_equals(copy.timestamp, defaultInit.timestamp); |
| assert_equals(clone.timestamp, defaultInit.timestamp); |
| |
| clone.destroy(); |
| |
| t.done(); |
| }, 'Verify destroying a frame doesn\'t affect its clones.'); |
| |
| async_test(async function(t) { |
| let frame = await createDefaultVideoFrame(); |
| |
| frame.destroy(); |
| |
| assert_throws_dom("InvalidStateError", () => { |
| let clone = frame.clone(); |
| }); |
| |
| t.done(); |
| }, 'Verify cloning a destroyed frame throws.'); |
| |
| async_test(async function(t) { |
| let localFrame = await createDefaultVideoFrame(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| let externalPort = channel.port2; |
| |
| externalPort.onmessage = t.step_func((e) => { |
| let externalFrame = e.data; |
| externalFrame.destroy(); |
| externalPort.postMessage("Done"); |
| }) |
| |
| localPort.onmessage = t.step_func_done((e) => { |
| assert_not_equals(localFrame.timestamp, defaultInit.timestamp); |
| }) |
| |
| localPort.postMessage(localFrame); |
| |
| }, 'Verify destroying frames propagates accross contexts.'); |
| |
| async_test(async function(t) { |
| let localFrame = await createDefaultVideoFrame(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| let externalPort = channel.port2; |
| |
| externalPort.onmessage = t.step_func((e) => { |
| let externalFrame = e.data; |
| externalFrame.destroy(); |
| externalPort.postMessage("Done"); |
| }) |
| |
| localPort.onmessage = t.step_func_done((e) => { |
| assert_equals(localFrame.timestamp, defaultInit.timestamp); |
| localFrame.destroy(); |
| }) |
| |
| localPort.postMessage(localFrame.clone()); |
| |
| }, 'Verify destroying cloned frames doesn\'t propagate accross contexts.'); |
| |
| async_test(async function(t) { |
| let localFrame = await createDefaultVideoFrame(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| |
| localPort.onmessage = t.unreached_func(); |
| |
| localFrame.destroy(); |
| |
| assert_throws_dom("DataCloneError", () => { |
| localPort.postMessage(localFrame); |
| }); |
| |
| t.done(); |
| }, 'Verify posting destroyed frames throws.'); |
| |
| </script> |
| </html> |