diff options
Diffstat (limited to 'chromium/ui/views/view_unittest.cc')
-rw-r--r-- | chromium/ui/views/view_unittest.cc | 172 |
1 files changed, 56 insertions, 116 deletions
diff --git a/chromium/ui/views/view_unittest.cc b/chromium/ui/views/view_unittest.cc index 53b28f3cb93..e0fa07e46b1 100644 --- a/chromium/ui/views/view_unittest.cc +++ b/chromium/ui/views/view_unittest.cc @@ -12,12 +12,12 @@ #include "testing/gmock/include/gmock/gmock.h" #include "ui/base/accelerators/accelerator.h" #include "ui/base/clipboard/clipboard.h" -#include "ui/base/events/event.h" -#include "ui/base/keycodes/keyboard_codes.h" #include "ui/base/l10n/l10n_util.h" #include "ui/compositor/compositor.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator.h" +#include "ui/events/event.h" +#include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/canvas.h" #include "ui/gfx/path.h" #include "ui/gfx/transform.h" @@ -1545,131 +1545,71 @@ TEST_F(ViewTest, DISABLED_RerouteMouseWheelTest) { //////////////////////////////////////////////////////////////////////////////// // Native view hierachy //////////////////////////////////////////////////////////////////////////////// -class TestNativeViewHierarchy : public View { +class ToplevelWidgetObserverView : public View { public: - TestNativeViewHierarchy() { + ToplevelWidgetObserverView() : toplevel_(NULL) { } - - virtual void NativeViewHierarchyChanged( - bool attached, - gfx::NativeView native_view, - internal::RootView* root_view) OVERRIDE { - NotificationInfo info; - info.attached = attached; - info.native_view = native_view; - info.root_view = root_view; - notifications_.push_back(info); - }; - struct NotificationInfo { - bool attached; - gfx::NativeView native_view; - internal::RootView* root_view; - }; - static const size_t kTotalViews = 2; - std::vector<NotificationInfo> notifications_; -}; - -class TestChangeNativeViewHierarchy { - public: - explicit TestChangeNativeViewHierarchy(ViewTest *view_test) { - view_test_ = view_test; - native_host_ = new NativeViewHost(); - host_ = new Widget; - Widget::InitParams params = - view_test->CreateParams(Widget::InitParams::TYPE_POPUP); - params.bounds = gfx::Rect(0, 0, 500, 300); - host_->Init(params); - host_->GetRootView()->AddChildView(native_host_); - for (size_t i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { - windows_[i] = new Widget; - Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.parent = host_->GetNativeView(); - params.bounds = gfx::Rect(0, 0, 500, 300); - windows_[i]->Init(params); - root_views_[i] = windows_[i]->GetRootView(); - test_views_[i] = new TestNativeViewHierarchy; - root_views_[i]->AddChildView(test_views_[i]); - } + virtual ~ToplevelWidgetObserverView() { } - ~TestChangeNativeViewHierarchy() { - for (size_t i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { - windows_[i]->Close(); + // View overrides: + virtual void ViewHierarchyChanged( + const ViewHierarchyChangedDetails& details) OVERRIDE { + if (details.is_add) { + toplevel_ = GetWidget() ? GetWidget()->GetTopLevelWidget() : NULL; + } else { + toplevel_ = NULL; } - host_->Close(); - // Will close and self-delete widgets - no need to manually delete them. - view_test_->RunPendingMessages(); } - - void CheckEnumeratingNativeWidgets() { - if (!host_->GetTopLevelWidget()) - return; - Widget::Widgets widgets; - Widget::GetAllChildWidgets(host_->GetNativeView(), &widgets); - EXPECT_EQ(TestNativeViewHierarchy::kTotalViews + 1, widgets.size()); - // Unfortunately there is no guarantee the sequence of views here so always - // go through all of them. - for (Widget::Widgets::iterator i = widgets.begin(); - i != widgets.end(); ++i) { - View* root_view = (*i)->GetRootView(); - if (host_->GetRootView() == root_view) - continue; - size_t j; - for (j = 0; j < TestNativeViewHierarchy::kTotalViews; ++j) - if (root_views_[j] == root_view) - break; - // EXPECT_LT/GT/GE() fails to compile with class-defined constants - // with gcc, with error - // "error: undefined reference to 'TestNativeViewHierarchy::kTotalViews'" - // so I forced to use EXPECT_TRUE() instead. - EXPECT_TRUE(TestNativeViewHierarchy::kTotalViews > j); - } + virtual void NativeViewHierarchyChanged() OVERRIDE { + toplevel_ = GetWidget() ? GetWidget()->GetTopLevelWidget() : NULL; } - void CheckChangingHierarhy() { - size_t i; - for (i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { - // TODO(georgey): use actual hierarchy changes to send notifications. - static_cast<internal::RootView*>(root_views_[i])-> - NotifyNativeViewHierarchyChanged(false, host_->GetNativeView()); - static_cast<internal::RootView*>(root_views_[i])-> - NotifyNativeViewHierarchyChanged(true, host_->GetNativeView()); - } - for (i = 0; i < TestNativeViewHierarchy::kTotalViews; ++i) { - ASSERT_EQ(static_cast<size_t>(2), test_views_[i]->notifications_.size()); - EXPECT_FALSE(test_views_[i]->notifications_[0].attached); - EXPECT_EQ(host_->GetNativeView(), - test_views_[i]->notifications_[0].native_view); - EXPECT_EQ(root_views_[i], test_views_[i]->notifications_[0].root_view); - EXPECT_TRUE(test_views_[i]->notifications_[1].attached); - EXPECT_EQ(host_->GetNativeView(), - test_views_[i]->notifications_[1].native_view); - EXPECT_EQ(root_views_[i], test_views_[i]->notifications_[1].root_view); - } - } + Widget* toplevel() { return toplevel_; } - NativeViewHost* native_host_; - Widget* host_; - Widget* windows_[TestNativeViewHierarchy::kTotalViews]; - View* root_views_[TestNativeViewHierarchy::kTotalViews]; - TestNativeViewHierarchy* test_views_[TestNativeViewHierarchy::kTotalViews]; - ViewTest* view_test_; -}; + private: + Widget* toplevel_; -TEST_F(ViewTest, ChangeNativeViewHierarchyFindRoots) { - // TODO(georgey): Fix the test for Linux -#if defined(OS_WIN) - TestChangeNativeViewHierarchy test(this); - test.CheckEnumeratingNativeWidgets(); -#endif -} + DISALLOW_COPY_AND_ASSIGN(ToplevelWidgetObserverView); +}; -TEST_F(ViewTest, ChangeNativeViewHierarchyChangeHierarchy) { - // TODO(georgey): Fix the test for Linux -#if defined(OS_WIN) - TestChangeNativeViewHierarchy test(this); - test.CheckChangingHierarhy(); -#endif +// Test that a view can track the current top level widget by overriding +// View::ViewHierarchyChanged() and View::NativeViewHierarchyChanged(). +TEST_F(ViewTest, NativeViewHierarchyChanged) { + scoped_ptr<Widget> toplevel1(new Widget); + Widget::InitParams toplevel1_params = + CreateParams(Widget::InitParams::TYPE_POPUP); + toplevel1_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + toplevel1->Init(toplevel1_params); + + scoped_ptr<Widget> toplevel2(new Widget); + Widget::InitParams toplevel2_params = + CreateParams(Widget::InitParams::TYPE_POPUP); + toplevel2_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + toplevel2->Init(toplevel2_params); + + Widget* child = new Widget; + Widget::InitParams child_params(Widget::InitParams::TYPE_CONTROL); + child_params.parent = toplevel1->GetNativeView(); + child->Init(child_params); + + ToplevelWidgetObserverView* observer_view = + new ToplevelWidgetObserverView(); + EXPECT_EQ(NULL, observer_view->toplevel()); + + child->SetContentsView(observer_view); + EXPECT_EQ(toplevel1, observer_view->toplevel()); + + Widget::ReparentNativeView(child->GetNativeView(), + toplevel2->GetNativeView()); + EXPECT_EQ(toplevel2, observer_view->toplevel()); + + observer_view->parent()->RemoveChildView(observer_view); + EXPECT_EQ(NULL, observer_view->toplevel()); + + // Make |observer_view| |child|'s contents view again so that it gets deleted + // with the widget. + child->SetContentsView(observer_view); } //////////////////////////////////////////////////////////////////////////////// |