| 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();
|
| }
|
|
|
|
|