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->tab_capture_device_id == arg.tab_capture_device_id && |
82 expected.security_origin == arg.security_origin && | 82 expected->security_origin == arg.security_origin && |
83 expected.request_type == arg.request_type && | 83 expected->request_type == arg.request_type && |
84 expected.requested_audio_device_id == arg.requested_audio_device_id && | 84 expected->requested_audio_device_id == arg.requested_audio_device_id && |
85 expected.requested_video_device_id == arg.requested_video_device_id && | 85 expected->requested_video_device_id == arg.requested_video_device_id && |
86 expected.audio_type == arg.audio_type && | 86 expected->audio_type == arg.audio_type && |
87 expected.video_type == arg.video_type; | 87 expected->video_type == arg.video_type; |
88 } | 88 } |
89 | 89 |
90 TEST_F(MediaStreamUIProxyTest, Deny) { | 90 TEST_F(MediaStreamUIProxyTest, Deny) { |
91 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 91 scoped_ptr<MediaStreamRequest> request ( |
| 92 new MediaStreamRequest(0, 0, 0, std::string(), GURL("http://origin/"), |
| 93 false, |
92 MEDIA_GENERATE_STREAM, std::string(), | 94 MEDIA_GENERATE_STREAM, std::string(), |
93 std::string(), | 95 std::string(), |
94 MEDIA_DEVICE_AUDIO_CAPTURE, | 96 MEDIA_DEVICE_AUDIO_CAPTURE, |
95 MEDIA_DEVICE_VIDEO_CAPTURE); | 97 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 98 MediaStreamRequest* request_ptr = request.get(); |
96 proxy_->RequestAccess( | 99 proxy_->RequestAccess( |
97 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 100 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
98 base::Unretained(&response_callback_))); | 101 base::Unretained(&response_callback_))); |
99 MediaResponseCallback callback; | 102 MediaResponseCallback callback; |
100 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 103 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 104 _)) |
101 .WillOnce(SaveArg<1>(&callback)); | 105 .WillOnce(SaveArg<1>(&callback)); |
102 message_loop_.RunUntilIdle(); | 106 message_loop_.RunUntilIdle(); |
103 ASSERT_FALSE(callback.is_null()); | 107 ASSERT_FALSE(callback.is_null()); |
104 | 108 |
105 MediaStreamDevices devices; | 109 MediaStreamDevices devices; |
106 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); | 110 callback.Run(devices, MEDIA_DEVICE_OK, scoped_ptr<MediaStreamUI>()); |
107 | 111 |
108 MediaStreamDevices response; | 112 MediaStreamDevices response; |
109 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 113 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
110 .WillOnce(SaveArg<0>(&response)); | 114 .WillOnce(SaveArg<0>(&response)); |
111 message_loop_.RunUntilIdle(); | 115 message_loop_.RunUntilIdle(); |
112 | 116 |
113 EXPECT_TRUE(response.empty()); | 117 EXPECT_TRUE(response.empty()); |
114 } | 118 } |
115 | 119 |
116 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { | 120 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { |
117 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 121 scoped_ptr<MediaStreamRequest> request ( |
| 122 new MediaStreamRequest(0, 0, 0, std::string(), |
| 123 GURL("http://origin/"), false, |
118 MEDIA_GENERATE_STREAM, std::string(), | 124 MEDIA_GENERATE_STREAM, std::string(), |
119 std::string(), | 125 std::string(), |
120 MEDIA_DEVICE_AUDIO_CAPTURE, | 126 MEDIA_DEVICE_AUDIO_CAPTURE, |
121 MEDIA_DEVICE_VIDEO_CAPTURE); | 127 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 128 MediaStreamRequest* request_ptr = request.get(); |
122 proxy_->RequestAccess( | 129 proxy_->RequestAccess( |
123 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 130 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
124 base::Unretained(&response_callback_))); | 131 base::Unretained(&response_callback_))); |
125 MediaResponseCallback callback; | 132 MediaResponseCallback callback; |
126 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 133 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 134 _)) |
127 .WillOnce(SaveArg<1>(&callback)); | 135 .WillOnce(SaveArg<1>(&callback)); |
128 message_loop_.RunUntilIdle(); | 136 message_loop_.RunUntilIdle(); |
129 ASSERT_FALSE(callback.is_null()); | 137 ASSERT_FALSE(callback.is_null()); |
130 | 138 |
131 MediaStreamDevices devices; | 139 MediaStreamDevices devices; |
132 devices.push_back( | 140 devices.push_back( |
133 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 141 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
134 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 142 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
135 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); | 143 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); |
136 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); | 144 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); |
137 | 145 |
138 MediaStreamDevices response; | 146 MediaStreamDevices response; |
139 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 147 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
140 .WillOnce(SaveArg<0>(&response)); | 148 .WillOnce(SaveArg<0>(&response)); |
141 message_loop_.RunUntilIdle(); | 149 message_loop_.RunUntilIdle(); |
142 | 150 |
143 EXPECT_FALSE(response.empty()); | 151 EXPECT_FALSE(response.empty()); |
144 | 152 |
145 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); | 153 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); |
146 message_loop_.RunUntilIdle(); | 154 message_loop_.RunUntilIdle(); |
147 } | 155 } |
148 | 156 |
149 // Verify that the proxy can be deleted before the request is processed. | 157 // Verify that the proxy can be deleted before the request is processed. |
150 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { | 158 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { |
151 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 159 scoped_ptr<MediaStreamRequest> request ( |
| 160 new MediaStreamRequest(0, 0, 0, std::string(), |
| 161 GURL("http://origin/"), false, |
152 MEDIA_GENERATE_STREAM, std::string(), | 162 MEDIA_GENERATE_STREAM, std::string(), |
153 std::string(), | 163 std::string(), |
154 MEDIA_DEVICE_AUDIO_CAPTURE, | 164 MEDIA_DEVICE_AUDIO_CAPTURE, |
155 MEDIA_DEVICE_VIDEO_CAPTURE); | 165 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 166 MediaStreamRequest* request_ptr = request.get(); |
156 proxy_->RequestAccess( | 167 proxy_->RequestAccess( |
157 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 168 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
158 base::Unretained(&response_callback_))); | 169 base::Unretained(&response_callback_))); |
159 MediaResponseCallback callback; | 170 MediaResponseCallback callback; |
160 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 171 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 172 , _)) |
161 .WillOnce(SaveArg<1>(&callback)); | 173 .WillOnce(SaveArg<1>(&callback)); |
162 message_loop_.RunUntilIdle(); | 174 message_loop_.RunUntilIdle(); |
163 ASSERT_FALSE(callback.is_null()); | 175 ASSERT_FALSE(callback.is_null()); |
164 | 176 |
165 proxy_.reset(); | 177 proxy_.reset(); |
166 | 178 |
167 MediaStreamDevices devices; | 179 MediaStreamDevices devices; |
168 scoped_ptr<MediaStreamUI> ui; | 180 scoped_ptr<MediaStreamUI> ui; |
169 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); | 181 callback.Run(devices, MEDIA_DEVICE_OK, ui.Pass()); |
170 } | 182 } |
171 | 183 |
172 TEST_F(MediaStreamUIProxyTest, StopFromUI) { | 184 TEST_F(MediaStreamUIProxyTest, StopFromUI) { |
173 MediaStreamRequest request(0, 0, 0, GURL("http://origin/"), false, | 185 scoped_ptr<MediaStreamRequest> request ( |
| 186 new MediaStreamRequest(0, 0, 0, std::string(), |
| 187 GURL("http://origin/"), false, |
174 MEDIA_GENERATE_STREAM, std::string(), | 188 MEDIA_GENERATE_STREAM, std::string(), |
175 std::string(), | 189 std::string(), |
176 MEDIA_DEVICE_AUDIO_CAPTURE, | 190 MEDIA_DEVICE_AUDIO_CAPTURE, |
177 MEDIA_DEVICE_VIDEO_CAPTURE); | 191 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 192 MediaStreamRequest* request_ptr = request.get(); |
178 proxy_->RequestAccess( | 193 proxy_->RequestAccess( |
179 request, base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 194 request.Pass(), base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
180 base::Unretained(&response_callback_))); | 195 base::Unretained(&response_callback_))); |
181 MediaResponseCallback callback; | 196 MediaResponseCallback callback; |
182 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 197 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 198 , _)) |
183 .WillOnce(SaveArg<1>(&callback)); | 199 .WillOnce(SaveArg<1>(&callback)); |
184 message_loop_.RunUntilIdle(); | 200 message_loop_.RunUntilIdle(); |
185 ASSERT_FALSE(callback.is_null()); | 201 ASSERT_FALSE(callback.is_null()); |
186 | 202 |
187 base::Closure stop_callback; | 203 base::Closure stop_callback; |
188 | 204 |
189 MediaStreamDevices devices; | 205 MediaStreamDevices devices; |
190 devices.push_back( | 206 devices.push_back( |
191 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 207 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
192 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 208 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
(...skipping 14 matching lines...) Expand all Loading... |
207 MediaStreamUIProxy::WindowIdCallback()); | 223 MediaStreamUIProxy::WindowIdCallback()); |
208 message_loop_.RunUntilIdle(); | 224 message_loop_.RunUntilIdle(); |
209 | 225 |
210 ASSERT_FALSE(stop_callback.is_null()); | 226 ASSERT_FALSE(stop_callback.is_null()); |
211 EXPECT_CALL(stop_handler, OnStop()); | 227 EXPECT_CALL(stop_handler, OnStop()); |
212 stop_callback.Run(); | 228 stop_callback.Run(); |
213 message_loop_.RunUntilIdle(); | 229 message_loop_.RunUntilIdle(); |
214 } | 230 } |
215 | 231 |
216 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { | 232 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { |
217 MediaStreamRequest request(0, | 233 scoped_ptr<MediaStreamRequest> request ( |
218 0, | 234 new MediaStreamRequest(0, 0, 0, std::string(), |
219 0, | 235 GURL("http://origin/"), false, |
220 GURL("http://origin/"), | 236 MEDIA_GENERATE_STREAM, std::string(), |
221 false, | |
222 MEDIA_GENERATE_STREAM, | |
223 std::string(), | |
224 std::string(), | 237 std::string(), |
225 MEDIA_NO_SERVICE, | 238 MEDIA_NO_SERVICE, |
226 MEDIA_DESKTOP_VIDEO_CAPTURE); | 239 MEDIA_DESKTOP_VIDEO_CAPTURE)); |
| 240 MediaStreamRequest* request_ptr = request.get(); |
| 241 |
227 proxy_->RequestAccess( | 242 proxy_->RequestAccess( |
228 request, | 243 request.Pass(), |
229 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 244 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
230 base::Unretained(&response_callback_))); | 245 base::Unretained(&response_callback_))); |
231 MediaResponseCallback callback; | 246 MediaResponseCallback callback; |
232 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request), _)) | 247 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 248 _)) |
233 .WillOnce(SaveArg<1>(&callback)); | 249 .WillOnce(SaveArg<1>(&callback)); |
234 message_loop_.RunUntilIdle(); | 250 message_loop_.RunUntilIdle(); |
235 | 251 |
236 const int kWindowId = 1; | 252 const int kWindowId = 1; |
237 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 253 scoped_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
238 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); | 254 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); |
239 | 255 |
240 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); | 256 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, ui.Pass()); |
241 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); | 257 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); |
242 | 258 |
(...skipping 13 matching lines...) Expand all Loading... |
256 0, | 272 0, |
257 0, | 273 0, |
258 base::Bind(&MockResponseCallback::OnCheckResponse, | 274 base::Bind(&MockResponseCallback::OnCheckResponse, |
259 base::Unretained(&response_callback_))); | 275 base::Unretained(&response_callback_))); |
260 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); | 276 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); |
261 EXPECT_CALL(response_callback_, OnCheckResponse(_)); | 277 EXPECT_CALL(response_callback_, OnCheckResponse(_)); |
262 message_loop_.RunUntilIdle(); | 278 message_loop_.RunUntilIdle(); |
263 } | 279 } |
264 | 280 |
265 } // content | 281 } // content |
OLD | NEW |