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"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/tooltip_client.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/env.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/aura_test_base.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/text/text_elider.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/font.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller_test_helper.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/win/scoped_ole_initializer.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace corewm {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::Widget* CreateWidget(aura::RootWindow* root) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* widget = new views::Widget;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.accept_events = true;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.parent = root;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.native_widget = new DesktopNativeWidgetAura(widget);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 100);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Init(params);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->Show();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return widget;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Font GetDefaultFont() {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::ResourceBundle::GetSharedInstance().GetFont(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::ResourceBundle::BaseFont);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TooltipController* GetController(Widget* widget) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return static_cast<TooltipController*>(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetTooltipClient(
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          widget->GetNativeWindow()->GetRootWindow()));
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TooltipControllerTest : public aura::test::AuraTestBase {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTest() : view_(NULL) {}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TooltipControllerTest() {}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::SetUp();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    controller_.reset(new TooltipController(gfx::SCREEN_TYPE_ALTERNATE));
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->AddPreTargetHandler(controller_.get());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetTooltipClient(root_window(), controller_.get());
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_.reset(CreateWidget(root_window()));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->SetContentsView(new View);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = new TooltipTestView;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->GetContentsView()->AddChildView(view_);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds());
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_.reset(new TooltipControllerTestHelper(
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GetController(widget_.get())));
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_.reset(new aura::test::EventGenerator(GetRootWindow()));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_window()->RemovePreTargetHandler(controller_.get());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetTooltipClient(root_window(), NULL);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    controller_.reset();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_.reset();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_.reset();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_.reset();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::test::AuraTestBase::TearDown();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* GetWindow() {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return widget_->GetNativeWindow();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* GetRootWindow() {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return GetWindow()->GetRootWindow();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* PrepareSecondView() {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TooltipTestView* view2 = new TooltipTestView;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->GetContentsView()->AddChildView(view2);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->SetBounds(0, 0, 100, 100);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view2->SetBounds(100, 0, 100, 100);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return view2;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget_;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TooltipControllerTestHelper> helper_;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::test::EventGenerator> generator_;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TooltipController> controller_;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedOleInitializer ole_initializer_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, ViewTooltip) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseToCenterOf(GetWindow());
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), GetRootWindow()->GetEventHandlerForPoint(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      generator_->current_location()));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(GetWindow()));
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetWindow(), helper_->GetTooltipWindow());
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipsInMultipleViews) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrepareSecondView();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root_window = GetRootWindow();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(helper_->IsTooltipVisible());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, root_window->GetEventHandlerForPoint(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            generator_->current_location()));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, root_window->GetEventHandlerForPoint(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            generator_->current_location()));
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 expected_tooltip;  // = ""
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, EnableOrDisableTooltips) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text"));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(GetWindow(), view_->bounds().CenterPoint());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 expected_tooltip = ASCIIToUTF16("Tooltip Text");
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Diable tooltips and check again.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->controller()->SetTooltipsEnabled(false);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Enable tooltips back and check again.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->controller()->SetTooltipsEnabled(true);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TrimTooltipToFitTests) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int max_width = 4000;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 tooltip;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width, line_count, expect_lines;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_pixel_width = 400;  // copied from constants in tooltip_controller.cc
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_lines = 10;  // copied from constants in tooltip_controller.cc
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Font font = GetDefaultFont();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t tooltip_len;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Error in computed size vs. expected size should not be greater than the
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // size of the longest word.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int error_in_pixel_width = font.GetStringWidth(ASCIIToUTF16("tooltip"));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Long tooltips should wrap to next line
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expect_lines = 3;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; font.GetStringWidth(tooltip) <= (expect_lines - 1) * max_pixel_width;)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip_len = tooltip.length();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expect_lines, line_count);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(tooltip_len + expect_lines - 1, tooltip.length());
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // More than |max_lines| lines should get truncated at 10 lines.
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expect_lines = 13;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; font.GetStringWidth(tooltip) <= (expect_lines - 1) * max_pixel_width;)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(max_lines, line_count);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Long multi line tooltips should wrap individual lines.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expect_lines = 4;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; font.GetStringWidth(tooltip) <= (expect_lines - 2) * max_pixel_width;)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tooltip.append(ASCIIToUTF16("This is part of the tooltip"));
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.insert(tooltip.length() / 2, ASCIIToUTF16("\n"));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip_len = tooltip.length();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(max_pixel_width, width, error_in_pixel_width);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expect_lines, line_count);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We may have inserted the line break above near a space which will get
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // trimmed. Hence we may be off by 1 in the final tooltip length calculation.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(tooltip_len + expect_lines - 2, tooltip.length(), 1);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_WIN)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tooltip with really long word gets elided.
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip = UTF8ToUTF16(std::string('a', max_pixel_width));
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(max_pixel_width, width, 5);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, line_count);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::ElideText(UTF8ToUTF16(std::string('a', max_pixel_width)), font,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          max_pixel_width, ui::ELIDE_AT_END), tooltip);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Normal small tooltip should stay as is.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip = ASCIIToUTF16("Small Tooltip");
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(font.GetStringWidth(ASCIIToUTF16("Small Tooltip")), width);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, line_count);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Small Tooltip"), tooltip);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Normal small multi-line tooltip should stay as is.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip = ASCIIToUTF16("Multi line\nTooltip");
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int expected_width = font.GetStringWidth(ASCIIToUTF16("Multi line"));
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_width = std::max(expected_width,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            font.GetStringWidth(ASCIIToUTF16("Tooltip")));
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_width, width);
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, line_count);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Multi line\nTooltip"), tooltip);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whitespaces in tooltips are preserved.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip.clear();
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  width = line_count = -1;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tooltip = ASCIIToUTF16("Small  Tool  t\tip");
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipControllerTestHelper::TrimTooltipToFit(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_width, &tooltip, &width, &line_count);
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(font.GetStringWidth(ASCIIToUTF16("Small  Tool  t\tip")), width);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, line_count);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("Small  Tool  t\tip"), tooltip);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipHidesOnKeyPressAndStaysHiddenUntilChange) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1"));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view2 = PrepareSecondView();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 2"));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->PressKey(ui::VKEY_1, 0);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Moving the mouse inside |view1| should not change the state of the tooltip
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or the timers.
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; i++) {
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetRootWindow()->GetEventHandlerForPoint(
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  generator_->current_location()));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1");
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now we move the mouse on to |view2|. It should re-start the tooltip timer.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2");
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(window, helper_->GetTooltipWindow());
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TooltipControllerTest, TooltipHidesOnTimeoutAndStaysHiddenUntilChange) {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view_->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 1"));
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(string16(), helper_->GetTooltipText());
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, helper_->GetTooltipWindow());
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TooltipTestView* view2 = PrepareSecondView();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view2->set_tooltip_text(ASCIIToUTF16("Tooltip Text for view 2"));
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindow();
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fire tooltip timer so tooltip becomes visible.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseRelativeTo(window, view_->bounds().CenterPoint());
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipShownTimer();
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipVisible());
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Moving the mouse inside |view1| should not change the state of the tooltip
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or the timers.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 49; ++i) {
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    generator_->MoveMouseBy(1, 0);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipVisible());
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipTimerRunning());
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(helper_->IsTooltipShownTimerRunning());
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, GetRootWindow()->GetEventHandlerForPoint(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  generator_->current_location()));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 1");
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(window, helper_->GetTooltipWindow());
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now we move the mouse on to |view2|. It should re-start the tooltip timer.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  generator_->MoveMouseBy(1, 0);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipTimerRunning());
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper_->FireTooltipTimer();
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipVisible());
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper_->IsTooltipShownTimerRunning());
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 expected_tooltip = ASCIIToUTF16("Tooltip Text for view 2");
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, aura::client::GetTooltipText(window));
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_tooltip, helper_->GetTooltipText());
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(window, helper_->GetTooltipWindow());
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace corewm
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
415