Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4417)

Unified Diff: chrome/browser/media/native_desktop_media_list_unittest.cc

Issue 1828303003: Modify unit tests for NativeDesktopMediaList to cover aura window capture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/media/native_desktop_media_list.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/media/native_desktop_media_list_unittest.cc
diff --git a/chrome/browser/media/native_desktop_media_list_unittest.cc b/chrome/browser/media/native_desktop_media_list_unittest.cc
index 07ba3ecd93ed232f88ea9633033e812f18900853..945dc043eefb63c7d323140ce103f26cb97832f1 100644
--- a/chrome/browser/media/native_desktop_media_list_unittest.cc
+++ b/chrome/browser/media/native_desktop_media_list_unittest.cc
@@ -7,10 +7,10 @@
#include <stddef.h>
#include <stdint.h>
#include <string.h>
+#include <vector>
#include "base/location.h"
#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/lock.h"
@@ -21,12 +21,25 @@
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
#include "third_party/webrtc/modules/desktop_capture/screen_capturer.h"
#include "third_party/webrtc/modules/desktop_capture/window_capturer.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
+#include "ui/views/widget/widget.h"
+using content::DesktopMediaID;
using testing::_;
using testing::DoAll;
namespace {
+static const int kDefaultWindowCount = 2;
+#if defined(USE_AURA)
+static const int kDefaultAuraCount = 1;
+#else
+static const int kDefaultAuraCount = 0;
+#endif
+
class MockObserver : public DesktopMediaListObserver {
public:
MOCK_METHOD2(OnSourceAdded, void(DesktopMediaList* list, int index));
@@ -135,6 +148,8 @@ class FakeWindowCapturer : public webrtc::WindowCapturer {
DISALLOW_COPY_AND_ASSIGN(FakeWindowCapturer);
};
+} // namespace
+
ACTION_P2(CheckListSize, model, expected_list_size) {
EXPECT_EQ(expected_list_size, model->GetSourceCount());
}
@@ -144,38 +159,149 @@ ACTION_P(QuitMessageLoop, message_loop) {
FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
}
-class DesktopMediaListTest : public testing::Test {
+class NativeDesktopMediaListTest : public views::ViewsTestBase {
public:
- DesktopMediaListTest()
- : window_capturer_(NULL),
- ui_thread_(content::BrowserThread::UI,
- &message_loop_) {
+ NativeDesktopMediaListTest()
+ : ui_thread_(content::BrowserThread::UI, message_loop()) {}
+
+ void TearDown() override {
+ for (size_t i = 0; i < desktop_widgets_.size(); i++)
+ desktop_widgets_[i].reset();
+
+ ViewsTestBase::TearDown();
}
- void CreateWithDefaultCapturers() {
- window_capturer_ = new FakeWindowCapturer();
+ void CreateWithCapturers(bool screen, bool window) {
+ webrtc::ScreenCapturer* screen_capturer = nullptr;
+ if (screen)
+ screen_capturer = new FakeScreenCapturer();
+
+ if (window)
+ window_capturer_ = new FakeWindowCapturer();
+ else
+ window_capturer_ = nullptr;
+
model_.reset(new NativeDesktopMediaList(
- scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer()),
+ scoped_ptr<webrtc::ScreenCapturer>(screen_capturer),
scoped_ptr<webrtc::WindowCapturer>(window_capturer_)));
// Set update period to reduce the time it takes to run tests.
- model_->SetUpdatePeriod(base::TimeDelta::FromMilliseconds(0));
+ model_->SetUpdatePeriod(base::TimeDelta::FromMilliseconds(5));
+ }
+
+ void AddNativeWindow(int id) {
+ webrtc::WindowCapturer::Window window;
+ window.id = id;
+ window.title = "Test window";
+ window_list_.push_back(window);
+ }
+
+#if defined(USE_AURA)
+ std::unique_ptr<views::Widget> CreateDesktopWidget() {
+ std::unique_ptr<views::Widget> widget(new views::Widget);
+ views::Widget::InitParams params;
+ params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+ params.accept_events = false;
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.native_widget = new views::DesktopNativeWidgetAura(widget.get());
+ params.bounds = gfx::Rect(0, 0, 20, 20);
+ widget->Init(params);
+ widget->Show();
+ return widget;
}
- webrtc::WindowCapturer::WindowList AddWindowsAndVerify(
- size_t count, bool window_only) {
- webrtc::WindowCapturer::WindowList list;
- for (size_t i = 0; i < count; ++i) {
- webrtc::WindowCapturer::Window window;
- window.id = i + 1;
- window.title = "Test window";
- list.push_back(window);
+ void AddAuraWindow() {
+ webrtc::WindowCapturer::Window window;
+ window.title = "Test window";
+ // Create a aura native widow through a widget.
+ desktop_widgets_.push_back(CreateDesktopWidget());
+ // Get the native window's id.
+ aura::Window* aura_window = desktop_widgets_.back()->GetNativeWindow();
+ gfx::AcceleratedWidget widget =
+ aura_window->GetHost()->GetAcceleratedWidget();
+#if defined(OS_WIN)
+ window.id = reinterpret_cast<DesktopMediaID::Id>(widget);
+#else
+ window.id = widget;
+#endif
+ // Get the aura window's id.
+ DesktopMediaID aura_id = DesktopMediaID::RegisterAuraWindow(
+ DesktopMediaID::TYPE_WINDOW, aura_window);
+ native_aura_id_map_[window.id] = aura_id.aura_id;
+
+ window_list_.push_back(window);
+ }
+
+ void RemoveAuraWindow(int index) {
+ DCHECK_LT(index, static_cast<int>(desktop_widgets_.size()));
+
+ // Get the native window's id.
+ aura::Window* aura_window = desktop_widgets_[index]->GetNativeWindow();
+ gfx::AcceleratedWidget widget =
+ aura_window->GetHost()->GetAcceleratedWidget();
+#if defined(OS_WIN)
+ int native_id = reinterpret_cast<DesktopMediaID::Id>(widget);
+#else
+ int native_id = widget;
+#endif
+ // Remove the widget and assoicate aura window.
+ desktop_widgets_.erase(desktop_widgets_.begin() + index);
+ // Remove the aura window from the window list.
+ size_t i;
+ for (i = 0; i < window_list_.size(); i++) {
+ if (window_list_[i].id == native_id)
+ break;
+ }
+ DCHECK_LT(i, window_list_.size());
+ window_list_.erase(window_list_.begin() + i);
+ native_aura_id_map_.erase(native_id);
+ }
+
+#endif // defined(USE_AURA)
+
+ void AddWindowsAndVerify(bool screen,
+ size_t window_count,
+ size_t aura_count,
+ bool has_view_dialog) {
+ // Create model_.
+ CreateWithCapturers(screen, window_count > 0);
+
+#if !defined(USE_AURA)
+ aura_count = 0;
+#endif
+ if (aura_count >= window_count)
+ aura_count = window_count - 1;
+
+ if (window_count == 0)
+ has_view_dialog = false;
+
+ // Set up widows.
+ size_t aura_window_first_index = window_count - aura_count;
+ for (size_t i = 0; i < window_count; ++i) {
+ if (i < aura_window_first_index) {
+ AddNativeWindow(i + 1);
+ } else {
+#if defined(USE_AURA)
+ AddAuraWindow();
+#endif
+ }
+ }
+
+ if (window_capturer_)
+ window_capturer_->SetWindowList(window_list_);
+
+ // Set view dialog window ID as the first window id.
+ if (has_view_dialog) {
+ DesktopMediaID dialog_window_id(DesktopMediaID::TYPE_WINDOW,
+ window_list_[0].id);
+ model_->SetViewDialogWindowId(dialog_window_id);
+ window_count--;
+ aura_window_first_index--;
}
- window_capturer_->SetWindowList(list);
{
testing::InSequence dummy;
- size_t source_count = window_only ? count : count + 1;
+ size_t source_count = screen ? window_count + 1 : window_count;
for (size_t i = 0; i < source_count; ++i) {
EXPECT_CALL(observer_, OnSourceAdded(model_.get(), i))
.WillOnce(CheckListSize(model_.get(), static_cast<int>(i + 1)));
@@ -185,21 +311,32 @@ class DesktopMediaListTest : public testing::Test {
}
EXPECT_CALL(observer_,
OnSourceThumbnailChanged(model_.get(), source_count - 1))
- .WillOnce(QuitMessageLoop(&message_loop_));
+ .WillOnce(QuitMessageLoop(message_loop()));
}
model_->StartUpdating(&observer_);
- message_loop_.Run();
+ message_loop()->Run();
- for (size_t i = 0; i < count; ++i) {
- size_t source_index = window_only ? i : i + 1;
+ if (screen) {
+ EXPECT_EQ(model_->GetSource(0).id.type, DesktopMediaID::TYPE_SCREEN);
+ EXPECT_EQ(model_->GetSource(0).id.id, 0);
+ }
+
+ for (size_t i = 0; i < window_count; ++i) {
+ size_t source_index = screen ? i + 1 : i;
EXPECT_EQ(model_->GetSource(source_index).id.type,
- content::DesktopMediaID::TYPE_WINDOW);
- EXPECT_EQ(model_->GetSource(source_index).id.id, static_cast<int>(i + 1));
+ DesktopMediaID::TYPE_WINDOW);
EXPECT_EQ(model_->GetSource(source_index).name,
- base::UTF8ToUTF16("Test window"));
+ base::UTF8ToUTF16("Test window"));
+ int index = has_view_dialog ? i + 1 : i;
+ int native_id = window_list_[index].id;
+ EXPECT_EQ(model_->GetSource(source_index).id.id, native_id);
+#if defined(USE_AURA)
+ if (i >= aura_window_first_index)
+ EXPECT_EQ(model_->GetSource(source_index).id.aura_id,
+ native_aura_id_map_[native_id]);
+#endif
}
testing::Mock::VerifyAndClearExpectations(&observer_);
- return list;
}
protected:
@@ -209,154 +346,156 @@ class DesktopMediaListTest : public testing::Test {
// Owned by |model_|;
FakeWindowCapturer* window_capturer_;
+ webrtc::WindowCapturer::WindowList window_list_;
+ std::vector<std::unique_ptr<views::Widget>> desktop_widgets_;
+ std::map<DesktopMediaID::Id, DesktopMediaID::Id> native_aura_id_map_;
scoped_ptr<NativeDesktopMediaList> model_;
- base::MessageLoop message_loop_;
content::TestBrowserThread ui_thread_;
- DISALLOW_COPY_AND_ASSIGN(DesktopMediaListTest);
+ DISALLOW_COPY_AND_ASSIGN(NativeDesktopMediaListTest);
};
-TEST_F(DesktopMediaListTest, InitialSourceList) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false);
+TEST_F(NativeDesktopMediaListTest, WindowsOnly) {
+ AddWindowsAndVerify(false, kDefaultWindowCount, kDefaultAuraCount, false);
+}
- EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN);
- EXPECT_EQ(model_->GetSource(0).id.id, 0);
+TEST_F(NativeDesktopMediaListTest, ScreenOnly) {
+ AddWindowsAndVerify(true, 0, 0, false);
}
// Verifies that the window specified with SetViewDialogWindowId() is filtered
// from the results.
-TEST_F(DesktopMediaListTest, Filtering) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false);
-
- EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN);
- EXPECT_EQ(model_->GetSource(0).id.id, 0);
+TEST_F(NativeDesktopMediaListTest, Filtering) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, true);
}
-TEST_F(DesktopMediaListTest, WindowsOnly) {
- window_capturer_ = new FakeWindowCapturer();
- model_.reset(new NativeDesktopMediaList(
- scoped_ptr<webrtc::ScreenCapturer>(),
- scoped_ptr<webrtc::WindowCapturer>(window_capturer_)));
- AddWindowsAndVerify(1, true);
-}
+TEST_F(NativeDesktopMediaListTest, AddNativeWindow) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
-TEST_F(DesktopMediaListTest, ScreenOnly) {
- model_.reset(new NativeDesktopMediaList(
- scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer),
- scoped_ptr<webrtc::WindowCapturer>()));
-
- {
- testing::InSequence dummy;
- EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 0))
- .WillOnce(CheckListSize(model_.get(), 1));
- EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 0))
- .WillOnce(QuitMessageLoop(&message_loop_));
- }
- model_->StartUpdating(&observer_);
+ const int index = kDefaultWindowCount + 1;
+ EXPECT_CALL(observer_, OnSourceAdded(model_.get(), index))
+ .WillOnce(DoAll(CheckListSize(model_.get(), index + 1),
+ QuitMessageLoop(message_loop())));
- message_loop_.Run();
+ webrtc::WindowCapturer::Window window;
+ AddNativeWindow(index);
+ window_capturer_->SetWindowList(window_list_);
+
+ message_loop()->Run();
- EXPECT_EQ(model_->GetSource(0).id.type, content::DesktopMediaID::TYPE_SCREEN);
+ EXPECT_EQ(model_->GetSource(index).id.type, DesktopMediaID::TYPE_WINDOW);
+ EXPECT_EQ(model_->GetSource(index).id.id, index);
}
-TEST_F(DesktopMediaListTest, AddWindow) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false);
+#if defined(USE_AURA)
+TEST_F(NativeDesktopMediaListTest, AddAuraWindow) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
- EXPECT_CALL(observer_, OnSourceAdded(model_.get(), 2))
- .WillOnce(DoAll(CheckListSize(model_.get(), 3),
- QuitMessageLoop(&message_loop_)));
+ const int index = kDefaultWindowCount + 1;
+ EXPECT_CALL(observer_, OnSourceAdded(model_.get(), index))
+ .WillOnce(DoAll(CheckListSize(model_.get(), index + 1),
+ QuitMessageLoop(message_loop())));
- webrtc::WindowCapturer::Window window;
- window.id = 10; // id=0 is invalid.
- window.title = "Test window 10";
- list.push_back(window);
- window_capturer_->SetWindowList(list);
+ AddAuraWindow();
+ window_capturer_->SetWindowList(window_list_);
+
+ message_loop()->Run();
+
+ int native_id = window_list_.back().id;
+ EXPECT_EQ(model_->GetSource(index).id.type, DesktopMediaID::TYPE_WINDOW);
+ EXPECT_EQ(model_->GetSource(index).id.id, native_id);
+ EXPECT_EQ(model_->GetSource(index).id.aura_id,
+ native_aura_id_map_[native_id]);
+}
+#endif // defined(USE_AURA)
+
+TEST_F(NativeDesktopMediaListTest, RemoveNativeWindow) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
- message_loop_.Run();
+ EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1))
+ .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount),
+ QuitMessageLoop(message_loop())));
- EXPECT_EQ(model_->GetSource(2).id.type, content::DesktopMediaID::TYPE_WINDOW);
- EXPECT_EQ(model_->GetSource(2).id.id, 10);
+ window_list_.erase(window_list_.begin());
+ window_capturer_->SetWindowList(window_list_);
+
+ message_loop()->Run();
}
-TEST_F(DesktopMediaListTest, RemoveWindow) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false);
+#if defined(USE_AURA)
+TEST_F(NativeDesktopMediaListTest, RemoveAuraWindow) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
- EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 2))
- .WillOnce(DoAll(CheckListSize(model_.get(), 2),
- QuitMessageLoop(&message_loop_)));
+ int aura_window_start_index = kDefaultWindowCount - kDefaultAuraCount + 1;
+ EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), aura_window_start_index))
+ .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount),
+ QuitMessageLoop(message_loop())));
- list.erase(list.begin() + 1);
- window_capturer_->SetWindowList(list);
+ RemoveAuraWindow(0);
+ window_capturer_->SetWindowList(window_list_);
- message_loop_.Run();
+ message_loop()->Run();
}
+#endif // defined(USE_AURA)
-TEST_F(DesktopMediaListTest, RemoveAllWindows) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false);
+TEST_F(NativeDesktopMediaListTest, RemoveAllWindows) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
testing::InSequence seq;
- EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1))
- .WillOnce(CheckListSize(model_.get(), 2));
+ for (int i = 0; i < kDefaultWindowCount - 1; i++) {
+ EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1))
+ .WillOnce(CheckListSize(model_.get(), kDefaultWindowCount - i));
+ }
EXPECT_CALL(observer_, OnSourceRemoved(model_.get(), 1))
.WillOnce(DoAll(CheckListSize(model_.get(), 1),
- QuitMessageLoop(&message_loop_)));
+ QuitMessageLoop(message_loop())));
- list.erase(list.begin(), list.end());
- window_capturer_->SetWindowList(list);
+ window_list_.clear();
+ window_capturer_->SetWindowList(window_list_);
- message_loop_.Run();
+ message_loop()->Run();
}
-TEST_F(DesktopMediaListTest, UpdateTitle) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(1, false);
+TEST_F(NativeDesktopMediaListTest, UpdateTitle) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
EXPECT_CALL(observer_, OnSourceNameChanged(model_.get(), 1))
- .WillOnce(QuitMessageLoop(&message_loop_));
+ .WillOnce(QuitMessageLoop(message_loop()));
const std::string kTestTitle = "New Title";
+ window_list_[0].title = kTestTitle;
+ window_capturer_->SetWindowList(window_list_);
- list[0].title = kTestTitle;
- window_capturer_->SetWindowList(list);
-
- message_loop_.Run();
+ message_loop()->Run();
EXPECT_EQ(model_->GetSource(1).name, base::UTF8ToUTF16(kTestTitle));
}
-TEST_F(DesktopMediaListTest, UpdateThumbnail) {
- CreateWithDefaultCapturers();
- AddWindowsAndVerify(2, false);
+TEST_F(NativeDesktopMediaListTest, UpdateThumbnail) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
EXPECT_CALL(observer_, OnSourceThumbnailChanged(model_.get(), 1))
- .WillOnce(QuitMessageLoop(&message_loop_));
+ .WillOnce(QuitMessageLoop(message_loop()));
+
// Update frame for the window and verify that we get notification about it.
- window_capturer_->SetNextFrameValue(1, 1);
+ window_capturer_->SetNextFrameValue(1, 10);
- message_loop_.Run();
+ message_loop()->Run();
}
-TEST_F(DesktopMediaListTest, MoveWindow) {
- CreateWithDefaultCapturers();
- webrtc::WindowCapturer::WindowList list = AddWindowsAndVerify(2, false);
+TEST_F(NativeDesktopMediaListTest, MoveWindow) {
+ AddWindowsAndVerify(true, kDefaultWindowCount, kDefaultAuraCount, false);
EXPECT_CALL(observer_, OnSourceMoved(model_.get(), 2, 1))
- .WillOnce(DoAll(CheckListSize(model_.get(), 3),
- QuitMessageLoop(&message_loop_)));
+ .WillOnce(DoAll(CheckListSize(model_.get(), kDefaultWindowCount + 1),
+ QuitMessageLoop(message_loop())));
// Swap the two windows.
- webrtc::WindowCapturer::Window temp = list[0];
- list[0] = list[1];
- list[1] = temp;
- window_capturer_->SetWindowList(list);
+ webrtc::WindowCapturer::Window temp = window_list_[0];
+ window_list_[0] = window_list_[1];
+ window_list_[1] = temp;
+ window_capturer_->SetWindowList(window_list_);
- message_loop_.Run();
+ message_loop()->Run();
}
-
-} // namespace
« no previous file with comments | « chrome/browser/media/native_desktop_media_list.cc ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698