|  | // Extract & return the resolution string from a filename, if any. | 
|  | function resolutionFromFilename(filename) | 
|  | { | 
|  | resolution = filename.replace(/^.*[^0-9]([0-9]+x[0-9]+)[^0-9].*$/, "$1"); | 
|  | if (resolution != filename) { | 
|  | return resolution; | 
|  | } | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | function appendBuffer(test, sourceBuffer, data) | 
|  | { | 
|  | test.expectEvent(sourceBuffer, "update"); | 
|  | test.expectEvent(sourceBuffer, "updateend"); | 
|  | sourceBuffer.appendBuffer(data); | 
|  | } | 
|  |  | 
|  | function mediaSourceConfigChangeTest(directory, idA, idB, description) | 
|  | { | 
|  | var manifestFilenameA = directory + "/test-" + idA + "-manifest.json"; | 
|  | var manifestFilenameB = directory + "/test-" + idB + "-manifest.json"; | 
|  | mediasource_test(function(test, mediaElement, mediaSource) | 
|  | { | 
|  | mediaElement.pause(); | 
|  | mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'")); | 
|  | var expectResizeEvents = resolutionFromFilename(manifestFilenameA) != resolutionFromFilename(manifestFilenameB); | 
|  | var expectedResizeEventCount = 0; | 
|  |  | 
|  | MediaSourceUtil.fetchManifestAndData(test, manifestFilenameA, function(typeA, dataA) | 
|  | { | 
|  | MediaSourceUtil.fetchManifestAndData(test, manifestFilenameB, function(typeB, dataB) | 
|  | { | 
|  | assert_equals(typeA, typeB, "Media format types match"); | 
|  |  | 
|  | var sourceBuffer = mediaSource.addSourceBuffer(typeA); | 
|  |  | 
|  | appendBuffer(test, sourceBuffer, dataA); | 
|  | ++expectedResizeEventCount; | 
|  |  | 
|  | test.waitForExpectedEvents(function() | 
|  | { | 
|  | // Add the second buffer starting at 0.5 second. | 
|  | sourceBuffer.timestampOffset = 0.5; | 
|  | appendBuffer(test, sourceBuffer, dataB); | 
|  | ++expectedResizeEventCount; | 
|  | }); | 
|  |  | 
|  | test.waitForExpectedEvents(function() | 
|  | { | 
|  | // Add the first buffer starting at 1 second. | 
|  | sourceBuffer.timestampOffset = 1; | 
|  | appendBuffer(test, sourceBuffer, dataA); | 
|  | ++expectedResizeEventCount; | 
|  | }); | 
|  |  | 
|  | test.waitForExpectedEvents(function() | 
|  | { | 
|  | // Add the second buffer starting at 1.5 second. | 
|  | sourceBuffer.timestampOffset = 1.5; | 
|  | appendBuffer(test, sourceBuffer, dataB); | 
|  | ++expectedResizeEventCount; | 
|  | }); | 
|  |  | 
|  | test.waitForExpectedEvents(function() | 
|  | { | 
|  | assert_false(sourceBuffer.updating, "updating"); | 
|  | assert_greater_than(mediaSource.duration, 2, "duration"); | 
|  |  | 
|  | // Truncate the presentation to a duration of 2 seconds. | 
|  | mediaSource.duration = 2; | 
|  |  | 
|  | assert_true(sourceBuffer.updating, "updating"); | 
|  | test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer'); | 
|  | test.expectEvent(sourceBuffer, 'update', 'sourceBuffer'); | 
|  | test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer'); | 
|  | }); | 
|  |  | 
|  | test.waitForExpectedEvents(function() | 
|  | { | 
|  | assert_false(sourceBuffer.updating, "updating"); | 
|  |  | 
|  | mediaSource.endOfStream(); | 
|  |  | 
|  | assert_false(sourceBuffer.updating, "updating"); | 
|  |  | 
|  | if (expectResizeEvents) { | 
|  | for (var i = 0; i < expectedResizeEventCount; ++i) { | 
|  | test.expectEvent(mediaElement, "resize"); | 
|  | } | 
|  | } | 
|  | test.expectEvent(mediaElement, "ended"); | 
|  | mediaElement.play(); | 
|  | }); | 
|  |  | 
|  | test.waitForExpectedEvents(function() { | 
|  | test.done(); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | }, description); | 
|  | }; |