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