<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206129] trunk/LayoutTests/imported/w3c</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206129">206129</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2016-09-19 16:30:53 -0700 (Mon, 19 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Unreviewed gardening; update LayoutTests/media-source to the most recent version (5a011ca).

* resources/TestRepositories:
* web-platform-tests/media-source/OWNERS:
* web-platform-tests/media-source/interfaces.html:
* web-platform-tests/media-source/manifest.txt:
* web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html:
* web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html: Added.
* web-platform-tests/media-source/mediasource-avtracks.html:
* web-platform-tests/media-source/mediasource-detach.html:
* web-platform-tests/media-source/mediasource-duration-expected.txt:
* web-platform-tests/media-source/mediasource-duration.html:
* web-platform-tests/media-source/mediasource-endofstream.html:
* web-platform-tests/media-source/mediasource-errors.html:
* web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt:
* web-platform-tests/media-source/mediasource-getvideoplaybackquality.html:
* web-platform-tests/media-source/mediasource-is-type-supported.html:
* web-platform-tests/media-source/mediasource-liveseekable.html:
* web-platform-tests/media-source/mediasource-remove-expected.txt:
* web-platform-tests/media-source/mediasource-remove.html:
* web-platform-tests/media-source/mediasource-removesourcebuffer.html:
* web-platform-tests/media-source/mediasource-seekable.html:
* web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html: Added.
* web-platform-tests/media-source/mediasource-sourcebuffer-mode.html:
* web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html:
* web-platform-tests/media-source/mediasource-timestamp-offset.html:
* web-platform-tests/media-source/mediasource-trackdefault.html:
* web-platform-tests/media-source/mediasource-trackdefaultlist.html:
* web-platform-tests/media-source/mediasource-util.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cresourcesTestRepositories">trunk/LayoutTests/imported/w3c/resources/TestRepositories</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourceOWNERS">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/OWNERS</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourceinterfaceshtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/interfaces.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemanifesttxt">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/manifest.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceappendbufferquotaexceededhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceavtrackshtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-avtracks.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedetachhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-detach.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedurationexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedurationhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceendofstreamhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-endofstream.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceerrorshtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-errors.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcegetvideoplaybackqualityexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcegetvideoplaybackqualityhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceistypesupportedhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-is-type-supported.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceliveseekablehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-liveseekable.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremoveexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremovehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremovesourcebufferhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-removesourcebuffer.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceseekablehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-seekable.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffermodehtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffertrackdefaultshtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetimestampoffsethtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-timestamp-offset.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetrackdefaulthtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefault.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetrackdefaultlisthtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefaultlist.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceutiljs">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-util.js</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceattachstopsdelayingloadeventhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffermodetimestampshtml">trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2016-09-19  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        Unreviewed gardening; update LayoutTests/media-source to the most recent version (5a011ca).
+
+        * resources/TestRepositories:
+        * web-platform-tests/media-source/OWNERS:
+        * web-platform-tests/media-source/interfaces.html:
+        * web-platform-tests/media-source/manifest.txt:
+        * web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html:
+        * web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html: Added.
+        * web-platform-tests/media-source/mediasource-avtracks.html:
+        * web-platform-tests/media-source/mediasource-detach.html:
+        * web-platform-tests/media-source/mediasource-duration-expected.txt:
+        * web-platform-tests/media-source/mediasource-duration.html:
+        * web-platform-tests/media-source/mediasource-endofstream.html:
+        * web-platform-tests/media-source/mediasource-errors.html:
+        * web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt:
+        * web-platform-tests/media-source/mediasource-getvideoplaybackquality.html:
+        * web-platform-tests/media-source/mediasource-is-type-supported.html:
+        * web-platform-tests/media-source/mediasource-liveseekable.html:
+        * web-platform-tests/media-source/mediasource-remove-expected.txt:
+        * web-platform-tests/media-source/mediasource-remove.html:
+        * web-platform-tests/media-source/mediasource-removesourcebuffer.html:
+        * web-platform-tests/media-source/mediasource-seekable.html:
+        * web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html: Added.
+        * web-platform-tests/media-source/mediasource-sourcebuffer-mode.html:
+        * web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html:
+        * web-platform-tests/media-source/mediasource-timestamp-offset.html:
+        * web-platform-tests/media-source/mediasource-trackdefault.html:
+        * web-platform-tests/media-source/mediasource-trackdefaultlist.html:
+        * web-platform-tests/media-source/mediasource-util.js:
+
</ins><span class="cx"> 2016-09-19  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update XHTMLParser to recognize &quot;-//W3C//DTD MathML 2.0//EN&quot; public identifier
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cresourcesTestRepositories"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/resources/TestRepositories (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/resources/TestRepositories        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/resources/TestRepositories        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx">     {
</span><span class="cx">         &quot;name&quot;: &quot;web-platform-tests&quot;,
</span><span class="cx">         &quot;url&quot;: &quot;https://github.com/w3c/web-platform-tests.git&quot;, 
</span><del>-        &quot;revision&quot;: &quot;6d9c836&quot;,
</del><ins>+        &quot;revision&quot;: &quot;5a011ca&quot;,
</ins><span class="cx">         &quot;paths_to_skip&quot;: [
</span><span class="cx">             &quot;conformance-checkers&quot;,
</span><span class="cx">             &quot;docs&quot;,
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourceOWNERS"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/OWNERS (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/OWNERS        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/OWNERS        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,3 @@
</span><del>-@bit
-@acolwell
</del><span class="cx"> @shishimaru
</span><span class="cx"> @sideshowbarker
</span><span class="cx"> @wolenetz
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourceinterfaceshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/interfaces.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/interfaces.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/interfaces.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -26,93 +26,63 @@
</span><span class="cx"> &lt;script type=text/plain&gt;
</span><span class="cx"> [Constructor]
</span><span class="cx"> interface MediaSource : EventTarget {
</span><del>-    readonly    attribute SourceBufferList    sourceBuffers;
-    readonly    attribute SourceBufferList    activeSourceBuffers;
-    readonly    attribute ReadyState          readyState;
-                attribute unrestricted double duration;
-                attribute EventHandler        onsourceopen;
-                attribute EventHandler        onsourceended;
-                attribute EventHandler        onsourceclose;
-    SourceBuffer   addSourceBuffer (DOMString type);
-    void           removeSourceBuffer (SourceBuffer sourceBuffer);
-    void           endOfStream (optional EndOfStreamError error);
-    void           setLiveSeekableRange (double start, double end);
-    void           clearLiveSeekableRange ();
-    static boolean isTypeSupported (DOMString type);
</del><ins>+    readonly attribute SourceBufferList    sourceBuffers;
+    readonly attribute SourceBufferList    activeSourceBuffers;
+    readonly attribute ReadyState          readyState;
+             attribute unrestricted double duration;
+             attribute EventHandler        onsourceopen;
+             attribute EventHandler        onsourceended;
+             attribute EventHandler        onsourceclose;
+    SourceBuffer addSourceBuffer(DOMString type);
+    void         removeSourceBuffer(SourceBuffer sourceBuffer);
+    void         endOfStream(optional EndOfStreamError error);
+    void         setLiveSeekableRange(double start, double end);
+    void         clearLiveSeekableRange();
+    static boolean isTypeSupported(DOMString type);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> interface SourceBuffer : EventTarget {
</span><del>-                attribute AppendMode          mode;
-    readonly    attribute boolean             updating;
-    readonly    attribute TimeRanges          buffered;
-                attribute double              timestampOffset;
-    readonly    attribute AudioTrackList      audioTracks;
-    readonly    attribute VideoTrackList      videoTracks;
-    readonly    attribute TextTrackList       textTracks;
-                attribute double              appendWindowStart;
-                attribute unrestricted double appendWindowEnd;
-                attribute EventHandler        onupdatestart;
-                attribute EventHandler        onupdate;
-                attribute EventHandler        onupdateend;
-                attribute EventHandler        onerror;
-                attribute EventHandler        onabort;
-    void appendBuffer (ArrayBuffer data);
-    void appendBuffer (ArrayBufferView data);
-    void appendStream (ReadableStream stream, [EnforceRange] optional unsigned long long maxSize);
-    void abort ();
-    void remove (double start, unrestricted double end);
-                    attribute TrackDefaultList    trackDefaults;
</del><ins>+             attribute AppendMode          mode;
+    readonly attribute boolean             updating;
+    readonly attribute TimeRanges          buffered;
+             attribute double              timestampOffset;
+    readonly attribute AudioTrackList      audioTracks;
+    readonly attribute VideoTrackList      videoTracks;
+    readonly attribute TextTrackList       textTracks;
+             attribute double              appendWindowStart;
+             attribute unrestricted double appendWindowEnd;
+             attribute EventHandler        onupdatestart;
+             attribute EventHandler        onupdate;
+             attribute EventHandler        onupdateend;
+             attribute EventHandler        onerror;
+             attribute EventHandler        onabort;
+    void appendBuffer(BufferSource data);
+    void abort();
+    void remove(double start, unrestricted double end);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> interface SourceBufferList : EventTarget {
</span><del>-    readonly    attribute unsigned long length;
-                attribute EventHandler  onaddsourcebuffer;
-                attribute EventHandler  onremovesourcebuffer;
</del><ins>+    readonly attribute unsigned long length;
+             attribute EventHandler  onaddsourcebuffer;
+             attribute EventHandler  onremovesourcebuffer;
</ins><span class="cx">     getter SourceBuffer (unsigned long index);
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-interface VideoPlaybackQuality {
-    readonly    attribute DOMHighResTimeStamp creationTime;
-    readonly    attribute unsigned long       totalVideoFrames;
-    readonly    attribute unsigned long       droppedVideoFrames;
-    readonly    attribute unsigned long       corruptedVideoFrames;
-    readonly    attribute double              totalFrameDelay;
-};
-
-[ Constructor (TrackDefaultType type, DOMString language, DOMString label, sequence&lt;DOMString&gt; kinds, optional DOMString byteStreamTrackID = &quot;&quot;)]
-interface TrackDefault {
-    readonly    attribute TrackDefaultType    type;
-    readonly    attribute DOMString           byteStreamTrackID;
-    readonly    attribute DOMString           language;
-    readonly    attribute DOMString           label;
-    sequence&lt;DOMString&gt; getKinds ();
-};
-
-[ Constructor (optional sequence&lt;TrackDefault&gt; trackDefaults = [])]
-interface TrackDefaultList {
-    readonly    attribute unsigned long length;
-    getter TrackDefault (unsigned long index);
-};
-
</del><span class="cx"> [Exposed=Window,DedicatedWorker,SharedWorker]
</span><span class="cx"> partial interface URL {
</span><del>-    static DOMString createObjectURL (MediaSource mediaSource);
</del><ins>+    static DOMString createObjectURL(MediaSource mediaSource);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-partial interface HTMLVideoElement {
-    VideoPlaybackQuality getVideoPlaybackQuality ();
-};
-
</del><span class="cx"> partial interface AudioTrack {
</span><del>-    readonly    attribute SourceBuffer? sourceBuffer;
</del><ins>+    readonly attribute SourceBuffer? sourceBuffer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> partial interface VideoTrack {
</span><del>-    readonly    attribute SourceBuffer? sourceBuffer;
</del><ins>+    readonly attribute SourceBuffer? sourceBuffer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> partial interface TextTrack {
</span><del>-    readonly    attribute SourceBuffer? sourceBuffer;
</del><ins>+    readonly attribute SourceBuffer? sourceBuffer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> enum EndOfStreamError {
</span><span class="lines">@@ -130,15 +100,10 @@
</span><span class="cx">     &quot;open&quot;,
</span><span class="cx">     &quot;ended&quot;
</span><span class="cx"> };
</span><del>-
-enum TrackDefaultType {
-    &quot;audio&quot;,
-    &quot;video&quot;,
-    &quot;text&quot;
-};
</del><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><span class="cx"> &quot;use strict&quot;;
</span><ins>+setup({ explicit_done: true });
</ins><span class="cx"> var mediaSource;
</span><span class="cx"> var sourceBuffer;
</span><span class="cx"> var video = document.createElement(&quot;video&quot;);
</span><span class="lines">@@ -154,11 +119,10 @@
</span><span class="cx">   idlArray.add_objects({
</span><span class="cx">     MediaSource: ['mediaSource'],
</span><span class="cx">     SourceBuffer: ['sourceBuffer'],
</span><del>-    SourceBufferList: ['mediaSource.sourceBuffers'],
-    VideoPlaybackQuality: ['video.getVideoPlaybackQuality()'],
-    TrackDefaultList: ['sourceBuffer.trackDefaults']
</del><ins>+    SourceBufferList: ['mediaSource.sourceBuffers']
</ins><span class="cx">   });
</span><span class="cx">   idlArray.test();
</span><ins>+  done();
</ins><span class="cx"> }
</span><span class="cx"> mediaSource = new MediaSource();
</span><span class="cx"> video.src = URL.createObjectURL(mediaSource);
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemanifesttxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/manifest.txt (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/manifest.txt        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/manifest.txt        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,6 +1,12 @@
</span><ins>+interfaces.html
+mediasource-activesourcebuffers.html
</ins><span class="cx"> mediasource-addsourcebuffer.html
</span><ins>+mediasource-addsourcebuffer-mode.html
</ins><span class="cx"> mediasource-append-buffer.html
</span><ins>+mediasource-appendbuffer-quota-exceeded.html
</ins><span class="cx"> mediasource-appendwindow.html
</span><ins>+mediasource-attach-stops-delaying-load-event.html
+mediasource-avtracks.html
</ins><span class="cx"> mediasource-buffered.html
</span><span class="cx"> mediasource-closed.html
</span><span class="cx"> mediasource-config-change-mp4-a-bitrate.html
</span><span class="lines">@@ -17,10 +23,12 @@
</span><span class="cx"> mediasource-config-change-webm-v-bitrate.html
</span><span class="cx"> mediasource-config-change-webm-v-framerate.html
</span><span class="cx"> mediasource-config-change-webm-v-framesize.html
</span><ins>+mediasource-detach.html
</ins><span class="cx"> mediasource-duration-boundaryconditions.html
</span><span class="cx"> mediasource-duration.html
</span><ins>+mediasource-endofstream.html
</ins><span class="cx"> mediasource-endofstream-invaliderror.html
</span><del>-mediasource-getvideoplaybackquality.html
</del><ins>+mediasource-errors.html
</ins><span class="cx"> mediasource-is-type-supported.html
</span><span class="cx"> mediasource-liveseekable.html
</span><span class="cx"> mediasource-multiple-attach.html
</span><span class="lines">@@ -30,9 +38,18 @@
</span><span class="cx"> mediasource-redundant-seek.html
</span><span class="cx"> mediasource-remove.html
</span><span class="cx"> mediasource-removesourcebuffer.html
</span><ins>+mediasource-seekable.html
</ins><span class="cx"> mediasource-seek-beyond-duration.html
</span><span class="cx"> mediasource-seek-during-pending-seek.html
</span><span class="cx"> mediasource-sequencemode-append-buffer.html
</span><span class="cx"> mediasource-sourcebufferlist.html
</span><span class="cx"> mediasource-sourcebuffer-mode.html
</span><ins>+mediasource-sourcebuffer-mode-timestamps.html
</ins><span class="cx"> mediasource-timestamp-offset.html
</span><ins>+SourceBuffer-abort.html
+SourceBuffer-abort-readyState.html
+SourceBuffer-abort-removed.html
+SourceBuffer-abort-updating.html
+URL-createObjectURL.html
+URL-createObjectURL-null.html
+URL-createObjectURL-revoke.html
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceappendbufferquotaexceededhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-appendbuffer-quota-exceeded.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,10 +1,14 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><ins>+&lt;meta name=&quot;timeout&quot; content=&quot;long&quot;&gt;
</ins><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;mediasource-util.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script&gt;
</span><ins>+    var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
+    var manifestFilenameAudio = subType + &quot;/test-a-128k-44100Hz-1ch-manifest.json&quot;;
+
</ins><span class="cx">     // Fill up a given SourceBuffer by appending data repeatedly via doAppendDataFunc until
</span><span class="cx">     // an exception is thrown. The thrown exception is passed to onCaughtExceptionCallback.
</span><span class="cx">     function fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback) {
</span><span class="lines">@@ -19,16 +23,21 @@
</span><span class="cx">         test.waitForExpectedEvents(function() { fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback); });
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
</del><ins>+    mediasource_test(function(test, mediaElement, mediaSource)
</ins><span class="cx">     {
</span><del>-        sourceBuffer.mode = 'sequence';
-        fillUpSourceBuffer(test, sourceBuffer,
-            function () { // doAppendDataFunc
-                sourceBuffer.appendBuffer(mediaData);
-            },
-            function (ex) { // onCaughtExceptionCallback
-                assert_equals(ex.name, 'QuotaExceededError');
-                test.done();
-            });
</del><ins>+        mediaElement.addEventListener(&quot;error&quot;, test.unreached_func(&quot;Unexpected event 'error'&quot;));
+        MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function(typeAudio, dataAudio)
+        {
+            var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
+            sourceBuffer.mode = 'sequence';
+            fillUpSourceBuffer(test, sourceBuffer,
+                function () { // doAppendDataFunc
+                    sourceBuffer.appendBuffer(dataAudio);
+                },
+                function (ex) { // onCaughtExceptionCallback
+                    assert_equals(ex.name, 'QuotaExceededError');
+                    test.done();
+                });
+        });
</ins><span class="cx">     }, 'Appending data repeatedly should fill up the buffer and throw a QuotaExceededError when buffer is full.');
</span><span class="cx"> &lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceattachstopsdelayingloadeventhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html (0 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-attach-stops-delaying-load-event.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
+&lt;title&gt;Tests that MediaSource attachment stops delaying the load event.&lt;/title&gt;
+&lt;link rel=&quot;author&quot; title=&quot;Matthew Wolenetz&quot; href=&quot;mailto:wolenetz@chromium.org&quot;/&gt;
+&lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+async_test(function(test)
+{
+    var receivedLoadEvent = false;
+    var receivedSourceOpenEvent = false;
+
+    window.addEventListener(&quot;load&quot;, test.step_func(function() {
+        assert_false(receivedLoadEvent, &quot;window should not receive multiple load events&quot;);
+        receivedLoadEvent = true;
+        assert_equals(document.readyState, &quot;complete&quot;, &quot;document should be complete&quot;);
+        if (receivedLoadEvent &amp;&amp; receivedSourceOpenEvent) {
+            test.done();
+        }
+    }));
+
+    assert_equals(document.readyState, &quot;loading&quot;, &quot;document should not be complete yet&quot;);
+    var video = document.createElement(&quot;video&quot;);
+    var mediaSource = new MediaSource();
+
+    // |video| should stop delaying the load event long and complete the MediaSource attachment
+    // before either a &quot;progress&quot;, &quot;stalled&quot; or &quot;suspend&quot; event are enqueued.
+    video.addEventListener(&quot;suspend&quot;, test.unreached_func(&quot;unexpected 'suspend' event&quot;));
+    video.addEventListener(&quot;stalled&quot;, test.unreached_func(&quot;unexpected 'stalled' event&quot;));
+    video.addEventListener(&quot;progress&quot;, test.unreached_func(&quot;unexpected 'progress' event&quot;));
+
+    // No error is expected.
+    video.addEventListener(&quot;error&quot;, test.unreached_func(&quot;unexpected 'error' event&quot;));
+
+    mediaSource.addEventListener(&quot;sourceopen&quot;, test.step_func(function() {
+        assert_false(receivedSourceOpenEvent, &quot;only one sourceopen event should occur in this test&quot;);
+        receivedSourceOpenEvent = true;
+        assert_equals(video.networkState, video.NETWORK_LOADING);
+        assert_equals(video.readyState, video.HAVE_NOTHING);
+        if (receivedLoadEvent &amp;&amp; receivedSourceOpenEvent) {
+            test.done();
+        }
+    }));
+
+    var mediaSourceURL = URL.createObjectURL(mediaSource);
+    video.src = mediaSourceURL;
+    test.add_cleanup(function() { URL.revokeObjectURL(mediaSourceURL); });
+}, &quot;MediaSource attachment should immediately stop delaying the load event&quot;);
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceavtrackshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-avtracks.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-avtracks.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-avtracks.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedetachhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-detach.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-detach.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-detach.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedurationexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration-expected.txt (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration-expected.txt        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration-expected.txt        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -4,4 +4,8 @@
</span><span class="cx"> PASS Test endOfStream completes previous seek to truncated duration 
</span><span class="cx"> PASS Test setting same duration multiple times does not fire duplicate durationchange 
</span><span class="cx"> PASS Test setting the duration to less than the highest starting presentation timestamp will throw 
</span><ins>+PASS Truncating the duration throws an InvalidStateError exception when new duration is less than the highest buffered range start time of one of the track buffers 
+PASS Truncating the duration throws an InvalidStateError exception when new duration is less than a buffered coded frame presentation time 
+PASS Increasing the duration does not trigger any SourceBuffer update 
+PASS Increasing the duration during media playback does not trigger any SourceBuffer update 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcedurationhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-duration.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -10,6 +10,11 @@
</span><span class="cx">     &lt;body&gt;
</span><span class="cx">         &lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
</span><span class="cx">         &lt;script&gt;
</span><ins>+
+          var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
+          var manifestFilenameAudio = subType + &quot;/test-a-128k-44100Hz-1ch-manifest.json&quot;;
+          var manifestFilenameVideo = subType + &quot;/test-v-128k-320x240-30fps-10kfr-manifest.json&quot;;
+
</ins><span class="cx">           function mediasource_truncated_duration_seek_test(testFunction, description, options)
</span><span class="cx">           {
</span><span class="cx">               return mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
</span><span class="lines">@@ -53,15 +58,31 @@
</span><span class="cx"> 
</span><span class="cx">                   test.waitForExpectedEvents(function()
</span><span class="cx">                   {
</span><del>-                      // remove will not remove partial frames. The truncated duration is as such the highest end time.
-                      truncatedDuration = sourceBuffer.buffered.end(sourceBuffer.buffered.length-1);
</del><span class="cx">                       assert_greater_than_equal(mediaElement.currentTime, seekTo, 'Playback time has reached seekTo');
</span><del>-                      test.expectEvent(mediaElement, 'seeking', 'Seeking to truncated duration');
-
</del><span class="cx">                       assert_false(sourceBuffer.updating, 'sourceBuffer.updating');
</span><span class="cx"> 
</span><ins>+                      // Remove will not remove partial frames, so the resulting duration is the highest end time
+                      // of the track buffer ranges, and is greater than or equal to the highest coded frame
+                      // presentation time across all track buffer ranges. We first obtain the intersected track buffer
+                      // ranges end time and set the duration to that value.
+                      truncatedDuration = sourceBuffer.buffered.end(sourceBuffer.buffered.length-1);
+                      assert_less_than(truncatedDuration, seekTo,
+                                       'remove has removed the current playback position from at least one track buffer');
+
</ins><span class="cx">                       mediaSource.duration = truncatedDuration;
</span><ins>+                      test.expectEvent(mediaElement, 'seeking', 'Seeking to truncated duration');
</ins><span class="cx"> 
</span><ins>+                      // The actual duration may be slightly higher than truncatedDuration because the
+                      // duration is adjusted upwards if necessary to be the highest end time across all track buffer
+                      // ranges. Allow that increase here.
+                      assert_less_than_equal(truncatedDuration, mediaSource.duration,
+                                              'Duration should not be less than what was set');
+                      // Here, we assume no test media coded frame duration is longer than 100ms.
+                      assert_less_than(mediaSource.duration - truncatedDuration, 0.1);
+
+                      // Update our truncatedDuration to be the actual new duration.
+                      truncatedDuration = mediaSource.duration;
+
</ins><span class="cx">                       assert_true(mediaElement.seeking, 'Seeking after setting truncatedDuration');
</span><span class="cx">                   });
</span><span class="cx"> 
</span><span class="lines">@@ -253,6 +274,110 @@
</span><span class="cx">               });
</span><span class="cx">           }, 'Test setting the duration to less than the highest starting presentation timestamp will throw');
</span><span class="cx"> 
</span><ins>+          mediasource_test(function(test, mediaElement, mediaSource)
+          {
+              mediaElement.addEventListener(&quot;error&quot;, test.unreached_func(&quot;Unexpected event 'error'&quot;));
+              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function(typeAudio, dataAudio)
+              {
+                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function(typeVideo, dataVideo)
+                  {
+                      var sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
+                      var sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
+                      var newDuration = 1.2;
+
+                      sourceBufferAudio.appendWindowEnd = 2.0;
+                      sourceBufferAudio.appendWindowStart = newDuration / 2.0;
+                      sourceBufferAudio.appendBuffer(dataAudio);
+
+                      sourceBufferVideo.appendWindowEnd = 2.0;
+                      sourceBufferVideo.appendWindowStart = newDuration * 1.3;
+                      sourceBufferVideo.appendBuffer(dataVideo);
+
+                      test.expectEvent(sourceBufferAudio, &quot;updateend&quot;);
+                      test.expectEvent(sourceBufferVideo, &quot;updateend&quot;);
+                      test.waitForExpectedEvents(function()
+                      {
+                          assert_equals(sourceBufferAudio.buffered.length, 1);
+                          assert_equals(sourceBufferVideo.buffered.length, 1);
+                          assert_less_than(sourceBufferAudio.buffered.start(0), newDuration);
+                          assert_greater_than(sourceBufferVideo.buffered.start(0), newDuration);
+                          assert_throws(&quot;InvalidStateError&quot;, function () { mediaSource.duration = newDuration; });
+                          test.done();
+                      });
+                  });
+              });
+          }, &quot;Truncating the duration throws an InvalidStateError exception when new duration is less than the highest buffered range start time of one of the track buffers&quot;);
+
+          mediasource_test(function(test, mediaElement, mediaSource)
+          {
+              mediaElement.addEventListener(&quot;error&quot;, test.unreached_func(&quot;Unexpected event 'error'&quot;));
+              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function(typeAudio, dataAudio)
+              {
+                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function(typeVideo, dataVideo)
+                  {
+                      var sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
+                      var sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
+
+                      // Buffer audio [0.8,1.8)
+                      sourceBufferAudio.timestampOffset = 0.8;
+                      sourceBufferAudio.appendWindowEnd = 1.8;
+                      sourceBufferAudio.appendBuffer(dataAudio);
+
+                      // Buffer video [1.5,3)
+                      sourceBufferVideo.timestampOffset = 1.5;
+                      sourceBufferVideo.appendWindowEnd = 3;
+                      sourceBufferVideo.appendBuffer(dataVideo);
+
+                      test.expectEvent(sourceBufferAudio, &quot;updateend&quot;);
+                      test.expectEvent(sourceBufferVideo, &quot;updateend&quot;);
+                      test.waitForExpectedEvents(function()
+                      {
+                          var newDuration = 2.0;
+
+                          // Verify the test setup
+                          assert_equals(sourceBufferAudio.buffered.length, 1);
+                          assert_equals(sourceBufferVideo.buffered.length, 1);
+                          assert_greater_than(sourceBufferAudio.buffered.end(0), 1.5);
+                          assert_less_than(sourceBufferAudio.buffered.end(0), newDuration);
+                          assert_less_than(sourceBufferVideo.buffered.start(0), newDuration);
+                          assert_greater_than(sourceBufferVideo.buffered.end(0), newDuration + 0.5);
+
+                          // Verify the expected error
+                          // We assume relocated test video has at least one coded
+                          // frame presentation interval which fits in [&gt;2.0,&gt;2.5)
+                          assert_throws(&quot;InvalidStateError&quot;, function () { mediaSource.duration = newDuration; });
+                          test.done();
+                      });
+                  });
+              });
+          }, &quot;Truncating the duration throws an InvalidStateError exception when new duration is less than a buffered coded frame presentation time&quot;);
+
+          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+          {
+              assert_less_than(segmentInfo.duration, 60, 'Sufficient test media duration');
+              sourceBuffer.appendBuffer(mediaData);
+              test.expectEvent(sourceBuffer, 'updateend', 'Media data appended to the SourceBuffer');
+              test.waitForExpectedEvents(function()
+              {
+                  mediaSource.duration = 60;
+                  assert_false(sourceBuffer.updating, 'No SourceBuffer update when duration is increased');
+                  test.done();
+              });
+          }, 'Increasing the duration does not trigger any SourceBuffer update');
+
+          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+          {
+              assert_greater_than(segmentInfo.duration, 2, 'Sufficient test media duration');
+              mediaElement.play();
+              sourceBuffer.appendBuffer(mediaData);
+              test.expectEvent(sourceBuffer, 'updateend', 'Media data appended to the SourceBuffer');
+              test.waitForExpectedEvents(function()
+              {
+                  mediaSource.duration = 60;
+                  assert_false(sourceBuffer.updating, 'No SourceBuffer update when duration is increased');
+                  test.done();
+              });
+          }, 'Increasing the duration during media playback does not trigger any SourceBuffer update');
</ins><span class="cx">         &lt;/script&gt;
</span><span class="cx">     &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceendofstreamhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-endofstream.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-endofstream.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-endofstream.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -23,37 +23,23 @@
</span><span class="cx">             mediaSource.endOfStream();
</span><span class="cx">             test.expectEvent(mediaElement, 'canplaythrough',
</span><span class="cx">               'Media element may render the media content until the end');
</span><del>-            test.waitForExpectedEvents(function()
-            {
-                assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_ENOUGH_DATA,
-                  'Media element has enough data to render the content');
-                test.done();
-            });
</del><span class="cx">         });
</span><del>-    }, 'MediaSource.endOfStream(): media element notified that it now has all of the media data');
</del><span class="cx"> 
</span><del>-    mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
-    {
-        sourceBuffer.appendBuffer(mediaData);
-        test.expectEvent(sourceBuffer, 'updateend',
-          'Media buffer appended to SourceBuffer');
</del><span class="cx">         test.waitForExpectedEvents(function()
</span><span class="cx">         {
</span><del>-            assert_equals(sourceBuffer.buffered.length, 1,
-              'Media data properly buffered');
-            var highestEndTime = sourceBuffer.buffered.end(0);
-
-            mediaSource.endOfStream();
-
-            assert_equals(sourceBuffer.buffered.end(0), highestEndTime,
-              'Ending the stream does not affect buffered data');
</del><ins>+            assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE_ENOUGH_DATA,
+              'Media element has enough data to render the content');
</ins><span class="cx">             test.done();
</span><span class="cx">         });
</span><del>-    }, 'MediaSource.endOfStream(): buffered data not modified when endOfStream is called');
</del><ins>+    }, 'MediaSource.endOfStream(): media element notified that it now has all of the media data');
</ins><span class="cx"> 
</span><ins>+    function threeDecimalPlaces(number)
+    {
+        return Number(number.toFixed(3));
+    }
+
</ins><span class="cx">     mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
</span><span class="cx">     {
</span><del>-        assert_less_than(segmentInfo.duration, 60, 'Sufficient test media duration');
</del><span class="cx">         sourceBuffer.appendBuffer(mediaData);
</span><span class="cx">         test.expectEvent(sourceBuffer, 'updateend',
</span><span class="cx">           'Media buffer appended to SourceBuffer');
</span><span class="lines">@@ -61,13 +47,30 @@
</span><span class="cx">         {
</span><span class="cx">             assert_equals(sourceBuffer.buffered.length, 1,
</span><span class="cx">               'Media data properly buffered');
</span><ins>+            var highestEndTime = sourceBuffer.buffered.end(0);
</ins><span class="cx"> 
</span><del>-            mediaSource.duration = 60;
</del><ins>+            // Note that segmentInfo.duration is expected to also be the
+            // highest track buffer range end time. Therefore, endOfStream() should
+            // not change duration with this media.
+            assert_equals(threeDecimalPlaces(segmentInfo.duration), threeDecimalPlaces(mediaSource.duration));
+            assert_less_than_equal(highestEndTime, mediaSource.duration,
+                'Media duration may be slightly longer than intersected track buffered ranges');
+
+            // Set the duration even higher, then confirm that endOfStream() drops it back to be
+            // the highest track buffer range end time.
+            mediaSource.duration += 10;
</ins><span class="cx">             mediaSource.endOfStream();
</span><span class="cx"> 
</span><del>-            assert_equals(mediaSource.duration, sourceBuffer.buffered.end(0),
-              'Duration set to the higest end time');
</del><ins>+            assert_equals(sourceBuffer.buffered.length, 1,
+              'Media data properly buffered after endOfStream');
+
+            assert_equals(threeDecimalPlaces(segmentInfo.duration), threeDecimalPlaces(mediaSource.duration));
+            assert_less_than_equal(highestEndTime, mediaSource.duration,
+                'Media duration may be slightly longer than intersected track buffered ranges');
+            assert_equals(sourceBuffer.buffered.end(0), mediaSource.duration,
+                'After endOfStream(), highest buffered range end time must be the highest track buffer range end time');
+
</ins><span class="cx">             test.done();
</span><span class="cx">         });
</span><del>-    }, 'MediaSource.endOfStream(): duration set to the highest end time reported by the buffered attribute');
-&lt;/script&gt;
</del><span class="cx">\ No newline at end of file
</span><ins>+    }, 'MediaSource.endOfStream(): duration and buffered range end time before and after endOfStream');
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceerrorshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-errors.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-errors.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-errors.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcegetvideoplaybackqualityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality-expected.txt        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,3 +1,4 @@
</span><span class="cx"> 
</span><span class="cx"> PASS Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API 
</span><ins>+PASS Test the totalFrameDelay attribute of HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcegetvideoplaybackqualityhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-getvideoplaybackquality.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -18,18 +18,33 @@
</span><span class="cx">               {
</span><span class="cx">                   var videoElement = e.target;
</span><span class="cx">                   var newQuality = videoElement.getVideoPlaybackQuality();
</span><ins>+                  var now = window.performance.now();
</ins><span class="cx"> 
</span><del>-                  assert_not_equals(previousQuality, newQuality, &quot;Verify new object&quot;);
-                  assert_greater_than(newQuality.creationTime, previousQuality.creationTime, &quot;creationTime&quot;);
</del><ins>+                  assert_not_equals(previousQuality, newQuality,
+                    &quot;New quality object is different from the previous one&quot;);
+                  assert_greater_than(newQuality.creationTime, previousQuality.creationTime,
+                    &quot;creationTime increases monotonically&quot;);
+                  assert_approx_equals(newQuality.creationTime, now, 100,
+                    &quot;creationTime roughly equals current time&quot;);
</ins><span class="cx"> 
</span><span class="cx">                   assert_greater_than_equal(newQuality.totalVideoFrames, 0, &quot;totalVideoFrames &gt;= 0&quot;);
</span><del>-                  assert_greater_than_equal(newQuality.totalVideoFrames, previousQuality.totalVideoFrames, &quot;totalVideoFrames&quot;);
</del><ins>+                  assert_greater_than_equal(newQuality.totalVideoFrames, previousQuality.totalVideoFrames,
+                    &quot;totalVideoFrames increases monotonically&quot;);
+                  assert_less_than(newQuality.totalVideoFrames, 300,
+                    &quot;totalVideoFrames should remain low as duration is less than 10s and framerate less than 30fps&quot;);
</ins><span class="cx"> 
</span><span class="cx">                   assert_greater_than_equal(newQuality.droppedVideoFrames, 0, &quot;droppedVideoFrames &gt;= 0&quot;);
</span><del>-                  assert_greater_than_equal(newQuality.droppedVideoFrames, previousQuality.droppedVideoFrames, &quot;droppedVideoFrames&quot;);
</del><ins>+                  assert_greater_than_equal(newQuality.droppedVideoFrames, previousQuality.droppedVideoFrames,
+                    &quot;droppedVideoFrames increases monotonically&quot;);
+                  assert_less_than_equal(newQuality.droppedVideoFrames, newQuality.totalVideoFrames,
+                    &quot;droppedVideoFrames is only a portion of totalVideoFrames&quot;);
</ins><span class="cx"> 
</span><span class="cx">                   assert_greater_than_equal(newQuality.corruptedVideoFrames, 0, &quot;corruptedVideoFrames &gt;= 0&quot;);
</span><del>-                  assert_greater_than_equal(newQuality.corruptedVideoFrames, previousQuality.corruptedVideoFrames, &quot;corruptedVideoFrames&quot;);
</del><ins>+                  assert_greater_than_equal(newQuality.corruptedVideoFrames, previousQuality.corruptedVideoFrames,
+                    &quot;corruptedVideoFrames increases monotonically&quot;);
+                  assert_less_than_equal(newQuality.corruptedVideoFrames, newQuality.totalVideoFrames,
+                    &quot;corruptedVideoFrames is only a portion of totalVideoFrames&quot;);
+
</ins><span class="cx">                   previousQuality = newQuality;
</span><span class="cx">                   timeUpdateCount++;
</span><span class="cx">               }));
</span><span class="lines">@@ -36,36 +51,57 @@
</span><span class="cx"> 
</span><span class="cx">               mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
</span><span class="cx"> 
</span><del>-              test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
-              test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
</del><ins>+              sourceBuffer.appendBuffer(mediaData);
</ins><span class="cx">               test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
</span><del>-              sourceBuffer.appendBuffer(mediaData);
</del><span class="cx"> 
</span><span class="cx">               test.waitForExpectedEvents(function()
</span><span class="cx">               {
</span><span class="cx">                   assert_false(sourceBuffer.updating, &quot;updating&quot;);
</span><del>-
-                  sourceBuffer.remove(1, Infinity);
-
-                  assert_true(sourceBuffer.updating, &quot;updating&quot;);
-                  test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
-                  test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
-                  test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
</del><ins>+                  mediaSource.endOfStream();
+                  assert_less_than(mediaSource.duration, 10, &quot;duration&quot;);
+                  mediaElement.play();
+                  test.expectEvent(mediaElement, 'ended', 'mediaElement');
</ins><span class="cx">               });
</span><span class="cx"> 
</span><span class="cx">               test.waitForExpectedEvents(function()
</span><span class="cx">               {
</span><del>-                  assert_false(sourceBuffer.updating, &quot;updating&quot;);
-                  assert_greater_than(mediaSource.duration, 1, &quot;duration&quot;);
</del><ins>+                  assert_greater_than(timeUpdateCount, 2, &quot;timeUpdateCount&quot;);
+                  test.done();
+              });
+          }, &quot;Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API&quot;);
</ins><span class="cx"> 
</span><del>-                  mediaSource.duration = 1;
</del><span class="cx"> 
</span><del>-                  test.expectEvent(mediaElement, &quot;durationchange&quot;);
-              });
</del><ins>+          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+          {
+              var previousQuality = mediaElement.getVideoPlaybackQuality();
+              var timeUpdateCount = 0;
+              var startTime = 0;
+              mediaElement.addEventListener(&quot;timeupdate&quot;, test.step_func(function (e)
+              {
+                  var videoElement = e.target;
+                  var newQuality = videoElement.getVideoPlaybackQuality();
+                  var now = window.performance.now();
</ins><span class="cx"> 
</span><ins>+                  assert_greater_than_equal(newQuality.totalFrameDelay, 0, &quot;totalFrameDelay &gt;= 0&quot;);
+                  assert_greater_than_equal(newQuality.totalFrameDelay, previousQuality.totalFrameDelay,
+                    &quot;totalFrameDelay increases monotonically&quot;);
+                  assert_less_than(newQuality.totalFrameDelay, (now - startTime) / 1000,
+                    &quot;totalFrameDelay does not exceed the time elapsed since playback started&quot;);
+
+                  previousQuality = newQuality;
+                  timeUpdateCount++;
+              }));
+
+              mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+
+              sourceBuffer.appendBuffer(mediaData);
+              test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
</ins><span class="cx">               test.waitForExpectedEvents(function()
</span><span class="cx">               {
</span><ins>+                  assert_false(sourceBuffer.updating, &quot;updating&quot;);
</ins><span class="cx">                   mediaSource.endOfStream();
</span><ins>+                  assert_less_than(mediaSource.duration, 10, &quot;duration&quot;);
+                  startTime = window.performance.now();
</ins><span class="cx">                   mediaElement.play();
</span><span class="cx">                   test.expectEvent(mediaElement, 'ended', 'mediaElement');
</span><span class="cx">               });
</span><span class="lines">@@ -75,7 +111,7 @@
</span><span class="cx">                   assert_greater_than(timeUpdateCount, 2, &quot;timeUpdateCount&quot;);
</span><span class="cx">                   test.done();
</span><span class="cx">               });
</span><del>-          }, &quot;Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API&quot;);
</del><ins>+          }, &quot;Test the totalFrameDelay attribute of HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API&quot;);
</ins><span class="cx">         &lt;/script&gt;
</span><span class="cx">     &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceistypesupportedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-is-type-supported.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-is-type-supported.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-is-type-supported.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -5,6 +5,7 @@
</span><span class="cx">         &lt;title&gt;MediaSource.isTypeSupported() test cases.&lt;/title&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span><ins>+        &lt;script src=&quot;mediasource-util.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;/head&gt;
</span><span class="cx">     &lt;body&gt;
</span><span class="cx">         &lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
</span><span class="lines">@@ -36,6 +37,12 @@
</span><span class="cx">           ], false, 'Test invalid MIME format');
</span><span class="cx"> 
</span><span class="cx">           test_type_support([
</span><ins>+              'xxx',
+              'text/html',
+              'image/jpeg'
+          ], false, 'Test invalid MSE MIME media type');
+
+          test_type_support([
</ins><span class="cx">               'audio/webm;codecs=&quot;vp8&quot;',
</span><span class="cx">               'audio/mp4;codecs=&quot;avc1.4d001e&quot;',
</span><span class="cx">           ], false, 'Test invalid mismatch between major type and codec ID');
</span><span class="lines">@@ -46,7 +53,6 @@
</span><span class="cx">               'video/mp4;codecs=&quot;vp8&quot;',
</span><span class="cx">               'video/webm;codecs=&quot;mp4a.40.2&quot;',
</span><span class="cx">               'video/mp4;codecs=&quot;vorbis&quot;',
</span><del>-              'video/webm;codecs=&quot;mp4a.40.2&quot;',
</del><span class="cx">           ], false, 'Test invalid mismatch between minor type and codec ID');
</span><span class="cx"> 
</span><span class="cx">           test_type_support([
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceliveseekablehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-liveseekable.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-liveseekable.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-liveseekable.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,118 +1,137 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;html&gt;
-    &lt;head&gt;
-        &lt;title&gt;Checks setting/clearing the live seekable range and HTMLMediaElement.seekable&lt;/title&gt;
-        &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
-        &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
-        &lt;script src=&quot;mediasource-util.js&quot;&gt;&lt;/script&gt;
-    &lt;/head&gt;
-    &lt;body&gt;
-        &lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
-        &lt;script&gt;
-          test(function(test)
-          {
-              var mediaSource = new MediaSource();
-              assert_equals(mediaSource.readyState, &quot;closed&quot;, &quot;media source is closed.&quot;);
-              assert_throws(&quot;InvalidStateError&quot;, function() { mediaSource.setLiveSeekableRange(0, 1); });
-          }, &quot;setLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'&quot;);
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;title&gt;Checks setting/clearing the live seekable range and HTMLMediaElement.seekable&lt;/title&gt;
+&lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;mediasource-util.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+test(function(test)
+{
+    var mediaSource = new MediaSource();
+    assert_equals(mediaSource.readyState, &quot;closed&quot;, &quot;media source is closed.&quot;);
+    assert_throws(&quot;InvalidStateError&quot;, function() { mediaSource.setLiveSeekableRange(0, 1); });
+}, &quot;setLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          test(function(test)
-          {
-              var mediaSource = new MediaSource();
-              assert_equals(mediaSource.readyState, &quot;closed&quot;, &quot;media source is closed.&quot;);
-              assert_throws(&quot;InvalidStateError&quot;, function() { mediaSource.clearLiveSeekableRange(); });
-          }, &quot;clearLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'&quot;);
</del><ins>+test(function(test)
+{
+    var mediaSource = new MediaSource();
+    assert_equals(mediaSource.readyState, &quot;closed&quot;, &quot;media source is closed.&quot;);
+    assert_throws(&quot;InvalidStateError&quot;, function() { mediaSource.clearLiveSeekableRange(); });
+}, &quot;clearLiveSeekableRange throws an InvalidStateError exception if the readyState attribute is not 'open'&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          mediasource_test(function(test, mediaElement, mediaSource)
-          {
-              mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
-              assert_throws(new TypeError(), function() { mediaSource.setLiveSeekableRange(-1, 1); });
-              test.done();
-          }, &quot;setLiveSeekableRange throws a TypeError if start is negative&quot;);
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    var mimetype = MediaSourceUtil.AUDIO_VIDEO_TYPE;
+    var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
+    sourceBuffer.appendBuffer(new Uint8Array(0));
+    assert_true(sourceBuffer.updating, &quot;Updating set when a buffer is appended.&quot;);
+    mediaSource.setLiveSeekableRange(0, 1);
+    test.done();
+}, &quot;setLiveSeekableRange does not restrict to not currently updating&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          mediasource_test(function(test, mediaElement, mediaSource)
-          {
-              mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
-              assert_throws(new TypeError(), function() { mediaSource.setLiveSeekableRange(2, 1); });
-              test.done();
-          }, &quot;setLiveSeekableRange throws a TypeError if start is greater than end&quot;);
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    var mimetype = MediaSourceUtil.AUDIO_VIDEO_TYPE;
+    var sourceBuffer = mediaSource.addSourceBuffer(mimetype);
+    sourceBuffer.appendBuffer(new Uint8Array(0));
+    assert_true(sourceBuffer.updating, &quot;Updating set when a buffer is appended.&quot;);
+    mediaSource.clearLiveSeekableRange();
+    test.done();
+}, &quot;clearLiveSeekableRange does not restrict to not currently updating&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          mediasource_test(function(test, mediaElement, mediaSource)
-          {
-              mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
-              mediaSource.setLiveSeekableRange(0, 1);
-              test.done();
-          }, &quot;setLiveSeekableRange returns with no error when conditions are correct&quot;);
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    assert_throws(new TypeError(), function() { mediaSource.setLiveSeekableRange(-1, 1); });
+    test.done();
+}, &quot;setLiveSeekableRange throws a TypeError if start is negative&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          mediasource_test(function(test, mediaElement, mediaSource)
-          {
-              mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
-              mediaSource.clearLiveSeekableRange();
-              test.done();
-          }, &quot;clearLiveSeekableRange returns with no error when conditions are correct&quot;);
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    assert_throws(new TypeError(), function() { mediaSource.setLiveSeekableRange(2, 1); });
+    test.done();
+}, &quot;setLiveSeekableRange throws a TypeError if start is greater than end&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-          mediasource_test(function(test, mediaElement, mediaSource)
-          {
-              mediaSource.duration = +Infinity;
-              mediaSource.setLiveSeekableRange(1, 2);
-              assert_equals(mediaElement.seekable.length, 1,
-                'The seekable attribute contains a single range.');
-              assertSeekableEquals(mediaElement, '{ [1.000, 2.000) }',
-                'The seekable attribute returns the correct range.');
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    mediaSource.setLiveSeekableRange(0, 1);
+    test.done();
+}, &quot;setLiveSeekableRange returns with no error when conditions are correct&quot;);
</ins><span class="cx"> 
</span><del>-              mediaSource.clearLiveSeekableRange();
-              assertSeekableEquals(mediaElement, '{ }',
-                'The seekable attribute now returns an empty range.');
-              test.done();
-          }, &quot;HTMLMediaElement.seekable returns the live seekable range or an empty range if that range was cleared when nothing is buffered&quot;);
</del><span class="cx"> 
</span><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaElement.addEventListener('error', test.unreached_func(&quot;Unexpected event 'error'&quot;));
+    mediaSource.clearLiveSeekableRange();
+    test.done();
+}, &quot;clearLiveSeekableRange returns with no error when conditions are correct&quot;);
</ins><span class="cx"> 
</span><del>-          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
-          {
-              var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
-              test.expectEvent(sourceBuffer, 'updateend', 'Init segment appended to SourceBuffer.');
-              sourceBuffer.appendBuffer(initSegment);
-              test.waitForExpectedEvents(function()
-              {
-                  mediaSource.duration = +Infinity;
-                  mediaSource.setLiveSeekableRange(40, 42);
</del><span class="cx"> 
</span><del>-                  // Append a segment that starts after 1s to ensure seekable
-                  // won't use 0 as starting point.
-                  var midSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[5]);
-                  test.expectEvent(sourceBuffer, 'updateend');
-                  sourceBuffer.appendBuffer(midSegment);
-                  test.waitForExpectedEvents(function()
-                  {
-                      assert_equals(mediaElement.seekable.length, 1,
-                        'The seekable attribute contains a single range.');
-                      assert_equals(mediaElement.buffered.length, 1,
-                        'The buffered attribute contains a single range.');
-                      assert_not_equals(mediaElement.seekable.start(0), 0,
-                        'The range starts after 0.');
-                      assert_equals(mediaElement.seekable.start(0), mediaElement.buffered.start(0),
-                        'The start time is the start time of the buffered range.');
-                      assert_equals(mediaElement.seekable.end(0), 42,
-                        'The end time is the end time of the seekable range.');
</del><ins>+mediasource_test(function(test, mediaElement, mediaSource)
+{
+    mediaSource.duration = +Infinity;
+    mediaSource.setLiveSeekableRange(1, 2);
+    assert_equals(mediaElement.seekable.length, 1,
+      'The seekable attribute contains a single range.');
+    assertSeekableEquals(mediaElement, '{ [1.000, 2.000) }',
+      'The seekable attribute returns the correct range.');
</ins><span class="cx"> 
</span><del>-                      mediaSource.clearLiveSeekableRange();
-                      assert_equals(mediaElement.seekable.length, 1,
-                        'The seekable attribute contains a single range.');
-                      assert_equals(mediaElement.seekable.start(0), 0,
-                        'The start time is now 0.');
-                      assert_equals(mediaElement.seekable.end(0), mediaElement.buffered.end(0),
-                        'The end time is now the end time of the buffered range.');
</del><ins>+    mediaSource.clearLiveSeekableRange();
+    assertSeekableEquals(mediaElement, '{ }',
+      'The seekable attribute now returns an empty range.');
+    test.done();
+}, &quot;HTMLMediaElement.seekable returns the live seekable range or an empty range if that range was cleared when nothing is buffered&quot;);
</ins><span class="cx"> 
</span><del>-                      test.done();
-                  });
-              });
-          }, 'HTMLMediaElement.seekable returns the union of the buffered range and the live seekable range, when set');
-        &lt;/script&gt;
-    &lt;/body&gt;
-&lt;/html&gt;
</del><ins>+
+mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+{
+    var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
+    test.expectEvent(sourceBuffer, 'updateend', 'Init segment appended to SourceBuffer.');
+    sourceBuffer.appendBuffer(initSegment);
+    test.waitForExpectedEvents(function()
+    {
+        mediaSource.duration = +Infinity;
+        mediaSource.setLiveSeekableRange(40, 42);
+
+        // Append a segment that starts after 1s to ensure seekable
+        // won't use 0 as starting point.
+        var midSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[5]);
+        test.expectEvent(sourceBuffer, 'updateend');
+        sourceBuffer.appendBuffer(midSegment);
+        test.waitForExpectedEvents(function()
+        {
+            assert_equals(mediaElement.seekable.length, 1,
+              'The seekable attribute contains a single range.');
+            assert_equals(mediaElement.buffered.length, 1,
+              'The buffered attribute contains a single range.');
+            assert_not_equals(mediaElement.seekable.start(0), 0,
+              'The range starts after 0.');
+            assert_equals(mediaElement.seekable.start(0), mediaElement.buffered.start(0),
+              'The start time is the start time of the buffered range.');
+            assert_equals(mediaElement.seekable.end(0), 42,
+              'The end time is the end time of the seekable range.');
+
+            mediaSource.clearLiveSeekableRange();
+            assert_equals(mediaElement.seekable.length, 1,
+              'The seekable attribute contains a single range.');
+            assert_equals(mediaElement.seekable.start(0), 0,
+              'The start time is now 0.');
+            assert_equals(mediaElement.seekable.end(0), mediaElement.buffered.end(0),
+              'The end time is now the end time of the buffered range.');
+
+            test.done();
+        });
+    });
+}, 'HTMLMediaElement.seekable returns the union of the buffered range and the live seekable range, when set');
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremoveexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove-expected.txt (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove-expected.txt        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove-expected.txt        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -6,6 +6,7 @@
</span><span class="cx"> PASS Test remove with a NEGATIVE_INFINITY end. 
</span><span class="cx"> PASS Test remove with a NaN end. 
</span><span class="cx"> PASS Test remove after SourceBuffer removed from mediaSource. 
</span><ins>+PASS Test remove with a NaN duration. 
</ins><span class="cx"> PASS Test remove while update pending. 
</span><span class="cx"> PASS Test aborting a remove operation. 
</span><span class="cx"> PASS Test remove with a start at the duration. 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremovehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-remove.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx"> &lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</span><span class="cx"> &lt;html&gt;
</span><span class="cx">     &lt;head&gt;
</span><ins>+        &lt;meta  charset=&quot;utf-8&quot;&gt;
</ins><span class="cx">         &lt;title&gt;SourceBuffer.remove() test cases.&lt;/title&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -14,6 +15,8 @@
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span><span class="cx"> 
</span><ins>+              mediaSource.duration = 10;
+
</ins><span class="cx">               assert_throws(new TypeError(), function()
</span><span class="cx">               {
</span><span class="cx">                   sourceBuffer.remove(-1, 2);
</span><span class="lines">@@ -26,6 +29,8 @@
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span><span class="cx"> 
</span><ins>+              mediaSource.duration = 10;
+
</ins><span class="cx">               [ undefined, NaN, Infinity, -Infinity ].forEach(function(item)
</span><span class="cx">               {
</span><span class="cx">                   assert_throws(new TypeError(), function()
</span><span class="lines">@@ -69,6 +74,8 @@
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span><span class="cx"> 
</span><ins>+              mediaSource.duration = 10;
+
</ins><span class="cx">               assert_throws(new TypeError(), function()
</span><span class="cx">               {
</span><span class="cx">                   sourceBuffer.remove(0, Number.NEGATIVE_INFINITY);
</span><span class="lines">@@ -81,6 +88,8 @@
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span><span class="cx"> 
</span><ins>+              mediaSource.duration = 10;
+
</ins><span class="cx">               assert_throws(new TypeError(), function()
</span><span class="cx">               {
</span><span class="cx">                   sourceBuffer.remove(0, Number.NaN);
</span><span class="lines">@@ -105,7 +114,21 @@
</span><span class="cx">               test.done();
</span><span class="cx">           }, &quot;Test remove after SourceBuffer removed from mediaSource.&quot;);
</span><span class="cx"> 
</span><ins>+          mediasource_test(function(test, mediaElement, mediaSource)
+          {
+              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</ins><span class="cx"> 
</span><ins>+              assert_false(sourceBuffer.updating, &quot;updating is false&quot;);
+              assert_equals(mediaSource.duration, NaN, &quot;duration isn't set&quot;);
+
+              assert_throws(new TypeError(), function()
+              {
+                  sourceBuffer.remove(0, 0);
+              }, &quot;remove&quot;);
+
+              test.done();
+          }, &quot;Test remove with a NaN duration.&quot;);
+
</ins><span class="cx">           mediasource_test(function(test, mediaElement, mediaSource)
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span><span class="lines">@@ -201,6 +224,7 @@
</span><span class="cx">                   test.expectEvent(sourceBuffer, &quot;updatestart&quot;);
</span><span class="cx">                   test.expectEvent(sourceBuffer, &quot;update&quot;);
</span><span class="cx">                   test.expectEvent(sourceBuffer, &quot;updateend&quot;);
</span><ins>+                  test.expectEvent(mediaSource, &quot;sourceopen&quot;);
</ins><span class="cx">                   sourceBuffer.remove(1, 2);
</span><span class="cx"> 
</span><span class="cx">                   assert_true(sourceBuffer.updating, &quot;updating&quot;);
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceremovesourcebufferhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-removesourcebuffer.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-removesourcebuffer.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-removesourcebuffer.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -42,11 +42,46 @@
</span><span class="cx"> 
</span><span class="cx">               assert_throws(&quot;NotFoundError&quot;,
</span><span class="cx">                   function() { mediaSource.removeSourceBuffer(sourceBuffer); },
</span><del>-                  &quot;removeSourceBuffer() threw an exception when a SourceBuffer that was already removed.&quot;);
</del><ins>+                  &quot;removeSourceBuffer() threw an exception for a SourceBuffer that was already removed.&quot;);
</ins><span class="cx"> 
</span><span class="cx">               test.done();
</span><span class="cx">           }, &quot;Test calling removeSourceBuffer() twice with the same object.&quot;);
</span><span class="cx"> 
</span><ins>+          mediasource_test(function(test, mediaElement1, mediaSource1)
+          {
+              var sourceBuffer1 = mediaSource1.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
+              assert_class_string(sourceBuffer1, &quot;SourceBuffer&quot;, &quot;New SourceBuffer returned&quot;);
+
+              var mediaElement2 = document.createElement(&quot;video&quot;);
+              document.body.appendChild(mediaElement2);
+              test.add_cleanup(function() { document.body.removeChild(mediaElement2); });
+
+              var mediaSource2 = new MediaSource();
+              var mediaSource2URL = URL.createObjectURL(mediaSource2);
+              mediaElement2.src = mediaSource2URL;
+              test.expectEvent(mediaSource2, &quot;sourceopen&quot;, &quot;Second MediaSource opened&quot;);
+              test.waitForExpectedEvents(function()
+              {
+                  URL.revokeObjectURL(mediaSource2URL);
+
+                  var sourceBuffer2 = mediaSource2.addSourceBuffer(MediaSourceUtil.VIDEO_ONLY_TYPE);
+                  assert_class_string(sourceBuffer2, &quot;SourceBuffer&quot;, &quot;Second new SourceBuffer returned&quot;);
+                  assert_not_equals(mediaSource1, mediaSource2, &quot;MediaSources are different instances&quot;);
+                  assert_not_equals(sourceBuffer1, sourceBuffer2, &quot;SourceBuffers are different instances&quot;);
+                  assert_equals(mediaSource1.sourceBuffers[0], sourceBuffer1);
+                  assert_equals(mediaSource2.sourceBuffers[0], sourceBuffer2);
+                  assert_throws(&quot;NotFoundError&quot;,
+                      function() { mediaSource1.removeSourceBuffer(sourceBuffer2); },
+                      &quot;MediaSource1.removeSourceBuffer() threw an exception for SourceBuffer2&quot;);
+                  assert_throws(&quot;NotFoundError&quot;,
+                      function() { mediaSource2.removeSourceBuffer(sourceBuffer1); },
+                      &quot;MediaSource2.removeSourceBuffer() threw an exception for SourceBuffer1&quot;);
+                  mediaSource1.removeSourceBuffer(sourceBuffer1);
+                  mediaSource2.removeSourceBuffer(sourceBuffer2);
+                  test.done();
+              });
+          }, &quot;Test calling removeSourceBuffer() for a sourceBuffer belonging to a different mediaSource instance.&quot;);
+
</ins><span class="cx">           mediasource_test(function(test, mediaElement, mediaSource)
</span><span class="cx">           {
</span><span class="cx">               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceseekablehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-seekable.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-seekable.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-seekable.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffermodetimestampshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html (0 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html                                (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode-timestamps.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -0,0 +1,52 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;meta charset='utf-8'&gt;
+  &lt;title&gt;SourceBuffer#mode with generate timestamps flag true&lt;/title&gt;
+  &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+  &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;log&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+var mimes = ['audio/aac', 'audio/mpeg'];
+
+//check the browser supports the MIME used in this test
+function isTypeSupported(mime) {
+    if(!MediaSource.isTypeSupported(mime)) {
+        this.step(function() {
+            assert_unreached(&quot;Browser doesn't support the MIME used in this test: &quot; + mime);
+        });
+        this.done();
+        return false;
+    }
+    return true;
+}
+function mediaTest(mime) {
+    async_test(function(t) {
+        if(!isTypeSupported.bind(t)(mime)) {
+            return;
+        }
+        var mediaSource = new MediaSource();
+        mediaSource.addEventListener('sourceopen', t.step_func_done(function(e) {
+            var sourceBuffer = mediaSource.addSourceBuffer(mime);
+            assert_equals(sourceBuffer.updating, false, &quot;SourceBuffer.updating is false&quot;);
+            assert_throws({name: 'TypeError'},
+                          function() {
+                              sourceBuffer.mode = &quot;segments&quot;;
+                          },
+                          'SourceBuffer#mode with generate timestamps flag true');
+        }), false);
+        var video = document.createElement('video');
+        video.src = window.URL.createObjectURL(mediaSource);
+    }, mime + ' : ' +
+       'If generate timestamps flag equals true and new mode equals &quot;segments&quot;, ' +
+       'then throw a TypeError exception and abort these steps.');
+}
+mimes.forEach(function(mime) {
+    mediaTest(mime);
+});
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffermodehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-mode.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -2,6 +2,7 @@
</span><span class="cx"> &lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</span><span class="cx"> &lt;html&gt;
</span><span class="cx">     &lt;head&gt;
</span><ins>+        &lt;meta charset=&quot;utf-8&quot;&gt;
</ins><span class="cx">         &lt;title&gt;SourceBuffer.mode test cases.&lt;/title&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">         &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcesourcebuffertrackdefaultshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-sourcebuffer-trackdefaults.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetimestampoffsethtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-timestamp-offset.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-timestamp-offset.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-timestamp-offset.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -17,6 +17,9 @@
</span><span class="cx">                   var segmentInfo = MediaSourceUtil.SEGMENT_INFO;
</span><span class="cx">                   var sourceBuffer = mediaSource.addSourceBuffer(segmentInfo.type);
</span><span class="cx"> 
</span><ins>+                  assert_equals(sourceBuffer.timestampOffset, 0,
+                      &quot;Initial timestampOffset of a SourceBuffer is 0&quot;);
+
</ins><span class="cx">                   if (expected == &quot;TypeError&quot;)  {
</span><span class="cx">                       assert_throws({name: &quot;TypeError&quot;},
</span><span class="cx">                           function() { sourceBuffer.timestampOffset = value; },
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetrackdefaulthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefault.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefault.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefault.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourcetrackdefaultlisthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefaultlist.html (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefaultlist.html        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-trackdefaultlist.html        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> &lt;!DOCTYPE html&gt;
</span><del>-&lt;!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --&gt;
</del><ins>+&lt;!--  Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).  --&gt;
</ins><span class="cx"> &lt;meta charset=&quot;utf-8&quot;&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsmediasourcemediasourceutiljs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-util.js (206128 => 206129)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-util.js        2016-09-19 23:27:26 UTC (rev 206128)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/media-source/mediasource-util.js        2016-09-19 23:30:53 UTC (rev 206129)
</span><span class="lines">@@ -303,7 +303,7 @@
</span><span class="cx"> 
</span><span class="cx">         var i = startingIndex;
</span><span class="cx">         var onAppendDone = function() {
</span><del>-            if (eventFired)
</del><ins>+            if (eventFired || (i &gt;= (segmentInfo.media.length - 1)))
</ins><span class="cx">                 return;
</span><span class="cx"> 
</span><span class="cx">             i++;
</span></span></pre>
</div>
</div>

</body>
</html>