tooltip_controller_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/cursor_client.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/tooltip_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/env.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/test/test_screen.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/screen.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/screen_type_delegate.h"
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_elider.h"
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/corewm/tooltip_aura.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller_test_helper.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/widget/tooltip_manager.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/wm_state.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/wm/public/window_types.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/win/scoped_ole_initializer.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_screen.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace corewm {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)views::Widget* CreateWidget(aura::Window* root) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = new views::Widget;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.accept_events = true;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.parent = root;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.native_widget = new DesktopNativeWidgetAura(widget);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 100);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Show();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return widget;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TooltipController* GetController(Widget* widget) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<TooltipController*>(
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetTooltipClient(
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          widget->GetNativeWindow()->GetRootWindow()));
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TooltipControllerTest : public aura::test::AuraTestBase {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTest() : view_(NULL) {}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TooltipControllerTest() {}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    wm_state_.reset(new wm::WMState);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::SetUp();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    controller_.reset(new TooltipController(
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          scoped_ptr<views::corewm::Tooltip>(
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              new views::corewm::TooltipAura(gfx::SCREEN_TYPE_ALTERNATE))));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->AddPreTargetHandler(controller_.get());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetTooltipClient(root_window(), controller_.get());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_.reset(CreateWidget(root_window()));
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->SetContentsView(new View);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = new TooltipTestView;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->GetContentsView()->AddChildView(view_);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds());
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_.reset(new TooltipControllerTestHelper(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GetController(widget_.get())));
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_.reset(new aura::test::EventGenerator(GetRootWindow()));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->RemovePreTargetHandler(controller_.get());
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    aura::client::SetTooltipClient(root_window(), NULL);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    controller_.reset();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_.reset();
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_.reset();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_.reset();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::TearDown();
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wm_state_.reset();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* GetWindow() {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return widget_->GetNativeWindow();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* GetRootWindow() {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GetWindow()->GetRootWindow();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* PrepareSecondView() {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TooltipTestView* view2 = new TooltipTestView;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->GetContentsView()->AddChildView(view2);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetBounds(0, 0, 100, 100);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view2->SetBounds(100, 0, 100, 100);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return view2;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TooltipControllerTestHelper> helper_;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::test::EventGenerator> generator_;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TooltipController> controller_;
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedOleInitializer ole_initializer_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<wm::WMState> wm_state_;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, ViewTooltip) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseToCenterOf(GetWindow());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), GetRootWindow()->GetEventHandlerForPoint(
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      generator_->current_location()));
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipsInMultipleViews) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrepareSecondView();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = GetRootWindow();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(helper_->IsTooltipVisible());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, root_window->GetEventHandlerForPoint(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            generator_->current_location()));
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, root_window->GetEventHandlerForPoint(
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            generator_->current_location()));
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip;  // = ""
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, EnableOrDisableTooltips) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), view_->bounds().CenterPoint());
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Disable tooltips and check again.
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->controller()->SetTooltipsEnabled(false);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable tooltips back and check again.
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->controller()->SetTooltipsEnabled(true);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies tooltip isn't shown if tooltip text consists entirely of whitespace.
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(TooltipControllerTest, DontShowEmptyTooltips) {
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("                     "));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), view_->bounds().CenterPoint());
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  helper_->FireTooltipTimer();
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1"));
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view2 = PrepareSecondView();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 2"));
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->PressKey(ui::VKEY_1, 0);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipTimerRunning());
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Moving the mouse inside |view1| should not change the state of the tooltip
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or the timers.
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; i++) {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipTimerRunning());
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetRootWindow()->GetEventHandlerForPoint(
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  generator_->current_location()));
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1");
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now we move the mouse on to |view2|. It should re-start the tooltip timer.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2");
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(window, helper_->GetTooltipWindow());
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1"));
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view2 = PrepareSecondView();
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 2"));
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipShownTimer();
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Moving the mouse inside |view1| should not change the state of the tooltip
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or the timers.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, GetRootWindow()->GetEventHandlerForPoint(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  generator_->current_location()));
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1");
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now we move the mouse on to |view2|. It should re-start the tooltip timer.
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2");
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(window, helper_->GetTooltipWindow());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Verifies a mouse exit event hides the tooltips.
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(TooltipControllerTest, HideOnExit) {
341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  generator_->MoveMouseToCenterOf(GetWindow());
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
347424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  helper_->FireTooltipTimer();
350424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  generator_->SendMouseExit();
353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
355424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TooltipControllerTest, ReshowOnClickAfterEnterExit) {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Owned by |view_|.
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TooltipTestView* v1 = new TooltipTestView;
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TooltipTestView* v2 = new TooltipTestView;
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->AddChildView(v1);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_->AddChildView(v2);
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Rect view_bounds(view_->GetLocalBounds());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_bounds.set_height(view_bounds.height() / 2);
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v1->SetBoundsRect(view_bounds);
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  view_bounds.set_y(view_bounds.height());
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v2->SetBoundsRect(view_bounds);
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 v1_tt(ASCIIToUTF16("v1"));
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 v2_tt(ASCIIToUTF16("v2"));
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v1->set_tooltip_text(v1_tt);
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v2->set_tooltip_text(v2_tt);
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point v1_point(1, 1);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  View::ConvertPointToWidget(v1, &v1_point);
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), v1_point);
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper_->FireTooltipTimer();
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(v1_tt, helper_->GetTooltipText());
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Press the mouse, move to v2 and back to v1.
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->ClickLeftButton();
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point v2_point(1, 1);
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  View::ConvertPointToWidget(v2, &v2_point);
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), v2_point);
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), v1_point);
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper_->FireTooltipTimer();
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(v1_tt, helper_->GetTooltipText());
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Returns the index of |window| in its parent's children.
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int IndexInParent(const aura::Window* window) {
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window::Windows::const_iterator i =
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      std::find(window->parent()->children().begin(),
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                window->parent()->children().end(),
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                window);
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return i == window->parent()->children().end() ? -1 :
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      static_cast<int>(i - window->parent()->children().begin());
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TestScreenPositionClient : public aura::client::ScreenPositionClient {
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestScreenPositionClient() {}
4091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~TestScreenPositionClient() {}
4101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // ScreenPositionClient overrides:
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ConvertPointToScreen(const aura::Window* window,
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    gfx::Point* point) OVERRIDE {
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ConvertPointFromScreen(const aura::Window* window,
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      gfx::Point* point) OVERRIDE {
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ConvertHostPointToScreen(aura::Window* root_gwindow,
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                        gfx::Point* point) OVERRIDE {
4201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    NOTREACHED();
4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetBounds(aura::Window* window,
4231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         const gfx::Rect& bounds,
4241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         const gfx::Display& display) OVERRIDE {
4251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    window->SetBounds(bounds);
4261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
4291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestScreenPositionClient);
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TooltipControllerCaptureTest : public TooltipControllerTest {
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
4361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TooltipControllerCaptureTest() {}
4371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~TooltipControllerCaptureTest() {}
4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TooltipControllerTest::SetUp();
4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::client::SetScreenPositionClient(GetRootWindow(),
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                          &screen_position_client_);
4431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_CHROMEOS)
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    desktop_screen_.reset(CreateDesktopScreen());
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE,
4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   desktop_screen_.get());
4471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
4511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_CHROMEOS)
4521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, test_screen());
4531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    desktop_screen_.reset();
4541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::client::SetScreenPositionClient(GetRootWindow(), NULL);
4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TooltipControllerTest::TearDown();
4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
4601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestScreenPositionClient screen_position_client_;
4611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<gfx::Screen> desktop_screen_;
4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TooltipControllerCaptureTest);
4641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
4651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies when capture is released the TooltipController resets state.
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(TooltipControllerCaptureTest, CloseOnCaptureLost) {
4681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view_->GetWidget()->SetCapture(view_);
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
4701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  generator_->MoveMouseToCenterOf(GetWindow());
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
4721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
4741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
4751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
4771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  helper_->FireTooltipTimer();
4781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view_->GetWidget()->ReleaseCapture();
4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(helper_->GetTooltipWindow() == NULL);
4831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Disabled on linux as DesktopScreenX11::GetWindowAtScreenPoint() doesn't
4861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// consider z-order.
4871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
4881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_Capture DISABLED_Capture
4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
4901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_Capture Capture
4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verifies the correct window is found for tooltips when there is a capture.
4931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(TooltipControllerCaptureTest, MAYBE_Capture) {
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 tooltip_text(ASCIIToUTF16("1"));
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 tooltip_text2(ASCIIToUTF16("2"));
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget_->SetBounds(gfx::Rect(0, 0, 200, 200));
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view_->set_tooltip_text(tooltip_text);
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<views::Widget> widget2(CreateWidget(root_window()));
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2->SetContentsView(new View);
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TooltipTestView* view2 = new TooltipTestView;
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2->GetContentsView()->AddChildView(view2);
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view2->set_tooltip_text(tooltip_text2);
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2->SetBounds(gfx::Rect(0, 0, 200, 200));
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  view2->SetBoundsRect(widget2->GetContentsView()->GetLocalBounds());
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget_->SetCapture(view_);
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(widget_->HasCapture());
5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2->Show();
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_GE(IndexInParent(widget2->GetNativeWindow()),
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            IndexInParent(widget_->GetNativeWindow()));
5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  generator_->MoveMouseRelativeTo(widget_->GetNativeWindow(),
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  view_->bounds().CenterPoint());
5161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  helper_->FireTooltipTimer();
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Even though the mouse is over a window with a tooltip it shouldn't be
5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // picked up because the windows don't have the same value for
5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |TooltipManager::kGroupingPropertyKey|.
5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(helper_->GetTooltipText().empty());
5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Now make both the windows have same transient value for
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // kGroupingPropertyKey. In this case the tooltip should be picked up from
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |widget2| (because the mouse is over it).
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int grouping_key = 1;
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget_->SetNativeWindowProperty(TooltipManager::kGroupingPropertyKey,
5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   reinterpret_cast<void*>(grouping_key));
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2->SetNativeWindowProperty(TooltipManager::kGroupingPropertyKey,
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                   reinterpret_cast<void*>(grouping_key));
5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  generator_->MoveMouseBy(1, 10);
5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  helper_->FireTooltipTimer();
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(tooltip_text2, helper_->GetTooltipText());
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  widget2.reset();
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// These tests search for a specific aura::Window to identify the
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// tooltip. Windows shows the tooltip using a native tooltip, so these tests
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// don't apply.
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_WIN) && !defined(OS_CHROMEOS)
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test creates two top level windows and verifies that the tooltip
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// displays correctly when mouse moves are dispatched to these windows.
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Additionally it also verifies that the tooltip is reparented to the new
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// window when mouse moves are dispatched to it.
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipsInMultipleRootWindows) {
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text For RootWindow1"));
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::Window* window = GetWindow();
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = GetRootWindow();
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  helper_->FireTooltipTimer();
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(helper_->IsTooltipVisible());
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(window, root_window->GetEventHandlerForPoint(
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            generator_->current_location()));
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip =
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        ASCIIToUTF16("Tooltip Text For RootWindow1");
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  views::Widget* widget2 = CreateWidget(NULL);
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget2->SetContentsView(new View);
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TooltipTestView* view2 = new TooltipTestView;
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget2->GetContentsView()->AddChildView(view2);
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  view2->SetBoundsRect(widget2->GetContentsView()->GetLocalBounds());
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  helper_.reset(new TooltipControllerTestHelper(
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    GetController(widget2)));
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  generator_.reset(new aura::test::EventGenerator(
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      widget2->GetNativeWindow()->GetRootWindow()));
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text For RootWindow2"));
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  aura::Window* window2 = widget2->GetNativeWindow();
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window2 =
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      widget2->GetNativeWindow()->GetRootWindow();
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window2, view2->bounds().CenterPoint());
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  helper_->FireTooltipTimer();
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(root_window, root_window2);
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(window, window2);
59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(helper_->IsTooltipVisible());
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(window2, root_window2->GetEventHandlerForPoint(
59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              generator_->current_location()));
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 expected_tooltip =
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ASCIIToUTF16("Tooltip Text For RootWindow2");
60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window2));
60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(window2, helper_->GetTooltipWindow());
60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool tooltip_reparented = false;
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i < root_window2->children().size(); ++i) {
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (root_window2->children()[i]->type() == ui::wm::WINDOW_TYPE_TOOLTIP) {
60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      tooltip_reparented = true;
60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(tooltip_reparented);
61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget2->Close();
61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
61568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This test validates whether the tooltip after becoming visible stays at the
61768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// top of the ZOrder in its root window after activation changes.
61868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(TooltipControllerTest, TooltipAtTopOfZOrderAfterActivation) {
61968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
62168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
62268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  generator_->MoveMouseToCenterOf(GetWindow());
62368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
62468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(GetWindow(), GetRootWindow()->GetEventHandlerForPoint(
62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      generator_->current_location()));
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
62768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::string16(), helper_->GetTooltipText());
62968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
63068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
63168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
63268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  helper_->FireTooltipTimer();
63368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
63468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
63568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  generator_->MoveMouseBy(1, 0);
63668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
63768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
63868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
63968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
64068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
64168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
64268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Fake activation loss and gain in the native widget. This should cause a
64368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // ZOrder change which should not affect the position of the tooltip.
64468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DesktopNativeWidgetAura* native_widget =
64568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      static_cast<DesktopNativeWidgetAura*>(widget_->native_widget());
64668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(native_widget != NULL);
64768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
64868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  native_widget->HandleActivationChanged(false);
64968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  native_widget->HandleActivationChanged(true);
65068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
65168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(
65268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      widget_->GetNativeWindow()->GetRootWindow()->children().back()->type(),
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::wm::WINDOW_TYPE_TOOLTIP);
65468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestTooltip : public Tooltip {
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestTooltip() : is_visible_(false) {}
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~TestTooltip() {}
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16& tooltip_text() const { return tooltip_text_; }
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tooltip:
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetText(aura::Window* window,
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const base::string16& tooltip_text,
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::Point& location) OVERRIDE {
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tooltip_text_ = tooltip_text;
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Show() OVERRIDE {
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    is_visible_ = true;
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Hide() OVERRIDE {
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    is_visible_ = false;
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsVisible() OVERRIDE {
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return is_visible_;
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_visible_;
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 tooltip_text_;
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestTooltip);
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use for tests that don't depend upon views.
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TooltipControllerTest2 : public aura::test::AuraTestBase {
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TooltipControllerTest2() : test_tooltip_(new TestTooltip) {}
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~TooltipControllerTest2() {}
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    wm_state_.reset(new wm::WMState);
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::test::AuraTestBase::SetUp();
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    controller_.reset(new TooltipController(
701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          scoped_ptr<corewm::Tooltip>(test_tooltip_)));
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    root_window()->AddPreTargetHandler(controller_.get());
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SetTooltipClient(root_window(), controller_.get());
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    helper_.reset(new TooltipControllerTestHelper(controller_.get()));
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    generator_.reset(new aura::test::EventGenerator(root_window()));
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    root_window()->RemovePreTargetHandler(controller_.get());
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::client::SetTooltipClient(root_window(), NULL);
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    controller_.reset();
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    generator_.reset();
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    helper_.reset();
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::test::AuraTestBase::TearDown();
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    wm_state_.reset();
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Owned by |controller_|.
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestTooltip* test_tooltip_;
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TooltipControllerTestHelper> helper_;
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::test::EventGenerator> generator_;
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TooltipController> controller_;
726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<wm::WMState> wm_state_;
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest2);
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TooltipControllerTest2, VerifyLeadingTrailingWhitespaceStripped) {
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::test::TestWindowDelegate test_delegate;
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> window(
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateNormalWindow(100, root_window(), &test_delegate));
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 300, 300));
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 tooltip_text(ASCIIToUTF16(" \nx  "));
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::SetTooltipText(window.get(), &tooltip_text);
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->MoveMouseToCenterOf(window.get());
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper_->FireTooltipTimer();
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("x"), test_tooltip_->tooltip_text());
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that tooltip is hidden and tooltip window closed upon cancel mode.
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TooltipControllerTest2, CloseOnCancelMode) {
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::test::TestWindowDelegate test_delegate;
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<aura::Window> window(
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateNormalWindow(100, root_window(), &test_delegate));
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window->SetBounds(gfx::Rect(0, 0, 300, 300));
7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 tooltip_text(ASCIIToUTF16("Tooltip Text"));
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  aura::client::SetTooltipText(window.get(), &tooltip_text);
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  generator_->MoveMouseToCenterOf(window.get());
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper_->FireTooltipTimer();
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Send OnCancelMode event and verify that tooltip becomes invisible and
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the tooltip window is closed.
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::CancelModeEvent event;
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper_->controller()->OnCancelMode(&event);
7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
7625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(helper_->GetTooltipWindow() == NULL);
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace corewm
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
768