Chromium Code Reviews| Index: Source/modules/webaudio/AudioContext.cpp |
| diff --git a/Source/modules/webaudio/AudioContext.cpp b/Source/modules/webaudio/AudioContext.cpp |
| index 645145c54ff0c92282c932f40525833a6296e1d6..a4811cb71801a034ab985caf9e9284d8721b10ac 100644 |
| --- a/Source/modules/webaudio/AudioContext.cpp |
| +++ b/Source/modules/webaudio/AudioContext.cpp |
| @@ -151,7 +151,6 @@ AudioContext::~AudioContext() |
| ASSERT(!m_isInitialized); |
| ASSERT(!m_activeSourceNodes.size()); |
| ASSERT(!m_finishedSourceHandlers.size()); |
| - ASSERT(!m_suspendResolvers.size()); |
| ASSERT(!m_isResolvingResumePromises); |
| ASSERT(!m_resumeResolvers.size()); |
| } |
| @@ -758,14 +757,17 @@ ScriptPromise AudioContext::suspendContext(ScriptState* scriptState) |
| RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
| ScriptPromise promise = resolver->promise(); |
| - // Save the resolver. If the context is running, it will get resolved at the end of a rendering |
| - // quantum. Otherwise, resolve it now. |
| - m_suspendResolvers.append(resolver); |
| + if (m_contextState == Closed) { |
| + resolver->reject( |
| + DOMException::create(InvalidStateError, "Cannot suspend a context that has been closed")); |
| + } else { |
| + // Stop rendering now. |
| + if (m_destinationNode) |
| + stopRendering(); |
| - if (m_contextState != Running) { |
| - // Context is not running so we can't wait for a rendering quantum to resolve the |
| - // promise. Just resolve it now (along with any other pending suspend promises). |
| - resolvePromisesForSuspendOnMainThread(); |
|
haraken
2015/05/18 14:47:59
Actually I was wondering why we need to call resol
Raymond Toy
2015/05/18 18:25:08
Yeah, I have no recollection of why I did it this
|
| + // Since we don't have any way of knowing when the hardware actually stops, we'll just |
| + // resolve the promise now. |
| + resolver->resolve(); |
| } |
| return promise; |
| @@ -898,8 +900,6 @@ void AudioContext::handlePostRenderTasks() |
| deferredTaskHandler().handleDeferredTasks(); |
| deferredTaskHandler().requestToDeleteHandlersOnMainThread(); |
| - resolvePromisesForSuspend(); |
| - |
| unlock(); |
| } |
| } |
| @@ -937,49 +937,11 @@ void AudioContext::resolvePromisesForResume() |
| } |
| } |
| -void AudioContext::resolvePromisesForSuspendOnMainThread() |
| -{ |
| - ASSERT(isMainThread()); |
| - AutoLocker locker(this); |
| - |
| - // We can stop rendering now. |
| - if (m_destinationNode) |
| - stopRendering(); |
| - |
| - for (auto& resolver : m_suspendResolvers) { |
| - if (m_contextState == Closed) { |
| - resolver->reject( |
| - DOMException::create(InvalidStateError, "Cannot suspend a context that has been closed")); |
| - } else { |
| - resolver->resolve(); |
| - } |
| - } |
| - |
| - m_suspendResolvers.clear(); |
| -} |
| - |
| -void AudioContext::resolvePromisesForSuspend() |
| -{ |
| - // This runs inside the AudioContext's lock when handling pre-render tasks. |
| - ASSERT(isAudioThread()); |
| - ASSERT(isGraphOwner()); |
| - |
| - // Resolve any pending promises created by suspend() |
| - if (m_suspendResolvers.size() > 0) |
| - Platform::current()->mainThread()->postTask(FROM_HERE, threadSafeBind(&AudioContext::resolvePromisesForSuspendOnMainThread, this)); |
| -} |
| - |
| void AudioContext::rejectPendingResolvers() |
| { |
| ASSERT(isMainThread()); |
| - // Audio context is closing down so reject any suspend or resume promises that are still |
| - // pending. |
| - |
| - for (auto& resolver : m_suspendResolvers) { |
| - resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away")); |
| - } |
| - m_suspendResolvers.clear(); |
| + // Audio context is closing down so reject any resume promises that are still pending. |
| for (auto& resolver : m_resumeResolvers) { |
| resolver->reject(DOMException::create(InvalidStateError, "Audio context is going away")); |
| @@ -1063,7 +1025,9 @@ DEFINE_TRACE(AudioContext) |
| visitor->trace(m_activeSourceNodes); |
| } |
| visitor->trace(m_resumeResolvers); |
| +#if 0 |
|
haraken
2015/05/18 14:47:59
You can remove this.
Raymond Toy
2015/05/18 18:25:08
Oops. Done
|
| visitor->trace(m_suspendResolvers); |
| +#endif |
| RefCountedGarbageCollectedEventTargetWithInlineData<AudioContext>::trace(visitor); |
| ActiveDOMObject::trace(visitor); |
| } |