14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/shelf/shelf_tooltip_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/test/shelf_test_api.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetEventTarget(ui::EventTarget* target,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    ui::Event* event) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::Event::DispatcherApi dispatch_helper(event);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dispatch_helper.set_target(target);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ShelfTooltipManagerTest : public AshTestBase {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ShelfTooltipManagerTest() {}
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~ShelfTooltipManagerTest() {}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::SetUp();
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RootWindowController* controller = Shell::GetPrimaryRootWindowController();
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    tooltip_manager_.reset(new ShelfTooltipManager(
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        controller->GetShelfLayoutManager(),
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ShelfTestAPI(controller->shelf()->shelf()).shelf_view()));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tooltip_manager_.reset();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AshTestBase::TearDown();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowDelayed() {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreateWidget();
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    tooltip_manager_->ShowDelayed(dummy_anchor_.get(), base::string16());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowImmediately() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CreateWidget();
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    tooltip_manager_->ShowImmediately(dummy_anchor_.get(), base::string16());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool TooltipIsVisible() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tooltip_manager_->IsVisible();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTimerRunning() {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tooltip_manager_->timer_.get() != NULL;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventHandler* GetEventHandler() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tooltip_manager_.get();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* GetTooltipWidget() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tooltip_manager_->widget_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<views::Widget> widget_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::View> dummy_anchor_;
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<ShelfTooltipManager> tooltip_manager_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateWidget() {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dummy_anchor_.reset(new views::View);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_.reset(new views::Widget);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget::InitParams params(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    params.parent = Shell::GetContainer(Shell::GetPrimaryRootWindow(),
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                        ash::kShellWindowId_ShelfContainer);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->Init(params);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget_->SetContentsView(dummy_anchor_.get());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShelfTooltipManagerTest);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, ShowingBasics) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowDelayed() should just start the timer instead of showing immediately.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowDelayed();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsTimerRunning());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(TooltipIsVisible());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTimerRunning());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, HideWhenShelfIsHidden) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a full-screen window to hide the shelf.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<views::Widget> widget(new views::Widget);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->SetFullscreen(true);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the shelf is hidden, the tooltip should be invisible.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SHELF_HIDDEN,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetShelfLayoutManager()->visibility_state());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not show the view if the shelf is hidden.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowDelayed() doesn't even start the timer for the hidden shelf.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowDelayed();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTimerRunning());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, HideWhenShelfIsAutoHide) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a visible window so auto-hide behavior is enforced.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* dummy = new views::Widget;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.bounds = gfx::Rect(0, 0, 200, 200);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.context = CurrentContext();
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dummy->Init(params);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dummy->Show();
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShelfLayoutManager* shelf =
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shelf->UpdateAutoHideState();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tooltip visibility change for auto hide may take time.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(TooltipIsVisible());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not show the view if the shelf is hidden.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowDelayed doesn't even run the timer for the hidden shelf.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowDelayed();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTimerRunning());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, ShouldHideForEvents) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventHandler* event_handler = GetEventHandler();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should not hide for key events.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE, false);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetEventTarget(root_window, &key_event);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnKeyEvent(&key_event);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(key_event.handled());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(TooltipIsVisible());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should hide for touch events.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TouchEvent touch_event(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ET_TOUCH_PRESSED, gfx::Point(), 0, base::TimeDelta());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetEventTarget(root_window, &touch_event);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnTouchEvent(&touch_event);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(touch_event.handled());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shouldn't hide if the touch happens on the tooltip.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* tooltip_widget = GetTooltipWidget();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetEventTarget(tooltip_widget->GetNativeWindow(), &touch_event);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnTouchEvent(&touch_event);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(touch_event.handled());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(TooltipIsVisible());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should hide for gesture events.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::GestureEvent gesture_event(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::ET_GESTURE_BEGIN, 0, 0, ui::EF_NONE,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(base::Time::Now().ToDoubleT() * 1000),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::GestureEventDetails(ui::ET_GESTURE_BEGIN, 0.0f, 0.0f), 0);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetEventTarget(tooltip_widget->GetNativeWindow(), &gesture_event);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnGestureEvent(&gesture_event);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(gesture_event.handled());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, HideForMouseMoveEvent) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowImmediately();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::EventHandler* event_handler = GetEventHandler();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tooltip_rect = GetTooltipWidget()->GetNativeWindow()->bounds();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(tooltip_rect.IsEmpty());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shouldn't hide if the mouse is in the tooltip.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::MouseEvent mouse_event(ui::ET_MOUSE_MOVED, tooltip_rect.CenterPoint(),
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             tooltip_rect.CenterPoint(), ui::EF_NONE,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             ui::EF_NONE);
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::LocatedEventTestApi test_api(&mouse_event);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetEventTarget(root_window, &mouse_event);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnMouseEvent(&mouse_event);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(mouse_event.handled());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(TooltipIsVisible());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should hide if the mouse is out of the tooltip.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_api.set_location(tooltip_rect.origin() + gfx::Vector2d(-1, -1));
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_handler->OnMouseEvent(&mouse_event);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(mouse_event.handled());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Checks that tooltip is hidden when mouse is pressed in anywhere.
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(ShelfTooltipManagerTest, HideForMouseClickEvent) {
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowImmediately();
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow();
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui::EventHandler* event_handler = GetEventHandler();
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect tooltip_rect = GetTooltipWidget()->GetNativeWindow()->bounds();
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(tooltip_rect.IsEmpty());
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Should hide if the mouse is pressed in the tooltip.
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, tooltip_rect.CenterPoint(),
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             tooltip_rect.CenterPoint(), ui::EF_NONE,
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             ui::EF_NONE);
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetEventTarget(root_window, &mouse_event);
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  event_handler->OnMouseEvent(&mouse_event);
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(mouse_event.handled());
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunAllPendingInMessageLoop();
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Should hide if the mouse is pressed outside of the tooltip.
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ShowImmediately();
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(TooltipIsVisible());
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::LocatedEventTestApi test_api(&mouse_event);
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  test_api.set_location(tooltip_rect.origin() + gfx::Vector2d(-1, -1));
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetEventTarget(root_window, &mouse_event);
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  event_handler->OnMouseEvent(&mouse_event);
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(mouse_event.handled());
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunAllPendingInMessageLoop();
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(TooltipIsVisible());
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
287