15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 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) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/aura/test/event_generator_delegate_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/memory/singleton.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/screen_position_client.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/window_tree_host.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace aura { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DefaultEventGeneratorDelegate : public EventGeneratorDelegateAura { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static DefaultEventGeneratorDelegate* GetInstance() { 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return Singleton<DefaultEventGeneratorDelegate>::get(); 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // EventGeneratorDelegate: 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void SetContext(ui::test::EventGenerator* owner, 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::NativeWindow root_window, 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::NativeWindow window) OVERRIDE { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root_window_ = root_window; 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // EventGeneratorDelegateAura: 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual WindowTreeHost* GetHostAt(const gfx::Point& point) const OVERRIDE { 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return root_window_->GetHost(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual client::ScreenPositionClient* GetScreenPositionClient( 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const aura::Window* window) const OVERRIDE { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) friend struct DefaultSingletonTraits<DefaultEventGeneratorDelegate>; 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DefaultEventGeneratorDelegate() : root_window_(NULL) { 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(!ui::test::EventGenerator::default_delegate); 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::test::EventGenerator::default_delegate = this; 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~DefaultEventGeneratorDelegate() { 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_EQ(this, ui::test::EventGenerator::default_delegate); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::test::EventGenerator::default_delegate = NULL; 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Window* root_window_; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DefaultEventGeneratorDelegate); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst Window* WindowFromTarget(const ui::EventTarget* event_target) { 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<const Window*>(event_target); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void InitializeAuraEventGeneratorDelegate() { 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DefaultEventGeneratorDelegate::GetInstance(); 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 67116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGeneratorDelegateAura::EventGeneratorDelegateAura() { 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEventGeneratorDelegateAura::~EventGeneratorDelegateAura() { 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdochui::EventTarget* EventGeneratorDelegateAura::GetTargetAt( 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Point& location) { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetHostAt(location)->window(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdochui::EventSource* EventGeneratorDelegateAura::GetEventSource( 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::EventTarget* target) { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<Window*>(target)->GetHost()->GetEventSource(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Point EventGeneratorDelegateAura::CenterOfTarget( 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventTarget* target) const { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point center = 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect(WindowFromTarget(target)->bounds().size()).CenterPoint(); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConvertPointFromTarget(target, ¢er); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return center; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Point EventGeneratorDelegateAura::CenterOfWindow( 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::NativeWindow window) const { 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return CenterOfTarget(window); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGeneratorDelegateAura::ConvertPointFromTarget( 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventTarget* event_target, 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point* point) const { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(point); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Window* target = WindowFromTarget(event_target); 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch aura::client::ScreenPositionClient* client = GetScreenPositionClient(target); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (client) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->ConvertPointToScreen(target, point); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window::ConvertPointToTarget(target, target->GetRootWindow(), point); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGeneratorDelegateAura::ConvertPointToTarget( 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventTarget* event_target, 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point* point) const { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(point); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Window* target = WindowFromTarget(event_target); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch aura::client::ScreenPositionClient* client = GetScreenPositionClient(target); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (client) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->ConvertPointFromScreen(target, point); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window::ConvertPointToTarget(target->GetRootWindow(), target, point); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EventGeneratorDelegateAura::ConvertPointFromHost( 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::EventTarget* hosted_target, 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Point* point) const { 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Window* window = WindowFromTarget(hosted_target); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window->GetHost()->ConvertPointFromHost(point); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace test 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace aura 129