15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "athena/screen/public/screen_manager.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <algorithm>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "athena/test/athena_test_base.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/container_priorities.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/aura/window.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/wm/core/window_util.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef athena::test::AthenaTestBase ScreenManagerTest;
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace athena {
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace {
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kTestZOrderPriority = 10;
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)aura::Window* Create(const std::string& name, int z_order_priority) {
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams params(name, z_order_priority);
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ScreenManager::Get()->CreateContainer(params);
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)aura::Window* CreateWindow(aura::Window* container,
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           aura::WindowDelegate* delegate,
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           const gfx::Rect& bounds) {
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* window = new aura::Window(delegate);
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window->SetType(ui::wm::WINDOW_TYPE_NORMAL);
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window->Init(aura::WINDOW_LAYER_TEXTURED);
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  container->AddChild(window);
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window->Show();
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  window->SetBounds(bounds);
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return window;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CheckZOrder(aura::Window* w1, aura::Window* w2) {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* parent = w1->parent();
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const aura::Window::Windows& children = parent->children();
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window::Windows::const_iterator begin_iter = children.begin();
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window::Windows::const_iterator end_iter = children.end();
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window::Windows::const_iterator w1_iter =
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::find(begin_iter, end_iter, w1);
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window::Windows::const_iterator w2_iter =
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      std::find(begin_iter, end_iter, w2);
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE(end_iter, w1_iter);
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE(end_iter, w2_iter);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(w1_iter < w2_iter);
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, CreateContainer) {
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  size_t num_containers = root_window()->children().size();
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* container = Create("test", kTestZOrderPriority);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("test", container->name());
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const aura::Window::Windows& containers = root_window()->children();
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(num_containers + 1, containers.size());
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_NE(containers.end(),
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            std::find(containers.begin(), containers.end(), container));
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, Zorder) {
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* window_10 = Create("test10", 10);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* window_11 = Create("test11", 11);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* window_12 = Create("test12", 12);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE("Init");
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CheckZOrder(window_10, window_11);
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CheckZOrder(window_11, window_12);
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE("Delete");
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    delete window_11;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CheckZOrder(window_10, window_12);
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE("Insert");
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    window_11 = Create("test11", 11);
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CheckZOrder(window_10, window_11);
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CheckZOrder(window_11, window_12);
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, NonActivatableContainer) {
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams non_activatable(
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "non_activatable", kTestZOrderPriority);
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  non_activatable.can_activate_children = false;
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* no_activatable_container =
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(non_activatable);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams activatable(
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "activatable", kTestZOrderPriority + 1);
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  activatable.can_activate_children = true;
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* activatable_container =
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(activatable);
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> window(
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CreateWindow(no_activatable_container, NULL, gfx::Rect(0, 0, 100, 100)));
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(wm::CanActivateWindow(window.get()));
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  activatable_container->AddChild(window.get());
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(wm::CanActivateWindow(window.get()));
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, GrabInputContainer) {
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams normal_params(
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "normal", kTestZOrderPriority);
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  normal_params.can_activate_children = true;
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* normal_container =
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(normal_params);
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate normal_delegate;
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> normal_window(CreateWindow(
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      normal_container, &normal_delegate, gfx::Rect(0, 0, 100, 100)));
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(wm::CanActivateWindow(normal_window.get()));
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wm::ActivateWindow(normal_window.get());
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator event_generator(root_window());
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.MoveMouseTo(0, 0);
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ClickLeftButton();
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", normal_delegate.GetMouseButtonCountsAndReset());
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_A, ui::EF_NONE);
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", normal_delegate.GetKeyCountsAndReset());
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams grab_params(
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "grabbing", kTestZOrderPriority + 1);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.can_activate_children = true;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.grab_inputs = true;
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* grab_container =
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(grab_params);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(wm::CanActivateWindow(normal_window.get()));
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate grab_delegate;
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> grab_window(CreateWindow(
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      grab_container, &grab_delegate, gfx::Rect(10, 10, 100, 100)));
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(wm::CanActivateWindow(grab_window.get()));
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  wm::ActivateWindow(grab_window.get());
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // (0, 0) is still on normal_window, but the event should not go there
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // because grabbing_container prevents it.
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.MoveMouseTo(0, 0);
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ClickLeftButton();
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", normal_delegate.GetMouseButtonCountsAndReset());
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", grab_delegate.GetMouseButtonCountsAndReset());
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.MoveMouseTo(20, 20);
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ClickLeftButton();
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", grab_delegate.GetMouseButtonCountsAndReset());
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ReleaseKey(ui::VKEY_A, ui::EF_NONE);
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", normal_delegate.GetKeyCountsAndReset());
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", grab_delegate.GetKeyCountsAndReset());
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, GrabShouldNotBlockVirtualKeyboard) {
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams grab_params("grabbing", kTestZOrderPriority);
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.can_activate_children = true;
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.grab_inputs = true;
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* grab_container =
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(grab_params);
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate grab_delegate;
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> grab_window(
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CreateWindow(grab_container, &grab_delegate, gfx::Rect(0, 0, 100, 100)));
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(wm::CanActivateWindow(grab_window.get()));
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Create a normal container appearing over the |grab_container|. This is
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // essentially the case of virtual keyboard.
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams vk_params(
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "virtual keyboard", kTestZOrderPriority + 1);
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  vk_params.can_activate_children = true;
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* vk_container = ScreenManager::Get()->CreateContainer(vk_params);
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate vk_delegate;
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> vk_window(
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CreateWindow(vk_container, &vk_delegate, gfx::Rect(0, 20, 100, 80)));
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(wm::CanActivateWindow(vk_window.get()));
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator event_generator(root_window());
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.MoveMouseTo(10, 25);
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ClickLeftButton();
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", grab_delegate.GetMouseButtonCountsAndReset());
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", vk_delegate.GetMouseButtonCountsAndReset());
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ScreenManagerTest, GrabAndMouseCapture) {
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams normal_params(
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "normal", kTestZOrderPriority);
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  normal_params.can_activate_children = true;
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* normal_container =
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(normal_params);
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate normal_delegate;
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> normal_window(CreateWindow(
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      normal_container, &normal_delegate, gfx::Rect(0, 0, 100, 100)));
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::test::EventGenerator event_generator(root_window());
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.MoveMouseTo(0, 0);
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.PressLeftButton();
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Creating grabbing container while mouse pressing.
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScreenManager::ContainerParams grab_params(
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "grabbing", kTestZOrderPriority + 1);
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.can_activate_children = true;
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  grab_params.grab_inputs = true;
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::Window* grab_container =
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ScreenManager::Get()->CreateContainer(grab_params);
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  aura::test::EventCountDelegate grab_delegate;
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<aura::Window> grab_window(CreateWindow(
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      grab_container, &grab_delegate, gfx::Rect(10, 10, 100, 100)));
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Release event should be sent to |normal_window| because it captures the
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // mouse event.
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ReleaseLeftButton();
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("1 1", normal_delegate.GetMouseButtonCountsAndReset());
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", grab_delegate.GetMouseButtonCountsAndReset());
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // After release, further mouse events should not be sent to |normal_window|
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // because grab_container grabs the input.
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_generator.ClickLeftButton();
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", normal_delegate.GetMouseButtonCountsAndReset());
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ("0 0", grab_delegate.GetMouseButtonCountsAndReset());
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace athena
240