Index: third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp |
diff --git a/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp b/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp |
index 930dc3c40b88e366c893b33e4f2691cb812f706b..e68f5b8daaad418b6cc49f9bafbeb2fe08225dad 100644 |
--- a/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp |
+++ b/third_party/WebKit/Source/modules/audio_output_devices/HTMLMediaElementAudioOutputDevice.cpp |
@@ -8,6 +8,7 @@ |
#include "bindings/core/v8/ScriptPromiseResolver.h" |
#include "bindings/core/v8/ScriptState.h" |
#include "core/dom/ExecutionContext.h" |
+#include "modules/audio_output_devices/AudioOutputDeviceClient.h" |
#include "modules/audio_output_devices/SetSinkIdCallbacks.h" |
#include "public/platform/WebSecurityOrigin.h" |
@@ -34,14 +35,23 @@ ScriptPromise HTMLMediaElementAudioOutputDevice::setSinkId(ScriptState* scriptSt |
ASSERT(scriptState); |
WebMediaPlayer* webMediaPlayer = element.webMediaPlayer(); |
- if (!webMediaPlayer) |
- return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "No media player available")); |
- |
+ ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
+ OwnPtr<SetSinkIdCallbacks> callbacks = adoptPtr(new SetSinkIdCallbacks(resolver, element, sinkId)); |
+ ScriptPromise promise = resolver->promise(); |
ExecutionContext* context = scriptState->executionContext(); |
ASSERT(context && context->isDocument()); |
- ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
- webMediaPlayer->setSinkId(sinkId, WebSecurityOrigin(context->securityOrigin()), new SetSinkIdCallbacks(resolver, element, sinkId)); |
+ if (webMediaPlayer) { |
+ webMediaPlayer->setSinkId(sinkId, WebSecurityOrigin(context->securityOrigin()), callbacks.leakPtr()); |
+ } else { |
+ if (AudioOutputDeviceClient* client = AudioOutputDeviceClient::from(context)) { |
+ client->checkAudioSink(context, sinkId, callbacks.release()); |
+ } else { |
+ // The context has been detached. The promise will never settle. |
+ ASSERT(context->activeDOMObjectsAreStopped()); |
+ } |
+ } |
+ |
return resolver->promise(); |
} |