OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" | 5 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "content/browser/frame_host/render_frame_host_delegate.h" | 8 #include "content/browser/frame_host/render_frame_host_delegate.h" |
9 #include "content/public/common/renderer_preferences.h" | 9 #include "content/public/common/renderer_preferences.h" |
10 #include "content/public/test/test_browser_thread.h" | 10 #include "content/public/test/test_browser_thread.h" |
11 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "ui/gfx/geometry/rect.h" | 13 #include "ui/gfx/geometry/rect.h" |
14 | 14 |
15 using testing::_; | 15 using testing::_; |
16 using testing::Return; | 16 using testing::Return; |
17 using testing::SaveArg; | 17 using testing::SaveArg; |
18 | 18 |
19 namespace content { | 19 namespace content { |
| 20 |
20 namespace { | 21 namespace { |
21 | |
22 class MockRenderFrameHostDelegate : public RenderFrameHostDelegate { | 22 class MockRenderFrameHostDelegate : public RenderFrameHostDelegate { |
23 public: | 23 public: |
24 MOCK_METHOD2(RequestMediaAccessPermission, | 24 MOCK_METHOD2(RequestMediaAccessPermission, |
25 void(const MediaStreamRequest& request, | 25 void(const MediaStreamRequest& request, |
26 const MediaResponseCallback& callback)); | 26 const MediaResponseCallback& callback)); |
27 MOCK_METHOD2(CheckMediaAccessPermission, | 27 MOCK_METHOD2(CheckMediaAccessPermission, |
28 bool(const GURL& security_origin, | 28 bool(const GURL& security_origin, |
29 MediaStreamType type)); | 29 MediaStreamType type)); |
30 }; | 30 }; |
31 | 31 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 TestBrowserThread ui_thread_; | 69 TestBrowserThread ui_thread_; |
70 TestBrowserThread io_thread_; | 70 TestBrowserThread io_thread_; |
71 | 71 |
72 MockRenderFrameHostDelegate delegate_; | 72 MockRenderFrameHostDelegate delegate_; |
73 MockResponseCallback response_callback_; | 73 MockResponseCallback response_callback_; |
74 scoped_ptr<MediaStreamUIProxy> proxy_; | 74 scoped_ptr<MediaStreamUIProxy> proxy_; |
75 }; | 75 }; |
76 | 76 |
77 MATCHER_P(SameRequest, expected, "") { | 77 MATCHER_P(SameRequest, expected, "") { |
78 return | 78 return |
79 expected.render_process_id == arg.render_process_id && | 79 expected->render_process_id == arg.render_process_id && |
80 expected.render_frame_id == arg.render_frame_id && | 80 expected->render_frame_id == arg.render_frame_id && |
81 expected.tab_capture_device_id == arg.tab_capture_device_id && | 81 expected->security_origin == arg.security_origin && |
82 expected.security_origin == arg.security_origin && | 82 expected->request_type == arg.request_type && |
83 expected.request_type == arg.request_type && | 83 expected->requested_audio_device_id == arg.requested_audio_device_id && |
84 expected.requested_audio_device_id == arg.requested_audio_device_id && | 84 expected->requested_video_device_id == arg.requested_video_device_id && |
85 expected.requested_video_device_id == arg.requested_video_device_id && | 85 expected->audio_type == arg.audio_type && |
86 expected.audio_type == arg.audio_type && | 86 expected->video_type == arg.video_type; |
87 expected.video_type == arg.video_type; | |
88 } | 87 } |
89 | 88 |
90 TEST_F(MediaStreamUIProxyTest, Deny) { | 89 TEST_F(MediaStreamUIProxyTest, Deny) { |
91 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 90 scoped_ptr<MediaStreamRequest> request ( |
| 91 new MediaStreamRequest(0, 0, 0, GURL("http://origin/"), |
| 92 false, |
92 MEDIA_GENERATE_STREAM, std::string(), | 93 MEDIA_GENERATE_STREAM, std::string(), |
93 std::string(), | 94 std::string(), |
94 MEDIA_DEVICE_AUDIO_CAPTURE, | 95 MEDIA_DEVICE_AUDIO_CAPTURE, |
95 MEDIA_DEVICE_VIDEO_CAPTURE); | 96 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 97 MediaStreamRequest* request_ptr = request.get(); |
96 proxy_->RequestAccess( | 98 proxy_->RequestAccess( |
97 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 99 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
98 base::Unretained(&response_callback_))); | 100 base::Unretained(&response_callback_))); |
99 MediaResponseCallback callback; | 101 MediaResponseCallback callback; |
100 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 102 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 103 _)) |
101 .WillOnce(SaveArg<1>(&callback)); | 104 .WillOnce(SaveArg<1>(&callback)); |
102 message_loop_.RunUntilIdle(); | 105 message_loop_.RunUntilIdle(); |
103 ASSERT_FALSE(callback.is_null()); | 106 ASSERT_FALSE(callback.is_null()); |
104 | 107 |
105 MediaStreamDevices devices; | 108 MediaStreamDevices devices; |
106 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); | 109 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); |
107 | 110 |
108 MediaStreamDevices response; | 111 MediaStreamDevices response; |
109 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 112 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
110 .WillOnce(SaveArg<0>(&response)); | 113 .WillOnce(SaveArg<0>(&response)); |
111 message_loop_.RunUntilIdle(); | 114 message_loop_.RunUntilIdle(); |
112 | 115 |
113 EXPECT_TRUE(response.empty()); | 116 EXPECT_TRUE(response.empty()); |
114 } | 117 } |
115 | 118 |
116 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { | 119 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { |
117 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 120 scoped_ptr<MediaStreamRequest> request ( |
| 121 new MediaStreamRequest(0, 0, 0, |
| 122 GURL("http://origin/"), false, |
118 MEDIA_GENERATE_STREAM, std::string(), | 123 MEDIA_GENERATE_STREAM, std::string(), |
119 std::string(), | 124 std::string(), |
120 MEDIA_DEVICE_AUDIO_CAPTURE, | 125 MEDIA_DEVICE_AUDIO_CAPTURE, |
121 MEDIA_DEVICE_VIDEO_CAPTURE); | 126 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 127 MediaStreamRequest* request_ptr = request.get(); |
122 proxy_->RequestAccess( | 128 proxy_->RequestAccess( |
123 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 129 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
124 base::Unretained(&response_callback_))); | 130 base::Unretained(&response_callback_))); |
125 MediaResponseCallback callback; | 131 MediaResponseCallback callback; |
126 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 132 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 133 _)) |
127 .WillOnce(SaveArg<1>(&callback)); | 134 .WillOnce(SaveArg<1>(&callback)); |
128 message_loop_.RunUntilIdle(); | 135 message_loop_.RunUntilIdle(); |
129 ASSERT_FALSE(callback.is_null()); | 136 ASSERT_FALSE(callback.is_null()); |
130 | 137 |
131 MediaStreamDevices devices; | 138 MediaStreamDevices devices; |
132 devices.push_back( | 139 devices.push_back( |
133 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 140 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
134 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 141 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
135 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); | 142 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); |
136 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); | 143 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); |
137 | 144 |
138 MediaStreamDevices response; | 145 MediaStreamDevices response; |
139 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 146 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
140 .WillOnce(SaveArg<0>(&response)); | 147 .WillOnce(SaveArg<0>(&response)); |
141 message_loop_.RunUntilIdle(); | 148 message_loop_.RunUntilIdle(); |
142 | 149 |
143 EXPECT_FALSE(response.empty()); | 150 EXPECT_FALSE(response.empty()); |
144 | 151 |
145 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); | 152 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); |
146 message_loop_.RunUntilIdle(); | 153 message_loop_.RunUntilIdle(); |
147 } | 154 } |
148 | 155 |
149 // Verify that the proxy can be deleted before the request is processed. | 156 // Verify that the proxy can be deleted before the request is processed. |
150 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { | 157 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { |
151 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 158 scoped_ptr<MediaStreamRequest> request ( |
| 159 new MediaStreamRequest(0, 0, 0, |
| 160 GURL("http://origin/"), false, |
152 MEDIA_GENERATE_STREAM, std::string(), | 161 MEDIA_GENERATE_STREAM, std::string(), |
153 std::string(), | 162 std::string(), |
154 MEDIA_DEVICE_AUDIO_CAPTURE, | 163 MEDIA_DEVICE_AUDIO_CAPTURE, |
155 MEDIA_DEVICE_VIDEO_CAPTURE); | 164 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 165 MediaStreamRequest* request_ptr = request.get(); |
156 proxy_->RequestAccess( | 166 proxy_->RequestAccess( |
157 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 167 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
158 base::Unretained(&response_callback_))); | 168 base::Unretained(&response_callback_))); |
159 MediaResponseCallback callback; | 169 MediaResponseCallback callback; |
160 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 170 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 171 , _)) |
161 .WillOnce(SaveArg<1>(&callback)); | 172 .WillOnce(SaveArg<1>(&callback)); |
162 message_loop_.RunUntilIdle(); | 173 message_loop_.RunUntilIdle(); |
163 ASSERT_FALSE(callback.is_null()); | 174 ASSERT_FALSE(callback.is_null()); |
164 | 175 |
165 proxy_.reset(); | 176 proxy_.reset(); |
166 | 177 |
167 MediaStreamDevices devices; | 178 MediaStreamDevices devices; |
168 scoped_ptr<MediaStreamUI> ui; | 179 scoped_ptr<MediaStreamUI> ui; |
169 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); | 180 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); |
170 } | 181 } |
171 | 182 |
172 TEST_F(MediaStreamUIProxyTest, StopFromUI) { | 183 TEST_F(MediaStreamUIProxyTest, StopFromUI) { |
173 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 184 scoped_ptr<MediaStreamRequest> request ( |
| 185 new MediaStreamRequest(0, 0, 0, |
| 186 GURL("http://origin/"), false, |
174 MEDIA_GENERATE_STREAM, std::string(), | 187 MEDIA_GENERATE_STREAM, std::string(), |
175 std::string(), | 188 std::string(), |
176 MEDIA_DEVICE_AUDIO_CAPTURE, | 189 MEDIA_DEVICE_AUDIO_CAPTURE, |
177 MEDIA_DEVICE_VIDEO_CAPTURE); | 190 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 191 MediaStreamRequest* request_ptr = request.get(); |
178 proxy_->RequestAccess( | 192 proxy_->RequestAccess( |
179 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 193 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
180 base::Unretained(&response_callback_))); | 194 base::Unretained(&response_callback_))); |
181 MediaResponseCallback callback; | 195 MediaResponseCallback callback; |
182 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 196 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 197 , _)) |
183 .WillOnce(SaveArg<1>(&callback)); | 198 .WillOnce(SaveArg<1>(&callback)); |
184 message_loop_.RunUntilIdle(); | 199 message_loop_.RunUntilIdle(); |
185 ASSERT_FALSE(callback.is_null()); | 200 ASSERT_FALSE(callback.is_null()); |
186 | 201 |
187 base::Closure stop_callback; | 202 base::Closure stop_callback; |
188 | 203 |
189 MediaStreamDevices devices; | 204 MediaStreamDevices devices; |
190 devices.push_back( | 205 devices.push_back( |
191 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 206 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
192 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 207 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
(...skipping 14 matching lines...) Expand all Loading... |
207 MediaStreamUIProxy::WindowIdCallback()); | 222 MediaStreamUIProxy::WindowIdCallback()); |
208 message_loop_.RunUntilIdle(); | 223 message_loop_.RunUntilIdle(); |
209 | 224 |
210 ASSERT_FALSE(stop_callback.is_null()); | 225 ASSERT_FALSE(stop_callback.is_null()); |
211 EXPECT_CALL(stop_handler, OnStop()); | 226 EXPECT_CALL(stop_handler, OnStop()); |
212 stop_callback.Run(); | 227 stop_callback.Run(); |
213 message_loop_.RunUntilIdle(); | 228 message_loop_.RunUntilIdle(); |
214 } | 229 } |
215 | 230 |
216 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { | 231 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { |
217 MediaStreamRequest request(0, | 232 scoped_ptr<MediaStreamRequest> request ( |
218 0, | 233 new MediaStreamRequest(0, 0, 0, |
219 0, | 234 GURL("http://origin/"), false, |
220 GURL("http://origin/"), | 235 MEDIA_GENERATE_STREAM, std::string(), |
221 false, | |
222 MEDIA_GENERATE_STREAM, | |
223 std::string(), | |
224 std::string(), | 236 std::string(), |
225 MEDIA_NO_SERVICE, | 237 MEDIA_NO_SERVICE, |
226 MEDIA_DESKTOP_VIDEO_CAPTURE); | 238 MEDIA_DESKTOP_VIDEO_CAPTURE)); |
| 239 MediaStreamRequest* request_ptr = request.get(); |
| 240 |
227 proxy_->RequestAccess( | 241 proxy_->RequestAccess( |
228 request, | 242 request.Pass(), |
229 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 243 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
230 base::Unretained(&response_callback_))); | 244 base::Unretained(&response_callback_))); |
231 MediaResponseCallback callback; | 245 MediaResponseCallback callback; |
232 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 246 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 247 _)) |
233 .WillOnce(SaveArg<1>(&callback)); | 248 .WillOnce(SaveArg<1>(&callback)); |
234 message_loop_.RunUntilIdle(); | 249 message_loop_.RunUntilIdle(); |
235 | 250 |
236 const int kWindowId = 1; | 251 const int kWindowId = 1; |
237 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 252 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
238 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); | 253 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); |
239 | 254 |
240 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); | 255 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); |
241 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); | 256 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); |
242 | 257 |
(...skipping 13 matching lines...) Expand all Loading... |
256 0, | 271 0, |
257 0, | 272 0, |
258 base::Bind(&MockResponseCallback::OnCheckResponse, | 273 base::Bind(&MockResponseCallback::OnCheckResponse, |
259 base::Unretained(&response_callback_))); | 274 base::Unretained(&response_callback_))); |
260 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); | 275 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); |
261 EXPECT_CALL(response_callback_, OnCheckResponse(_)); | 276 EXPECT_CALL(response_callback_, OnCheckResponse(_)); |
262 message_loop_.RunUntilIdle(); | 277 message_loop_.RunUntilIdle(); |
263 } | 278 } |
264 | 279 |
265 } // content | 280 } // content |
OLD | NEW |