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 "components/test_runner/mock_web_user_media_client.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/bind_helpers.h" | |
11 #include "base/logging.h" | |
12 #include "base/macros.h" | |
13 #include "components/test_runner/web_test_delegate.h" | |
14 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" | |
15 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" | |
16 #include "third_party/WebKit/public/platform/WebMediaStream.h" | |
17 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | |
18 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | |
19 #include "third_party/WebKit/public/platform/WebVector.h" | |
20 #include "third_party/WebKit/public/web/WebDocument.h" | |
21 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.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::WebString; | |
31 using blink::WebUserMediaRequest; | |
32 using blink::WebVector; | |
33 | |
34 namespace test_runner { | |
35 | |
36 class MockExtraData : public WebMediaStream::ExtraData { | |
37 }; | |
38 | |
39 MockWebUserMediaClient::MockWebUserMediaClient(WebTestDelegate* delegate) | |
40 : delegate_(delegate), | |
41 should_enumerate_extra_device_(false), | |
42 weak_factory_(this) {} | |
43 | |
44 MockWebUserMediaClient::~MockWebUserMediaClient() {} | |
45 | |
46 void MockWebUserMediaClient::requestUserMedia( | |
47 const WebUserMediaRequest& stream_request) { | |
48 DCHECK(!stream_request.isNull()); | |
49 WebUserMediaRequest request = stream_request; | |
50 | |
51 if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) { | |
52 delegate_->PostTask(base::Bind( | |
53 &WebUserMediaRequest::requestFailed, | |
54 base::Owned(new WebUserMediaRequest(request)), WebString())); | |
55 return; | |
56 } | |
57 | |
58 WebMediaStream stream; | |
59 stream.initialize(WebVector<WebMediaStreamTrack>(), | |
60 WebVector<WebMediaStreamTrack>()); | |
61 stream.setExtraData(new MockExtraData()); | |
62 | |
63 if (request.audio() && | |
64 !delegate_->AddMediaStreamAudioSourceAndTrack(&stream)) { | |
65 WebMediaStreamSource source; | |
66 source.initialize("MockAudioDevice#1", | |
67 WebMediaStreamSource::TypeAudio, | |
68 "Mock audio device", | |
69 false /* remote */); | |
70 WebMediaStreamTrack web_track; | |
71 web_track.initialize(source); | |
72 stream.addTrack(web_track); | |
73 } | |
74 | |
75 if (request.video() && | |
76 !delegate_->AddMediaStreamVideoSourceAndTrack(&stream)) { | |
77 WebMediaStreamSource source; | |
78 source.initialize("MockVideoDevice#1", | |
79 WebMediaStreamSource::TypeVideo, | |
80 "Mock video device", | |
81 false /* remote */); | |
82 WebMediaStreamTrack web_track; | |
83 web_track.initialize(source); | |
84 stream.addTrack(web_track); | |
85 } | |
86 | |
87 delegate_->PostTask( | |
88 base::Bind(&WebUserMediaRequest::requestSucceeded, | |
89 base::Owned(new WebUserMediaRequest(request)), stream)); | |
90 } | |
91 | |
92 void MockWebUserMediaClient::cancelUserMediaRequest( | |
93 const WebUserMediaRequest&) { | |
94 } | |
95 | |
96 void MockWebUserMediaClient::requestMediaDevices( | |
97 const WebMediaDevicesRequest& request) { | |
98 struct { | |
99 const char* device_id; | |
100 WebMediaDeviceInfo::MediaDeviceKind kind; | |
101 const char* label; | |
102 const char* group_id; | |
103 } test_devices[] = { | |
104 { | |
105 "device1", | |
106 WebMediaDeviceInfo::MediaDeviceKindAudioInput, | |
107 "Built-in microphone", | |
108 "group1", | |
109 }, | |
110 { | |
111 "device2", | |
112 WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | |
113 "Built-in speakers", | |
114 "group1", | |
115 }, | |
116 { | |
117 "device3", | |
118 WebMediaDeviceInfo::MediaDeviceKindVideoInput, | |
119 "Built-in webcam", | |
120 "group2", | |
121 }, | |
122 { | |
123 "device4", | |
124 WebMediaDeviceInfo::MediaDeviceKindAudioInput, | |
125 "Extra microphone", | |
126 "group3", | |
127 }, | |
128 }; | |
129 | |
130 size_t num_devices = should_enumerate_extra_device_ | |
131 ? arraysize(test_devices) | |
132 : arraysize(test_devices) - 1; | |
133 WebVector<WebMediaDeviceInfo> devices(num_devices); | |
134 for (size_t i = 0; i < num_devices; ++i) { | |
135 devices[i].initialize(WebString::fromUTF8(test_devices[i].device_id), | |
136 test_devices[i].kind, | |
137 WebString::fromUTF8(test_devices[i].label), | |
138 WebString::fromUTF8(test_devices[i].group_id)); | |
139 } | |
140 | |
141 delegate_->PostTask( | |
142 base::Bind(&WebMediaDevicesRequest::requestSucceeded, | |
143 base::Owned(new WebMediaDevicesRequest(request)), devices)); | |
144 | |
145 should_enumerate_extra_device_ = !should_enumerate_extra_device_; | |
146 if (!media_device_change_observer_.isNull()) | |
147 media_device_change_observer_.didChangeMediaDevices(); | |
148 } | |
149 | |
150 void MockWebUserMediaClient::setMediaDeviceChangeObserver( | |
151 const blink::WebMediaDeviceChangeObserver& observer) { | |
152 media_device_change_observer_ = observer; | |
153 } | |
154 | |
155 } // namespace test_runner | |
OLD | NEW |