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"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/aura/test/ui_controls_factory_aura.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_property.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.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 =
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        aura::test::CreateUIControlsAura(root_window->GetHost());
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)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns the UIControls object for the RootWindow at |point_in_screen|.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UIControlsAura* GetUIControlsAt(const gfx::Point& point_in_screen) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mazda): Support the case passive grab is taken.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetUIControlsForRootWindow(ash::wm::GetRootWindowAt(point_in_screen));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UIControlsAsh : public UIControlsAura {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIControlsAsh() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UIControlsAsh() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UIControslAura overrides:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendKeyPress(gfx::NativeWindow window,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ui::KeyboardCode key,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool control,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool shift,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool alt,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool command) OVERRIDE {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SendKeyPressNotifyWhenDone(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window, key, control, shift, alt, command, base::Closure());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendKeyPressNotifyWhenDone(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeWindow window,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::KeyboardCode key,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool control,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool shift,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool alt,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool command,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window* root =
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        window ? window->GetRootWindow() : ash::Shell::GetTargetRootWindow();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsForRootWindow(root);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendKeyPressNotifyWhenDone(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window, key, control, shift, alt, command, closure);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseMove(long x, long y) OVERRIDE {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point p(x, y);
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(p);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseMove(p.x(), p.y());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseMoveNotifyWhenDone(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long x,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      long y,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point p(x, y);
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(p);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls &&
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls->SendMouseMoveNotifyWhenDone(p.x(), p.y(), closure);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SendMouseEvents(MouseButton type, int state) OVERRIDE {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(ash::Shell::GetScreen()->GetCursorScreenPoint());
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(p);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseEvents(type, state);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SendMouseEventsNotifyWhenDone(
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MouseButton type, int state, const base::Closure& closure) OVERRIDE {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(aura::Env::GetInstance()->last_mouse_location());
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(p);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseEventsNotifyWhenDone(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        type, state, closure);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool SendMouseClick(MouseButton type) OVERRIDE {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Point p(ash::Shell::GetScreen()->GetCursorScreenPoint());
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsAt(p);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_controls && ui_controls->SendMouseClick(type);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RunClosureAfterAllPendingUIEvents(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& closure) OVERRIDE {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UIControlsAura* ui_controls = GetUIControlsForRootWindow(
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        ash::Shell::GetTargetRootWindow());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ui_controls)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_controls->RunClosureAfterAllPendingUIEvents(closure);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UIControlsAsh);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ui_controls::UIControlsAura* CreateAshUIControls() {
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return new ash::test::UIControlsAsh();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace test
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace ash
140