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 |