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