<!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>[179044] trunk</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/179044">179044</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-23 16:52:42 -0800 (Fri, 23 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[MSE] Implement Range Removal algorithm.
https://bugs.webkit.org/show_bug.cgi?id=140622.

Patch by Bartlomiej Gajda &lt;b.gajda@samsung.com&gt; on 2015-01-23
Reviewed by Jer Noble.

Source/WebCore:

This extract Range Removal algorithm (Editor's Draft version, bug:26316) from remove(),
to separate function to deal with old FIXME since bug in spec was resolved.
This should both guarantee good order of events, and prevent from switching to 'open' state
during end of stream.

Test: media/media-source/media-source-end-of-stream-readyState.html

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::setDurationInternal): update to use rangeRemoval(), not remove()
(WebCore::MediaSource::streamEndedWithError): remove FIXME, brigning back correct order of events.
* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::remove): comments up to spec, extract rangeRemoval algorithm.
(WebCore::SourceBuffer::rangeRemoval):
(WebCore::SourceBuffer::removeTimerFired): comments up to spec.
* Modules/mediasource/SourceBuffer.h:

LayoutTests:

Added short test to check whether endOfStream incorrectly switches back
to 'open' state.

* media/media-source/media-source-end-of-stream-readyState.html: Added.
* media/media-source/media-source-end-of-stream-readyState-expected.txt: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasourceMediaSourcecpp">trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasourceSourceBuffercpp">trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediasourceSourceBufferh">trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediamediasourcemediasourceendofstreamreadyStateexpectedtxt">trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediasourcemediasourceendofstreamreadyStatehtml">trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (179043 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-01-24 00:49:02 UTC (rev 179043)
+++ trunk/LayoutTests/ChangeLog        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2015-01-23  Bartlomiej Gajda  &lt;b.gajda@samsung.com&gt;
+
+        [MSE] Implement Range Removal algorithm.
+        https://bugs.webkit.org/show_bug.cgi?id=140622.
+
+        Reviewed by Jer Noble.
+
+        Added short test to check whether endOfStream incorrectly switches back
+        to 'open' state.
+
+        * media/media-source/media-source-end-of-stream-readyState.html: Added.
+        * media/media-source/media-source-end-of-stream-readyState-expected.txt: Added.
+
</ins><span class="cx"> 2015-01-23  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Test gardening. Mark a few failures after filing bugs.
</span></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediasourceendofstreamreadyStateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState-expected.txt (0 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState-expected.txt                                (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState-expected.txt        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+
+RUN(video.src = URL.createObjectURL(source))
+EVENT(sourceopen)
+RUN(sourceBuffer = source.addSourceBuffer(&quot;video/mock; codecs=mock&quot;))
+RUN(sourceBuffer.appendBuffer(mediaSegment))
+EVENT(updateend)
+EXPECTED (source.duration.toFixed(3) == '10') OK
+EXPECTED (sourceBuffer.buffered.end(0).toFixed(3) == '5') OK
+RUN(source.endOfStream())
+EXPECTED (source.duration.toFixed(3) == '5') OK
+EVENT(updateend)
+END OF TEST
+
</ins></span></pre></div>
<a id="trunkLayoutTestsmediamediasourcemediasourceendofstreamreadyStatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState.html (0 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState.html                                (rev 0)
+++ trunk/LayoutTests/media/media-source/media-source-end-of-stream-readyState.html        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;title&gt;mock-media-source&lt;/title&gt;
+    &lt;script src=&quot;mock-media-source.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;../video-test.js&quot;&gt;&lt;/script&gt;
+    &lt;script&gt;
+    var source;
+    var sourceBuffer;
+    var mediaSegment;
+
+    if (window.internals)
+        internals.initializeMockMediaSource();
+
+    function runTest() {
+        findMediaElement();
+
+        source = new MediaSource();
+        waitForEventOn(source, 'sourceopen', sourceOpen, false, true);
+        run('video.src = URL.createObjectURL(source)');
+    }
+
+    function sourceOpen() {
+        run('sourceBuffer = source.addSourceBuffer(&quot;video/mock; codecs=mock&quot;)');
+        waitForEventOn(sourceBuffer, 'updateend', updateEnd1, false, true);
+        mediaSegment = concatenateSamples([
+            makeAInit(10, [makeATrack(1, 'mock', TRACK_KIND.VIDEO)]),
+            makeASample(0, 0, 5, 1, SAMPLE_FLAG.SYNC, 0),
+        ]);
+        run('sourceBuffer.appendBuffer(mediaSegment)');
+
+    }
+
+    function updateEnd1() {
+        testExpected('source.duration.toFixed(3)', 10);
+        testExpected('sourceBuffer.buffered.end(0).toFixed(3)', 5);
+
+        waitForEventOn(source, 'sourceopen', function() { failTest(&quot;Should not transit to 'open' state during endOfStream().&quot;) }, false, true);
+        waitForEventOn(sourceBuffer, 'updateend', endTest, false, true);
+        run('source.endOfStream()');
+        testExpected('source.duration.toFixed(3)', 5);
+    }
+
+    &lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+    &lt;video&gt;&lt;/video&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (179043 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-01-24 00:49:02 UTC (rev 179043)
+++ trunk/Source/WebCore/ChangeLog        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-01-23  Bartlomiej Gajda  &lt;b.gajda@samsung.com&gt;
+
+        [MSE] Implement Range Removal algorithm.
+        https://bugs.webkit.org/show_bug.cgi?id=140622.
+
+        Reviewed by Jer Noble.
+
+        This extract Range Removal algorithm (Editor's Draft version, bug:26316) from remove(),
+        to separate function to deal with old FIXME since bug in spec was resolved.
+        This should both guarantee good order of events, and prevent from switching to 'open' state
+        during end of stream.
+
+        Test: media/media-source/media-source-end-of-stream-readyState.html
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::setDurationInternal): update to use rangeRemoval(), not remove()
+        (WebCore::MediaSource::streamEndedWithError): remove FIXME, brigning back correct order of events.
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::remove): comments up to spec, extract rangeRemoval algorithm.
+        (WebCore::SourceBuffer::rangeRemoval):
+        (WebCore::SourceBuffer::removeTimerFired): comments up to spec.
+        * Modules/mediasource/SourceBuffer.h:
+
</ins><span class="cx"> 2015-01-23  Enrica Casucci  &lt;enrica@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Hit test returns incorrect results when performed in paginated content over the page gaps.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceMediaSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (179043 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp        2015-01-24 00:49:02 UTC (rev 179043)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -371,7 +371,7 @@
</span><span class="cx">     // on all objects in sourceBuffers.
</span><span class="cx">     if (oldDuration.isValid() &amp;&amp; duration &lt; oldDuration) {
</span><span class="cx">         for (auto&amp; sourceBuffer : *m_sourceBuffers)
</span><del>-            sourceBuffer-&gt;remove(duration, oldDuration, IGNORE_EXCEPTION);
</del><ins>+            sourceBuffer-&gt;rangeRemoval(duration, oldDuration);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // 5. If a user agent is unable to partially render audio frames or text cues that start before and end after the
</span><span class="lines">@@ -447,6 +447,10 @@
</span><span class="cx"> 
</span><span class="cx">     // 2.4.7 https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#end-of-stream-algorithm
</span><span class="cx"> 
</span><ins>+    // 1. Change the readyState attribute value to &quot;ended&quot;.
+    // 2. Queue a task to fire a simple event named sourceended at the MediaSource.
+    setReadyState(endedKeyword());
+
</ins><span class="cx">     // 3.
</span><span class="cx">     if (error.isEmpty()) {
</span><span class="cx">         // ↳ If error is not set, is null, or is an empty string
</span><span class="lines">@@ -463,13 +467,6 @@
</span><span class="cx">         m_private-&gt;markEndOfStream(MediaSourcePrivate::EosNoError);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // NOTE: Do steps 1 &amp; 2 after step 3 (with an empty error) to avoid the MediaSource's readyState being re-opened by a
-    // remove() operation resulting from a duration change.
-    // FIXME: Re-number or update this section once &lt;https://www.w3.org/Bugs/Public/show_bug.cgi?id=26316&gt; is resolved.
-    // 1. Change the readyState attribute value to &quot;ended&quot;.
-    // 2. Queue a task to fire a simple event named sourceended at the MediaSource.
-    setReadyState(endedKeyword());
-
</del><span class="cx">     if (error == network) {
</span><span class="cx">         // ↳ If error is set to &quot;network&quot;
</span><span class="cx">         ASSERT(m_mediaElement);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceSourceBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (179043 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2015-01-24 00:49:02 UTC (rev 179043)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -360,33 +360,49 @@
</span><span class="cx">     LOG(MediaSource, &quot;SourceBuffer::remove(%p) - start(%lf), end(%lf)&quot;, this, start.toDouble(), end.toDouble());
</span><span class="cx"> 
</span><span class="cx">     // Section 3.2 remove() method steps.
</span><del>-    // 1. If start is negative or greater than duration, then throw an InvalidAccessError exception and abort these steps.
-    // 2. If end is less than or equal to start, then throw an InvalidAccessError exception and abort these steps.
-    if (start &lt; MediaTime::zeroTime() || (m_source &amp;&amp; (!m_source-&gt;duration().isValid() || start &gt; m_source-&gt;duration())) || end &lt;= start) {
</del><ins>+    // 1. If duration equals NaN, then throw an InvalidAccessError exception and abort these steps.
+    // 2. If start is negative or greater than duration, then throw an InvalidAccessError exception and abort these steps.
+    // 3. If end is less than or equal to start, then throw an InvalidAccessError exception and abort these steps.
+
+    // FIXME: reorder/revisit this section once &lt;https://www.w3.org/Bugs/Public/show_bug.cgi?id=27857&gt; got resolved
+    // as it seems wrong to check mediaSource duration before checking isRemoved().
+    if ((m_source &amp;&amp; m_source-&gt;duration().isInvalid())
+        || start &lt; MediaTime::zeroTime() || (m_source &amp;&amp; start &gt; m_source-&gt;duration())
+        || end &lt;= start) {
</ins><span class="cx">         ec = INVALID_ACCESS_ERR;
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // 3. If this object has been removed from the sourceBuffers attribute of the parent media source then throw an
</del><ins>+    // 4. If this object has been removed from the sourceBuffers attribute of the parent media source then throw an
</ins><span class="cx">     //    InvalidStateError exception and abort these steps.
</span><del>-    // 4. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
</del><ins>+    // 5. If the updating attribute equals true, then throw an InvalidStateError exception and abort these steps.
</ins><span class="cx">     if (isRemoved() || m_updating) {
</span><span class="cx">         ec = INVALID_STATE_ERR;
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // 5. If the readyState attribute of the parent media source is in the &quot;ended&quot; state then run the following steps:
-    // 5.1. Set the readyState attribute of the parent media source to &quot;open&quot;
-    // 5.2. Queue a task to fire a simple event named sourceopen at the parent media source .
</del><ins>+    // 6. If the readyState attribute of the parent media source is in the &quot;ended&quot; state then run the following steps:
+    // 6.1. Set the readyState attribute of the parent media source to &quot;open&quot;
+    // 6.2. Queue a task to fire a simple event named sourceopen at the parent media source .
</ins><span class="cx">     m_source-&gt;openIfInEndedState();
</span><span class="cx"> 
</span><del>-    // 6. Set the updating attribute to true.
</del><ins>+    // 7. Run the range removal algorithm with start and end as the start and end of the removal range.
+    rangeRemoval(start, end);
+}
+
+void SourceBuffer::rangeRemoval(const MediaTime&amp; start, const MediaTime&amp; end)
+{
+    // 3.5.7 Range Removal
+    // https://rawgit.com/w3c/media-source/7bbe4aa33c61ec025bc7acbd80354110f6a000f9/media-source.html#sourcebuffer-range-removal
+    // 1. Let start equal the starting presentation timestamp for the removal range.
+    // 2. Let end equal the end presentation timestamp for the removal range.
+    // 3. Set the updating attribute to true.
</ins><span class="cx">     m_updating = true;
</span><span class="cx"> 
</span><del>-    // 7. Queue a task to fire a simple event named updatestart at this SourceBuffer object.
</del><ins>+    // 4. Queue a task to fire a simple event named updatestart at this SourceBuffer object.
</ins><span class="cx">     scheduleEvent(eventNames().updatestartEvent);
</span><span class="cx"> 
</span><del>-    // 8. Return control to the caller and run the rest of the steps asynchronously.
</del><ins>+    // 5. Return control to the caller and run the rest of the steps asynchronously.
</ins><span class="cx">     m_pendingRemoveStart = start;
</span><span class="cx">     m_pendingRemoveEnd = end;
</span><span class="cx">     m_removeTimer.startOneShot(0);
</span><span class="lines">@@ -789,21 +805,21 @@
</span><span class="cx">     ASSERT(m_pendingRemoveStart.isValid());
</span><span class="cx">     ASSERT(m_pendingRemoveStart &lt; m_pendingRemoveEnd);
</span><span class="cx"> 
</span><del>-    // Section 3.2 remove() method steps
-    // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#widl-SourceBuffer-remove-void-double-start-double-end
</del><ins>+    // Section 3.5.7 Range Removal
+    // http://w3c.github.io/media-source/#sourcebuffer-range-removal
</ins><span class="cx"> 
</span><del>-    // 9. Run the coded frame removal algorithm with start and end as the start and end of the removal range.
</del><ins>+    // 6. Run the coded frame removal algorithm with start and end as the start and end of the removal range.
</ins><span class="cx">     removeCodedFrames(m_pendingRemoveStart, m_pendingRemoveEnd);
</span><span class="cx"> 
</span><del>-    // 10. Set the updating attribute to false.
</del><ins>+    // 7. Set the updating attribute to false.
</ins><span class="cx">     m_updating = false;
</span><span class="cx">     m_pendingRemoveStart = MediaTime::invalidTime();
</span><span class="cx">     m_pendingRemoveEnd = MediaTime::invalidTime();
</span><span class="cx"> 
</span><del>-    // 11. Queue a task to fire a simple event named update at this SourceBuffer object.
</del><ins>+    // 8. Queue a task to fire a simple event named update at this SourceBuffer object.
</ins><span class="cx">     scheduleEvent(eventNames().updateEvent);
</span><span class="cx"> 
</span><del>-    // 12. Queue a task to fire a simple event named updateend at this SourceBuffer object.
</del><ins>+    // 9. Queue a task to fire a simple event named updateend at this SourceBuffer object.
</ins><span class="cx">     scheduleEvent(eventNames().updateendEvent);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediasourceSourceBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h (179043 => 179044)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h        2015-01-24 00:49:02 UTC (rev 179043)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h        2015-01-24 00:52:42 UTC (rev 179044)
</span><span class="lines">@@ -126,6 +126,7 @@
</span><span class="cx">     bool shouldGenerateTimestamps() const { return m_shouldGenerateTimestamps; }
</span><span class="cx">     void setShouldGenerateTimestamps(bool flag) { m_shouldGenerateTimestamps = flag; }
</span><span class="cx"> 
</span><ins>+    void rangeRemoval(const MediaTime&amp;, const MediaTime&amp;);
</ins><span class="cx"> protected:
</span><span class="cx">     // EventTarget interface
</span><span class="cx">     virtual void refEventTarget() override { ref(); }
</span></span></pre>
</div>
</div>

</body>
</html>