Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2183)

Unified Diff: Source/modules/webaudio/AudioScheduledSourceNode.cpp

Issue 23596014: Keep AudioScheduledSourceNode alive until onended is called. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/webaudio/AudioScheduledSourceNode.cpp
diff --git a/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/Source/modules/webaudio/AudioScheduledSourceNode.cpp
index c467527aff906266be38459d2e21b6b55404f3ec..bb5236f273ec7113032233a414430cdcf1447add 100644
--- a/Source/modules/webaudio/AudioScheduledSourceNode.cpp
+++ b/Source/modules/webaudio/AudioScheduledSourceNode.cpp
@@ -42,6 +42,7 @@ const double AudioScheduledSourceNode::UnknownTime = -1;
AudioScheduledSourceNode::AudioScheduledSourceNode(AudioContext* context, float sampleRate)
: AudioSourceNode(context, sampleRate)
+ , ActiveDOMObject(context->scriptExecutionContext())
, m_playbackState(UNSCHEDULED_STATE)
, m_startTime(0)
, m_endTime(UnknownTime)
@@ -144,7 +145,7 @@ void AudioScheduledSourceNode::start(double when)
m_playbackState = SCHEDULED_STATE;
}
-void AudioScheduledSourceNode::stop(double when)
+void AudioScheduledSourceNode::stopNote(double when)
{
ASSERT(isMainThread());
if (!(m_playbackState == SCHEDULED_STATE || m_playbackState == PLAYING_STATE))
@@ -161,7 +162,7 @@ void AudioScheduledSourceNode::noteOn(double when)
void AudioScheduledSourceNode::noteOff(double when)
{
- stop(when);
+ stopNote(when);
}
void AudioScheduledSourceNode::setOnended(PassRefPtr<EventListener> listener, DOMWrapperWorld* isolatedWorld)
@@ -179,8 +180,10 @@ void AudioScheduledSourceNode::finish()
context()->decrementActiveSourceCount();
}
- if (m_hasEndedListener)
+ if (m_hasEndedListener) {
+ setPendingActivity(this);
Ken Russell (switch to Gerrit) 2013/09/09 21:30:05 Sorry, I failed to realize this before. This can't
Ken Russell (switch to Gerrit) 2013/09/09 21:34:31 Apologies, I think I'm wrong. AudioNode::ref is sp
callOnMainThread(&AudioScheduledSourceNode::notifyEndedDispatch, this);
+ }
}
void AudioScheduledSourceNode::notifyEndedDispatch(void* userData)
@@ -190,9 +193,24 @@ void AudioScheduledSourceNode::notifyEndedDispatch(void* userData)
void AudioScheduledSourceNode::notifyEnded()
{
- RefPtr<Event> event = Event::create(eventNames().endedEvent);
- event->setTarget(this);
- dispatchEvent(event.get());
+ // Avoid firing the event if the document has already gone away.
+ if (context()->scriptExecutionContext()) {
+ RefPtr<Event> event = Event::create(eventNames().endedEvent);
+ event->setTarget(this);
+ dispatchEvent(event.get());
+ }
+ unsetPendingActivity(this);
Ken Russell (switch to Gerrit) 2013/09/09 19:45:47 This looks wrong now. What happens if we navigate
+}
+
+ScriptExecutionContext* AudioScheduledSourceNode::scriptExecutionContext() const
+{
+ return context()->scriptExecutionContext();
+}
+
+void AudioScheduledSourceNode::stop()
+{
+ if (hasPendingActivity())
+ unsetPendingActivity(this);
}
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698