Index: Source/modules/webaudio/AudioScheduledSourceNode.cpp |
diff --git a/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
index 19bcc5ee2dd2249b9c07872117a8f3d454329df7..98e4d1bc1284a6dc0833d59bde6eeea7a01f011d 100644 |
--- a/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
+++ b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
@@ -29,15 +29,23 @@ |
#include "modules/webaudio/AudioScheduledSourceNode.h" |
#include "bindings/core/v8/ExceptionState.h" |
+#include "core/dom/CrossThreadTask.h" |
#include "core/dom/ExceptionCode.h" |
#include "modules/EventModules.h" |
#include "modules/webaudio/AudioContext.h" |
#include "platform/audio/AudioUtilities.h" |
-#include <algorithm> |
#include "wtf/MathExtras.h" |
+#include <algorithm> |
namespace WebCore { |
+#if !ENABLE(OILPAN) |
+// We need a dedicated specialization for AudioScheduledSourceNode because it |
+// doesn't inherit from RefCounted. |
+template<> struct CrossThreadCopierBase<false, false, false, PassRefPtr<AudioScheduledSourceNode> > : public CrossThreadCopierPassThrough<PassRefPtr<AudioScheduledSourceNode> > { |
+}; |
+#endif |
+ |
const double AudioScheduledSourceNode::UnknownTime = -1; |
AudioScheduledSourceNode::AudioScheduledSourceNode(AudioContext* context, float sampleRate) |
@@ -179,30 +187,14 @@ void AudioScheduledSourceNode::finish() |
m_playbackState = FINISHED_STATE; |
} |
- 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()); |
+ if (m_hasEndedListener && context()->executionContext()) { |
+ context()->executionContext()->postTask(createCrossThreadTask(&AudioScheduledSourceNode::notifyEnded, PassRefPtrWillBeRawPtr<AudioScheduledSourceNode>(this))); |
} |
} |
-void AudioScheduledSourceNode::notifyEndedDispatch(void* userData) |
-{ |
- OwnPtr<NotifyEndedTask> task = adoptPtr(static_cast<NotifyEndedTask*>(userData)); |
- |
- task->notifyEnded(); |
-} |
- |
-AudioScheduledSourceNode::NotifyEndedTask::NotifyEndedTask(PassRefPtr<AudioScheduledSourceNode> sourceNode) |
- : m_scheduledNode(sourceNode) |
-{ |
-} |
- |
-void AudioScheduledSourceNode::NotifyEndedTask::notifyEnded() |
+void AudioScheduledSourceNode::notifyEnded() |
{ |
- RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::ended); |
- event->setTarget(m_scheduledNode.get()); |
- m_scheduledNode->dispatchEvent(event.get()); |
+ dispatchEvent(Event::create(EventTypeNames::ended)); |
} |
} // namespace WebCore |