Chromium Code Reviews| Index: Source/modules/webaudio/AudioScheduledSourceNode.cpp |
| diff --git a/Source/modules/webaudio/AudioScheduledSourceNode.cpp b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
| index c467527aff906266be38459d2e21b6b55404f3ec..39e06e752610f0a599276debad244fa76455983c 100644 |
| --- a/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
| +++ b/Source/modules/webaudio/AudioScheduledSourceNode.cpp |
| @@ -179,8 +179,11 @@ void AudioScheduledSourceNode::finish() |
| context()->decrementActiveSourceCount(); |
| } |
| - if (m_hasEndedListener) |
| + if (m_hasEndedListener) { |
| + // Reference ourself so we don't accidentally get deleted before notifyEnded gets called. |
| + ref(); |
|
haraken
2013/09/05 23:42:44
You can just set m_playing to true, and...
|
| callOnMainThread(&AudioScheduledSourceNode::notifyEndedDispatch, this); |
| + } |
| } |
| void AudioScheduledSourceNode::notifyEndedDispatch(void* userData) |
| @@ -190,9 +193,15 @@ 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()); |
| + } |
| + |
| + // Deref to match the ref() call in finish(); |
| + deref(); |
|
haraken
2013/09/05 23:42:44
... set m_playing to false here.
Then you can imp
|
| } |
| } // namespace WebCore |