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, &center);
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