| 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 #include <vector> |
| 10 | 11 |
| 11 #include "base/location.h" | 12 #include "base/location.h" |
| 12 #include "base/macros.h" | 13 #include "base/macros.h" |
| 13 #include "base/message_loop/message_loop.h" | |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/synchronization/lock.h" | 16 #include "base/synchronization/lock.h" |
| 17 #include "chrome/browser/media/desktop_media_list_observer.h" | 17 #include "chrome/browser/media/desktop_media_list_observer.h" |
| 18 #include "content/public/test/test_browser_thread.h" | 18 #include "content/public/test/test_browser_thread.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 21 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| 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 #include "ui/aura/window.h" |
| 25 #include "ui/aura/window_tree_host.h" |
| 26 #include "ui/views/test/views_test_base.h" |
| 27 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
| 28 #include "ui/views/widget/widget.h" |
| 24 | 29 |
| 30 using content::DesktopMediaID; |
| 25 using testing::_; | 31 using testing::_; |
| 26 using testing::DoAll; | 32 using testing::DoAll; |
| 27 | 33 |
| 28 namespace { | 34 namespace { |
| 29 | 35 |
| 36 static const int kDefaultWindowCount = 2; |
| 37 #if defined(USE_AURA) |
| 38 static const int kDefaultAuraCount = 1; |
| 39 #else |
| 40 static const int kDefaultAuraCount = 0; |
| 41 #endif |
| 42 |
| 30 class MockObserver : public DesktopMediaListObserver { | 43 class MockObserver : public DesktopMediaListObserver { |
| 31 public: | 44 public: |
| 32 MOCK_METHOD2(OnSourceAdded, void(DesktopMediaList* list, int index)); | 45 MOCK_METHOD2(OnSourceAdded, void(DesktopMediaList* list, int index)); |
| 33 MOCK_METHOD2(OnSourceRemoved, void(DesktopMediaList* list, int index)); | 46 MOCK_METHOD2(OnSourceRemoved, void(DesktopMediaList* list, int index)); |
| 34 MOCK_METHOD3(OnSourceMoved, | 47 MOCK_METHOD3(OnSourceMoved, |
| 35 void(DesktopMediaList* list, int old_index, int new_index)); | 48 void(DesktopMediaList* list, int old_index, int new_index)); |
| 36 MOCK_METHOD2(OnSourceNameChanged, void(DesktopMediaList* list, int index)); | 49 MOCK_METHOD2(OnSourceNameChanged, void(DesktopMediaList* list, int index)); |
| 37 MOCK_METHOD2(OnSourceThumbnailChanged, | 50 MOCK_METHOD2(OnSourceThumbnailChanged, |
| 38 void(DesktopMediaList* list, int index)); | 51 void(DesktopMediaList* list, int index)); |
| 39 }; | 52 }; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 | 141 |
| 129 WindowId selected_window_id_; | 142 WindowId selected_window_id_; |
| 130 | 143 |
| 131 // Frames to be captured per window. | 144 // Frames to be captured per window. |
| 132 std::map<WindowId, int8_t> frame_values_; | 145 std::map<WindowId, int8_t> frame_values_; |
| 133 base::Lock frame_values_lock_; | 146 base::Lock frame_values_lock_; |
| 134 | 147 |
| 135 DISALLOW_COPY_AND_ASSIGN(FakeWindowCapturer); | 148 DISALLOW_COPY_AND_ASSIGN(FakeWindowCapturer); |
| 136 }; | 149 }; |
| 137 | 150 |
| 151 } // namespace |
| 152 |
| 138 ACTION_P2(CheckListSize, model, expected_list_size) { | 153 ACTION_P2(CheckListSize, model, expected_list_size) { |
| 139 EXPECT_EQ(expected_list_size, model->GetSourceCount()); | 154 EXPECT_EQ(expected_list_size, model->GetSourceCount()); |
| 140 } | 155 } |
| 141 | 156 |
| 142 ACTION_P(QuitMessageLoop, message_loop) { | 157 ACTION_P(QuitMessageLoop, message_loop) { |
| 143 message_loop->task_runner()->PostTask( | 158 message_loop->task_runner()->PostTask( |
| 144 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); | 159 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
| 145 } | 160 } |
| 146 | 161 |
| 147 class DesktopMediaListTest : public testing::Test { | 162 class NativeDesktopMediaListTest : public views::ViewsTestBase { |
| 148 public: | 163 public: |
| 149 DesktopMediaListTest() | 164 NativeDesktopMediaListTest() |
| 150 : window_capturer_(NULL), | 165 : ui_thread_(content::BrowserThread::UI, message_loop()) {} |
| 151 ui_thread_(content::BrowserThread::UI, | 166 |
| 152 &message_loop_) { | 167 void TearDown() override { |
| 168 for (size_t i = 0; i < desktop_widgets_.size(); i++) |
| 169 desktop_widgets_[i].reset(); |
| 170 |
| 171 ViewsTestBase::TearDown(); |
| 153 } | 172 } |
| 154 | 173 |
| 155 void CreateWithDefaultCapturers() { | 174 void CreateWithCapturers(bool screen, bool window) { |
| 156 window_capturer_ = new FakeWindowCapturer(); | 175 webrtc::ScreenCapturer* screen_capturer = nullptr; |
| 176 if (screen) |
| 177 screen_capturer = new FakeScreenCapturer(); |
| 178 |
| 179 if (window) |
| 180 window_capturer_ = new FakeWindowCapturer(); |
| 181 else |
| 182 window_capturer_ = nullptr; |
| 183 |
| 157 model_.reset(new NativeDesktopMediaList( | 184 model_.reset(new NativeDesktopMediaList( |
| 158 scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer()), | 185 scoped_ptr<webrtc::ScreenCapturer>(screen_capturer), |
| 159 scoped_ptr<webrtc::WindowCapturer>(window_capturer_))); | 186 scoped_ptr<webrtc::WindowCapturer>(window_capturer_))); |
| 160 | 187 |
| 161 // Set update period to reduce the time it takes to run tests. | 188 // Set update period to reduce the time it takes to run tests. |
| 162 model_->SetUpdatePeriod(base::TimeDelta::FromMilliseconds(0)); | 189 model_->SetUpdatePeriod(base::TimeDelta::FromMilliseconds(5)); |
| 163 } | 190 } |
| 164 | 191 |
| 165 webrtc::WindowCapturer::WindowList AddWindowsAndVerify( | 192 void AddNativeWindow(int id) { |
| 166 size_t count, bool window_only) { | 193 webrtc::WindowCapturer::Window window; |
| 167 webrtc::WindowCapturer::WindowList list; | 194 window.id = id; |
| 168 for (size_t i = 0; i < count; ++i) { | 195 window.title = "Test window"; |
| 169 webrtc::WindowCapturer::Window window; | 196 window_list_.push_back(window); |
| 170 window.id = i + 1; | 197 } |
| 171 window.title = "Test window"; | 198 |
| 172 list.push_back(window); | 199 #if defined(USE_AURA) |
| 200 std::unique_ptr<views::Widget> CreateDesktopWidget() { |
| 201 std::unique_ptr<views::Widget> widget(new views::Widget); |
| 202 views::Widget::InitParams params; |
| 203 params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; |
| 204 params.accept_events = false; |
| 205 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 206 params.native_widget = new views::DesktopNativeWidgetAura(widget.get()); |
| 207 params.bounds = gfx::Rect(0, 0, 20, 20); |
| 208 widget->Init(params); |
| 209 widget->Show(); |
| 210 return widget; |
| 211 } |
| 212 |
| 213 void AddAuraWindow() { |
| 214 webrtc::WindowCapturer::Window window; |
| 215 window.title = "Test window"; |
| 216 // Create a aura native widow through a widget. |
| 217 desktop_widgets_.push_back(CreateDesktopWidget()); |
| 218 // Get the native window's id. |
| 219 aura::Window* aura_window = desktop_widgets_.back()->GetNativeWindow(); |
| 220 gfx::AcceleratedWidget widget = |
| 221 aura_window->GetHost()->GetAcceleratedWidget(); |
| 222 #if defined(OS_WIN) |
| 223 window.id = reinterpret_cast<DesktopMediaID::Id>(widget); |
| 224 #else |
| 225 window.id = widget; |
| 226 #endif |
| 227 // Get the aura window's id. |
| 228 DesktopMediaID aura_id = DesktopMediaID::RegisterAuraWindow( |
| 229 DesktopMediaID::TYPE_WINDOW, aura_window); |
| 230 native_aura_id_map_[window.id] = aura_id.aura_id; |
| 231 |
| 232 window_list_.push_back(window); |
| 233 } |
| 234 |
| 235 void RemoveAuraWindow(int index) { |
| 236 DCHECK_LT(index, static_cast<int>(desktop_widgets_.size())); |
| 237 |
| 238 // Get the native window's id. |
| 239 aura::Window* aura_window = desktop_widgets_[index]->GetNativeWindow(); |
| 240 gfx::AcceleratedWidget widget = |
| 241 aura_window->GetHost()->GetAcceleratedWidget(); |
| 242 #if defined(OS_WIN) |
| 243 int native_id = reinterpret_cast<DesktopMediaID::Id>(widget); |
| 244 #else |
| 245 int native_id = widget; |
| 246 #endif |
| 247 // Remove the widget and assoicate aura window. |
| 248 desktop_widgets_.erase(desktop_widgets_.begin() + index); |
| 249 // Remove the aura window from the window list. |
| 250 size_t i; |
| 251 for (i = 0; i < window_list_.size(); i++) { |
| 252 if (window_list_[i].id == native_id) |
| 253 break; |
| 173 } | 254 } |
| 174 window_capturer_->SetWindowList(list); | 255 DCHECK_LT(i, window_list_.size()); |
| 256 window_list_.erase(window_list_.begin() + i); |
| 257 native_aura_id_map_.erase(native_id); |
| 258 } |
| 259 |
| 260 #endif // defined(USE_AURA) |
| 261 |
| 262 void AddWindowsAndVerify(bool screen, |
| 263 size_t window_count, |
| 264 size_t aura_count, |
| 265 bool has_view_dialog) { |
| 266 // Create model_. |
| 267 CreateWithCapturers(screen, window_count > 0); |
| 268 |
| 269 #if !defined(USE_AURA) |
| 270 aura_count = 0; |
| 271 #endif |
| 272 if (aura_count >= window_count) |
| 273 aura_count = window_count - 1; |
| 274 |
| 275 if (window_count == 0) |
| 276 has_view_dialog = false; |
| 277 |
| 278 // Set up widows. |
| 279 size_t aura_window_first_index = window_count - aura_count; |
| 280 for (size_t i = 0; i < window_count; ++i) { |
| 281 if (i < aura_window_first_index) { |
| 282 AddNativeWindow(i + 1); |
| 283 } else { |
| 284 #if defined(USE_AURA) |
| 285 AddAuraWindow(); |
| 286 #endif |
| 287 } |
| 288 } |
| 289 |
| 290 if (window_capturer_) |
| 291 window_capturer_->SetWindowList(window_list_); |
| 292 |
| 293 // Set view dialog window ID as the first window id. |
| 294 if (has_view_dialog) { |
| 295 DesktopMediaID dialog_window_id(DesktopMediaID::TYPE_WINDOW, |
| 296 window_list_[0].id); |
| 297 model_->SetViewDialogWindowId(dialog_window_id); |
| 298 window_count--; |
| 299 aura_window_first_index--; |
| 300 } |
| 175 | 301 |
| 176 { | 302 { |
| 177 testing::InSequence dummy; | 303 testing::InSequence dummy; |
| 178 size_t source_count = window_only ? count : count + 1; | 304 size_t source_count = screen ? window_count + 1 : window_count; |
| 179 for (size_t i = 0; i < source_count; ++i) { | 305 for (size_t i = 0; i < source_count; ++i) { |
| 180 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), i)) | 306 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), i)) |
| 181 .WillOnce(CheckListSize(model_.get(), static_cast<int>(i + 1))); | 307 .WillOnce(CheckListSize(model_.get(), static_cast<int>(i + 1))); |
| 182 } | 308 } |
| 183 for (size_t i = 0; i < source_count - 1; ++i) { | 309 for (size_t i = 0; i < source_count - 1; ++i) { |
| 184 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), i)); | 310 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), i)); |
| 185 } | 311 } |
| 186 EXPECT_CALL(observer_, | 312 EXPECT_CALL(observer_, |
| 187 OnSourceThumbnailChanged(model_.get(), source_count - 1)) | 313 OnSourceThumbnailChanged(model_.get(), source_count - 1)) |
| 188 .WillOnce(QuitMessageLoop(&message_loop_)); | 314 .WillOnce(QuitMessageLoop(message_loop())); |
| 189 } | 315 } |
| 190 model_->StartUpdating(&observer_); | 316 model_->StartUpdating(&observer_); |
| 191 message_loop_.Run(); | 317 message_loop()->Run(); |
| 192 | 318 |
| 193 for (size_t i = 0; i < count; ++i) { | 319 if (screen) { |
| 194 size_t source_index = window_only ? i : i + 1; | 320 EXPECT_EQ(model_->GetSource(0).id.type, DesktopMediaID::TYPE_SCREEN); |
| 321 EXPECT_EQ(model_->GetSource(0).id.id, 0); |
| 322 } |
| 323 |
| 324 for (size_t i = 0; i < window_count; ++i) { |
| 325 size_t source_index = screen ? i + 1 : i; |
| 195 EXPECT_EQ(model_->GetSource(source_index).id.type, | 326 EXPECT_EQ(model_->GetSource(source_index).id.type, |
| 196 content::DesktopMediaID::TYPE_WINDOW); | 327 DesktopMediaID::TYPE_WINDOW); |
| 197 EXPECT_EQ(model_->GetSource(source_index).id.id, static_cast<int>(i + 1)); | |
| 198 EXPECT_EQ(model_->GetSource(source_index).name, | 328 EXPECT_EQ(model_->GetSource(source_index).name, |
| 199 base::UTF8ToUTF16("Test window")); | 329 base::UTF8ToUTF16("Test window")); |
| 330 int index = has_view_dialog ? i + 1 : i; |
| 331 int native_id = window_list_[index].id; |
| 332 EXPECT_EQ(model_->GetSource(source_index).id.id, native_id); |
| 333 #if defined(USE_AURA) |
| 334 if (i >= aura_window_first_index) |
| 335 EXPECT_EQ(model_->GetSource(source_index).id.aura_id, |
| 336 native_aura_id_map_[native_id]); |
| 337 #endif |
| 200 } | 338 } |
| 201 testing::Mock::VerifyAndClearExpectations(&observer_); | 339 testing::Mock::VerifyAndClearExpectations(&observer_); |
| 202 return list; | |
| 203 } | 340 } |
| 204 | 341 |
| 205 protected: | 342 protected: |
| 206 // Must be listed before |model_|, so it's destroyed last. | 343 // Must be listed before |model_|, so it's destroyed last. |
| 207 MockObserver observer_; | 344 MockObserver observer_; |
| 208 | 345 |
| 209 // Owned by |model_|; | 346 // Owned by |model_|; |
| 210 FakeWindowCapturer* window_capturer_; | 347 FakeWindowCapturer* window_capturer_; |
| 211 | 348 |
| 349 webrtc::WindowCapturer::WindowList window_list_; |
| 350 std::vector<std::unique_ptr<views::Widget>> desktop_widgets_; |
| 351 std::map<DesktopMediaID::Id, DesktopMediaID::Id> native_aura_id_map_; |
| 212 scoped_ptr<NativeDesktopMediaList> model_; | 352 scoped_ptr<NativeDesktopMediaList> model_; |
| 213 | 353 |
| 214 base::MessageLoop message_loop_; | |
| 215 content::TestBrowserThread ui_thread_; | 354 content::TestBrowserThread ui_thread_; |
| 216 | 355 |
| 217 DISALLOW_COPY_AND_ASSIGN(DesktopMediaListTest); | 356 DISALLOW_COPY_AND_ASSIGN(NativeDesktopMediaListTest); |
| 218 }; | 357 }; |
| 219 | 358 |
| 220 TEST_F(DesktopMediaListTest, InitialSourceList) { | 359 TEST_F(NativeDesktopMediaListTest, WindowsOnly) { |
| 221 CreateWithDefaultCapturers(); | 360 AddWindowsAndVerify(false, kDefaultWindowCount, kDefaultAuraCount, false); |
| 222 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); | 361 } |
| 223 | 362 |
| 224 EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN); | 363 TEST_F(NativeDesktopMediaListTest, ScreenOnly) { |
| 225 EXPECT_EQ(model_->GetSource(0).id.id, 0); | 364 AddWindowsAndVerify(true, 0, 0, false); |
| 226 } | 365 } |
| 227 | 366 |
| 228 // Verifies that the window specified with SetViewDialogWindowId() is filtered | 367 // Verifies that the window specified with SetViewDialogWindowId() is filtered |
| 229 // from the results. | 368 // from the results. |
| 230 TEST_F(DesktopMediaListTest, Filtering) { | 369 TEST_F(NativeDesktopMediaListTest, Filtering) { |
| 231 CreateWithDefaultCapturers(); | 370 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, true); |
| 232 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | |
| 233 | |
| 234 EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN); | |
| 235 EXPECT_EQ(model_->GetSource(0).id.id, 0); | |
| 236 } | 371 } |
| 237 | 372 |
| 238 TEST_F(DesktopMediaListTest, WindowsOnly) { | 373 TEST_F(NativeDesktopMediaListTest, AddNativeWindow) { |
| 239 window_capturer_ = new FakeWindowCapturer(); | 374 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 240 model_.reset(new NativeDesktopMediaList( | 375 |
| 241 scoped_ptr<webrtc::ScreenCapturer>(), | 376 const int index = kDefaultWindowCount + 1; |
| 242 scoped_ptr<webrtc::WindowCapturer>(window_capturer_))); | 377 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), index)) |
| 243 AddWindowsAndVerify(1, true); | 378 .WillOnce(DoAll(CheckListSize(model_.get(), index + 1), |
| 379 QuitMessageLoop(message_loop()))); |
| 380 |
| 381 webrtc::WindowCapturer::Window window; |
| 382 AddNativeWindow(index); |
| 383 window_capturer_->SetWindowList(window_list_); |
| 384 |
| 385 message_loop()->Run(); |
| 386 |
| 387 EXPECT_EQ(model_->GetSource(index).id.type, DesktopMediaID::TYPE_WINDOW); |
| 388 EXPECT_EQ(model_->GetSource(index).id.id, index); |
| 244 } | 389 } |
| 245 | 390 |
| 246 TEST_F(DesktopMediaListTest, ScreenOnly) { | 391 #if defined(USE_AURA) |
| 247 model_.reset(new NativeDesktopMediaList( | 392 TEST_F(NativeDesktopMediaListTest, AddAuraWindow) { |
| 248 scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer), | 393 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 249 scoped_ptr<webrtc::WindowCapturer>())); | |
| 250 | 394 |
| 251 { | 395 const int index = kDefaultWindowCount + 1; |
| 252 testing::InSequence dummy; | 396 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), index)) |
| 253 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 0)) | 397 .WillOnce(DoAll(CheckListSize(model_.get(), index + 1), |
| 254 .WillOnce(CheckListSize(model_.get(), 1)); | 398 QuitMessageLoop(message_loop()))); |
| 255 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 0)) | |
| 256 .WillOnce(QuitMessageLoop(&message_loop_)); | |
| 257 } | |
| 258 model_->StartUpdating(&observer_); | |
| 259 | 399 |
| 260 message_loop_.Run(); | 400 AddAuraWindow(); |
| 401 window_capturer_->SetWindowList(window_list_); |
| 261 | 402 |
| 262 EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN); | 403 message_loop()->Run(); |
| 404 |
| 405 int native_id = window_list_.back().id; |
| 406 EXPECT_EQ(model_->GetSource(index).id.type, DesktopMediaID::TYPE_WINDOW); |
| 407 EXPECT_EQ(model_->GetSource(index).id.id, native_id); |
| 408 EXPECT_EQ(model_->GetSource(index).id.aura_id, |
| 409 native_aura_id_map_[native_id]); |
| 410 } |
| 411 #endif // defined(USE_AURA) |
| 412 |
| 413 TEST_F(NativeDesktopMediaListTest, RemoveNativeWindow) { |
| 414 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 415 |
| 416 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) |
| 417 .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount), |
| 418 QuitMessageLoop(message_loop()))); |
| 419 |
| 420 window_list_.erase(window_list_.begin()); |
| 421 window_capturer_->SetWindowList(window_list_); |
| 422 |
| 423 message_loop()->Run(); |
| 263 } | 424 } |
| 264 | 425 |
| 265 TEST_F(DesktopMediaListTest, AddWindow) { | 426 #if defined(USE_AURA) |
| 266 CreateWithDefaultCapturers(); | 427 TEST_F(NativeDesktopMediaListTest, RemoveAuraWindow) { |
| 267 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); | 428 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 268 | 429 |
| 269 EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 2)) | 430 int aura_window_start_index = kDefaultWindowCount - kDefaultAuraCount + 1; |
| 270 .WillOnce(DoAll(CheckListSize(model_.get(), 3), | 431 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), aura_window_start_index)) |
| 271 QuitMessageLoop(&message_loop_))); | 432 .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount), |
| 433 QuitMessageLoop(message_loop()))); |
| 272 | 434 |
| 273 webrtc::WindowCapturer::Window window; | 435 RemoveAuraWindow(0); |
| 274 window.id = 10; // id=0 is invalid. | 436 window_capturer_->SetWindowList(window_list_); |
| 275 window.title = "Test window 10"; | |
| 276 list.push_back(window); | |
| 277 window_capturer_->SetWindowList(list); | |
| 278 | 437 |
| 279 message_loop_.Run(); | 438 message_loop()->Run(); |
| 439 } |
| 440 #endif // defined(USE_AURA) |
| 280 | 441 |
| 281 EXPECT_EQ(model_->GetSource(2).id.type, content::DesktopMediaID::TYPE_WINDOW); | 442 TEST_F(NativeDesktopMediaListTest, RemoveAllWindows) { |
| 282 EXPECT_EQ(model_->GetSource(2).id.id, 10); | 443 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 444 |
| 445 testing::InSequence seq; |
| 446 for (int i = 0; i < kDefaultWindowCount - 1; i++) { |
| 447 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) |
| 448 .WillOnce(CheckListSize(model_.get(), kDefaultWindowCount - i)); |
| 449 } |
| 450 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) |
| 451 .WillOnce(DoAll(CheckListSize(model_.get(), 1), |
| 452 QuitMessageLoop(message_loop()))); |
| 453 |
| 454 window_list_.clear(); |
| 455 window_capturer_->SetWindowList(window_list_); |
| 456 |
| 457 message_loop()->Run(); |
| 283 } | 458 } |
| 284 | 459 |
| 285 TEST_F(DesktopMediaListTest, RemoveWindow) { | 460 TEST_F(NativeDesktopMediaListTest, UpdateTitle) { |
| 286 CreateWithDefaultCapturers(); | 461 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 287 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | |
| 288 | |
| 289 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 2)) | |
| 290 .WillOnce(DoAll(CheckListSize(model_.get(), 2), | |
| 291 QuitMessageLoop(&message_loop_))); | |
| 292 | |
| 293 list.erase(list.begin() + 1); | |
| 294 window_capturer_->SetWindowList(list); | |
| 295 | |
| 296 message_loop_.Run(); | |
| 297 } | |
| 298 | |
| 299 TEST_F(DesktopMediaListTest, RemoveAllWindows) { | |
| 300 CreateWithDefaultCapturers(); | |
| 301 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | |
| 302 | |
| 303 testing::InSequence seq; | |
| 304 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) | |
| 305 .WillOnce(CheckListSize(model_.get(), 2)); | |
| 306 EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1)) | |
| 307 .WillOnce(DoAll(CheckListSize(model_.get(), 1), | |
| 308 QuitMessageLoop(&message_loop_))); | |
| 309 | |
| 310 list.erase(list.begin(), list.end()); | |
| 311 window_capturer_->SetWindowList(list); | |
| 312 | |
| 313 message_loop_.Run(); | |
| 314 } | |
| 315 | |
| 316 TEST_F(DesktopMediaListTest, UpdateTitle) { | |
| 317 CreateWithDefaultCapturers(); | |
| 318 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false); | |
| 319 | 462 |
| 320 EXPECT_CALL(observer_, OnSourceNameChanged(model_.get(), 1)) | 463 EXPECT_CALL(observer_, OnSourceNameChanged(model_.get(), 1)) |
| 321 .WillOnce(QuitMessageLoop(&message_loop_)); | 464 .WillOnce(QuitMessageLoop(message_loop())); |
| 322 | 465 |
| 323 const std::string kTestTitle = "New Title"; | 466 const std::string kTestTitle = "New Title"; |
| 467 window_list_[0].title = kTestTitle; |
| 468 window_capturer_->SetWindowList(window_list_); |
| 324 | 469 |
| 325 list[0].title = kTestTitle; | 470 message_loop()->Run(); |
| 326 window_capturer_->SetWindowList(list); | |
| 327 | |
| 328 message_loop_.Run(); | |
| 329 | 471 |
| 330 EXPECT_EQ(model_->GetSource(1).name, base::UTF8ToUTF16(kTestTitle)); | 472 EXPECT_EQ(model_->GetSource(1).name, base::UTF8ToUTF16(kTestTitle)); |
| 331 } | 473 } |
| 332 | 474 |
| 333 TEST_F(DesktopMediaListTest, UpdateThumbnail) { | 475 TEST_F(NativeDesktopMediaListTest, UpdateThumbnail) { |
| 334 CreateWithDefaultCapturers(); | 476 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 335 AddWindowsAndVerify(2, false); | |
| 336 | 477 |
| 337 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 1)) | 478 EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 1)) |
| 338 .WillOnce(QuitMessageLoop(&message_loop_)); | 479 .WillOnce(QuitMessageLoop(message_loop())); |
| 480 |
| 339 // Update frame for the window and verify that we get notification about it. | 481 // Update frame for the window and verify that we get notification about it. |
| 340 window_capturer_->SetNextFrameValue(1, 1); | 482 window_capturer_->SetNextFrameValue(1, 10); |
| 341 | 483 |
| 342 message_loop_.Run(); | 484 message_loop()->Run(); |
| 343 } | 485 } |
| 344 | 486 |
| 345 TEST_F(DesktopMediaListTest, MoveWindow) { | 487 TEST_F(NativeDesktopMediaListTest, MoveWindow) { |
| 346 CreateWithDefaultCapturers(); | 488 AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false); |
| 347 webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false); | |
| 348 | 489 |
| 349 EXPECT_CALL(observer_, OnSourceMoved(model_.get(), 2, 1)) | 490 EXPECT_CALL(observer_, OnSourceMoved(model_.get(), 2, 1)) |
| 350 .WillOnce(DoAll(CheckListSize(model_.get(), 3), | 491 .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount + 1), |
| 351 QuitMessageLoop(&message_loop_))); | 492 QuitMessageLoop(message_loop()))); |
| 352 | 493 |
| 353 // Swap the two windows. | 494 // Swap the two windows. |
| 354 webrtc::WindowCapturer::Window temp = list[0]; | 495 webrtc::WindowCapturer::Window temp = window_list_[0]; |
| 355 list[0] = list[1]; | 496 window_list_[0] = window_list_[1]; |
| 356 list[1] = temp; | 497 window_list_[1] = temp; |
| 357 window_capturer_->SetWindowList(list); | 498 window_capturer_->SetWindowList(window_list_); |
| 358 | 499 |
| 359 message_loop_.Run(); | 500 message_loop()->Run(); |
| 360 } | 501 } |
| 361 | |
| 362 } // namespace | |
| OLD | NEW |