| Index: Source/modules/mediastream/MediaDevices.cpp
|
| diff --git a/Source/modules/mediastream/MediaDevices.cpp b/Source/modules/mediastream/MediaDevices.cpp
|
| index 24537ad028652b24b8f408fdaa2e7731527d617d..1e91ee4e8c3956a74dad9c2fbdd12e831644bd9b 100644
|
| --- a/Source/modules/mediastream/MediaDevices.cpp
|
| +++ b/Source/modules/mediastream/MediaDevices.cpp
|
| @@ -11,6 +11,10 @@
|
| #include "core/dom/DOMException.h"
|
| #include "core/dom/Document.h"
|
| #include "core/dom/ExceptionCode.h"
|
| +#include "modules/mediastream/MediaStream.h"
|
| +#include "modules/mediastream/NavigatorMediaStream.h"
|
| +#include "modules/mediastream/NavigatorUserMediaErrorCallback.h"
|
| +#include "modules/mediastream/NavigatorUserMediaSuccessCallback.h"
|
| #include "modules/mediastream/UserMediaController.h"
|
|
|
| namespace blink {
|
| @@ -26,4 +30,68 @@ ScriptPromise MediaDevices::enumerateDevices(ScriptState* scriptState)
|
| return request->start();
|
| }
|
|
|
| +namespace {
|
| +
|
| +class PromiseSuccessCallback : public NavigatorUserMediaSuccessCallback {
|
| +public:
|
| + PromiseSuccessCallback(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
|
| + : m_resolver(resolver)
|
| + {
|
| + }
|
| +
|
| + ~PromiseSuccessCallback()
|
| + {
|
| + }
|
| +
|
| + void handleEvent(MediaStream* stream)
|
| + {
|
| + m_resolver->resolve(stream);
|
| + }
|
| +private:
|
| + RefPtrWillBeRawPtr<ScriptPromiseResolver> m_resolver;
|
| +};
|
| +
|
| +class PromiseErrorCallback : public NavigatorUserMediaErrorCallback {
|
| +public:
|
| + PromiseErrorCallback(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver)
|
| + : m_resolver(resolver)
|
| + {
|
| + }
|
| +
|
| + ~PromiseErrorCallback()
|
| + {
|
| + }
|
| +
|
| + void handleEvent(NavigatorUserMediaError* error)
|
| + {
|
| + m_resolver->reject(error);
|
| + }
|
| +private:
|
| + RefPtrWillBeRawPtr<ScriptPromiseResolver> m_resolver;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +ScriptPromise MediaDevices::getUserMedia(ScriptState* scriptState, const Dictionary& options, ExceptionState& exceptionState)
|
| +{
|
| + RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
|
| +
|
| + NavigatorUserMediaSuccessCallback* successCallback = new PromiseSuccessCallback(resolver);
|
| + NavigatorUserMediaErrorCallback* errorCallback = new PromiseErrorCallback(resolver);
|
| +
|
| + Document* document = toDocument(scriptState->executionContext());
|
| + UserMediaController* userMedia = UserMediaController::from(document->frame());
|
| + if (!userMedia)
|
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "No media device controller available; is this a detached window?"));
|
| +
|
| + UserMediaRequest* request = UserMediaRequest::create(document, userMedia, options, successCallback, errorCallback, exceptionState);
|
| + if (!request) {
|
| + ASSERT(exceptionState.hadException());
|
| + return exceptionState.reject(scriptState);
|
| + }
|
| +
|
| + request->start();
|
| + return resolver->promise();
|
| +}
|
| +
|
| } // namespace blink
|
|
|