| // META: global=window | |
| // META: script=/common/media.js | |
| // META: script=/webcodecs/utils.js | |
| var defaultAudioInit = { | |
| type: 'key', | |
| timestamp: 1234, | |
| duration: 9876, | |
| data: new Uint8Array([5, 6, 7, 8]) | |
| }; | |
| var defaultVideoInit = { | |
| type: 'key', | |
| timestamp: 1234, | |
| duration: 5678, | |
| data: new Uint8Array([9, 10, 11, 12]) | |
| }; | |
| function createDefaultChunk(type, init) { | |
| return type == 'audio' ? new EncodedAudioChunk(init) : | |
| new EncodedVideoChunk(init); | |
| } | |
| function runTest(t, type) { | |
| let defaultInit = type == 'audio' ? defaultAudioInit : defaultVideoInit; | |
| let originalData = createDefaultChunk(type, defaultInit); | |
| let channel = new MessageChannel(); | |
| let localPort = channel.port1; | |
| let externalPort = channel.port2; | |
| externalPort.onmessage = t.step_func((e) => { | |
| let newData = e.data; | |
| // We should have a valid deserialized buffer. | |
| assert_equals(newData.type, defaultInit.type, 'type'); | |
| assert_equals(newData.duration, defaultInit.duration, 'duration'); | |
| assert_equals(newData.timestamp, defaultInit.timestamp, 'timestamp'); | |
| assert_equals( | |
| newData.byteLength, defaultInit.data.byteLength, 'byteLength'); | |
| const originalData_copyDest = new Uint8Array(defaultInit.data); | |
| const newData_copyDest = new Uint8Array(defaultInit.data); | |
| originalData.copyTo(originalData_copyDest); | |
| newData.copyTo(newData_copyDest); | |
| for (var i = 0; i < newData_copyDest.length; ++i) { | |
| assert_equals( | |
| newData_copyDest[i], originalData_copyDest[i], `data (i=${i})`); | |
| } | |
| externalPort.postMessage('Done'); | |
| }) | |
| localPort.onmessage = t.step_func_done((e) => { | |
| assert_equals(originalData.type, defaultInit.type, 'type'); | |
| assert_equals(originalData.duration, defaultInit.duration, 'duration'); | |
| assert_equals(originalData.timestamp, defaultInit.timestamp, 'timestamp'); | |
| assert_equals( | |
| originalData.byteLength, defaultInit.data.byteLength, 'byteLength'); | |
| }) | |
| localPort.postMessage(originalData); | |
| } | |
| async_test(t => { | |
| runTest(t, 'audio'); | |
| }, 'Verify EncodedAudioChunk is serializable.'); | |
| async_test(t => { | |
| runTest(t, 'video'); | |
| }, 'Verify EncodedVideoChunk is serializable.'); | |
| test(() => { | |
| const chunk = createDefaultChunk("video", defaultVideoInit); | |
| if (window.history) | |
| assert_throws_dom("DataCloneError", () => history.pushState({ chunk }, null)); | |
| }, "Verify EncodedVideoChunk cannot be stored"); |