1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/shell/renderer/test_runner/WebUserMediaClientMock.h"
7 #include "base/logging.h"
8 #include "content/shell/renderer/test_runner/MockConstraints.h"
9 #include "content/shell/renderer/test_runner/WebTestDelegate.h"
10 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
11 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h"
12 #include "third_party/WebKit/public/platform/WebMediaStream.h"
13 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
15 #include "third_party/WebKit/public/platform/WebVector.h"
16 #include "third_party/WebKit/public/web/WebDocument.h"
17 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
18 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
19 #include "third_party/WebKit/public/web/WebUserMediaRequest.h"
21 using namespace blink;
25 class UserMediaRequestTask : public WebMethodTask<WebUserMediaClientMock> {
27 UserMediaRequestTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebMediaStream result)
28 : WebMethodTask<WebUserMediaClientMock>(object)
32 DCHECK(!m_result.isNull());
35 virtual void runIfValid() OVERRIDE
37 m_request.requestSucceeded(m_result);
41 WebUserMediaRequest m_request;
42 WebMediaStream m_result;
45 class UserMediaRequestConstraintFailedTask : public WebMethodTask<WebUserMediaClientMock> {
47 UserMediaRequestConstraintFailedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebString& constraint)
48 : WebMethodTask<WebUserMediaClientMock>(object)
50 , m_constraint(constraint)
54 virtual void runIfValid() OVERRIDE
56 m_request.requestFailedConstraint(m_constraint);
60 WebUserMediaRequest m_request;
61 WebString m_constraint;
64 class UserMediaRequestPermissionDeniedTask : public WebMethodTask<WebUserMediaClientMock> {
66 UserMediaRequestPermissionDeniedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request)
67 : WebMethodTask<WebUserMediaClientMock>(object)
72 virtual void runIfValid() OVERRIDE
74 m_request.requestFailed();
78 WebUserMediaRequest m_request;
81 class MediaDevicesRequestTask : public WebMethodTask<WebUserMediaClientMock> {
83 MediaDevicesRequestTask(WebUserMediaClientMock* object, const WebMediaDevicesRequest& request, const WebVector<WebMediaDeviceInfo>& result)
84 : WebMethodTask<WebUserMediaClientMock>(object)
90 virtual void runIfValid() OVERRIDE
92 m_request.requestSucceeded(m_result);
96 WebMediaDevicesRequest m_request;
97 WebVector<WebMediaDeviceInfo> m_result;
100 ////////////////////////////////
102 class MockExtraData : public WebMediaStream::ExtraData {
107 WebUserMediaClientMock::WebUserMediaClientMock(WebTestDelegate* delegate)
108 : m_delegate(delegate)
112 void WebUserMediaClientMock::requestUserMedia(const WebUserMediaRequest& streamRequest)
114 DCHECK(!streamRequest.isNull());
115 WebUserMediaRequest request = streamRequest;
117 if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) {
118 m_delegate->postTask(new UserMediaRequestPermissionDeniedTask(this, request));
122 WebMediaConstraints constraints = request.audioConstraints();
123 WebString failedConstraint;
124 if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
125 m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
128 constraints = request.videoConstraints();
129 if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
130 m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
134 const size_t zero = 0;
135 const size_t one = 1;
136 WebVector<WebMediaStreamTrack> audioTracks(request.audio() ? one : zero);
137 WebVector<WebMediaStreamTrack> videoTracks(request.video() ? one : zero);
139 if (request.audio()) {
140 WebMediaStreamSource source;
141 source.initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, "Mock audio device");
142 audioTracks[0].initialize(source);
145 if (request.video()) {
146 WebMediaStreamSource source;
147 source.initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, "Mock video device");
148 videoTracks[0].initialize(source);
151 WebMediaStream stream;
152 stream.initialize(audioTracks, videoTracks);
154 stream.setExtraData(new MockExtraData());
156 m_delegate->postTask(new UserMediaRequestTask(this, request, stream));
159 void WebUserMediaClientMock::cancelUserMediaRequest(const WebUserMediaRequest&)
163 void WebUserMediaClientMock::requestMediaDevices(const WebMediaDevicesRequest& request)
165 const size_t three = 3;
166 WebVector<WebMediaDeviceInfo> devices(three);
168 devices[0].initialize("device1", WebMediaDeviceInfo::MediaDeviceKindAudioInput, "Built-in microphone", "group1");
169 devices[1].initialize("device2", WebMediaDeviceInfo::MediaDeviceKindAudioOutput, "Built-in speakers", "group1");
170 devices[2].initialize("device3", WebMediaDeviceInfo::MediaDeviceKindVideoInput, "Build-in webcam", "group2");
172 m_delegate->postTask(new MediaDevicesRequestTask(this, request, devices));
175 void WebUserMediaClientMock::cancelMediaDevicesRequest(const WebMediaDevicesRequest&)
179 } // namespace content