1868fa2fe829687343ffae624259930155e16dbd8Torne (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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_factory.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/coordinate_conversion.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/capture_client.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/env.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/aura/test/ui_controls_factory_aura.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_property.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls_aura.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DECLARE_WINDOW_PROPERTY_TYPE(ui_controls::UIControlsAura*)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace ash {
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace test {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using ui_controls::UIControlsAura;
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using ui_controls::MouseButton;
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_OWNED_WINDOW_PROPERTY_KEY(UIControlsAura, kUIControlsKey, NULL);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the UIControls object for RootWindow.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kUIControlsKey is owned property and UIControls object
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be deleted when the root window is deleted.
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)UIControlsAura* GetUIControlsForRootWindow(aura::Window* root_window) {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UIControlsAura* native_ui_control =
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      root_window->GetProperty(kUIControlsKey);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_ui_control) {
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    native_ui_control =
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        aura::test::CreateUIControlsAura(root_window->GetDispatcher());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pass the ownership to the |root_window|.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_window->SetProperty(kUIControlsKey, native_ui_control);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return native_ui_control;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the UIControls object for the RootWindow at the |point_in_screen|
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in virtual screen coordinates, and updates the |point| relative to the
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UIControlsAura's root window.  NULL if there is no RootWindow under
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |point_in_screen|.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UIControlsAura* GetUIControlsAt(gfx::Point* point_in_screen) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mazda): Support the case passive grab is taken.
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root = ash::wm::GetRootWindowAt(*point_in_screen);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::client::ScreenPositionClient* screen_position_client =
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aura::client::GetScreenPositionClient(root);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (screen_position_client)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screen_position_client->ConvertPointFromScreen(root, point_in_screen);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetUIControlsForRootWindow(root);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UIControlsAsh : public UIControlsAura {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIControlsAsh() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UIControlsAsh() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UIControslAura overrides:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendKeyPress(gfx::NativeWindow window,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ui::KeyboardCode key,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool control,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool shift,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool alt,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool command) OVERRIDE {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SendKeyPressNotifyWhenDone(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window, key, control, shift, alt, command, base::Closure());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendKeyPressNotifyWhenDone(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeWindow window,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::KeyboardCode key,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool control,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool shift,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool alt,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool command,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window* root =
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        window ? window->GetRootWindow() : ash::Shell::GetTargetRootWindow();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsForRootWindow(root);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendKeyPressNotifyWhenDone(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window, key, control, shift, alt, command, closure);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseMove(long x, long y) OVERRIDE {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point p(x, y);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(&p);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseMove(p.x(), p.y());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseMoveNotifyWhenDone(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long x,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long y,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point p(x, y);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(&p);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls->SendMouseMoveNotifyWhenDone(p.x(), p.y(), closure);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SendMouseEvents(MouseButton type, int state) OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(ash::Shell::GetScreen()->GetCursorScreenPoint());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(&p);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseEvents(type, state);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseEventsNotifyWhenDone(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MouseButton type, int state, const base::Closure& closure) OVERRIDE {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(aura::Env::GetInstance()->last_mouse_location());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(&p);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseEventsNotifyWhenDone(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, state, closure);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SendMouseClick(MouseButton type) OVERRIDE {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(ash::Shell::GetScreen()->GetCursorScreenPoint());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(&p);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseClick(type);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunClosureAfterAllPendingUIEvents(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsForRootWindow(
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        ash::Shell::GetTargetRootWindow());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ui_controls)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_controls->RunClosureAfterAllPendingUIEvents(closure);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UIControlsAsh);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ui_controls::UIControlsAura* CreateAshUIControls() {
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return new ash::test::UIControlsAsh();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace test
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace ash
150