mirror of
https://github.com/classilla/tenfourfox.git
synced 2025-02-08 01:31:00 +00:00
114 lines
5.0 KiB
HTML
114 lines
5.0 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>Test Attaching a MediaSource to multiple HTMLMediaElements.</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="mediasource-util.js"></script>
|
|
</head>
|
|
<body>
|
|
<div id="log"></div>
|
|
<script>
|
|
function twoMediaElementTest(testFunction, description)
|
|
{
|
|
media_test(function(test)
|
|
{
|
|
var firstMediaTag = document.createElement('video');
|
|
var secondMediaTag = document.createElement('video');
|
|
document.body.appendChild(firstMediaTag);
|
|
document.body.appendChild(secondMediaTag);
|
|
|
|
// Overload done() so that elements added to the document can be
|
|
// removed.
|
|
var removeMediaElements = true;
|
|
var oldTestDone = test.done.bind(test);
|
|
test.done = function()
|
|
{
|
|
if (removeMediaElements) {
|
|
document.body.removeChild(secondMediaTag);
|
|
document.body.removeChild(firstMediaTag);
|
|
removeMediaElements = false;
|
|
}
|
|
oldTestDone();
|
|
};
|
|
|
|
testFunction(test, firstMediaTag, secondMediaTag);
|
|
}, description);
|
|
}
|
|
|
|
twoMediaElementTest(function(test, firstMediaTag, secondMediaTag)
|
|
{
|
|
// When attachment of mediaSource to two MediaElements is done
|
|
// without an intervening stable state, exactly one of the two
|
|
// MediaElements should successfully attach, and the other one
|
|
// should get error event due to mediaSource already in 'open'
|
|
// readyState.
|
|
var mediaSource = new MediaSource();
|
|
var mediaSourceURL = URL.createObjectURL(mediaSource);
|
|
var gotSourceOpen = false;
|
|
var gotError = false;
|
|
var doneIfFinished = test.step_func(function()
|
|
{
|
|
if (gotSourceOpen && gotError)
|
|
test.done();
|
|
});
|
|
var errorHandler = test.step_func(function(e)
|
|
{
|
|
firstMediaTag.removeEventListener('error', errorHandler);
|
|
secondMediaTag.removeEventListener('error', errorHandler);
|
|
|
|
var eventTarget = e.target;
|
|
var otherTarget;
|
|
if (eventTarget == firstMediaTag) {
|
|
otherTarget = secondMediaTag;
|
|
} else {
|
|
assert_equals(eventTarget, secondMediaTag, 'Error target check');
|
|
otherTarget = firstMediaTag;
|
|
}
|
|
|
|
assert_true(eventTarget.error != null, 'Error state on one tag');
|
|
assert_equals(eventTarget.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, 'Expected error code');
|
|
assert_equals(otherTarget.error, null, 'No error on other tag');
|
|
|
|
assert_equals(eventTarget.networkState, HTMLMediaElement.NETWORK_NO_SOURCE,
|
|
'Tag with error state networkState');
|
|
assert_equals(otherTarget.networkState, HTMLMediaElement.NETWORK_LOADING,
|
|
'Tag without error state networkState');
|
|
|
|
gotError = true;
|
|
doneIfFinished();
|
|
});
|
|
|
|
test.expectEvent(mediaSource, 'sourceopen', 'An attachment succeeded');
|
|
firstMediaTag.addEventListener('error', errorHandler);
|
|
secondMediaTag.addEventListener('error', errorHandler);
|
|
|
|
firstMediaTag.src = mediaSourceURL;
|
|
secondMediaTag.src = mediaSourceURL;
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assert_equals(mediaSource.readyState, 'open', 'Source is opened');
|
|
gotSourceOpen = true;
|
|
doneIfFinished();
|
|
});
|
|
}, 'Test exactly one succeeds when two MediaElements attach to same MediaSource');
|
|
|
|
mediasource_test(function(test, mediaElement, mediaSource) {
|
|
assert_equals(mediaSource.readyState, 'open', 'Source open');
|
|
// Set the tag's src attribute. This should close mediaSource,
|
|
// reattach it to the tag, and initiate source reopening.
|
|
test.expectEvent(mediaSource, 'sourceopen', 'Source attached again');
|
|
mediaElement.src = URL.createObjectURL(mediaSource);
|
|
assert_equals(mediaSource.readyState, 'closed', 'Source closed');
|
|
|
|
test.waitForExpectedEvents(function()
|
|
{
|
|
assert_equals(mediaSource.readyState, 'open', 'Source reopened');
|
|
test.done();
|
|
});
|
|
}, 'Test that MediaSource can reattach if closed first');
|
|
</script>
|
|
</body>
|
|
</html>
|