diff options
Diffstat (limited to 'Source/WebCore/Modules/mediastream/UserMediaRequest.cpp')
| -rw-r--r-- | Source/WebCore/Modules/mediastream/UserMediaRequest.cpp | 159 |
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(); |
