summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/mediastream/UserMediaRequest.cpp')
-rw-r--r--Source/WebCore/Modules/mediastream/UserMediaRequest.cpp159
1 files changed, 86 insertions, 73 deletions
diff --git a/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp b/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
index 0924dad52..e438d35a2 100644
--- a/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
+++ b/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2011 Ericsson AB. All rights reserved.
* Copyright (C) 2012 Google Inc. All rights reserved.
- * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
* Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
*
* Redistribution and use in source and binary forms, with or without
@@ -40,64 +40,60 @@
#include "Dictionary.h"
#include "Document.h"
#include "ExceptionCode.h"
-#include "Frame.h"
-#include "JSMediaDeviceInfo.h"
-#include "JSMediaStream.h"
-#include "JSNavigatorUserMediaError.h"
#include "MediaConstraintsImpl.h"
#include "MediaStream.h"
+#include "MediaStreamCenter.h"
#include "MediaStreamPrivate.h"
-#include "RealtimeMediaSourceCenter.h"
#include "SecurityOrigin.h"
#include "UserMediaController.h"
+#include <wtf/Functional.h>
#include <wtf/MainThread.h>
namespace WebCore {
-static RefPtr<MediaConstraints> parseOptions(const Dictionary& options, const String& mediaType)
+static PassRefPtr<MediaConstraints> parseOptions(const Dictionary& options, const String& mediaType, ExceptionCode& ec)
{
- Dictionary constraintsDictionary;
- if (options.get(mediaType, constraintsDictionary) && !constraintsDictionary.isUndefinedOrNull())
- return MediaConstraintsImpl::create(constraintsDictionary);
+ RefPtr<MediaConstraints> constraints;
- bool mediaRequested = false;
- if (!options.get(mediaType, mediaRequested) || !mediaRequested)
- return nullptr;
+ Dictionary constraintsDictionary;
+ bool ok = options.get(mediaType, constraintsDictionary);
+ if (ok && !constraintsDictionary.isUndefinedOrNull())
+ constraints = MediaConstraintsImpl::create(constraintsDictionary, ec);
+ else {
+ bool mediaRequested = false;
+ options.get(mediaType, mediaRequested);
+ if (mediaRequested)
+ constraints = MediaConstraintsImpl::create();
+ }
- return MediaConstraintsImpl::create();
+ return constraints.release();
}
-void UserMediaRequest::start(Document* document, const Dictionary& options, MediaDevices::Promise&& promise, ExceptionCode& ec)
+PassRefPtr<UserMediaRequest> UserMediaRequest::create(ScriptExecutionContext* context, UserMediaController* controller, const Dictionary& options, PassRefPtr<NavigatorUserMediaSuccessCallback> successCallback, PassRefPtr<NavigatorUserMediaErrorCallback> errorCallback, ExceptionCode& ec)
{
- if (!options.isObject()) {
- ec = TypeError;
- return;
- }
+ ASSERT(successCallback);
- UserMediaController* userMedia = UserMediaController::from(document ? document->page() : nullptr);
- if (!userMedia) {
- ec = NOT_SUPPORTED_ERR;
- return;
- }
+ RefPtr<MediaConstraints> audioConstraints = parseOptions(options, AtomicString("audio", AtomicString::ConstructFromLiteral), ec);
+ if (ec)
+ return nullptr;
- RefPtr<MediaConstraints> audioConstraints = parseOptions(options, AtomicString("audio", AtomicString::ConstructFromLiteral));
- RefPtr<MediaConstraints> videoConstraints = parseOptions(options, AtomicString("video", AtomicString::ConstructFromLiteral));
+ RefPtr<MediaConstraints> videoConstraints = parseOptions(options, AtomicString("video", AtomicString::ConstructFromLiteral), ec);
+ if (ec)
+ return nullptr;
- if (!audioConstraints && !videoConstraints) {
- ec = NOT_SUPPORTED_ERR;
- return;
- }
+ if (!audioConstraints && !videoConstraints)
+ return nullptr;
- Ref<UserMediaRequest> request = adoptRef(*new UserMediaRequest(document, userMedia, audioConstraints.release(), videoConstraints.release(), WTFMove(promise)));
- request->start();
+ return adoptRef(new UserMediaRequest(context, controller, audioConstraints.release(), videoConstraints.release(), successCallback, errorCallback));
}
-UserMediaRequest::UserMediaRequest(ScriptExecutionContext* context, UserMediaController* controller, PassRefPtr<MediaConstraints> audioConstraints, PassRefPtr<MediaConstraints> videoConstraints, MediaDevices::Promise&& promise)
+UserMediaRequest::UserMediaRequest(ScriptExecutionContext* context, UserMediaController* controller, PassRefPtr<MediaConstraints> audioConstraints, PassRefPtr<MediaConstraints> videoConstraints, PassRefPtr<NavigatorUserMediaSuccessCallback> successCallback, PassRefPtr<NavigatorUserMediaErrorCallback> errorCallback)
: ContextDestructionObserver(context)
, m_audioConstraints(audioConstraints)
, m_videoConstraints(videoConstraints)
, m_controller(controller)
- , m_promise(WTFMove(promise))
+ , m_successCallback(successCallback)
+ , m_errorCallback(errorCallback)
{
}
@@ -117,34 +113,32 @@ void UserMediaRequest::start()
{
// 1 - make sure the system is capable of supporting the audio and video constraints. We don't want to ask for
// user permission if the constraints can not be suported.
- RealtimeMediaSourceCenter::singleton().validateRequestConstraints(this, m_audioConstraints, m_videoConstraints);
+ MediaStreamCenter::shared().validateRequestConstraints(this, m_audioConstraints, m_videoConstraints);
}
-void UserMediaRequest::constraintsValidated(const Vector<RefPtr<RealtimeMediaSource>>& audioTracks, const Vector<RefPtr<RealtimeMediaSource>>& videoTracks)
+
+void UserMediaRequest::constraintsValidated()
{
- for (auto& audioTrack : audioTracks)
- m_audioDeviceUIDs.append(audioTrack->persistentID());
- for (auto& videoTrack : videoTracks)
- m_videoDeviceUIDs.append(videoTrack->persistentID());
+ if (m_controller)
+ callOnMainThread(bind(&UserMediaRequest::requestPermission, this));
+}
- RefPtr<UserMediaRequest> protectedThis(this);
- callOnMainThread([protectedThis] {
- // 2 - The constraints are valid, ask the user for access to media.
- if (UserMediaController* controller = protectedThis->m_controller)
- controller->requestUserMediaAccess(*protectedThis.get());
- });
+void UserMediaRequest::requestPermission()
+{
+ // 2 - The constraints are valid, ask the user for access to media.
+ if (m_controller)
+ m_controller->requestPermission(this);
}
-void UserMediaRequest::userMediaAccessGranted(const String& audioDeviceUID, const String& videoDeviceUID)
+void UserMediaRequest::userMediaAccessGranted()
{
- m_allowedVideoDeviceUID = videoDeviceUID;
- m_audioDeviceUIDAllowed = audioDeviceUID;
+ callOnMainThread(bind(&UserMediaRequest::createMediaStream, this));
+}
- RefPtr<UserMediaRequest> protectedThis(this);
- callOnMainThread([protectedThis, audioDeviceUID, videoDeviceUID] {
- // 3 - the user granted access, ask platform to create the media stream descriptors.
- RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.get(), audioDeviceUID, videoDeviceUID);
- });
+void UserMediaRequest::createMediaStream()
+{
+ // 3 - the user granted access, ask platform to create the media stream descriptors.
+ MediaStreamCenter::shared().createMediaStream(this, m_audioConstraints, m_videoConstraints);
}
void UserMediaRequest::userMediaAccessDenied()
@@ -159,25 +153,28 @@ void UserMediaRequest::constraintsInvalid(const String& constraintName)
void UserMediaRequest::didCreateStream(PassRefPtr<MediaStreamPrivate> privateStream)
{
- if (!m_scriptExecutionContext)
+ if (!m_scriptExecutionContext || !m_successCallback)
return;
+ callOnMainThread(bind(&UserMediaRequest::callSuccessHandler, this, privateStream));
+}
+
+void UserMediaRequest::callSuccessHandler(PassRefPtr<MediaStreamPrivate> privateStream)
+{
// 4 - Create the MediaStream and pass it to the success callback.
+ ASSERT(m_successCallback);
+
RefPtr<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
- if (m_audioConstraints) {
- for (auto& track : stream->getAudioTracks()) {
- track->applyConstraints(*m_audioConstraints);
- track->source().startProducingData();
- }
- }
- if (m_videoConstraints) {
- for (auto& track : stream->getVideoTracks()) {
- track->applyConstraints(*m_videoConstraints);
- track->source().startProducingData();
- }
- }
- m_promise.resolve(stream);
+ Vector<RefPtr<MediaStreamTrack>> tracks = stream->getAudioTracks();
+ for (auto iter = tracks.begin(); iter != tracks.end(); ++iter)
+ (*iter)->applyConstraints(m_audioConstraints);
+
+ tracks = stream->getVideoTracks();
+ for (auto iter = tracks.begin(); iter != tracks.end(); ++iter)
+ (*iter)->applyConstraints(m_videoConstraints);
+
+ m_successCallback->handleEvent(stream.get());
}
void UserMediaRequest::failedToCreateStreamWithConstraintsError(const String& constraintName)
@@ -186,7 +183,11 @@ void UserMediaRequest::failedToCreateStreamWithConstraintsError(const String& co
if (!m_scriptExecutionContext)
return;
- m_promise.reject(NavigatorUserMediaError::create(NavigatorUserMediaError::constraintNotSatisfiedErrorName(), constraintName));
+ if (!m_errorCallback)
+ return;
+
+ RefPtr<NavigatorUserMediaError> error = NavigatorUserMediaError::create(NavigatorUserMediaError::constraintNotSatisfiedErrorName(), constraintName);
+ callOnMainThread(bind(&UserMediaRequest::callErrorHandler, this, error.release()));
}
void UserMediaRequest::failedToCreateStreamWithPermissionError()
@@ -194,8 +195,20 @@ void UserMediaRequest::failedToCreateStreamWithPermissionError()
if (!m_scriptExecutionContext)
return;
- // FIXME: Replace NavigatorUserMediaError with MediaStreamError (see bug 143335)
- m_promise.reject(NavigatorUserMediaError::create(NavigatorUserMediaError::permissionDeniedErrorName(), emptyString()));
+ if (!m_errorCallback)
+ return;
+
+ RefPtr<NavigatorUserMediaError> error = NavigatorUserMediaError::create(NavigatorUserMediaError::permissionDeniedErrorName(), emptyString());
+ callOnMainThread(bind(&UserMediaRequest::callErrorHandler, this, error.release()));
+}
+
+void UserMediaRequest::callErrorHandler(PassRefPtr<NavigatorUserMediaError> prpError)
+{
+ RefPtr<NavigatorUserMediaError> error = prpError;
+
+ ASSERT(error);
+
+ m_errorCallback->handleEvent(error.get());
}
void UserMediaRequest::contextDestroyed()
@@ -203,8 +216,8 @@ void UserMediaRequest::contextDestroyed()
Ref<UserMediaRequest> protect(*this);
if (m_controller) {
- m_controller->cancelUserMediaAccessRequest(*this);
- m_controller = nullptr;
+ m_controller->cancelRequest(this);
+ m_controller = 0;
}
ContextDestructionObserver::contextDestroyed();