importScripts("mediasource-worker-util.js");
// Note, we do not use testharness.js utilities within the worker context
// because it also communicates using postMessage to the main HTML document's
// harness, and would confuse the test case message parsing there.
onmessage = function(evt) {
postMessage({ subject: messageSubject.ERROR, info: "No message expected by Worker"});
};
let util = new MediaSourceWorkerUtil();
let handle = util.mediaSource.handle;
util.mediaSource.addEventListener('sourceopen', () => {
// Immediately re-verify the SameObject property of the handle we transferred.
if (handle !== util.mediaSource.handle) {
postMessage({
subject: messageSubject.ERROR,
info: 'mediaSource.handle changed from the original value'
});
}
// Also verify that transferring the already-transferred handle instance is
// prevented correctly.
try {
postMessage(
{
subject: messageSubject.ERROR,
info:
'This postMessage should fail: the handle has already been transferred',
extra_info: util.mediaSource.handle
},
{transfer: [util.mediaSource.handle]});
} catch (e) {
if (e.name != 'DataCloneError') {
postMessage({
subject: messageSubject.ERROR,
info: 'Expected handle retransfer exception did not occur'
});
}
}
sourceBuffer = util.mediaSource.addSourceBuffer(util.mediaMetadata.type);
sourceBuffer.onerror = (err) => {
postMessage({ subject: messageSubject.ERROR, info: err });
};
sourceBuffer.onupdateend = () => {
// Reset the parser. Unnecessary for this buffering, except helps with test
// coverage.
sourceBuffer.abort();
// Shorten the buffered media and test playback duration to avoid timeouts.
sourceBuffer.remove(0.5, Infinity);
sourceBuffer.onupdateend = () => {
util.mediaSource.duration = 0.5;
// Issue changeType to the same type that we've already buffered.
// Unnecessary for this buffering, except helps with test coverage.
sourceBuffer.changeType(util.mediaMetadata.type);
util.mediaSource.endOfStream();
// Sanity check the duration.
// Unnecessary for this buffering, except helps with test coverage.
var duration = util.mediaSource.duration;
if (isNaN(duration) || duration <= 0.0 || duration >= 1.0) {
postMessage({
subject: messageSubject.ERROR,
info: "mediaSource.duration " + duration + " is not within expected range (0,1)"
});
}
};
};
util.mediaLoadPromise.then(mediaData => { sourceBuffer.appendBuffer(mediaData); },
err => { postMessage({ subject: messageSubject.ERROR, info: err }) });
}, {once: true});
postMessage({ subject: messageSubject.HANDLE, info: handle }, { transfer: [handle] });