| 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 "chrome/browser/media/native_desktop_media_list.h" | 5 #include "chrome/browser/media/native_desktop_media_list.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 | 10 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" | 22 #include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" |
| 23 #include "third_party/webrtc/modules/desktop_capture/window_capturer.h" | 23 #include "third_party/webrtc/modules/desktop_capture/window_capturer.h" |
| 24 | 24 |
| 25 using testing::_; | 25 using testing::_; |
| 26 using testing::DoAll; | 26 using testing::DoAll; |
| 27 | 27 |
| 28 namespace { | 28 namespace { |
| 29 | 29 |
| 30 class MockObserver : public DesktopMediaListObserver { | 30 class MockObserver : public DesktopMediaListObserver { |
| 31 public: | 31 public: |
| 32 MOCK_METHOD1(OnSourceAdded, void(int index)); | 32 MOCK_METHOD2(OnSourceAdded, void(DesktopMediaList* list, int index)); |
| 33 MOCK_METHOD1(OnSourceRemoved, void(int index)); | 33 MOCK_METHOD2(OnSourceRemoved, void(DesktopMediaList* list, int index)); |
| 34 MOCK_METHOD2(OnSourceMoved, void(int old_index, int new_index)); | 34 MOCK_METHOD3(OnSourceMoved, |
| 35 MOCK_METHOD1(OnSourceNameChanged, void(int index)); | 35 void(DesktopMediaList* list, int old_index, int new_index)); |
| 36 MOCK_METHOD1(OnSourceThumbnailChanged, void(int index)); | 36 MOCK_METHOD2(OnSourceNameChanged, void(DesktopMediaList* list, int index)); |
| 37 MOCK_METHOD2(OnSourceThumbnailChanged, |
| 38 void(DesktopMediaList* list, int index)); |
| 37 }; | 39 }; |
| 38 | 40 |
| 39 class FakeScreenCapturer : public webrtc::ScreenCapturer { | 41 class FakeScreenCapturer : public webrtc::ScreenCapturer { |
| 40 public: | 42 public: |
| 41 FakeScreenCapturer() {} | 43 FakeScreenCapturer() {} |
| 42 ~FakeScreenCapturer() override {} | 44 ~FakeScreenCapturer() override {} |
| 43 | 45 |
| 44 // webrtc::ScreenCapturer implementation. | 46 // webrtc::ScreenCapturer implementation. |
| 45 void Start(Callback* callback) override { callback_ = callback; } | 47 void Start(Callback* callback) override { callback_ = callback; } |
| 46 | 48 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 window.id = i + 1; | 170 window.id = i + 1; |
| 169 window.title = "Test window"; | 171 window.title = "Test window"; |
| 170 list.push_back(window); | 172 list.push_back(window); |
| 171 } | 173 } |
| 172 window_capturer_->SetWindowList(list); | 174 window_capturer_->SetWindowList(list); |
| 173 | 175 |
| 174 { | 176 { |
| 175 testing::InSequence dummy; | 177 testing::InSequence dummy; |
| 176 size_t source_count = window_only ? count : count + 1; | 178 size_t source_count = window_only ? count : count + 1; |
| 177 for (size_t i = 0; i < source_count; ++i) { | 179 for (size_t i = 0; i < source_count; ++i) { |
| 178 EXPECT_CALL(observer_, OnSourceAdded(i)) | 180 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), i)) |
| 179 .WillOnce(CheckListSize(model_.get(), static_cast<int>(i + 1))); | 181 .WillOnce(CheckListSize(model_.get(), static_cast<int>(i + 1))); |
| 180 } | 182 } |
| 181 for (size_t i = 0; i < source_count - 1; ++i) { | 183 for (size_t i = 0; i < source_count - 1; ++i) { |
| 182 EXPECT_CALL(observer_, OnSourceThumbnailChanged(i)); | 184 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), i)); |
| 183 } | 185 } |
| 184 EXPECT_CALL(observer_, OnSourceThumbnailChanged(source_count - 1)) | 186 EXPECT_CALL(observer_, |
| 185 .WillOnce(QuitMessageLoop(&message_loop_)); | 187 OnSourceThumbnailChanged(model_.get(), source_count - 1)) |
| 188 .WillOnce(QuitMessageLoop(&message_loop_)); |
| 186 } | 189 } |
| 187 model_->StartUpdating(&observer_); | 190 model_->StartUpdating(&observer_); |
| 188 message_loop_.Run(); | 191 message_loop_.Run(); |
| 189 | 192 |
| 190 for (size_t i = 0; i < count; ++i) { | 193 for (size_t i = 0; i < count; ++i) { |
| 191 size_t source_index = window_only ? i : i + 1; | 194 size_t source_index = window_only ? i : i + 1; |
| 192 EXPECT_EQ(model_->GetSource(source_index).id.type, | 195 EXPECT_EQ(model_->GetSource(source_index).id.type, |
| 193 content::DesktopMediaID::TYPE_WINDOW); | 196 content::DesktopMediaID::TYPE_WINDOW); |
| 194 EXPECT_EQ(model_->GetSource(source_index).id.id, static_cast<int>(i + 1)); | 197 EXPECT_EQ(model_->GetSource(source_index).id.id, static_cast<int>(i + 1)); |
| 195 EXPECT_EQ(model_->GetSource(source_index).name, | 198 EXPECT_EQ(model_->GetSource(source_index).name, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 AddWindowsAndVerify(1, true); | 243 AddWindowsAndVerify(1, true); |
| 241 } | 244 } |
| 242 | 245 |
| 243 TEST_F(DesktopMediaListTest, ScreenOnly) { | 246 TEST_F(DesktopMediaListTest, ScreenOnly) { |
| 244 model_.reset(new NativeDesktopMediaList( | 247 model_.reset(new NativeDesktopMediaList( |
| 245 scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer), | 248 scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer), |
| 246 scoped_ptr<webrtc::WindowCapturer>())); | 249 scoped_ptr<webrtc::WindowCapturer>())); |
| 247 | 250 |
| 248 { | 251 { |
| 249 testing::InSequence dummy; | 252 testing::InSequence dummy; |
| 250 EXPECT_CALL(observer_, OnSourceAdded(0)) | 253 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 0)) |
| 251 .WillOnce(CheckListSize(model_.get(), 1)); | 254 .WillOnce(CheckListSize(model_.get(), 1)); |
| 252 EXPECT_CALL(observer_, OnSourceThumbnailChanged(0)) | 255 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 0)) |
| 253 .WillOnce(QuitMessageLoop(&message_loop_)); | 256 .WillOnce(QuitMessageLoop(&message_loop_)); |
| 254 } | 257 } |
| 255 model_->StartUpdating(&observer_); | 258 model_->StartUpdating(&observer_); |
| 256 | 259 |
| 257 message_loop_.Run(); | 260 message_loop_.Run(); |
| 258 | 261 |
| 259 EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN); | 262 EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN); |
| 260 } | 263 } |
| 261 | 264 |
| 262 TEST_F(DesktopMediaListTest, AddWindow) { | 265 TEST_F(DesktopMediaListTest, AddWindow) { |
| 263 CreateWithDefaultCapturers(); | 266 CreateWithDefaultCapturers(); |
| 264 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); | 267 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); |
| 265 | 268 |
| 266 EXPECT_CALL(observer_, OnSourceAdded(2)) | 269 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 2)) |
| 267 .WillOnce(DoAll(CheckListSize(model_.get(), 3), | 270 .WillOnce(DoAll(CheckListSize(model_.get(), 3), |
| 268 QuitMessageLoop(&message_loop_))); | 271 QuitMessageLoop(&message_loop_))); |
| 269 | 272 |
| 270 webrtc::WindowCapturer::Window window; | 273 webrtc::WindowCapturer::Window window; |
| 271 window.id = 10; // id=0 is invalid. | 274 window.id = 10; // id=0 is invalid. |
| 272 window.title = "Test window 10"; | 275 window.title = "Test window 10"; |
| 273 list.push_back(window); | 276 list.push_back(window); |
| 274 window_capturer_->SetWindowList(list); | 277 window_capturer_->SetWindowList(list); |
| 275 | 278 |
| 276 message_loop_.Run(); | 279 message_loop_.Run(); |
| 277 | 280 |
| 278 EXPECT_EQ(model_->GetSource(2).id.type, content::DesktopMediaID::TYPE_WINDOW); | 281 EXPECT_EQ(model_->GetSource(2).id.type, content::DesktopMediaID::TYPE_WINDOW); |
| 279 EXPECT_EQ(model_->GetSource(2).id.id, 10); | 282 EXPECT_EQ(model_->GetSource(2).id.id, 10); |
| 280 } | 283 } |
| 281 | 284 |
| 282 TEST_F(DesktopMediaListTest, RemoveWindow) { | 285 TEST_F(DesktopMediaListTest, RemoveWindow) { |
| 283 CreateWithDefaultCapturers(); | 286 CreateWithDefaultCapturers(); |
| 284 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | 287 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); |
| 285 | 288 |
| 286 EXPECT_CALL(observer_, OnSourceRemoved(2)) | 289 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 2)) |
| 287 .WillOnce(DoAll(CheckListSize(model_.get(), 2), | 290 .WillOnce(DoAll(CheckListSize(model_.get(), 2), |
| 288 QuitMessageLoop(&message_loop_))); | 291 QuitMessageLoop(&message_loop_))); |
| 289 | 292 |
| 290 list.erase(list.begin() + 1); | 293 list.erase(list.begin() + 1); |
| 291 window_capturer_->SetWindowList(list); | 294 window_capturer_->SetWindowList(list); |
| 292 | 295 |
| 293 message_loop_.Run(); | 296 message_loop_.Run(); |
| 294 } | 297 } |
| 295 | 298 |
| 296 TEST_F(DesktopMediaListTest, RemoveAllWindows) { | 299 TEST_F(DesktopMediaListTest, RemoveAllWindows) { |
| 297 CreateWithDefaultCapturers(); | 300 CreateWithDefaultCapturers(); |
| 298 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | 301 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); |
| 299 | 302 |
| 300 testing::InSequence seq; | 303 testing::InSequence seq; |
| 301 EXPECT_CALL(observer_, OnSourceRemoved(1)) | 304 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) |
| 302 .WillOnce(CheckListSize(model_.get(), 2)); | 305 .WillOnce(CheckListSize(model_.get(), 2)); |
| 303 EXPECT_CALL(observer_, OnSourceRemoved(1)) | 306 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) |
| 304 .WillOnce(DoAll(CheckListSize(model_.get(), 1), | 307 .WillOnce(DoAll(CheckListSize(model_.get(), 1), |
| 305 QuitMessageLoop(&message_loop_))); | 308 QuitMessageLoop(&message_loop_))); |
| 306 | 309 |
| 307 list.erase(list.begin(), list.end()); | 310 list.erase(list.begin(), list.end()); |
| 308 window_capturer_->SetWindowList(list); | 311 window_capturer_->SetWindowList(list); |
| 309 | 312 |
| 310 message_loop_.Run(); | 313 message_loop_.Run(); |
| 311 } | 314 } |
| 312 | 315 |
| 313 TEST_F(DesktopMediaListTest, UpdateTitle) { | 316 TEST_F(DesktopMediaListTest, UpdateTitle) { |
| 314 CreateWithDefaultCapturers(); | 317 CreateWithDefaultCapturers(); |
| 315 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); | 318 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); |
| 316 | 319 |
| 317 EXPECT_CALL(observer_, OnSourceNameChanged(1)) | 320 EXPECT_CALL(observer_, OnSourceNameChanged(model_.get(), 1)) |
| 318 .WillOnce(QuitMessageLoop(&message_loop_)); | 321 .WillOnce(QuitMessageLoop(&message_loop_)); |
| 319 | 322 |
| 320 const std::string kTestTitle = "New Title"; | 323 const std::string kTestTitle = "New Title"; |
| 321 | 324 |
| 322 list[0].title = kTestTitle; | 325 list[0].title = kTestTitle; |
| 323 window_capturer_->SetWindowList(list); | 326 window_capturer_->SetWindowList(list); |
| 324 | 327 |
| 325 message_loop_.Run(); | 328 message_loop_.Run(); |
| 326 | 329 |
| 327 EXPECT_EQ(model_->GetSource(1).name, base::UTF8ToUTF16(kTestTitle)); | 330 EXPECT_EQ(model_->GetSource(1).name, base::UTF8ToUTF16(kTestTitle)); |
| 328 } | 331 } |
| 329 | 332 |
| 330 TEST_F(DesktopMediaListTest, UpdateThumbnail) { | 333 TEST_F(DesktopMediaListTest, UpdateThumbnail) { |
| 331 CreateWithDefaultCapturers(); | 334 CreateWithDefaultCapturers(); |
| 332 AddWindowsAndVerify(2, false); | 335 AddWindowsAndVerify(2, false); |
| 333 | 336 |
| 334 EXPECT_CALL(observer_, OnSourceThumbnailChanged(1)) | 337 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 1)) |
| 335 .WillOnce(QuitMessageLoop(&message_loop_)); | 338 .WillOnce(QuitMessageLoop(&message_loop_)); |
| 336 // Update frame for the window and verify that we get notification about it. | 339 // Update frame for the window and verify that we get notification about it. |
| 337 window_capturer_->SetNextFrameValue(1, 1); | 340 window_capturer_->SetNextFrameValue(1, 1); |
| 338 | 341 |
| 339 message_loop_.Run(); | 342 message_loop_.Run(); |
| 340 } | 343 } |
| 341 | 344 |
| 342 TEST_F(DesktopMediaListTest, MoveWindow) { | 345 TEST_F(DesktopMediaListTest, MoveWindow) { |
| 343 CreateWithDefaultCapturers(); | 346 CreateWithDefaultCapturers(); |
| 344 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | 347 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); |
| 345 | 348 |
| 346 EXPECT_CALL(observer_, OnSourceMoved(2, 1)) | 349 EXPECT_CALL(observer_, OnSourceMoved(model_.get(), 2, 1)) |
| 347 .WillOnce(DoAll(CheckListSize(model_.get(), 3), | 350 .WillOnce(DoAll(CheckListSize(model_.get(), 3), |
| 348 QuitMessageLoop(&message_loop_))); | 351 QuitMessageLoop(&message_loop_))); |
| 349 | 352 |
| 350 // Swap the two windows. | 353 // Swap the two windows. |
| 351 webrtc::WindowCapturer::Window temp = list[0]; | 354 webrtc::WindowCapturer::Window temp = list[0]; |
| 352 list[0] = list[1]; | 355 list[0] = list[1]; |
| 353 list[1] = temp; | 356 list[1] = temp; |
| 354 window_capturer_->SetWindowList(list); | 357 window_capturer_->SetWindowList(list); |
| 355 | 358 |
| 356 message_loop_.Run(); | 359 message_loop_.Run(); |
| 357 } | 360 } |
| 358 | 361 |
| 359 } // namespace | 362 } // namespace |
| OLD | NEW |