1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h"
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/env.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/test/aura_test_utils.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/aura/test/ui_controls_factory_aura.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/aura/window_tree_host.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/test/ui_controls_aura.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace aura {
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass UIControlsOzone : public ui_controls::UIControlsAura {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UIControlsOzone(WindowTreeHost* host) : host_(host) {}
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendKeyPress(gfx::NativeWindow window,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            ui::KeyboardCode key,
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool control,
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool shift,
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool alt,
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool command) OVERRIDE {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SendKeyPressNotifyWhenDone(
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        window, key, control, shift, alt, command, base::Closure());
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendKeyPressNotifyWhenDone(
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      gfx::NativeWindow window,
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::KeyboardCode key,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool control,
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool shift,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool alt,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool command,
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& closure) OVERRIDE {
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int flags = button_down_mask_;
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (control) {
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags |= ui::EF_CONTROL_DOWN;
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, flags);
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (shift) {
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags |= ui::EF_SHIFT_DOWN;
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SHIFT, flags);
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (alt) {
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags |= ui::EF_ALT_DOWN;
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_MENU, flags);
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (command) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flags |= ui::EF_COMMAND_DOWN;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PostKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_LWIN, flags);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    PostKeyEvent(ui::ET_KEY_PRESSED, key, flags);
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    PostKeyEvent(ui::ET_KEY_RELEASED, key, flags);
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (alt) {
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags &= ~ui::EF_ALT_DOWN;
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_MENU, flags);
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (shift) {
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags &= ~ui::EF_SHIFT_DOWN;
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_SHIFT, flags);
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (control) {
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      flags &= ~ui::EF_CONTROL_DOWN;
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, flags);
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (command) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      flags &= ~ui::EF_COMMAND_DOWN;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PostKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_LWIN, flags);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RunClosureAfterAllPendingUIEvents(closure);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendMouseMove(long screen_x, long screen_y) OVERRIDE {
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SendMouseMoveNotifyWhenDone(screen_x, screen_y, base::Closure());
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendMouseMoveNotifyWhenDone(
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      long screen_x,
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      long screen_y,
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& closure) OVERRIDE {
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gfx::Point root_location(screen_x, screen_y);
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        aura::client::GetScreenPositionClient(host_->window());
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (screen_position_client) {
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      screen_position_client->ConvertPointFromScreen(host_->window(),
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                     &root_location);
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gfx::Point root_current_location =
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        QueryLatestMousePositionRequestInHost(host_);
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    host_->ConvertPointFromHost(&root_current_location);
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (button_down_mask_)
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostMouseEvent(ui::ET_MOUSE_DRAGGED, root_location, 0, 0);
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    else
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostMouseEvent(ui::ET_MOUSE_MOVED, root_location, 0, 0);
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RunClosureAfterAllPendingUIEvents(closure);
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendMouseEvents(ui_controls::MouseButton type,
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               int state) OVERRIDE {
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SendMouseEventsNotifyWhenDone(type, state, base::Closure());
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendMouseEventsNotifyWhenDone(
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::MouseButton type,
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      int state,
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& closure) OVERRIDE {
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gfx::Point loc = aura::Env::GetInstance()->last_mouse_location();
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    aura::client::ScreenPositionClient* screen_position_client =
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        aura::client::GetScreenPositionClient(host_->window());
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (screen_position_client) {
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      screen_position_client->ConvertPointFromScreen(host_->window(), &loc);
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int flag = 0;
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    switch (type) {
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case ui_controls::LEFT:
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        flag = ui::EF_LEFT_MOUSE_BUTTON;
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case ui_controls::MIDDLE:
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        flag = ui::EF_MIDDLE_MOUSE_BUTTON;
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      case ui_controls::RIGHT:
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        flag = ui::EF_RIGHT_MOUSE_BUTTON;
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      default:
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        NOTREACHED();
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        break;
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (state & ui_controls::DOWN) {
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      button_down_mask_ |= flag;
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostMouseEvent(ui::ET_MOUSE_PRESSED, loc, button_down_mask_ | flag, flag);
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (state & ui_controls::UP) {
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      button_down_mask_ &= ~flag;
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PostMouseEvent(
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ui::ET_MOUSE_RELEASED, loc, button_down_mask_ | flag, flag);
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RunClosureAfterAllPendingUIEvents(closure);
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return true;
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool SendMouseClick(ui_controls::MouseButton type) OVERRIDE {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SendMouseEvents(type, ui_controls::UP | ui_controls::DOWN);
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RunClosureAfterAllPendingUIEvents(
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const base::Closure& closure) OVERRIDE {
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!closure.is_null())
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE, closure);
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void PostKeyEvent(ui::EventType type, ui::KeyboardCode key_code, int flags) {
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        FROM_HERE,
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::Bind(&UIControlsOzone::PostKeyEventTask,
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   base::Unretained(this),
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   type,
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   key_code,
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   flags));
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void PostKeyEventTask(ui::EventType type,
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        ui::KeyboardCode key_code,
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        int flags) {
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Do not rewrite injected events. See crbug.com/136465.
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    flags |= ui::EF_FINAL;
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::KeyEvent key_event(type, key_code, flags);
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    host_->PostNativeEvent(&key_event);
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void PostMouseEvent(ui::EventType type,
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      const gfx::PointF& location,
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      int flags,
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      int changed_button_flags) {
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::MessageLoop::current()->PostTask(
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        FROM_HERE,
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::Bind(&UIControlsOzone::PostMouseEventTask,
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   base::Unretained(this),
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   type,
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   location,
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   flags,
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   changed_button_flags));
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void PostMouseEventTask(ui::EventType type,
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          const gfx::PointF& location,
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          int flags,
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                          int changed_button_flags) {
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::MouseEvent mouse_event(
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        type, location, location, flags, changed_button_flags);
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // This hack is necessary to set the repeat count for clicks.
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::MouseEvent mouse_event2(&mouse_event);
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    host_->PostNativeEvent(&mouse_event2);
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WindowTreeHost* host_;
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Mask of the mouse buttons currently down.
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  unsigned button_down_mask_ = 0;
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(UIControlsOzone);
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdochui_controls::UIControlsAura* CreateUIControlsAura(WindowTreeHost* host) {
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return new UIControlsOzone(host);
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace test
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace aura
231