1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebInputEventConversion.h"
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "EventNames.h"
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "KeyboardCodes.h"
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "KeyboardEvent.h"
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "MouseEvent.h"
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PlatformKeyboardEvent.h"
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PlatformMouseEvent.h"
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PlatformWheelEvent.h"
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScrollView.h"
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebInputEvent.h"
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WheelEvent.h"
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Widget.h"
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore;
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit {
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// MakePlatformMouseEvent -----------------------------------------------------
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
52643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformMouseEventBuilder::PlatformMouseEventBuilder(Widget* widget, const WebMouseEvent& e)
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: widget is always toplevel, unless it's a popup.  We may be able
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // to get rid of this once we abstract popups into a WebKit API.
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_position = widget->convertFromContainingWindow(IntPoint(e.x, e.y));
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_globalPosition = IntPoint(e.globalX, e.globalY);
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_button = static_cast<MouseButton>(e.button);
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_shiftKey = (e.modifiers & WebInputEvent::ShiftKey);
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_ctrlKey = (e.modifiers & WebInputEvent::ControlKey);
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_altKey = (e.modifiers & WebInputEvent::AltKey);
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_metaKey = (e.modifiers & WebInputEvent::MetaKey);
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_modifierFlags = e.modifiers;
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_timestamp = e.timeStampSeconds;
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_clickCount = e.clickCount;
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (e.type) {
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::MouseMove:
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::MouseLeave:  // synthesize a move event
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_eventType = MouseEventMoved;
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::MouseDown:
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_eventType = MouseEventPressed;
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::MouseUp:
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_eventType = MouseEventReleased;
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    default:
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// PlatformWheelEventBuilder --------------------------------------------------
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
88643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformWheelEventBuilder::PlatformWheelEventBuilder(Widget* widget, const WebMouseWheelEvent& e)
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_position = widget->convertFromContainingWindow(IntPoint(e.x, e.y));
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_globalPosition = IntPoint(e.globalX, e.globalY);
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_deltaX = e.deltaX;
93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_deltaY = e.deltaY;
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_wheelTicksX = e.wheelTicksX;
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_wheelTicksY = e.wheelTicksY;
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_isAccepted = false;
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_granularity = e.scrollByPage ?
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ScrollByPageWheelEvent : ScrollByPixelWheelEvent;
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_shiftKey = (e.modifiers & WebInputEvent::ShiftKey);
100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_ctrlKey = (e.modifiers & WebInputEvent::ControlKey);
101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_altKey = (e.modifiers & WebInputEvent::AltKey);
102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_metaKey = (e.modifiers & WebInputEvent::MetaKey);
103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// MakePlatformKeyboardEvent --------------------------------------------------
106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochstatic inline PlatformKeyboardEvent::Type toPlatformKeyboardEventType(WebInputEvent::Type type)
108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (type) {
110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::KeyUp:
111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return PlatformKeyboardEvent::KeyUp;
112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::KeyDown:
113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return PlatformKeyboardEvent::KeyDown;
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::RawKeyDown:
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return PlatformKeyboardEvent::RawKeyDown;
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebInputEvent::Char:
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return PlatformKeyboardEvent::Char;
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    default:
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return PlatformKeyboardEvent::KeyDown;
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
124643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPlatformKeyboardEventBuilder::PlatformKeyboardEventBuilder(const WebKeyboardEvent& e)
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_type = toPlatformKeyboardEventType(e.type);
127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_text = String(e.text);
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_unmodifiedText = String(e.unmodifiedText);
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_keyIdentifier = String(e.keyIdentifier);
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_autoRepeat = (e.modifiers & WebInputEvent::IsAutoRepeat);
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_windowsVirtualKeyCode = e.windowsKeyCode;
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_nativeVirtualKeyCode = e.nativeKeyCode;
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_isKeypad = (e.modifiers & WebInputEvent::IsKeyPad);
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_shiftKey = (e.modifiers & WebInputEvent::ShiftKey);
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_ctrlKey = (e.modifiers & WebInputEvent::ControlKey);
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_altKey = (e.modifiers & WebInputEvent::AltKey);
137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_metaKey = (e.modifiers & WebInputEvent::MetaKey);
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_isSystemKey = e.isSystemKey;
139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
141643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid PlatformKeyboardEventBuilder::setKeyType(Type type)
142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // According to the behavior of Webkit in Windows platform,
144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // we need to convert KeyDown to RawKeydown and Char events
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // See WebKit/WebKit/Win/WebView.cpp
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(m_type == KeyDown);
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(type == RawKeyDown || type == Char);
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_type = type;
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (type == RawKeyDown) {
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_text = String();
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_unmodifiedText = String();
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_keyIdentifier = String();
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_windowsVirtualKeyCode = 0;
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Please refer to bug http://b/issue?id=961192, which talks about Webkit
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// keyboard event handling changes. It also mentions the list of keys
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// which don't have associated character events.
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool PlatformKeyboardEventBuilder::isCharacterKey() const
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (windowsVirtualKeyCode()) {
165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case VKEY_BACK:
166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case VKEY_ESCAPE:
167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return true;
170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(TOUCH_EVENTS)
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline TouchEventType toPlatformTouchEventType(const WebInputEvent::Type type)
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (type) {
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebInputEvent::TouchStart:
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return TouchStart;
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebInputEvent::TouchMove:
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return TouchMove;
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebInputEvent::TouchEnd:
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return TouchEnd;
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebInputEvent::TouchCancel:
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return TouchCancel;
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return TouchStart;
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline PlatformTouchPoint::State toPlatformTouchPointState(const WebTouchPoint::State state)
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (state) {
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StateReleased:
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PlatformTouchPoint::TouchReleased;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StatePressed:
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PlatformTouchPoint::TouchPressed;
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StateMoved:
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PlatformTouchPoint::TouchMoved;
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StateStationary:
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PlatformTouchPoint::TouchStationary;
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StateCancelled:
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PlatformTouchPoint::TouchCancelled;
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case WebTouchPoint::StateUndefined:
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return PlatformTouchPoint::TouchReleased;
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTouchPoint& point)
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_id = point.id;
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_state = toPlatformTouchPointState(point.state);
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_pos = widget->convertFromContainingWindow(point.position);
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_screenPos = point.screenPosition;
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockPlatformTouchEventBuilder::PlatformTouchEventBuilder(Widget* widget, const WebTouchEvent& event)
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_type = toPlatformTouchEventType(event.type);
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_ctrlKey = event.modifiers & WebInputEvent::ControlKey;
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_altKey = event.modifiers & WebInputEvent::AltKey;
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_shiftKey = event.modifiers & WebInputEvent::ShiftKey;
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_metaKey = event.modifiers & WebInputEvent::MetaKey;
22481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_timestamp = event.timeStampSeconds;
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (int i = 0; i < event.touchPointsLength; ++i)
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_touchPoints.append(PlatformTouchPointBuilder(widget, event.touchPoints[i]));
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic int getWebInputModifiers(const UIEventWithKeyState& event)
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int modifiers = 0;
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.ctrlKey())
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        modifiers |= WebInputEvent::ControlKey;
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.shiftKey())
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        modifiers |= WebInputEvent::ShiftKey;
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.altKey())
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        modifiers |= WebInputEvent::AltKey;
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.metaKey())
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        modifiers |= WebInputEvent::MetaKey;
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return modifiers;
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2450617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenWebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, const MouseEvent& event)
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.type() == eventNames().mousemoveEvent)
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::MouseMove;
249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().mouseoutEvent)
250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::MouseLeave;
251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().mouseoverEvent)
252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::MouseEnter;
253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().mousedownEvent)
254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::MouseDown;
255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().mouseupEvent)
256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::MouseUp;
2570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    else if (event.type() == eventNames().contextmenuEvent)
2580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        type = WebInputEvent::ContextMenu;
259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return; // Skip all other mouse events.
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    timeStampSeconds = event.timeStamp() * 1.0e-3;
262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (event.button()) {
263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case LeftButton:
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        button = WebMouseEvent::ButtonLeft;
265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case MiddleButton:
267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        button = WebMouseEvent::ButtonMiddle;
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case RightButton:
270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        button = WebMouseEvent::ButtonRight;
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    modifiers = getWebInputModifiers(event);
274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.buttonDown()) {
275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        switch (event.button()) {
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case LeftButton:
277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            modifiers |= WebInputEvent::LeftButtonDown;
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case MiddleButton:
280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            modifiers |= WebInputEvent::MiddleButtonDown;
281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        case RightButton:
283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            modifiers |= WebInputEvent::RightButtonDown;
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            break;
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    ScrollView* view = widget->parent();
2880617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    IntPoint p = view->contentsToWindow(
2890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y()));
290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    globalX = event.screenX();
291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    globalY = event.screenY();
292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    windowX = p.x();
293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    windowY = p.y();
2940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    x = event.absoluteLocation().x() - widget->pos().x();
2950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    y = event.absoluteLocation().y() - widget->pos().y();
296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    clickCount = event.detail();
297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2990617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenWebMouseWheelEventBuilder::WebMouseWheelEventBuilder(const Widget* widget, const WheelEvent& event)
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (event.type() != eventNames().mousewheelEvent)
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    type = WebInputEvent::MouseWheel;
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    timeStampSeconds = event.timeStamp() * 1.0e-3;
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modifiers = getWebInputModifiers(event);
3060617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    ScrollView* view = widget->parent();
3070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    IntPoint p = view->contentsToWindow(
3080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y()));
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    globalX = event.screenX();
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    globalY = event.screenY();
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    windowX = p.x();
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    windowY = p.y();
3130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    x = event.absoluteLocation().x() - widget->pos().x();
3140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    y = event.absoluteLocation().y() - widget->pos().y();
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deltaX = static_cast<float>(event.rawDeltaX());
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    deltaY = static_cast<float>(event.rawDeltaY());
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // The 120 is from WheelEvent::initWheelEvent().
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wheelTicksX = static_cast<float>(event.wheelDeltaX()) / 120;
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    wheelTicksY = static_cast<float>(event.wheelDeltaY()) / 120;
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    scrollByPage = event.granularity() == WheelEvent::Page;
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
323643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event)
324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (event.type() == eventNames().keydownEvent)
326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = KeyDown;
327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().keyupEvent)
328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::KeyUp;
329643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (event.type() == eventNames().keypressEvent)
330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        type = WebInputEvent::Char;
331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return; // Skip all other keyboard events.
333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    modifiers = getWebInputModifiers(event);
334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    timeStampSeconds = event.timeStamp() * 1.0e-3;
335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    windowsKeyCode = event.keyCode();
336e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
337e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // The platform keyevent does not exist if the event was created using
338e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // initKeyboardEvent.
339e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (!event.keyEvent())
340e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        return;
341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    nativeKeyCode = event.keyEvent()->nativeVirtualKeyCode();
342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    unsigned int numChars = std::min(event.keyEvent()->text().length(),
343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static_cast<unsigned int>(WebKeyboardEvent::textLengthCap));
344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (unsigned int i = 0; i < numChars; i++) {
345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        text[i] = event.keyEvent()->text()[i];
346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        unmodifiedText[i] = event.keyEvent()->unmodifiedText()[i];
347643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
350643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit
351