| 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 |