summaryrefslogtreecommitdiff
path: root/chromium/ui/views/view_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/views/view_unittest.cc')
-rw-r--r--chromium/ui/views/view_unittest.cc172
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);
}
////////////////////////////////////////////////////////////////////////////////