Index: Source/modules/webaudio/AudioScheduledSourceNode.cpp |
diff --git a/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
index c467527aff906266be38459d2e21b6b55404f3ec..ed7ab7404d46fd3eed583f9402a6b076ed584d93 100644 |
--- a/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
+++ b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
@@ -179,20 +179,30 @@ void AudioScheduledSourceNode::finish() |
context()->decrementActiveSourceCount(); |
} |
- if (m_hasEndedListener) |
- callOnMainThread(&AudioScheduledSourceNode::notifyEndedDispatch, this); |
+ if (m_hasEndedListener) { |
+ // |task| will keep the AudioScheduledSourceNode alive until the listener has been handled. |
+ OwnPtr<NotifyEndedTask> task = adoptPtr(new NotifyEndedTask(this)); |
+ callOnMainThread(&AudioScheduledSourceNode::notifyEndedDispatch, task.leakPtr()); |
+ } |
} |
void AudioScheduledSourceNode::notifyEndedDispatch(void* userData) |
{ |
- static_cast<AudioScheduledSourceNode*>(userData)->notifyEnded(); |
+ OwnPtr<NotifyEndedTask> task = adoptPtr(static_cast<NotifyEndedTask*>(userData)); |
+ |
+ task->notifyEnded(); |
+} |
+ |
+AudioScheduledSourceNode::NotifyEndedTask::NotifyEndedTask(PassRefPtr<AudioScheduledSourceNode> sourceNode) |
+ : m_scheduledNode(sourceNode) |
+{ |
} |
-void AudioScheduledSourceNode::notifyEnded() |
+void AudioScheduledSourceNode::NotifyEndedTask::notifyEnded() |
{ |
RefPtr<Event> event = Event::create(eventNames().endedEvent); |
- event->setTarget(this); |
- dispatchEvent(event.get()); |
+ event->setTarget(m_scheduledNode); |
+ m_scheduledNode->dispatchEvent(event.get()); |
} |
} // namespace WebCore |