| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" |
| 10 #include "content/browser/frame_host/render_frame_host_delegate.h" | 11 #include "content/browser/frame_host/render_frame_host_delegate.h" |
| 11 #include "content/public/test/test_browser_thread.h" | 12 #include "content/public/test/test_browser_thread.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #include "ui/gfx/geometry/rect.h" | 15 #include "ui/gfx/geometry/rect.h" |
| 15 #include "url/gurl.h" | 16 #include "url/gurl.h" |
| 16 #include "url/origin.h" | 17 #include "url/origin.h" |
| 17 | 18 |
| 18 using testing::_; | 19 using testing::_; |
| 19 using testing::Return; | 20 using testing::Return; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 class MediaStreamUIProxyTest : public testing::Test { | 58 class MediaStreamUIProxyTest : public testing::Test { |
| 58 public: | 59 public: |
| 59 MediaStreamUIProxyTest() | 60 MediaStreamUIProxyTest() |
| 60 : ui_thread_(BrowserThread::UI, &message_loop_), | 61 : ui_thread_(BrowserThread::UI, &message_loop_), |
| 61 io_thread_(BrowserThread::IO, &message_loop_) { | 62 io_thread_(BrowserThread::IO, &message_loop_) { |
| 62 proxy_ = MediaStreamUIProxy::CreateForTests(&delegate_); | 63 proxy_ = MediaStreamUIProxy::CreateForTests(&delegate_); |
| 63 } | 64 } |
| 64 | 65 |
| 65 ~MediaStreamUIProxyTest() override { | 66 ~MediaStreamUIProxyTest() override { |
| 66 proxy_.reset(); | 67 proxy_.reset(); |
| 67 message_loop_.RunUntilIdle(); | 68 base::RunLoop().RunUntilIdle(); |
| 68 } | 69 } |
| 69 | 70 |
| 70 protected: | 71 protected: |
| 71 base::MessageLoop message_loop_; | 72 base::MessageLoop message_loop_; |
| 72 TestBrowserThread ui_thread_; | 73 TestBrowserThread ui_thread_; |
| 73 TestBrowserThread io_thread_; | 74 TestBrowserThread io_thread_; |
| 74 | 75 |
| 75 MockRenderFrameHostDelegate delegate_; | 76 MockRenderFrameHostDelegate delegate_; |
| 76 MockResponseCallback response_callback_; | 77 MockResponseCallback response_callback_; |
| 77 std::unique_ptr<MediaStreamUIProxy> proxy_; | 78 std::unique_ptr<MediaStreamUIProxy> proxy_; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 96 MEDIA_DEVICE_VIDEO_CAPTURE)); | 97 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 97 MediaStreamRequest* request_ptr = request.get(); | 98 MediaStreamRequest* request_ptr = request.get(); |
| 98 proxy_->RequestAccess( | 99 proxy_->RequestAccess( |
| 99 std::move(request), | 100 std::move(request), |
| 100 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 101 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
| 101 base::Unretained(&response_callback_))); | 102 base::Unretained(&response_callback_))); |
| 102 MediaResponseCallback callback; | 103 MediaResponseCallback callback; |
| 103 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 104 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 104 _)) | 105 _)) |
| 105 .WillOnce(SaveArg<1>(&callback)); | 106 .WillOnce(SaveArg<1>(&callback)); |
| 106 message_loop_.RunUntilIdle(); | 107 base::RunLoop().RunUntilIdle(); |
| 107 ASSERT_FALSE(callback.is_null()); | 108 ASSERT_FALSE(callback.is_null()); |
| 108 | 109 |
| 109 MediaStreamDevices devices; | 110 MediaStreamDevices devices; |
| 110 callback.Run(devices, MEDIA_DEVICE_OK, std::unique_ptr<MediaStreamUI>()); | 111 callback.Run(devices, MEDIA_DEVICE_OK, std::unique_ptr<MediaStreamUI>()); |
| 111 | 112 |
| 112 MediaStreamDevices response; | 113 MediaStreamDevices response; |
| 113 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 114 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
| 114 .WillOnce(SaveArg<0>(&response)); | 115 .WillOnce(SaveArg<0>(&response)); |
| 115 message_loop_.RunUntilIdle(); | 116 base::RunLoop().RunUntilIdle(); |
| 116 | 117 |
| 117 EXPECT_TRUE(response.empty()); | 118 EXPECT_TRUE(response.empty()); |
| 118 } | 119 } |
| 119 | 120 |
| 120 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { | 121 TEST_F(MediaStreamUIProxyTest, AcceptAndStart) { |
| 121 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 122 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
| 122 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 123 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
| 123 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 124 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
| 124 MEDIA_DEVICE_VIDEO_CAPTURE)); | 125 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 125 MediaStreamRequest* request_ptr = request.get(); | 126 MediaStreamRequest* request_ptr = request.get(); |
| 126 proxy_->RequestAccess( | 127 proxy_->RequestAccess( |
| 127 std::move(request), | 128 std::move(request), |
| 128 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 129 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
| 129 base::Unretained(&response_callback_))); | 130 base::Unretained(&response_callback_))); |
| 130 MediaResponseCallback callback; | 131 MediaResponseCallback callback; |
| 131 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 132 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 132 _)) | 133 _)) |
| 133 .WillOnce(SaveArg<1>(&callback)); | 134 .WillOnce(SaveArg<1>(&callback)); |
| 134 message_loop_.RunUntilIdle(); | 135 base::RunLoop().RunUntilIdle(); |
| 135 ASSERT_FALSE(callback.is_null()); | 136 ASSERT_FALSE(callback.is_null()); |
| 136 | 137 |
| 137 MediaStreamDevices devices; | 138 MediaStreamDevices devices; |
| 138 devices.push_back( | 139 devices.push_back( |
| 139 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 140 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
| 140 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 141 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
| 141 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); | 142 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(0)); |
| 142 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 143 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
| 143 | 144 |
| 144 MediaStreamDevices response; | 145 MediaStreamDevices response; |
| 145 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 146 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
| 146 .WillOnce(SaveArg<0>(&response)); | 147 .WillOnce(SaveArg<0>(&response)); |
| 147 message_loop_.RunUntilIdle(); | 148 base::RunLoop().RunUntilIdle(); |
| 148 | 149 |
| 149 EXPECT_FALSE(response.empty()); | 150 EXPECT_FALSE(response.empty()); |
| 150 | 151 |
| 151 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); | 152 proxy_->OnStarted(base::Closure(), MediaStreamUIProxy::WindowIdCallback()); |
| 152 message_loop_.RunUntilIdle(); | 153 base::RunLoop().RunUntilIdle(); |
| 153 } | 154 } |
| 154 | 155 |
| 155 // 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. |
| 156 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { | 157 TEST_F(MediaStreamUIProxyTest, DeleteBeforeAccepted) { |
| 157 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 158 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
| 158 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 159 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
| 159 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 160 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
| 160 MEDIA_DEVICE_VIDEO_CAPTURE)); | 161 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 161 MediaStreamRequest* request_ptr = request.get(); | 162 MediaStreamRequest* request_ptr = request.get(); |
| 162 proxy_->RequestAccess( | 163 proxy_->RequestAccess( |
| 163 std::move(request), | 164 std::move(request), |
| 164 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 165 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
| 165 base::Unretained(&response_callback_))); | 166 base::Unretained(&response_callback_))); |
| 166 MediaResponseCallback callback; | 167 MediaResponseCallback callback; |
| 167 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) | 168 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 168 , _)) | 169 , _)) |
| 169 .WillOnce(SaveArg<1>(&callback)); | 170 .WillOnce(SaveArg<1>(&callback)); |
| 170 message_loop_.RunUntilIdle(); | 171 base::RunLoop().RunUntilIdle(); |
| 171 ASSERT_FALSE(callback.is_null()); | 172 ASSERT_FALSE(callback.is_null()); |
| 172 | 173 |
| 173 proxy_.reset(); | 174 proxy_.reset(); |
| 174 | 175 |
| 175 MediaStreamDevices devices; | 176 MediaStreamDevices devices; |
| 176 std::unique_ptr<MediaStreamUI> ui; | 177 std::unique_ptr<MediaStreamUI> ui; |
| 177 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 178 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
| 178 } | 179 } |
| 179 | 180 |
| 180 TEST_F(MediaStreamUIProxyTest, StopFromUI) { | 181 TEST_F(MediaStreamUIProxyTest, StopFromUI) { |
| 181 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 182 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
| 182 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 183 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
| 183 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, | 184 std::string(), std::string(), MEDIA_DEVICE_AUDIO_CAPTURE, |
| 184 MEDIA_DEVICE_VIDEO_CAPTURE)); | 185 MEDIA_DEVICE_VIDEO_CAPTURE)); |
| 185 MediaStreamRequest* request_ptr = request.get(); | 186 MediaStreamRequest* request_ptr = request.get(); |
| 186 proxy_->RequestAccess( | 187 proxy_->RequestAccess( |
| 187 std::move(request), | 188 std::move(request), |
| 188 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 189 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
| 189 base::Unretained(&response_callback_))); | 190 base::Unretained(&response_callback_))); |
| 190 MediaResponseCallback callback; | 191 MediaResponseCallback callback; |
| 191 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) | 192 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr) |
| 192 , _)) | 193 , _)) |
| 193 .WillOnce(SaveArg<1>(&callback)); | 194 .WillOnce(SaveArg<1>(&callback)); |
| 194 message_loop_.RunUntilIdle(); | 195 base::RunLoop().RunUntilIdle(); |
| 195 ASSERT_FALSE(callback.is_null()); | 196 ASSERT_FALSE(callback.is_null()); |
| 196 | 197 |
| 197 base::Closure stop_callback; | 198 base::Closure stop_callback; |
| 198 | 199 |
| 199 MediaStreamDevices devices; | 200 MediaStreamDevices devices; |
| 200 devices.push_back( | 201 devices.push_back( |
| 201 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); | 202 MediaStreamDevice(MEDIA_DEVICE_AUDIO_CAPTURE, "Mic", "Mic")); |
| 202 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 203 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
| 203 EXPECT_CALL(*ui, OnStarted(_)) | 204 EXPECT_CALL(*ui, OnStarted(_)) |
| 204 .WillOnce(testing::DoAll(SaveArg<0>(&stop_callback), Return(0))); | 205 .WillOnce(testing::DoAll(SaveArg<0>(&stop_callback), Return(0))); |
| 205 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); | 206 callback.Run(devices, MEDIA_DEVICE_OK, std::move(ui)); |
| 206 | 207 |
| 207 MediaStreamDevices response; | 208 MediaStreamDevices response; |
| 208 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) | 209 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)) |
| 209 .WillOnce(SaveArg<0>(&response)); | 210 .WillOnce(SaveArg<0>(&response)); |
| 210 message_loop_.RunUntilIdle(); | 211 base::RunLoop().RunUntilIdle(); |
| 211 | 212 |
| 212 EXPECT_FALSE(response.empty()); | 213 EXPECT_FALSE(response.empty()); |
| 213 | 214 |
| 214 MockStopStreamHandler stop_handler; | 215 MockStopStreamHandler stop_handler; |
| 215 proxy_->OnStarted(base::Bind(&MockStopStreamHandler::OnStop, | 216 proxy_->OnStarted(base::Bind(&MockStopStreamHandler::OnStop, |
| 216 base::Unretained(&stop_handler)), | 217 base::Unretained(&stop_handler)), |
| 217 MediaStreamUIProxy::WindowIdCallback()); | 218 MediaStreamUIProxy::WindowIdCallback()); |
| 218 message_loop_.RunUntilIdle(); | 219 base::RunLoop().RunUntilIdle(); |
| 219 | 220 |
| 220 ASSERT_FALSE(stop_callback.is_null()); | 221 ASSERT_FALSE(stop_callback.is_null()); |
| 221 EXPECT_CALL(stop_handler, OnStop()); | 222 EXPECT_CALL(stop_handler, OnStop()); |
| 222 stop_callback.Run(); | 223 stop_callback.Run(); |
| 223 message_loop_.RunUntilIdle(); | 224 base::RunLoop().RunUntilIdle(); |
| 224 } | 225 } |
| 225 | 226 |
| 226 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { | 227 TEST_F(MediaStreamUIProxyTest, WindowIdCallbackCalled) { |
| 227 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( | 228 std::unique_ptr<MediaStreamRequest> request(new MediaStreamRequest( |
| 228 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, | 229 0, 0, 0, GURL("http://origin/"), false, MEDIA_GENERATE_STREAM, |
| 229 std::string(), std::string(), MEDIA_NO_SERVICE, | 230 std::string(), std::string(), MEDIA_NO_SERVICE, |
| 230 MEDIA_DESKTOP_VIDEO_CAPTURE)); | 231 MEDIA_DESKTOP_VIDEO_CAPTURE)); |
| 231 MediaStreamRequest* request_ptr = request.get(); | 232 MediaStreamRequest* request_ptr = request.get(); |
| 232 | 233 |
| 233 proxy_->RequestAccess( | 234 proxy_->RequestAccess( |
| 234 std::move(request), | 235 std::move(request), |
| 235 base::Bind(&MockResponseCallback::OnAccessRequestResponse, | 236 base::Bind(&MockResponseCallback::OnAccessRequestResponse, |
| 236 base::Unretained(&response_callback_))); | 237 base::Unretained(&response_callback_))); |
| 237 MediaResponseCallback callback; | 238 MediaResponseCallback callback; |
| 238 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), | 239 EXPECT_CALL(delegate_, RequestMediaAccessPermission(SameRequest(request_ptr), |
| 239 _)) | 240 _)) |
| 240 .WillOnce(SaveArg<1>(&callback)); | 241 .WillOnce(SaveArg<1>(&callback)); |
| 241 message_loop_.RunUntilIdle(); | 242 base::RunLoop().RunUntilIdle(); |
| 242 | 243 |
| 243 const int kWindowId = 1; | 244 const int kWindowId = 1; |
| 244 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); | 245 std::unique_ptr<MockMediaStreamUI> ui(new MockMediaStreamUI()); |
| 245 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); | 246 EXPECT_CALL(*ui, OnStarted(_)).WillOnce(Return(kWindowId)); |
| 246 | 247 |
| 247 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, std::move(ui)); | 248 callback.Run(MediaStreamDevices(), MEDIA_DEVICE_OK, std::move(ui)); |
| 248 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); | 249 EXPECT_CALL(response_callback_, OnAccessRequestResponse(_, _)); |
| 249 | 250 |
| 250 MockStopStreamHandler handler; | 251 MockStopStreamHandler handler; |
| 251 EXPECT_CALL(handler, OnWindowId(kWindowId)); | 252 EXPECT_CALL(handler, OnWindowId(kWindowId)); |
| 252 | 253 |
| 253 proxy_->OnStarted( | 254 proxy_->OnStarted( |
| 254 base::Bind(&MockStopStreamHandler::OnStop, base::Unretained(&handler)), | 255 base::Bind(&MockStopStreamHandler::OnStop, base::Unretained(&handler)), |
| 255 base::Bind(&MockStopStreamHandler::OnWindowId, | 256 base::Bind(&MockStopStreamHandler::OnWindowId, |
| 256 base::Unretained(&handler))); | 257 base::Unretained(&handler))); |
| 257 message_loop_.RunUntilIdle(); | 258 base::RunLoop().RunUntilIdle(); |
| 258 } | 259 } |
| 259 | 260 |
| 260 TEST_F(MediaStreamUIProxyTest, CheckAccess) { | 261 TEST_F(MediaStreamUIProxyTest, CheckAccess) { |
| 261 proxy_->CheckAccess(url::Origin(GURL("http://origin/")), | 262 proxy_->CheckAccess(url::Origin(GURL("http://origin/")), |
| 262 MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0, | 263 MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0, |
| 263 base::Bind(&MockResponseCallback::OnCheckResponse, | 264 base::Bind(&MockResponseCallback::OnCheckResponse, |
| 264 base::Unretained(&response_callback_))); | 265 base::Unretained(&response_callback_))); |
| 265 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); | 266 EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); |
| 266 EXPECT_CALL(response_callback_, OnCheckResponse(_)); | 267 EXPECT_CALL(response_callback_, OnCheckResponse(_)); |
| 267 message_loop_.RunUntilIdle(); | 268 base::RunLoop().RunUntilIdle(); |
| 268 } | 269 } |
| 269 | 270 |
| 270 } // namespace content | 271 } // namespace content |
| OLD | NEW |