OLD | NEW |
| (Empty) |
1 // Copyright 2014 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. | |
4 | |
5 #include "content/shell/renderer/test_runner/mock_web_user_media_client.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/macros.h" | |
9 #include "content/shell/renderer/test_runner/mock_constraints.h" | |
10 #include "content/shell/renderer/test_runner/web_test_delegate.h" | |
11 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" | |
12 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" | |
13 #include "third_party/WebKit/public/platform/WebMediaStream.h" | |
14 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | |
15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | |
16 #include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
" | |
17 #include "third_party/WebKit/public/platform/WebSourceInfo.h" | |
18 #include "third_party/WebKit/public/platform/WebVector.h" | |
19 #include "third_party/WebKit/public/web/WebDocument.h" | |
20 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h" | |
21 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" | |
22 #include "third_party/WebKit/public/web/WebUserMediaRequest.h" | |
23 | |
24 using blink::WebMediaConstraints; | |
25 using blink::WebMediaDeviceInfo; | |
26 using blink::WebMediaDevicesRequest; | |
27 using blink::WebMediaStream; | |
28 using blink::WebMediaStreamSource; | |
29 using blink::WebMediaStreamTrack; | |
30 using blink::WebMediaStreamTrackSourcesRequest; | |
31 using blink::WebSourceInfo; | |
32 using blink::WebString; | |
33 using blink::WebUserMediaRequest; | |
34 using blink::WebVector; | |
35 | |
36 namespace content { | |
37 | |
38 class UserMediaRequestTask : public WebMethodTask<MockWebUserMediaClient> { | |
39 public: | |
40 UserMediaRequestTask(MockWebUserMediaClient* object, | |
41 const WebUserMediaRequest& request, | |
42 const WebMediaStream result) | |
43 : WebMethodTask<MockWebUserMediaClient>(object), | |
44 request_(request), | |
45 result_(result) { | |
46 DCHECK(!result_.isNull()); | |
47 } | |
48 | |
49 void RunIfValid() override { request_.requestSucceeded(result_); } | |
50 | |
51 private: | |
52 WebUserMediaRequest request_; | |
53 WebMediaStream result_; | |
54 | |
55 DISALLOW_COPY_AND_ASSIGN(UserMediaRequestTask); | |
56 }; | |
57 | |
58 class UserMediaRequestConstraintFailedTask | |
59 : public WebMethodTask<MockWebUserMediaClient> { | |
60 public: | |
61 UserMediaRequestConstraintFailedTask(MockWebUserMediaClient* object, | |
62 const WebUserMediaRequest& request, | |
63 const WebString& constraint) | |
64 : WebMethodTask<MockWebUserMediaClient>(object), | |
65 request_(request), | |
66 constraint_(constraint) {} | |
67 | |
68 void RunIfValid() override { request_.requestFailedConstraint(constraint_); } | |
69 | |
70 private: | |
71 WebUserMediaRequest request_; | |
72 WebString constraint_; | |
73 | |
74 DISALLOW_COPY_AND_ASSIGN(UserMediaRequestConstraintFailedTask); | |
75 }; | |
76 | |
77 class UserMediaRequestPermissionDeniedTask | |
78 : public WebMethodTask<MockWebUserMediaClient> { | |
79 public: | |
80 UserMediaRequestPermissionDeniedTask(MockWebUserMediaClient* object, | |
81 const WebUserMediaRequest& request) | |
82 : WebMethodTask<MockWebUserMediaClient>(object), | |
83 request_(request) {} | |
84 | |
85 void RunIfValid() override { request_.requestFailed(); } | |
86 | |
87 private: | |
88 WebUserMediaRequest request_; | |
89 | |
90 DISALLOW_COPY_AND_ASSIGN(UserMediaRequestPermissionDeniedTask); | |
91 }; | |
92 | |
93 class MediaDevicesRequestTask : public WebMethodTask<MockWebUserMediaClient> { | |
94 public: | |
95 MediaDevicesRequestTask(MockWebUserMediaClient* object, | |
96 const WebMediaDevicesRequest& request, | |
97 const WebVector<WebMediaDeviceInfo>& result) | |
98 : WebMethodTask<MockWebUserMediaClient>(object), | |
99 request_(request), | |
100 result_(result) {} | |
101 | |
102 void RunIfValid() override { request_.requestSucceeded(result_); } | |
103 | |
104 private: | |
105 WebMediaDevicesRequest request_; | |
106 WebVector<WebMediaDeviceInfo> result_; | |
107 | |
108 DISALLOW_COPY_AND_ASSIGN(MediaDevicesRequestTask); | |
109 }; | |
110 | |
111 class SourcesRequestTask : public WebMethodTask<MockWebUserMediaClient> { | |
112 public: | |
113 SourcesRequestTask(MockWebUserMediaClient* object, | |
114 const WebMediaStreamTrackSourcesRequest& request, | |
115 const WebVector<WebSourceInfo>& result) | |
116 : WebMethodTask<MockWebUserMediaClient>(object), | |
117 request_(request), | |
118 result_(result) {} | |
119 | |
120 void RunIfValid() override { request_.requestSucceeded(result_); } | |
121 | |
122 private: | |
123 WebMediaStreamTrackSourcesRequest request_; | |
124 WebVector<WebSourceInfo> result_; | |
125 | |
126 DISALLOW_COPY_AND_ASSIGN(SourcesRequestTask); | |
127 }; | |
128 | |
129 class MockExtraData : public WebMediaStream::ExtraData { | |
130 public: | |
131 int foo; | |
132 }; | |
133 | |
134 MockWebUserMediaClient::MockWebUserMediaClient(WebTestDelegate* delegate) | |
135 : delegate_(delegate) {} | |
136 | |
137 void MockWebUserMediaClient::requestUserMedia( | |
138 const WebUserMediaRequest& stream_request) { | |
139 DCHECK(!stream_request.isNull()); | |
140 WebUserMediaRequest request = stream_request; | |
141 | |
142 if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) { | |
143 delegate_->PostTask( | |
144 new UserMediaRequestPermissionDeniedTask(this, request)); | |
145 return; | |
146 } | |
147 | |
148 WebMediaConstraints constraints = request.audioConstraints(); | |
149 WebString failed_constraint; | |
150 if (!constraints.isNull() && | |
151 !MockConstraints::VerifyConstraints(constraints, &failed_constraint)) { | |
152 delegate_->PostTask(new UserMediaRequestConstraintFailedTask( | |
153 this, request, failed_constraint)); | |
154 return; | |
155 } | |
156 constraints = request.videoConstraints(); | |
157 if (!constraints.isNull() && | |
158 !MockConstraints::VerifyConstraints(constraints, &failed_constraint)) { | |
159 delegate_->PostTask(new UserMediaRequestConstraintFailedTask( | |
160 this, request, failed_constraint)); | |
161 return; | |
162 } | |
163 | |
164 const size_t zero = 0; | |
165 const size_t one = 1; | |
166 WebVector<WebMediaStreamTrack> audio_tracks(request.audio() ? one : zero); | |
167 WebVector<WebMediaStreamTrack> video_tracks(request.video() ? one : zero); | |
168 | |
169 if (request.audio()) { | |
170 WebMediaStreamSource source; | |
171 source.initialize("MockAudioDevice#1", | |
172 WebMediaStreamSource::TypeAudio, | |
173 "Mock audio device", | |
174 false /* remote */, true /* readonly */); | |
175 audio_tracks[0].initialize(source); | |
176 } | |
177 | |
178 if (request.video()) { | |
179 WebMediaStreamSource source; | |
180 source.initialize("MockVideoDevice#1", | |
181 WebMediaStreamSource::TypeVideo, | |
182 "Mock video device", | |
183 false /* remote */, true /* readonly */); | |
184 video_tracks[0].initialize(source); | |
185 } | |
186 | |
187 WebMediaStream stream; | |
188 stream.initialize(audio_tracks, video_tracks); | |
189 | |
190 stream.setExtraData(new MockExtraData()); | |
191 | |
192 delegate_->PostTask(new UserMediaRequestTask(this, request, stream)); | |
193 } | |
194 | |
195 void MockWebUserMediaClient::cancelUserMediaRequest( | |
196 const WebUserMediaRequest&) { | |
197 } | |
198 | |
199 void MockWebUserMediaClient::requestMediaDevices( | |
200 const WebMediaDevicesRequest& request) { | |
201 struct { | |
202 const char* device_id; | |
203 WebMediaDeviceInfo::MediaDeviceKind kind; | |
204 const char* label; | |
205 const char* group_id; | |
206 } test_devices[] = { | |
207 { | |
208 "device1", | |
209 WebMediaDeviceInfo::MediaDeviceKindAudioInput, | |
210 "Built-in microphone", | |
211 "group1", | |
212 }, | |
213 { | |
214 "device2", | |
215 WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | |
216 "Built-in speakers", | |
217 "group1", | |
218 }, | |
219 { | |
220 "device3", | |
221 WebMediaDeviceInfo::MediaDeviceKindVideoInput, | |
222 "Build-in webcam", | |
223 "group2", | |
224 }, | |
225 }; | |
226 | |
227 WebVector<WebMediaDeviceInfo> devices(arraysize(test_devices)); | |
228 for (size_t i = 0; i < arraysize(test_devices); ++i) { | |
229 devices[i].initialize(WebString::fromUTF8(test_devices[i].device_id), | |
230 test_devices[i].kind, | |
231 WebString::fromUTF8(test_devices[i].label), | |
232 WebString::fromUTF8(test_devices[i].group_id)); | |
233 } | |
234 | |
235 delegate_->PostTask(new MediaDevicesRequestTask(this, request, devices)); | |
236 } | |
237 | |
238 void MockWebUserMediaClient::cancelMediaDevicesRequest( | |
239 const WebMediaDevicesRequest&) { | |
240 } | |
241 | |
242 void MockWebUserMediaClient::requestSources( | |
243 const blink::WebMediaStreamTrackSourcesRequest& request) { | |
244 struct { | |
245 const char* id; | |
246 WebSourceInfo::SourceKind kind; | |
247 const char* label; | |
248 WebSourceInfo::VideoFacingMode facing; | |
249 } test_sources[] = { | |
250 { | |
251 "device1", | |
252 WebSourceInfo::SourceKindAudio, | |
253 "Built-in microphone", | |
254 WebSourceInfo::VideoFacingModeNone, | |
255 }, | |
256 { | |
257 "device2", | |
258 WebSourceInfo::SourceKindVideo, | |
259 "Build-in webcam", | |
260 WebSourceInfo::VideoFacingModeEnvironment, | |
261 }, | |
262 }; | |
263 | |
264 WebVector<WebSourceInfo> sources(arraysize(test_sources)); | |
265 for (size_t i = 0; i < arraysize(test_sources); ++i) { | |
266 sources[i].initialize(WebString::fromUTF8(test_sources[i].id), | |
267 test_sources[i].kind, | |
268 WebString::fromUTF8(test_sources[i].label), | |
269 test_sources[i].facing); | |
270 } | |
271 | |
272 delegate_->PostTask(new SourcesRequestTask(this, request, sources)); | |
273 } | |
274 | |
275 } // namespace content | |
OLD | NEW |