diff options
Diffstat (limited to 'chromium/ui/views/corewm/tooltip_controller_unittest.cc')
-rw-r--r-- | chromium/ui/views/corewm/tooltip_controller_unittest.cc | 452 |
1 files changed, 337 insertions, 115 deletions
diff --git a/chromium/ui/views/corewm/tooltip_controller_unittest.cc b/chromium/ui/views/corewm/tooltip_controller_unittest.cc index 6ebf4b9f828..e3487ae854b 100644 --- a/chromium/ui/views/corewm/tooltip_controller_unittest.cc +++ b/chromium/ui/views/corewm/tooltip_controller_unittest.cc @@ -7,14 +7,13 @@ #include "base/strings/utf_string_conversions.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/client/screen_position_client.h" -#include "ui/aura/client/tooltip_client.h" -#include "ui/aura/client/window_types.h" #include "ui/aura/env.h" -#include "ui/aura/root_window.h" #include "ui/aura/test/aura_test_base.h" #include "ui/aura/test/event_generator.h" #include "ui/aura/test/test_screen.h" +#include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" +#include "ui/aura/window_event_dispatcher.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/font.h" #include "ui/gfx/point.h" @@ -23,9 +22,15 @@ #include "ui/gfx/text_elider.h" #include "ui/views/corewm/tooltip_aura.h" #include "ui/views/corewm/tooltip_controller_test_helper.h" +#include "ui/views/test/desktop_test_views_delegate.h" +#include "ui/views/test/test_views_delegate.h" #include "ui/views/view.h" #include "ui/views/widget/tooltip_manager.h" #include "ui/views/widget/widget.h" +#include "ui/wm/core/default_activation_client.h" +#include "ui/wm/core/wm_state.h" +#include "ui/wm/public/tooltip_client.h" +#include "ui/wm/public/window_types.h" #if defined(OS_WIN) #include "ui/base/win/scoped_ole_initializer.h" @@ -36,6 +41,8 @@ #include "ui/views/widget/desktop_aura/desktop_screen.h" #endif +using base::ASCIIToUTF16; + namespace views { namespace corewm { namespace test { @@ -72,7 +79,14 @@ class TooltipControllerTest : public aura::test::AuraTestBase { virtual ~TooltipControllerTest() {} virtual void SetUp() OVERRIDE { +#if defined(OS_CHROMEOS) + views_delegate_.reset(new TestViewsDelegate); +#else + views_delegate_.reset(new DesktopTestViewsDelegate); +#endif + aura::test::AuraTestBase::SetUp(); + new wm::DefaultActivationClient(root_window()); #if defined(OS_CHROMEOS) controller_.reset(new TooltipController( scoped_ptr<views::corewm::Tooltip>( @@ -100,6 +114,7 @@ class TooltipControllerTest : public aura::test::AuraTestBase { helper_.reset(); widget_.reset(); aura::test::AuraTestBase::TearDown(); + views_delegate_.reset(); } protected: @@ -126,6 +141,9 @@ class TooltipControllerTest : public aura::test::AuraTestBase { private: scoped_ptr<TooltipController> controller_; + + scoped_ptr<views::TestViewsDelegate> views_delegate_; + #if defined(OS_WIN) ui::ScopedOleInitializer ole_initializer_; #endif @@ -135,15 +153,15 @@ class TooltipControllerTest : public aura::test::AuraTestBase { TEST_F(TooltipControllerTest, ViewTooltip) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); generator_->MoveMouseToCenterOf(GetWindow()); EXPECT_EQ(GetWindow(), GetRootWindow()->GetEventHandlerForPoint( generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow())); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow()); // Fire tooltip timer so tooltip becomes visible. @@ -160,7 +178,7 @@ TEST_F(TooltipControllerTest, ViewTooltip) { TEST_F(TooltipControllerTest, TooltipsInMultipleViews) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); PrepareSecondView(); @@ -176,7 +194,7 @@ TEST_F(TooltipControllerTest, TooltipsInMultipleViews) { EXPECT_TRUE(helper_->IsTooltipVisible()); EXPECT_EQ(window, root_window->GetEventHandlerForPoint( generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -186,7 +204,7 @@ TEST_F(TooltipControllerTest, TooltipsInMultipleViews) { EXPECT_FALSE(helper_->IsTooltipVisible()); EXPECT_EQ(window, root_window->GetEventHandlerForPoint( generator_->current_location())); - string16 expected_tooltip; // = "" + base::string16 expected_tooltip; // = "" EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -195,11 +213,11 @@ TEST_F(TooltipControllerTest, TooltipsInMultipleViews) { TEST_F(TooltipControllerTest, EnableOrDisableTooltips) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); generator_->MoveMouseRelativeTo(GetWindow(), view_->bounds().CenterPoint()); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); // Fire tooltip timer so tooltip becomes visible. helper_->FireTooltipTimer(); @@ -221,7 +239,7 @@ TEST_F(TooltipControllerTest, EnableOrDisableTooltips) { // Verifies tooltip isn't shown if tooltip text consists entirely of whitespace. TEST_F(TooltipControllerTest, DontShowEmptyTooltips) { view_->set_tooltip_text(ASCIIToUTF16(" ")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); generator_->MoveMouseRelativeTo(GetWindow(), view_->bounds().CenterPoint()); @@ -232,7 +250,7 @@ TEST_F(TooltipControllerTest, DontShowEmptyTooltips) { TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); TooltipTestView* view2 = PrepareSecondView(); @@ -261,7 +279,7 @@ TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) { EXPECT_EQ(window, GetRootWindow()->GetEventHandlerForPoint( generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -273,7 +291,7 @@ TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) { helper_->FireTooltipTimer(); EXPECT_TRUE(helper_->IsTooltipVisible()); EXPECT_TRUE(helper_->IsTooltipShownTimerRunning()); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -281,7 +299,7 @@ TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) { TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(NULL, helper_->GetTooltipWindow()); TooltipTestView* view2 = PrepareSecondView(); @@ -309,7 +327,7 @@ TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) { EXPECT_FALSE(helper_->IsTooltipShownTimerRunning()); EXPECT_EQ(window, GetRootWindow()->GetEventHandlerForPoint( generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -321,7 +339,7 @@ TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) { helper_->FireTooltipTimer(); EXPECT_TRUE(helper_->IsTooltipVisible()); EXPECT_TRUE(helper_->IsTooltipShownTimerRunning()); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); EXPECT_EQ(window, helper_->GetTooltipWindow()); @@ -331,9 +349,9 @@ TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) { TEST_F(TooltipControllerTest, HideOnExit) { view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); generator_->MoveMouseToCenterOf(GetWindow()); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow())); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow()); // Fire tooltip timer so tooltip becomes visible. @@ -344,6 +362,44 @@ TEST_F(TooltipControllerTest, HideOnExit) { EXPECT_FALSE(helper_->IsTooltipVisible()); } +TEST_F(TooltipControllerTest, ReshowOnClickAfterEnterExit) { + // Owned by |view_|. + TooltipTestView* v1 = new TooltipTestView; + TooltipTestView* v2 = new TooltipTestView; + view_->AddChildView(v1); + view_->AddChildView(v2); + gfx::Rect view_bounds(view_->GetLocalBounds()); + view_bounds.set_height(view_bounds.height() / 2); + v1->SetBoundsRect(view_bounds); + view_bounds.set_y(view_bounds.height()); + v2->SetBoundsRect(view_bounds); + const base::string16 v1_tt(ASCIIToUTF16("v1")); + const base::string16 v2_tt(ASCIIToUTF16("v2")); + v1->set_tooltip_text(v1_tt); + v2->set_tooltip_text(v2_tt); + + gfx::Point v1_point(1, 1); + View::ConvertPointToWidget(v1, &v1_point); + generator_->MoveMouseRelativeTo(GetWindow(), v1_point); + + // Fire tooltip timer so tooltip becomes visible. + helper_->FireTooltipTimer(); + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(v1_tt, helper_->GetTooltipText()); + + // Press the mouse, move to v2 and back to v1. + generator_->ClickLeftButton(); + + gfx::Point v2_point(1, 1); + View::ConvertPointToWidget(v2, &v2_point); + generator_->MoveMouseRelativeTo(GetWindow(), v2_point); + generator_->MoveMouseRelativeTo(GetWindow(), v1_point); + + helper_->FireTooltipTimer(); + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(v1_tt, helper_->GetTooltipText()); +} + namespace { // Returns the index of |window| in its parent's children. @@ -419,11 +475,12 @@ class TooltipControllerCaptureTest : public TooltipControllerTest { // Verifies when capture is released the TooltipController resets state. TEST_F(TooltipControllerCaptureTest, CloseOnCaptureLost) { view_->GetWidget()->SetCapture(view_); + RunAllPendingInMessageLoop(); view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); generator_->MoveMouseToCenterOf(GetWindow()); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); + base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow())); - EXPECT_EQ(string16(), helper_->GetTooltipText()); + EXPECT_EQ(base::string16(), helper_->GetTooltipText()); EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow()); // Fire tooltip timer so tooltip becomes visible. @@ -444,8 +501,8 @@ TEST_F(TooltipControllerCaptureTest, CloseOnCaptureLost) { #endif // Verifies the correct window is found for tooltips when there is a capture. TEST_F(TooltipControllerCaptureTest, MAYBE_Capture) { - const string16 tooltip_text(ASCIIToUTF16("1")); - const string16 tooltip_text2(ASCIIToUTF16("2")); + const base::string16 tooltip_text(ASCIIToUTF16("1")); + const base::string16 tooltip_text2(ASCIIToUTF16("2")); widget_->SetBounds(gfx::Rect(0, 0, 200, 200)); view_->set_tooltip_text(tooltip_text); @@ -490,120 +547,285 @@ TEST_F(TooltipControllerCaptureTest, MAYBE_Capture) { widget2.reset(); } -#if !defined(OS_CHROMEOS) -// This test creates two top level windows and verifies that the tooltip -// displays correctly when mouse moves are dispatched to these windows. -// Additionally it also verifies that the tooltip is reparented to the new -// window when mouse moves are dispatched to it. -TEST_F(TooltipControllerTest, TooltipsInMultipleRootWindows) { - view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text For RootWindow1")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); - EXPECT_EQ(NULL, helper_->GetTooltipWindow()); +namespace { - aura::Window* window = GetWindow(); - aura::Window* root_window = GetRootWindow(); +class TestTooltip : public Tooltip { + public: + TestTooltip() : is_visible_(false) {} + virtual ~TestTooltip() {} - // Fire tooltip timer so tooltip becomes visible. - generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint()); - helper_->FireTooltipTimer(); - EXPECT_TRUE(helper_->IsTooltipVisible()); - for (int i = 0; i < 49; ++i) { - generator_->MoveMouseBy(1, 0); - EXPECT_TRUE(helper_->IsTooltipVisible()); - EXPECT_EQ(window, root_window->GetEventHandlerForPoint( - generator_->current_location())); - string16 expected_tooltip = - ASCIIToUTF16("Tooltip Text For RootWindow1"); - EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window)); - EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); - EXPECT_EQ(window, helper_->GetTooltipWindow()); + const base::string16& tooltip_text() const { return tooltip_text_; } + + // Tooltip: + virtual void SetText(aura::Window* window, + const base::string16& tooltip_text, + const gfx::Point& location) OVERRIDE { + tooltip_text_ = tooltip_text; + location_ = location; + } + virtual void Show() OVERRIDE { + is_visible_ = true; } + virtual void Hide() OVERRIDE { + is_visible_ = false; + } + virtual bool IsVisible() OVERRIDE { + return is_visible_; + } + const gfx::Point& location() { return location_; } + + private: + bool is_visible_; + base::string16 tooltip_text_; + gfx::Point location_; + + DISALLOW_COPY_AND_ASSIGN(TestTooltip); +}; + +} // namespace + +// Use for tests that don't depend upon views. +class TooltipControllerTest2 : public aura::test::AuraTestBase { + public: + TooltipControllerTest2() : test_tooltip_(new TestTooltip) {} + virtual ~TooltipControllerTest2() {} + + virtual void SetUp() OVERRIDE { + wm_state_.reset(new wm::WMState); + aura::test::AuraTestBase::SetUp(); + new wm::DefaultActivationClient(root_window()); + controller_.reset(new TooltipController( + scoped_ptr<corewm::Tooltip>(test_tooltip_))); + root_window()->AddPreTargetHandler(controller_.get()); + SetTooltipClient(root_window(), controller_.get()); + helper_.reset(new TooltipControllerTestHelper(controller_.get())); + generator_.reset(new aura::test::EventGenerator(root_window())); + } + + virtual void TearDown() OVERRIDE { + root_window()->RemovePreTargetHandler(controller_.get()); + aura::client::SetTooltipClient(root_window(), NULL); + controller_.reset(); + generator_.reset(); + helper_.reset(); + aura::test::AuraTestBase::TearDown(); + wm_state_.reset(); + } + + protected: + // Owned by |controller_|. + TestTooltip* test_tooltip_; + scoped_ptr<TooltipControllerTestHelper> helper_; + scoped_ptr<aura::test::EventGenerator> generator_; + + private: + scoped_ptr<TooltipController> controller_; + scoped_ptr<wm::WMState> wm_state_; + + DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest2); +}; + +TEST_F(TooltipControllerTest2, VerifyLeadingTrailingWhitespaceStripped) { + aura::test::TestWindowDelegate test_delegate; + scoped_ptr<aura::Window> window( + CreateNormalWindow(100, root_window(), &test_delegate)); + window->SetBounds(gfx::Rect(0, 0, 300, 300)); + base::string16 tooltip_text(ASCIIToUTF16(" \nx ")); + aura::client::SetTooltipText(window.get(), &tooltip_text); + generator_->MoveMouseToCenterOf(window.get()); + helper_->FireTooltipTimer(); + EXPECT_EQ(ASCIIToUTF16("x"), test_tooltip_->tooltip_text()); +} + +// Verifies that tooltip is hidden and tooltip window closed upon cancel mode. +TEST_F(TooltipControllerTest2, CloseOnCancelMode) { + aura::test::TestWindowDelegate test_delegate; + scoped_ptr<aura::Window> window( + CreateNormalWindow(100, root_window(), &test_delegate)); + window->SetBounds(gfx::Rect(0, 0, 300, 300)); + base::string16 tooltip_text(ASCIIToUTF16("Tooltip Text")); + aura::client::SetTooltipText(window.get(), &tooltip_text); + generator_->MoveMouseToCenterOf(window.get()); - views::Widget* widget2 = CreateWidget(NULL); - widget2->SetContentsView(new View); - TooltipTestView* view2 = new TooltipTestView; - widget2->GetContentsView()->AddChildView(view2); - view2->SetBoundsRect(widget2->GetContentsView()->GetLocalBounds()); - helper_.reset(new TooltipControllerTestHelper( - GetController(widget2))); - generator_.reset(new aura::test::EventGenerator( - widget2->GetNativeWindow()->GetRootWindow())); - view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text For RootWindow2")); - - aura::Window* window2 = widget2->GetNativeWindow(); - aura::Window* root_window2 = - widget2->GetNativeWindow()->GetRootWindow(); // Fire tooltip timer so tooltip becomes visible. - generator_->MoveMouseRelativeTo(window2, view2->bounds().CenterPoint()); helper_->FireTooltipTimer(); + EXPECT_TRUE(helper_->IsTooltipVisible()); - EXPECT_NE(root_window, root_window2); - EXPECT_NE(window, window2); + // Send OnCancelMode event and verify that tooltip becomes invisible and + // the tooltip window is closed. + ui::CancelModeEvent event; + helper_->controller()->OnCancelMode(&event); + EXPECT_FALSE(helper_->IsTooltipVisible()); + EXPECT_TRUE(helper_->GetTooltipWindow() == NULL); +} - for (int i = 0; i < 49; ++i) { - generator_->MoveMouseBy(1, 0); - EXPECT_TRUE(helper_->IsTooltipVisible()); - EXPECT_EQ(window2, root_window2->GetEventHandlerForPoint( - generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text For RootWindow2"); - EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window2)); - EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); - EXPECT_EQ(window2, helper_->GetTooltipWindow()); +// Use for tests that need both views and a TestTooltip. +class TooltipControllerTest3 : public aura::test::AuraTestBase { + public: + TooltipControllerTest3() : test_tooltip_(new TestTooltip) {} + virtual ~TooltipControllerTest3() {} + + virtual void SetUp() OVERRIDE { + wm_state_.reset(new wm::WMState); + aura::test::AuraTestBase::SetUp(); + new wm::DefaultActivationClient(root_window()); + + widget_.reset(CreateWidget(root_window())); + widget_->SetContentsView(new View); + view_ = new TooltipTestView; + widget_->GetContentsView()->AddChildView(view_); + view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds()); + + generator_.reset(new aura::test::EventGenerator(GetRootWindow())); + controller_.reset(new TooltipController( + scoped_ptr<views::corewm::Tooltip>(test_tooltip_))); + GetRootWindow()->RemovePreTargetHandler( + static_cast<TooltipController*>(aura::client::GetTooltipClient( + widget_->GetNativeWindow()->GetRootWindow()))); + GetRootWindow()->AddPreTargetHandler(controller_.get()); + helper_.reset(new TooltipControllerTestHelper(controller_.get())); + SetTooltipClient(GetRootWindow(), controller_.get()); } - bool tooltip_reparented = false; - for (size_t i = 0; i < root_window2->children().size(); ++i) { - if (root_window2->children()[i]->type() == - aura::client::WINDOW_TYPE_TOOLTIP) { - tooltip_reparented = true; - break; - } + virtual void TearDown() OVERRIDE { + GetRootWindow()->RemovePreTargetHandler(controller_.get()); + aura::client::SetTooltipClient(GetRootWindow(), NULL); + + controller_.reset(); + generator_.reset(); + helper_.reset(); + widget_.reset(); + aura::test::AuraTestBase::TearDown(); + wm_state_.reset(); } - EXPECT_TRUE(tooltip_reparented); - widget2->Close(); -} -// This test validates whether the tooltip after becoming visible stays at the -// top of the ZOrder in its root window after activation changes. -TEST_F(TooltipControllerTest, TooltipAtTopOfZOrderAfterActivation) { - view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text")); - EXPECT_EQ(string16(), helper_->GetTooltipText()); - EXPECT_EQ(NULL, helper_->GetTooltipWindow()); - generator_->MoveMouseToCenterOf(GetWindow()); + aura::Window* GetWindow() { return widget_->GetNativeWindow(); } - EXPECT_EQ(GetWindow(), GetRootWindow()->GetEventHandlerForPoint( - generator_->current_location())); - string16 expected_tooltip = ASCIIToUTF16("Tooltip Text"); - EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow())); - EXPECT_EQ(string16(), helper_->GetTooltipText()); - EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow()); + protected: + // Owned by |controller_|. + TestTooltip* test_tooltip_; + scoped_ptr<TooltipControllerTestHelper> helper_; + scoped_ptr<aura::test::EventGenerator> generator_; + scoped_ptr<views::Widget> widget_; + TooltipTestView* view_; - // Fire tooltip timer so tooltip becomes visible. + private: + scoped_ptr<TooltipController> controller_; + scoped_ptr<wm::WMState> wm_state_; + +#if defined(OS_WIN) + ui::ScopedOleInitializer ole_initializer_; +#endif + + aura::Window* GetRootWindow() { return GetWindow()->GetRootWindow(); } + + DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest3); +}; + +TEST_F(TooltipControllerTest3, TooltipPositionChangesOnTwoViewsWithSameLabel) { + // Owned by |view_|. + // These two views have the same tooltip text + TooltipTestView* v1 = new TooltipTestView; + TooltipTestView* v2 = new TooltipTestView; + // v1_1 is a view inside v1 that has an identical tooltip text to that of v1 + // and v2 + TooltipTestView* v1_1 = new TooltipTestView; + // v2_1 is a view inside v2 that has an identical tooltip text to that of v1 + // and v2 + TooltipTestView* v2_1 = new TooltipTestView; + // v2_2 is a view inside v2 with the tooltip text different from all the + // others + TooltipTestView* v2_2 = new TooltipTestView; + + // Setup all the views' relations + view_->AddChildView(v1); + view_->AddChildView(v2); + v1->AddChildView(v1_1); + v2->AddChildView(v2_1); + v2->AddChildView(v2_2); + const base::string16 reference_string( + base::ASCIIToUTF16("Identical Tooltip Text")); + const base::string16 alternative_string( + base::ASCIIToUTF16("Another Shrubbery")); + v1->set_tooltip_text(reference_string); + v2->set_tooltip_text(reference_string); + v1_1->set_tooltip_text(reference_string); + v2_1->set_tooltip_text(reference_string); + v2_2->set_tooltip_text(alternative_string); + + // Set views' bounds + gfx::Rect view_bounds(view_->GetLocalBounds()); + view_bounds.set_height(view_bounds.height() / 2); + v1->SetBoundsRect(view_bounds); + v1_1->SetBounds(0, 0, 3, 3); + view_bounds.set_y(view_bounds.height()); + v2->SetBoundsRect(view_bounds); + v2_2->SetBounds(view_bounds.width() - 3, view_bounds.height() - 3, 3, 3); + v2_1->SetBounds(0, 0, 3, 3); + + // Test whether a toolbar appears on v1 + gfx::Point center = v1->bounds().CenterPoint(); + generator_->MoveMouseRelativeTo(GetWindow(), center); helper_->FireTooltipTimer(); + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(reference_string, helper_->GetTooltipText()); + gfx::Point tooltip_bounds1 = test_tooltip_->location(); + // Test whether the toolbar changes position on mouse over v2 + center = v2->bounds().CenterPoint(); + generator_->MoveMouseRelativeTo(GetWindow(), center); + helper_->FireTooltipTimer(); EXPECT_TRUE(helper_->IsTooltipVisible()); - generator_->MoveMouseBy(1, 0); + EXPECT_EQ(reference_string, helper_->GetTooltipText()); + gfx::Point tooltip_bounds2 = test_tooltip_->location(); + + EXPECT_NE(tooltip_bounds1, gfx::Point()); + EXPECT_NE(tooltip_bounds2, gfx::Point()); + EXPECT_NE(tooltip_bounds1, tooltip_bounds2); + + // Test if the toolbar does not change position on encountering a contained + // view with the same tooltip text + center = v2_1->GetLocalBounds().CenterPoint(); + views::View::ConvertPointToTarget(v2_1, view_, ¢er); + generator_->MoveMouseRelativeTo(GetWindow(), center); + helper_->FireTooltipTimer(); + gfx::Point tooltip_bounds2_1 = test_tooltip_->location(); + EXPECT_NE(tooltip_bounds2, tooltip_bounds2_1); EXPECT_TRUE(helper_->IsTooltipVisible()); - EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow())); - EXPECT_EQ(expected_tooltip, helper_->GetTooltipText()); - EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow()); + EXPECT_EQ(reference_string, helper_->GetTooltipText()); + + // Test if the toolbar changes position on encountering a contained + // view with a different tooltip text + center = v2_2->GetLocalBounds().CenterPoint(); + views::View::ConvertPointToTarget(v2_2, view_, ¢er); + generator_->MoveMouseRelativeTo(GetWindow(), center); + helper_->FireTooltipTimer(); + gfx::Point tooltip_bounds2_2 = test_tooltip_->location(); - // Fake activation loss and gain in the native widget. This should cause a - // ZOrder change which should not affect the position of the tooltip. - DesktopNativeWidgetAura* native_widget = - static_cast<DesktopNativeWidgetAura*>(widget_->native_widget()); - EXPECT_TRUE(native_widget != NULL); + EXPECT_NE(tooltip_bounds2_1, tooltip_bounds2_2); + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(alternative_string, helper_->GetTooltipText()); - native_widget->HandleActivationChanged(false); - native_widget->HandleActivationChanged(true); + // Test if moving from a view that is contained by a larger view, both with + // the same tooltip text, does not change tooltip's position. + center = v1_1->GetLocalBounds().CenterPoint(); + views::View::ConvertPointToTarget(v1_1, view_, ¢er); + generator_->MoveMouseRelativeTo(GetWindow(), center); + helper_->FireTooltipTimer(); + gfx::Point tooltip_bounds1_1 = test_tooltip_->location(); - EXPECT_EQ( - widget_->GetNativeWindow()->GetRootWindow()->children().back()->type(), - aura::client::WINDOW_TYPE_TOOLTIP); -} + EXPECT_TRUE(helper_->IsTooltipVisible()); + EXPECT_EQ(reference_string, helper_->GetTooltipText()); -#endif + center = v1->bounds().CenterPoint(); + generator_->MoveMouseRelativeTo(GetWindow(), center); + helper_->FireTooltipTimer(); + tooltip_bounds1 = test_tooltip_->location(); + + EXPECT_NE(tooltip_bounds1_1, tooltip_bounds1); + EXPECT_EQ(reference_string, helper_->GetTooltipText()); +} } // namespace test } // namespace corewm |