<!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>[200637] 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/200637">200637</a></dd>
<dt>Author</dt> <dd>ryanhaddad@apple.com</dd>
<dt>Date</dt> <dd>2016-05-10 13:21:45 -0700 (Tue, 10 May 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/200627">r200627</a>.
https://bugs.webkit.org/show_bug.cgi?id=157531
This change has caused crashes in existing LayoutTests
(Requested by ryanhaddad on #webkit).
Reverted changeset:
"Return a Promise from HTMLMediaElement.play()"
https://bugs.webkit.org/show_bug.cgi?id=157400
http://trac.webkit.org/changeset/200627
Patch by Commit Queue <commit-queue@webkit.org> on 2016-05-10</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestshtmldominterfacesexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoredomGenericEventQueuecpp">trunk/Source/WebCore/dom/GenericEventQueue.cpp</a></li>
<li><a href="#trunkSourceWebCoredomGenericEventQueueh">trunk/Source/WebCore/dom/GenericEventQueue.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementidl">trunk/Source/WebCore/html/HTMLMediaElement.idl</a></li>
<li><a href="#trunkSourceWebCoreplatformGenericTaskQueueh">trunk/Source/WebCore/platform/GenericTaskQueue.h</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejecterrornotsupportedexpectedtxt">trunk/LayoutTests/media/media-play-promise-reject-error-notsupported-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejecterrornotsupportedhtml">trunk/LayoutTests/media/media-play-promise-reject-error-notsupported.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectloadabortexpectedtxt">trunk/LayoutTests/media/media-play-promise-reject-load-abort-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectloadaborthtml">trunk/LayoutTests/media/media-play-promise-reject-load-abort.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectpauseabortexpectedtxt">trunk/LayoutTests/media/media-play-promise-reject-pause-abort-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectpauseaborthtml">trunk/LayoutTests/media/media-play-promise-reject-pause-abort.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectplaynotallowedexpectedtxt">trunk/LayoutTests/media/media-play-promise-reject-play-notallowed-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectplaynotallowedhtml">trunk/LayoutTests/media/media-play-promise-reject-play-notallowed.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectplaynotsupportedexpectedtxt">trunk/LayoutTests/media/media-play-promise-reject-play-notsupported-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiserejectplaynotsupportedhtml">trunk/LayoutTests/media/media-play-promise-reject-play-notsupported.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiseresolveexpectedtxt">trunk/LayoutTests/media/media-play-promise-resolve-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiseresolvewhenplayingexpectedtxt">trunk/LayoutTests/media/media-play-promise-resolve-when-playing-expected.txt</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiseresolvewhenplayinghtml">trunk/LayoutTests/media/media-play-promise-resolve-when-playing.html</a></li>
<li><a href="#trunkLayoutTestsmediamediaplaypromiseresolvehtml">trunk/LayoutTests/media/media-play-promise-resolve.html</a></li>
<li><a href="#trunkSourceWebCoreplatformGenericTaskQueuecpp">trunk/Source/WebCore/platform/GenericTaskQueue.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/ChangeLog        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-05-10 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r200627.
+ https://bugs.webkit.org/show_bug.cgi?id=157531
+
+ This change has caused crashes in existing LayoutTests
+ (Requested by ryanhaddad on #webkit).
+
+ Reverted changeset:
+
+ "Return a Promise from HTMLMediaElement.play()"
+ https://bugs.webkit.org/show_bug.cgi?id=157400
+ http://trac.webkit.org/changeset/200627
+
</ins><span class="cx"> 2016-05-10 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><span class="cx"> Fix scrolling tree dumping
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-05-10 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r200627.
+ https://bugs.webkit.org/show_bug.cgi?id=157531
+
+ This change has caused crashes in existing LayoutTests
+ (Requested by ryanhaddad on #webkit).
+
+ Reverted changeset:
+
+ "Return a Promise from HTMLMediaElement.play()"
+ https://bugs.webkit.org/show_bug.cgi?id=157400
+ http://trac.webkit.org/changeset/200627
+
</ins><span class="cx"> 2016-05-06 Jer Noble <jer.noble@apple.com>
</span><span class="cx">
</span><span class="cx"> Return a Promise from HTMLMediaElement.play()
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestshtmldominterfacesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -2447,9 +2447,7 @@
</span><span class="cx"> PASS HTMLMediaElement interface: attribute ended
</span><span class="cx"> PASS HTMLMediaElement interface: attribute autoplay
</span><span class="cx"> PASS HTMLMediaElement interface: attribute loop
</span><del>-FAIL HTMLMediaElement interface: operation play() assert_throws: calling operation with this = null didn't throw TypeError function "function () {
- fn.apply(obj, args);
- }" did not throw
</del><ins>+PASS HTMLMediaElement interface: operation play()
</ins><span class="cx"> PASS HTMLMediaElement interface: operation pause()
</span><span class="cx"> PASS HTMLMediaElement interface: attribute mediaGroup
</span><span class="cx"> PASS HTMLMediaElement interface: attribute controller
</span></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejecterrornotsupportedexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-error-notsupported-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-error-notsupported-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-error-notsupported-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,7 +0,0 @@
</span><del>-
-RUN(mediaElement.src = findMediaFile("video", "content/invalid"))
-RUN(mediaElement.play().then(failTest).catch(promiseRejected))
-Promise rejected. OK
-EXPECTED (error.name == 'NotSupportedError') OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejecterrornotsupportedhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-error-notsupported.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-error-notsupported.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-error-notsupported.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,31 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- var error;
- function start()
- {
- findMediaElement();
- run('mediaElement.src = findMediaFile("video", "content/invalid")');
- run('mediaElement.play().then(failTest).catch(promiseRejected)');
- }
- function promiseRejected(e)
- {
- error = e;
- logResult(true, "Promise rejected.");
- testExpected('error.name', 'NotSupportedError');
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectloadabortexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-load-abort-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-load-abort-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-load-abort-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,7 +0,0 @@
</span><del>-
-RUN(mediaElement.play().then(failTest).catch(promiseRejected))
-RUN(mediaElement.src = findMediaFile("video", "content/test"))
-Promise rejected. OK
-EXPECTED (error.name == 'AbortError') OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectloadaborthtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-load-abort.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-load-abort.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-load-abort.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,31 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- var error;
- function start()
- {
- findMediaElement();
- run('mediaElement.play().then(failTest).catch(promiseRejected)');
- run('mediaElement.src = findMediaFile("video", "content/test")');
- }
- function promiseRejected(e)
- {
- error = e;
- logResult(true, "Promise rejected.");
- testExpected('error.name', 'AbortError');
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectpauseabortexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-pause-abort-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-pause-abort-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-pause-abort-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,7 +0,0 @@
</span><del>-
-RUN(mediaElement.play().then(failTest).catch(promiseRejected))
-RUN(mediaElement.pause())
-Promise rejected. OK
-EXPECTED (error.name == 'AbortError') OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectpauseaborthtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-pause-abort.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-pause-abort.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-pause-abort.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,31 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- var error;
- function start()
- {
- findMediaElement();
- run('mediaElement.play().then(failTest).catch(promiseRejected)');
- run('mediaElement.pause()');
- }
- function promiseRejected(e)
- {
- error = e;
- logResult(true, "Promise rejected.");
- testExpected('error.name', 'AbortError');
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectplaynotallowedexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-play-notallowed-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-play-notallowed-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-play-notallowed-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,8 +0,0 @@
</span><del>-
-RUN(internals.setMediaElementRestrictions(mediaElement, "RequireUserGestureForVideoRateChange"))
-RUN(mediaElement.src = findMediaFile("video", "content/test"))
-RUN(mediaElement.play().then(failTest).catch(promiseRejected))
-Promise rejected. OK
-EXPECTED (error.name == 'NotAllowedError') OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectplaynotallowedhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-play-notallowed.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-play-notallowed.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-play-notallowed.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,35 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- var error;
- function start()
- {
- findMediaElement();
-         if (window.internals)
-         run('internals.setMediaElementRestrictions(mediaElement, "RequireUserGestureForVideoRateChange")');
-
- run('mediaElement.src = findMediaFile("video", "content/test")');
- run('mediaElement.play().then(failTest).catch(promiseRejected)');
- }
-
- function promiseRejected(e)
- {
- error = e;
- logResult(true, "Promise rejected.");
- testExpected('error.name', 'NotAllowedError');
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectplaynotsupportedexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-play-notsupported-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-play-notsupported-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-play-notsupported-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,8 +0,0 @@
</span><del>-
-RUN(mediaElement.src = findMediaFile("video", "content/invalid"))
-EVENT(error)
-RUN(mediaElement.play().then(failTest).catch(promiseRejected))
-Promise rejected. OK
-EXPECTED (error.name == 'NotSupportedError') OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiserejectplaynotsupportedhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-reject-play-notsupported.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-reject-play-notsupported.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-reject-play-notsupported.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,37 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- var error;
- function start()
- {
- findMediaElement();
- run('mediaElement.src = findMediaFile("video", "content/invalid")');
- waitForEventOnce('error', error);
- }
-
- function error()
- {
- run('mediaElement.play().then(failTest).catch(promiseRejected)');
- }
-
- function promiseRejected(e)
- {
- error = e;
- logResult(true, "Promise rejected.");
- testExpected('error.name', 'NotSupportedError');
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiseresolveexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-resolve-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-resolve-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-resolve-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,6 +0,0 @@
</span><del>-
-RUN(mediaElement.src = findMediaFile("video", "content/test"))
-RUN(mediaElement.play().then(promiseResolved).catch(failTest))
-Promise resolved. OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiseresolvewhenplayingexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-resolve-when-playing-expected.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-resolve-when-playing-expected.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-resolve-when-playing-expected.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,8 +0,0 @@
</span><del>-
-RUN(mediaElement.src = findMediaFile("video", "content/test"))
-RUN(mediaElement.play())
-EVENT(playing)
-RUN(mediaElement.play().then(promiseResolved).catch(failTest))
-Promise resolved. OK
-END OF TEST
-
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiseresolvewhenplayinghtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-resolve-when-playing.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-resolve-when-playing.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-resolve-when-playing.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,35 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- function start()
- {
- findMediaElement();
- run('mediaElement.src = findMediaFile("video", "content/test")');
- run('mediaElement.play()');
- waitForEventOnce('playing', playing);
- }
-
- function playing()
- {
- run('mediaElement.play().then(promiseResolved).catch(failTest)');
- }
-
- function promiseResolved()
- {
- logResult(true, "Promise resolved.");
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkLayoutTestsmediamediaplaypromiseresolvehtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/media/media-play-promise-resolve.html (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/media/media-play-promise-resolve.html        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/LayoutTests/media/media-play-promise-resolve.html        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,29 +0,0 @@
</span><del>-<!DOCTYPE html>
-<html>
- <head>
- <script src=media-file.js></script>
- <script src=video-test.js></script>
-
- <script>
- var promise;
- function start()
- {
- findMediaElement();
- run('mediaElement.src = findMediaFile("video", "content/test")');
- run('mediaElement.play().then(promiseResolved).catch(failTest)');
- }
-
- function promiseResolved()
- {
- logResult(true, "Promise resolved.");
- endTest();
- }
- </script>
- </head>
-
- <body onload="start()">
-
- <video></video>
-
- </body>
-</html>
</del></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/CMakeLists.txt        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -2109,7 +2109,6 @@
</span><span class="cx"> platform/FileChooser.cpp
</span><span class="cx"> platform/FileStream.cpp
</span><span class="cx"> platform/FileSystem.cpp
</span><del>- platform/GenericTaskQueue.cpp
</del><span class="cx"> platform/Language.cpp
</span><span class="cx"> platform/Length.cpp
</span><span class="cx"> platform/LengthBox.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/ChangeLog        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-05-10 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r200627.
+ https://bugs.webkit.org/show_bug.cgi?id=157531
+
+ This change has caused crashes in existing LayoutTests
+ (Requested by ryanhaddad on #webkit).
+
+ Reverted changeset:
+
+ "Return a Promise from HTMLMediaElement.play()"
+ https://bugs.webkit.org/show_bug.cgi?id=157400
+ http://trac.webkit.org/changeset/200627
+
</ins><span class="cx"> 2016-05-10 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><span class="cx"> Fix scrolling tree dumping
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -6042,7 +6042,6 @@
</span><span class="cx">                 CD3E252318046BCD00E27F56 /* CSSGridTemplateAreasValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD3E252118046BCD00E27F56 /* CSSGridTemplateAreasValue.cpp */; };
</span><span class="cx">                 CD3E252418046BCD00E27F56 /* CSSGridTemplateAreasValue.h in Headers */ = {isa = PBXBuildFile; fileRef = CD3E252218046BCD00E27F56 /* CSSGridTemplateAreasValue.h */; };
</span><span class="cx">                 CD4AC52A1496AE9A0087C4EF /* Composite.wav in Copy Audio Resources */ = {isa = PBXBuildFile; fileRef = CD4AC5281496AE2F0087C4EF /* Composite.wav */; };
</span><del>-                CD4BE52A1CE136EF009D87DA /* GenericTaskQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD4BE5291CE13425009D87DA /* GenericTaskQueue.cpp */; };
</del><span class="cx">                 CD5209E41B0BD8380077184E /* MediaPlayerEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5209E31B0BD8380077184E /* MediaPlayerEnums.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 CD5209E61B0BD9E10077184E /* HTMLMediaElementEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = CD5209E51B0BD9E10077184E /* HTMLMediaElementEnums.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 CD52481A18E200ED0008A07D /* DisplaySleepDisabler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD52481818E200ED0008A07D /* DisplaySleepDisabler.cpp */; };
</span><span class="lines">@@ -14033,7 +14032,6 @@
</span><span class="cx">                 CD3E252218046BCD00E27F56 /* CSSGridTemplateAreasValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSGridTemplateAreasValue.h; sourceTree = "<group>"; };
</span><span class="cx">                 CD4097FF1A8C855F004C65E9 /* CFNSURLConnectionSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFNSURLConnectionSPI.h; sourceTree = "<group>"; };
</span><span class="cx">                 CD4AC5281496AE2F0087C4EF /* Composite.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = Composite.wav; path = platform/audio/resources/Composite.wav; sourceTree = SOURCE_ROOT; };
</span><del>-                CD4BE5291CE13425009D87DA /* GenericTaskQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericTaskQueue.cpp; sourceTree = "<group>"; };
</del><span class="cx">                 CD4E0AFA11F7BC27009D3811 /* fullscreen.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = fullscreen.css; sourceTree = "<group>"; };
</span><span class="cx">                 CD5209E31B0BD8380077184E /* MediaPlayerEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlayerEnums.h; sourceTree = "<group>"; };
</span><span class="cx">                 CD5209E51B0BD9E10077184E /* HTMLMediaElementEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLMediaElementEnums.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -22951,7 +22949,6 @@
</span><span class="cx">                                 5179CE23195C81420019C198 /* GamepadProvider.h */,
</span><span class="cx">                                 5179CE29195C91860019C198 /* GamepadProviderClient.h */,
</span><span class="cx">                                 CD62FB941AF018E70012ED7D /* GenericTaskQueue.h */,
</span><del>-                                CD4BE5291CE13425009D87DA /* GenericTaskQueue.cpp */,
</del><span class="cx">                                 A8748BDF12CBF2DC001FBA41 /* HashTools.h */,
</span><span class="cx">                                 BC3BC29B0E91AB0F00835588 /* HostWindow.h */,
</span><span class="cx">                                 862F129F18C1DCE4005C54AF /* HysteresisActivity.h */,
</span><span class="lines">@@ -31343,7 +31340,6 @@
</span><span class="cx">                                 D70AD65713E1342B005B50B4 /* RenderRegion.cpp in Sources */,
</span><span class="cx">                                 BCE93F471517C6D5008CCF74 /* RenderRegionSet.cpp in Sources */,
</span><span class="cx">                                 A871DFE20A15376B00B12A68 /* RenderReplaced.cpp in Sources */,
</span><del>-                                CD4BE52A1CE136EF009D87DA /* GenericTaskQueue.cpp in Sources */,
</del><span class="cx">                                 BCA846D60DC67A350026C309 /* RenderReplica.cpp in Sources */,
</span><span class="cx">                                 1479FAED109AE37500DED655 /* RenderRuby.cpp in Sources */,
</span><span class="cx">                                 1479FAEF109AE37500DED655 /* RenderRubyBase.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoredomGenericEventQueuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/GenericEventQueue.cpp (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/GenericEventQueue.cpp        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/dom/GenericEventQueue.cpp        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx">
</span><span class="cx"> #include "Event.h"
</span><span class="cx"> #include "EventTarget.h"
</span><del>-#include "ScriptExecutionContext.h"
</del><span class="cx"> #include "Timer.h"
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx"> #include <wtf/NeverDestroyed.h>
</span><span class="lines">@@ -37,6 +36,7 @@
</span><span class="cx">
</span><span class="cx"> GenericEventQueue::GenericEventQueue(EventTarget& owner)
</span><span class="cx"> : m_owner(owner)
</span><ins>+ , m_weakPtrFactory(this)
</ins><span class="cx"> , m_isClosed(false)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -58,9 +58,42 @@
</span><span class="cx"> if (m_isSuspended)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- m_taskQueue.enqueueTask(std::bind(&GenericEventQueue::dispatchOneEvent, this));
</del><ins>+ pendingQueues().append(m_weakPtrFactory.createWeakPtr());
+ if (!sharedTimer().isActive())
+ sharedTimer().startOneShot(0);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+Timer& GenericEventQueue::sharedTimer()
+{
+ ASSERT(isMainThread());
+ static NeverDestroyed<Timer> timer(GenericEventQueue::sharedTimerFired);
+ return timer.get();
+}
+
+void GenericEventQueue::sharedTimerFired()
+{
+ ASSERT(!sharedTimer().isActive());
+ ASSERT(!pendingQueues().isEmpty());
+
+ // Copy the pending events first because we don't want to process synchronously the new events
+ // queued by the JS events handlers that are executed in the loop below.
+ Deque<WeakPtr<GenericEventQueue>> queuedEvents;
+ std::swap(queuedEvents, pendingQueues());
+ while (!queuedEvents.isEmpty()) {
+ WeakPtr<GenericEventQueue> queue = queuedEvents.takeFirst();
+ if (!queue)
+ continue;
+ queue->dispatchOneEvent();
+ }
+}
+
+Deque<WeakPtr<GenericEventQueue>>& GenericEventQueue::pendingQueues()
+{
+ ASSERT(isMainThread());
+ static NeverDestroyed<Deque<WeakPtr<GenericEventQueue>>> queues;
+ return queues.get();
+}
+
</ins><span class="cx"> void GenericEventQueue::dispatchOneEvent()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!m_pendingEvents.isEmpty());
</span><span class="lines">@@ -75,13 +108,13 @@
</span><span class="cx"> {
</span><span class="cx"> m_isClosed = true;
</span><span class="cx">
</span><del>- m_taskQueue.close();
</del><ins>+ m_weakPtrFactory.revokeAll();
</ins><span class="cx"> m_pendingEvents.clear();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void GenericEventQueue::cancelAllEvents()
</span><span class="cx"> {
</span><del>- m_taskQueue.cancelAllTasks();
</del><ins>+ m_weakPtrFactory.revokeAll();
</ins><span class="cx"> m_pendingEvents.clear();
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -94,7 +127,7 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!m_isSuspended);
</span><span class="cx"> m_isSuspended = true;
</span><del>- m_taskQueue.cancelAllTasks();
</del><ins>+ m_weakPtrFactory.revokeAll();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void GenericEventQueue::resume()
</span><span class="lines">@@ -108,7 +141,10 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> for (unsigned i = 0; i < m_pendingEvents.size(); ++i)
</span><del>- m_taskQueue.enqueueTask(std::bind(&GenericEventQueue::dispatchOneEvent, this));
</del><ins>+ pendingQueues().append(m_weakPtrFactory.createWeakPtr());
+
+ if (!sharedTimer().isActive())
+ sharedTimer().startOneShot(0);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoredomGenericEventQueueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/GenericEventQueue.h (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/GenericEventQueue.h        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/dom/GenericEventQueue.h        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -26,7 +26,6 @@
</span><span class="cx"> #ifndef GenericEventQueue_h
</span><span class="cx"> #define GenericEventQueue_h
</span><span class="cx">
</span><del>-#include "GenericTaskQueue.h"
</del><span class="cx"> #include <wtf/Deque.h>
</span><span class="cx"> #include <wtf/Forward.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="lines">@@ -53,11 +52,15 @@
</span><span class="cx"> void resume();
</span><span class="cx">
</span><span class="cx"> private:
</span><ins>+ static Timer& sharedTimer();
+ static void sharedTimerFired();
+ static Deque<WeakPtr<GenericEventQueue>>& pendingQueues();
+
</ins><span class="cx"> void dispatchOneEvent();
</span><span class="cx">
</span><span class="cx"> EventTarget& m_owner;
</span><del>- GenericTaskQueue<Timer> m_taskQueue;
</del><span class="cx"> Deque<RefPtr<Event>> m_pendingEvents;
</span><ins>+ WeakPtrFactory<GenericEventQueue> m_weakPtrFactory;
</ins><span class="cx"> bool m_isClosed;
</span><span class="cx"> bool m_isSuspended { false };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -51,7 +51,6 @@
</span><span class="cx"> #include "FrameView.h"
</span><span class="cx"> #include "HTMLSourceElement.h"
</span><span class="cx"> #include "HTMLVideoElement.h"
</span><del>-#include "JSDOMError.h"
</del><span class="cx"> #include "JSHTMLMediaElement.h"
</span><span class="cx"> #include "Language.h"
</span><span class="cx"> #include "Logging.h"
</span><span class="lines">@@ -349,6 +348,10 @@
</span><span class="cx"> , m_progressEventTimer(*this, &HTMLMediaElement::progressEventTimerFired)
</span><span class="cx"> , m_playbackProgressTimer(*this, &HTMLMediaElement::playbackProgressTimerFired)
</span><span class="cx"> , m_scanTimer(*this, &HTMLMediaElement::scanTimerFired)
</span><ins>+ , m_pauseAfterDetachedTimer(*this, &HTMLMediaElement::pauseAfterDetachedTimerFired)
+ , m_seekTaskQueue(document)
+ , m_resizeTaskQueue(document)
+ , m_shadowDOMTaskQueue(document)
</ins><span class="cx"> , m_playedTimeRanges()
</span><span class="cx"> , m_asyncEventQueue(*this)
</span><span class="cx"> , m_requestedPlaybackRate(1)
</span><span class="lines">@@ -557,8 +560,6 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> m_seekTaskQueue.close();
</span><del>- m_promiseTaskQueue.close();
- m_pauseAfterDetachedTaskQueue.close();
</del><span class="cx">
</span><span class="cx"> m_completelyLoaded = true;
</span><span class="cx"> }
</span><span class="lines">@@ -778,7 +779,7 @@
</span><span class="cx"> return InsertionDone;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void HTMLMediaElement::pauseAfterDetachedTask()
</del><ins>+void HTMLMediaElement::pauseAfterDetachedTimerFired()
</ins><span class="cx"> {
</span><span class="cx"> // If we were re-inserted into an active document, no need to pause.
</span><span class="cx"> if (m_inActiveDocument)
</span><span class="lines">@@ -814,7 +815,7 @@
</span><span class="cx"> m_inActiveDocument = false;
</span><span class="cx"> if (insertionPoint.inDocument()) {
</span><span class="cx"> // Pause asynchronously to let the operation that removed us finish, in case we get inserted back into a document.
</span><del>- m_pauseAfterDetachedTaskQueue.enqueueTask(std::bind(&HTMLMediaElement::pauseAfterDetachedTask, this));
</del><ins>+ m_pauseAfterDetachedTimer.startOneShot(0);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> HTMLElement::removedFrom(insertionPoint);
</span><span class="lines">@@ -902,38 +903,6 @@
</span><span class="cx"> m_asyncEventQueue.enqueueEvent(WTFMove(event));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void HTMLMediaElement::scheduleResolvePendingPlayPromises()
-{
- m_promiseTaskQueue.enqueueTask(std::bind(&HTMLMediaElement::resolvePendingPlayPromises, this));
-}
-
-void HTMLMediaElement::rejectPendingPlayPromises(DOMError& error)
-{
- Vector<PlayPromise> pendingPlayPromises = WTFMove(m_pendingPlayPromises);
-
- for (auto& promise : pendingPlayPromises)
- promise.reject(error);
-}
-
-void HTMLMediaElement::resolvePendingPlayPromises()
-{
- Vector<PlayPromise> pendingPlayPromises = WTFMove(m_pendingPlayPromises);
-
- for (auto& promise : pendingPlayPromises)
- promise.resolve(nullptr);
-}
-
-void HTMLMediaElement::scheduleNotifyAboutPlaying()
-{
- m_promiseTaskQueue.enqueueTask(std::bind(&HTMLMediaElement::notifyAboutPlaying, this));
-}
-
-void HTMLMediaElement::notifyAboutPlaying()
-{
- dispatchEvent(Event::create(eventNames().playingEvent, false, true));
- resolvePendingPlayPromises();
-}
-
</del><span class="cx"> void HTMLMediaElement::pendingActionTimerFired()
</span><span class="cx"> {
</span><span class="cx"> Ref<HTMLMediaElement> protect(*this); // loadNextSourceChild may fire 'beforeload', which can make arbitrary DOM mutations.
</span><span class="lines">@@ -1946,8 +1915,6 @@
</span><span class="cx"> // 7 - Queue a task to fire a simple event named error at the media element.
</span><span class="cx"> scheduleEvent(eventNames().errorEvent);
</span><span class="cx">
</span><del>- rejectPendingPlayPromises(DOMError::create("NotSupportedError", "The operation is not supported."));
-
</del><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx"> closeMediaSource();
</span><span class="cx"> #endif
</span><span class="lines">@@ -2012,8 +1979,6 @@
</span><span class="cx">
</span><span class="cx"> for (auto& source : childrenOfType<HTMLSourceElement>(*this))
</span><span class="cx"> source.cancelPendingErrorEvent();
</span><del>-
- rejectPendingPlayPromises(DOMError::create("AbortError", "The operation was aborted."));
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void HTMLMediaElement::mediaPlayerNetworkStateChanged(MediaPlayer*)
</span><span class="lines">@@ -2277,7 +2242,7 @@
</span><span class="cx"> if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tracksAreReady) {
</span><span class="cx"> scheduleEvent(eventNames().canplayEvent);
</span><span class="cx"> if (isPotentiallyPlaying)
</span><del>- scheduleNotifyAboutPlaying();
</del><ins>+ scheduleEvent(eventNames().playingEvent);
</ins><span class="cx"> shouldUpdateDisplayState = true;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -2288,13 +2253,13 @@
</span><span class="cx"> scheduleEvent(eventNames().canplaythroughEvent);
</span><span class="cx">
</span><span class="cx"> if (isPotentiallyPlaying && oldState <= HAVE_CURRENT_DATA)
</span><del>- scheduleNotifyAboutPlaying();
</del><ins>+ scheduleEvent(eventNames().playingEvent);
</ins><span class="cx">
</span><span class="cx"> if (canTransitionFromAutoplayToPlay()) {
</span><span class="cx"> m_paused = false;
</span><span class="cx"> invalidateCachedTime();
</span><span class="cx"> scheduleEvent(eventNames().playEvent);
</span><del>- scheduleNotifyAboutPlaying();
</del><ins>+ scheduleEvent(eventNames().playingEvent);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> shouldUpdateDisplayState = true;
</span><span class="lines">@@ -3021,29 +2986,6 @@
</span><span class="cx"> setAttribute(preloadAttr, preload);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void HTMLMediaElement::play(PlayPromise&& promise)
-{
- LOG(Media, "HTMLMediaElement::play(%p)", this);
-
- if (!m_mediaSession->playbackPermitted(*this)) {
- promise.reject(DOMError::create("NotAllowedError", "The request is not allowed by the user agent or the platform in the current context."));
- return;
- }
-
- if (m_error && m_error->code() == MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED) {
- promise.reject(DOMError::create("NotSupportedError", "The operation is not supported.."));
- return;
- }
-
- if (ScriptController::processingUserGestureForMedia())
- removeBehaviorsRestrictionsAfterFirstUserGesture();
-
- if (!playInternal())
- promise.reject(DOMError::create("NotAllowedError", "The request is not allowed by the user agent or the platform in the current context."));
-
- m_pendingPlayPromises.append(WTFMove(promise));
-}
-
</del><span class="cx"> void HTMLMediaElement::play()
</span><span class="cx"> {
</span><span class="cx"> LOG(Media, "HTMLMediaElement::play(%p)", this);
</span><span class="lines">@@ -3056,13 +2998,13 @@
</span><span class="cx"> playInternal();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-bool HTMLMediaElement::playInternal()
</del><ins>+void HTMLMediaElement::playInternal()
</ins><span class="cx"> {
</span><span class="cx"> LOG(Media, "HTMLMediaElement::playInternal(%p)", this);
</span><span class="cx">
</span><span class="cx"> if (!m_mediaSession->clientWillBeginPlayback()) {
</span><span class="cx"> LOG(Media, " returning because of interruption");
</span><del>- return false;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // 4.8.10.9. Playing the media resource
</span><span class="lines">@@ -3083,7 +3025,7 @@
</span><span class="cx"> if (m_readyState <= HAVE_CURRENT_DATA)
</span><span class="cx"> scheduleEvent(eventNames().waitingEvent);
</span><span class="cx"> else if (m_readyState >= HAVE_FUTURE_DATA)
</span><del>- scheduleNotifyAboutPlaying();
</del><ins>+ scheduleEvent(eventNames().playingEvent);
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(MEDIA_SESSION)
</span><span class="cx"> // 6.3 Activating a media session from a media element
</span><span class="lines">@@ -3105,18 +3047,15 @@
</span><span class="cx">
</span><span class="cx"> if (!m_session->invoke()) {
</span><span class="cx"> pause();
</span><del>- return false;
</del><ins>+ return;
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><del>- } else if (m_readyState >= HAVE_FUTURE_DATA)
- scheduleResolvePendingPlayPromises();
-
</del><ins>+ }
</ins><span class="cx"> m_autoplaying = false;
</span><span class="cx"> updatePlayState();
</span><span class="cx"> updateMediaController();
</span><del>- return true;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void HTMLMediaElement::pause()
</span><span class="lines">@@ -3154,7 +3093,6 @@
</span><span class="cx"> m_paused = true;
</span><span class="cx"> scheduleTimeupdateEvent(false);
</span><span class="cx"> scheduleEvent(eventNames().pauseEvent);
</span><del>- rejectPendingPlayPromises(DOMError::create("AbortError", "The operation was aborted."));
</del><span class="cx">
</span><span class="cx"> if (MemoryPressureHandler::singleton().isUnderMemoryPressure())
</span><span class="cx"> purgeBufferedDataIfPossible();
</span><span class="lines">@@ -5067,8 +5005,6 @@
</span><span class="cx"> m_seekTaskQueue.close();
</span><span class="cx"> m_resizeTaskQueue.close();
</span><span class="cx"> m_shadowDOMTaskQueue.close();
</span><del>- m_promiseTaskQueue.close();
- m_pauseAfterDetachedTaskQueue.close();
</del><span class="cx">
</span><span class="cx"> ActiveDOMObject::contextDestroyed();
</span><span class="cx"> }
</span><span class="lines">@@ -5080,7 +5016,6 @@
</span><span class="cx"> stopWithoutDestroyingMediaPlayer();
</span><span class="cx">
</span><span class="cx"> m_asyncEventQueue.close();
</span><del>- m_promiseTaskQueue.close();
</del><span class="cx">
</span><span class="cx"> // Once an active DOM object has been stopped it can not be restarted, so we can deallocate
</span><span class="cx"> // the media player now. Note that userCancelledLoad will already called clearMediaPlayer
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include "GenericEventQueue.h"
</span><span class="cx"> #include "GenericTaskQueue.h"
</span><span class="cx"> #include "HTMLMediaElementEnums.h"
</span><del>-#include "JSDOMPromise.h"
</del><span class="cx"> #include "MediaCanStartListener.h"
</span><span class="cx"> #include "MediaControllerInterface.h"
</span><span class="cx"> #include "MediaElementSession.h"
</span><span class="lines">@@ -59,7 +58,6 @@
</span><span class="cx"> class AudioSourceProvider;
</span><span class="cx"> class MediaElementAudioSourceNode;
</span><span class="cx"> #endif
</span><del>-class DOMError;
</del><span class="cx"> class DisplaySleepDisabler;
</span><span class="cx"> class Event;
</span><span class="cx"> class HTMLSourceElement;
</span><span class="lines">@@ -143,11 +141,6 @@
</span><span class="cx">
</span><span class="cx"> using HTMLMediaElementEnums::DelayedActionType;
</span><span class="cx"> void scheduleDelayedAction(DelayedActionType);
</span><del>- void scheduleResolvePendingPlayPromises();
- void rejectPendingPlayPromises(DOMError&);
- void resolvePendingPlayPromises();
- void scheduleNotifyAboutPlaying();
- void notifyAboutPlaying();
</del><span class="cx">
</span><span class="cx"> MediaPlayerEnums::MovieLoadType movieLoadType() const;
</span><span class="cx">
</span><span class="lines">@@ -211,10 +204,6 @@
</span><span class="cx"> bool isAutoplaying() const { return m_autoplaying; }
</span><span class="cx"> bool loop() const;
</span><span class="cx"> void setLoop(bool b);
</span><del>-
- typedef DOMPromise<std::nullptr_t, DOMError&> PlayPromise;
- void play(PlayPromise&&);
-
</del><span class="cx"> WEBCORE_EXPORT void play() override;
</span><span class="cx"> WEBCORE_EXPORT void pause() override;
</span><span class="cx"> void setShouldBufferData(bool) override;
</span><span class="lines">@@ -682,7 +671,7 @@
</span><span class="cx">
</span><span class="cx"> // These "internal" functions do not check user gesture restrictions.
</span><span class="cx"> void loadInternal();
</span><del>- bool playInternal();
</del><ins>+ void playInternal();
</ins><span class="cx"> void pauseInternal();
</span><span class="cx">
</span><span class="cx"> void prepareForLoad();
</span><span class="lines">@@ -783,22 +772,19 @@
</span><span class="cx"> void isVisibleInViewportChanged() final;
</span><span class="cx"> void updateShouldAutoplay();
</span><span class="cx">
</span><del>- void pauseAfterDetachedTask();
</del><ins>+ void pauseAfterDetachedTimerFired();
</ins><span class="cx">
</span><span class="cx"> Timer m_pendingActionTimer;
</span><span class="cx"> Timer m_progressEventTimer;
</span><span class="cx"> Timer m_playbackProgressTimer;
</span><span class="cx"> Timer m_scanTimer;
</span><del>- GenericTaskQueue<Timer> m_seekTaskQueue;
- GenericTaskQueue<Timer> m_resizeTaskQueue;
- GenericTaskQueue<Timer> m_shadowDOMTaskQueue;
- GenericTaskQueue<Timer> m_promiseTaskQueue;
- GenericTaskQueue<Timer> m_pauseAfterDetachedTaskQueue;
</del><ins>+ Timer m_pauseAfterDetachedTimer;
+ GenericTaskQueue<ScriptExecutionContext> m_seekTaskQueue;
+ GenericTaskQueue<ScriptExecutionContext> m_resizeTaskQueue;
+ GenericTaskQueue<ScriptExecutionContext> m_shadowDOMTaskQueue;
</ins><span class="cx"> RefPtr<TimeRanges> m_playedTimeRanges;
</span><span class="cx"> GenericEventQueue m_asyncEventQueue;
</span><span class="cx">
</span><del>- Vector<PlayPromise> m_pendingPlayPromises;
-
</del><span class="cx"> double m_requestedPlaybackRate;
</span><span class="cx"> double m_reportedPlaybackRate;
</span><span class="cx"> double m_defaultPlaybackRate;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.idl (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.idl        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/html/HTMLMediaElement.idl        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx"> readonly attribute boolean ended;
</span><span class="cx"> [Reflect] attribute boolean autoplay;
</span><span class="cx"> [Reflect] attribute boolean loop;
</span><del>- Promise play();
</del><ins>+ void play();
</ins><span class="cx"> void pause();
</span><span class="cx"> void fastSeek(unrestricted double time);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformGenericTaskQueuecpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/platform/GenericTaskQueue.cpp (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/GenericTaskQueue.cpp        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/platform/GenericTaskQueue.cpp        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -1,92 +0,0 @@
</span><del>-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "GenericTaskQueue.h"
-
-#include <wtf/MainThread.h>
-#include <wtf/NeverDestroyed.h>
-
-namespace WebCore {
-
-TaskDispatcher<Timer>::~TaskDispatcher()
-{
- Deque<TaskDispatcher<Timer>*> replacementQueue;
- for (auto* dispatcher : pendingDispatchers()) {
- if (dispatcher != this)
- replacementQueue.append(dispatcher);
- }
- if (replacementQueue.isEmpty())
- sharedTimer().stop();
- pendingDispatchers() = WTFMove(replacementQueue);
-}
-
-void TaskDispatcher<Timer>::postTask(std::function<void()> function)
-{
- m_pendingTasks.append(WTFMove(function));
- pendingDispatchers().append(this);
- if (!sharedTimer().isActive())
- sharedTimer().startOneShot(0);
-}
-
-Timer& TaskDispatcher<Timer>::sharedTimer()
-{
- ASSERT(isMainThread());
- static NeverDestroyed<Timer> timer(TaskDispatcher<Timer>::sharedTimerFired);
- return timer.get();
-}
-
-void TaskDispatcher<Timer>::sharedTimerFired()
-{
- ASSERT(!sharedTimer().isActive());
- ASSERT(!pendingDispatchers().isEmpty());
-
- // Copy the pending events first because we don't want to process synchronously the new events
- // queued by the JS events handlers that are executed in the loop below.
- Deque<TaskDispatcher<Timer>*> queuedDispatchers = WTFMove(pendingDispatchers());
- while (!queuedDispatchers.isEmpty()) {
- TaskDispatcher<Timer>* dispatcher = queuedDispatchers.takeFirst();
- if (!dispatcher)
- continue;
- dispatcher->dispatchOneTask();
- }
-}
-
-Deque<TaskDispatcher<Timer>*>& TaskDispatcher<Timer>::pendingDispatchers()
-{
- ASSERT(isMainThread());
- static NeverDestroyed<Deque<TaskDispatcher<Timer>*>> dispatchers;
- return dispatchers.get();
-}
-
-void TaskDispatcher<Timer>::dispatchOneTask()
-{
- ASSERT(!m_pendingTasks.isEmpty());
- std::function<void()> task = m_pendingTasks.takeFirst();
- task();
-}
-
-}
-
</del></span></pre></div>
<a id="trunkSourceWebCoreplatformGenericTaskQueueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/GenericTaskQueue.h (200636 => 200637)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/GenericTaskQueue.h        2016-05-10 19:31:22 UTC (rev 200636)
+++ trunk/Source/WebCore/platform/GenericTaskQueue.h        2016-05-10 20:21:45 UTC (rev 200637)
</span><span class="lines">@@ -52,17 +52,27 @@
</span><span class="cx"> template<>
</span><span class="cx"> class TaskDispatcher<Timer> {
</span><span class="cx"> public:
</span><del>- ~TaskDispatcher();
- void postTask(std::function<void()>);
</del><ins>+ TaskDispatcher()
+ : m_timer(*this, &TaskDispatcher<Timer>::timerFired)
+ {
+ }
</ins><span class="cx">
</span><del>-private:
- static Timer& sharedTimer();
- static void sharedTimerFired();
- static Deque<TaskDispatcher<Timer>*>& pendingDispatchers();
</del><ins>+ void postTask(std::function<void()> function)
+ {
+ m_queue.append(function);
+ m_timer.startOneShot(0);
+ }
</ins><span class="cx">
</span><del>- void dispatchOneTask();
</del><ins>+ void timerFired()
+ {
+ Deque<std::function<void()>> queue;
+ queue.swap(m_queue);
+ for (std::function<void()>& function : queue)
+ function();
+ }
</ins><span class="cx">
</span><del>- Deque<std::function<void()>> m_pendingTasks;
</del><ins>+ Timer m_timer;
+ Deque<std::function<void()>> m_queue;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template <typename T>
</span></span></pre>
</div>
</div>
</body>
</html>