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