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 "content/shell/renderer/test_runner/MockConstraints.h"
8 #include "content/shell/renderer/test_runner/WebTestDelegate.h"
9 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
10 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h"
11 #include "third_party/WebKit/public/platform/WebMediaStream.h"
12 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
13 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
14 #include "third_party/WebKit/public/platform/WebVector.h"
15 #include "third_party/WebKit/public/web/WebDocument.h"
16 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
17 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
18 #include "third_party/WebKit/public/web/WebUserMediaRequest.h"
20 using namespace blink;
22 namespace WebTestRunner {
24 class UserMediaRequestTask : public WebMethodTask<WebUserMediaClientMock> {
26 UserMediaRequestTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebMediaStream result)
27 : WebMethodTask<WebUserMediaClientMock>(object)
31 BLINK_ASSERT(!m_result.isNull());
34 virtual void runIfValid() OVERRIDE
36 m_request.requestSucceeded(m_result);
40 WebUserMediaRequest m_request;
41 WebMediaStream m_result;
44 class UserMediaRequestConstraintFailedTask : public WebMethodTask<WebUserMediaClientMock> {
46 UserMediaRequestConstraintFailedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebString& constraint)
47 : WebMethodTask<WebUserMediaClientMock>(object)
49 , m_constraint(constraint)
53 virtual void runIfValid() OVERRIDE
55 m_request.requestFailedConstraint(m_constraint);
59 WebUserMediaRequest m_request;
60 WebString m_constraint;
63 class UserMediaRequestPermissionDeniedTask : public WebMethodTask<WebUserMediaClientMock> {
65 UserMediaRequestPermissionDeniedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request)
66 : WebMethodTask<WebUserMediaClientMock>(object)
71 virtual void runIfValid() OVERRIDE
73 m_request.requestFailed();
77 WebUserMediaRequest m_request;
80 class MediaDevicesRequestTask : public WebMethodTask<WebUserMediaClientMock> {
82 MediaDevicesRequestTask(WebUserMediaClientMock* object, const WebMediaDevicesRequest& request, const WebVector<WebMediaDeviceInfo>& result)
83 : WebMethodTask<WebUserMediaClientMock>(object)
89 virtual void runIfValid() OVERRIDE
91 m_request.requestSucceeded(m_result);
95 WebMediaDevicesRequest m_request;
96 WebVector<WebMediaDeviceInfo> m_result;
99 ////////////////////////////////
101 class MockExtraData : public WebMediaStream::ExtraData {
106 WebUserMediaClientMock::WebUserMediaClientMock(WebTestDelegate* delegate)
107 : m_delegate(delegate)
111 void WebUserMediaClientMock::requestUserMedia(const WebUserMediaRequest& streamRequest)
113 BLINK_ASSERT(!streamRequest.isNull());
114 WebUserMediaRequest request = streamRequest;
116 if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) {
117 m_delegate->postTask(new UserMediaRequestPermissionDeniedTask(this, request));
121 WebMediaConstraints constraints = request.audioConstraints();
122 WebString failedConstraint;
123 if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
124 m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
127 constraints = request.videoConstraints();
128 if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
129 m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
133 const size_t zero = 0;
134 const size_t one = 1;
135 WebVector<WebMediaStreamTrack> audioTracks(request.audio() ? one : zero);
136 WebVector<WebMediaStreamTrack> videoTracks(request.video() ? one : zero);
138 if (request.audio()) {
139 WebMediaStreamSource source;
140 source.initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, "Mock audio device");
141 audioTracks[0].initialize(source);
144 if (request.video()) {
145 WebMediaStreamSource source;
146 source.initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, "Mock video device");
147 videoTracks[0].initialize(source);
150 WebMediaStream stream;
151 stream.initialize(audioTracks, videoTracks);
153 stream.setExtraData(new MockExtraData());
155 m_delegate->postTask(new UserMediaRequestTask(this, request, stream));
158 void WebUserMediaClientMock::cancelUserMediaRequest(const WebUserMediaRequest&)
162 void WebUserMediaClientMock::requestMediaDevices(const WebMediaDevicesRequest& request)
164 const size_t three = 3;
165 WebVector<WebMediaDeviceInfo> devices(three);
167 devices[0].initialize("device1", WebMediaDeviceInfo::MediaDeviceKindAudioInput, "Built-in microphone", "group1");
168 devices[1].initialize("device2", WebMediaDeviceInfo::MediaDeviceKindAudioOutput, "Built-in speakers", "group1");
169 devices[2].initialize("device3", WebMediaDeviceInfo::MediaDeviceKindVideoInput, "Build-in webcam", "group2");
171 m_delegate->postTask(new MediaDevicesRequestTask(this, request, devices));
174 void WebUserMediaClientMock::cancelMediaDevicesRequest(const WebMediaDevicesRequest&)