Title: [228574] trunk
Revision
228574
Author
[email protected]
Date
2018-02-16 13:06:34 -0800 (Fri, 16 Feb 2018)

Log Message

Crash under WebCore::EventTarget::fireEventListeners
https://bugs.webkit.org/show_bug.cgi?id=182880
<rdar://problem/20788804>

Reviewed by Youenn Fablet.

Source/WebCore:

Make sure the 'ended' event does not get dispatched on a
AudioScheduledSourceNode after ActiveDOMObjects have been stopped.

Test: webaudio/audiobuffersource-ended-detached-frame.html

* Modules/webaudio/AudioScheduledSourceNode.cpp:
(WebCore::AudioScheduledSourceNode::finish):

LayoutTests:

Add layout test coverage.

* webaudio/audiobuffersource-ended-detached-frame-expected.txt: Added.
* webaudio/audiobuffersource-ended-detached-frame.html: Added.
* webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (228573 => 228574)


--- trunk/LayoutTests/ChangeLog	2018-02-16 20:59:55 UTC (rev 228573)
+++ trunk/LayoutTests/ChangeLog	2018-02-16 21:06:34 UTC (rev 228574)
@@ -1,3 +1,17 @@
+2018-02-16  Chris Dumez  <[email protected]>
+
+        Crash under WebCore::EventTarget::fireEventListeners
+        https://bugs.webkit.org/show_bug.cgi?id=182880
+        <rdar://problem/20788804>
+
+        Reviewed by Youenn Fablet.
+
+        Add layout test coverage.
+
+        * webaudio/audiobuffersource-ended-detached-frame-expected.txt: Added.
+        * webaudio/audiobuffersource-ended-detached-frame.html: Added.
+        * webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html: Added.
+
 2018-02-16  Jiewen Tan  <[email protected]>
 
         [WebAuthN] Implement PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()

Added: trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame-expected.txt (0 => 228574)


--- trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame-expected.txt	2018-02-16 21:06:34 UTC (rev 228574)
@@ -0,0 +1,9 @@
+Test that we do not crash when trying to fire an 'ended' event at a audiobuffersource node in a detached frame.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame.html (0 => 228574)


--- trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame.html	                        (rev 0)
+++ trunk/LayoutTests/webaudio/audiobuffersource-ended-detached-frame.html	2018-02-16 21:06:34 UTC (rev 228574)
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<head>
+    <script src=""
+    <script>
+        function runTest()
+        {
+            description("Test that we do not crash when trying to fire an 'ended' event at a audiobuffersource node in a detached frame.");
+            jsTestIsAsync = true;
+
+            frame = document.createElement("iframe");
+            frame.src = ""
+            frame._onload_ = function() {
+                frame.contentWindow.runTest();
+                frame.remove();
+                setTimeout(function() {
+                    finishJSTest();
+                }, 10);
+            };
+            document.body.appendChild(frame);
+        }
+    </script>
+</head>
+<body _onload_="runTest()">
+</body>

Added: trunk/LayoutTests/webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html (0 => 228574)


--- trunk/LayoutTests/webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html	                        (rev 0)
+++ trunk/LayoutTests/webaudio/resources/audiobuffersource-ended-detached-frame-iframe.html	2018-02-16 21:06:34 UTC (rev 228574)
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<script src=""
+<script>
+    var context;
+    var source;
+
+    function runTest()
+    {
+        var sampleRate = 44100.0;
+        var numberOfFrames = 32;
+        context = new webkitOfflineAudioContext(1, numberOfFrames, sampleRate);
+        source = context.createBufferSource();
+        source.buffer = createTestBuffer(context, numberOfFrames);
+        source.connect(context.destination);
+        source._onended_ = function()
+        {
+        }
+        source.start(0);
+        context.startRendering();
+    }
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (228573 => 228574)


--- trunk/Source/WebCore/ChangeLog	2018-02-16 20:59:55 UTC (rev 228573)
+++ trunk/Source/WebCore/ChangeLog	2018-02-16 21:06:34 UTC (rev 228574)
@@ -1,3 +1,19 @@
+2018-02-16  Chris Dumez  <[email protected]>
+
+        Crash under WebCore::EventTarget::fireEventListeners
+        https://bugs.webkit.org/show_bug.cgi?id=182880
+        <rdar://problem/20788804>
+
+        Reviewed by Youenn Fablet.
+
+        Make sure the 'ended' event does not get dispatched on a
+        AudioScheduledSourceNode after ActiveDOMObjects have been stopped.
+
+        Test: webaudio/audiobuffersource-ended-detached-frame.html
+
+        * Modules/webaudio/AudioScheduledSourceNode.cpp:
+        (WebCore::AudioScheduledSourceNode::finish):
+
 2018-02-16  Jiewen Tan  <[email protected]>
 
         [WebAuthN] Implement PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()

Modified: trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp (228573 => 228574)


--- trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp	2018-02-16 20:59:55 UTC (rev 228573)
+++ trunk/Source/WebCore/Modules/webaudio/AudioScheduledSourceNode.cpp	2018-02-16 21:06:34 UTC (rev 228574)
@@ -33,6 +33,7 @@
 #include "Event.h"
 #include "EventNames.h"
 #include "ScriptController.h"
+#include "ScriptExecutionContext.h"
 #include <algorithm>
 #include <wtf/MathExtras.h>
 
@@ -166,11 +167,20 @@
         context().decrementActiveSourceCount();
     }
 
-    if (m_hasEndedListener) {
-        callOnMainThread([protectedThis = makeRef(*this)] () mutable {
-            protectedThis->dispatchEvent(Event::create(eventNames().endedEvent, false, false));
-        });
-    }
+    if (!m_hasEndedListener)
+        return;
+
+    auto* scriptExecutionContext = this->scriptExecutionContext();
+    if (!scriptExecutionContext)
+        return;
+
+    scriptExecutionContext->postTask([this, protectedThis = makeRef(*this)] (auto&) {
+        // Make sure ActiveDOMObjects have not been stopped after scheduling this task.
+        if (!this->scriptExecutionContext())
+            return;
+
+        this->dispatchEvent(Event::create(eventNames().endedEvent, false, false));
+    });
 }
 
 bool AudioScheduledSourceNode::addEventListener(const AtomicString& eventType, Ref<EventListener>&& listener, const AddEventListenerOptions& options)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to