Index: content/browser/renderer_host/render_widget_host_view_win.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_win.cc b/content/browser/renderer_host/render_widget_host_view_win.cc |
index 3de8d20eea2ce1937aba87a855d867e8309b7a55..56dfab5e86c974ab649b91440922e28930724960 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_win.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc |
@@ -51,6 +51,7 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/win/WebInputEventFactory.h" |
+#include "ui/base/event.h" |
#include "ui/base/ime/composition_text.h" |
#include "ui/base/l10n/l10n_util_win.h" |
#include "ui/base/text/text_elider.h" |
@@ -305,9 +306,6 @@ class WrappedObject : public IINTERFACE { |
public: |
WrappedObject() { |
} |
- WrappedObject(const PAYLOAD ©) |
- : data_(copy) { |
- } |
const PAYLOAD& data() const { |
return data_; |
} |
@@ -459,78 +457,23 @@ class LocalGestureEvent : |
DISALLOW_COPY_AND_ASSIGN(LocalGestureEvent); |
}; |
-class LocalTouchEvent : |
- public WrappedObject<ui::TouchEvent, WebKit::WebTouchEvent> { |
+class TouchEventFromWebTouchPoint : public ui::TouchEventImpl { |
public: |
- LocalTouchEvent() : index_(0) {} |
- LocalTouchEvent( |
- ui::EventType type, |
- const gfx::Point& location, |
- int touch_id, |
- base::TimeDelta time_stamp) : |
- index_(0) { |
- data().type = ConvertToWebInputEvent(type); |
- data().timeStampSeconds = time_stamp.InSecondsF(); |
- } |
- |
- LocalTouchEvent(const WebKit::WebTouchEvent& copy, |
- ui::EventType type, |
- base::TimeDelta time_stamp, |
- size_t index = 0) : |
- WrappedObject<ui::TouchEvent, WebKit::WebTouchEvent>(copy), |
- index_(index) { |
- data().type = ConvertToWebInputEvent(type); |
- DCHECK(copy.touchesLength > index) << "Undefined touch point."; |
- data().timeStampSeconds = time_stamp.InSecondsF(); |
- } |
- |
- // TODO: make these functions non-virtual post http://crbug.com/125937 |
- virtual ui::EventType GetEventType() const OVERRIDE { |
- return ConvertToUIEvent(data().touches[index_].state); |
- } |
- virtual gfx::Point GetLocation() const OVERRIDE { |
- return data().touches[index_].position; |
- } |
- virtual int GetTouchId() const OVERRIDE { |
- return data().touches[index_].id; |
- } |
- virtual int GetEventFlags() const OVERRIDE { |
- return 0; |
- } |
- virtual base::TimeDelta GetTimestamp() const OVERRIDE { |
- return base::TimeDelta::FromMilliseconds( 1000 * data().timeStampSeconds); |
- } |
- void SetTimestamp(base::TimeDelta t) { |
- data().timeStampSeconds = t.InSecondsF(); |
- } |
- virtual float RadiusX() const OVERRIDE { |
- return data().touches[index_].radiusX; |
- } |
- virtual float RadiusY() const OVERRIDE { |
- return data().touches[index_].radiusY; |
- } |
- virtual float RotationAngle() const OVERRIDE { |
- return data().touches[index_].rotationAngle; |
- } |
- virtual float Force() const OVERRIDE { |
- return data().touches[index_].force; |
+ TouchEventFromWebTouchPoint(const WebKit::WebTouchPoint& touch_point, |
+ base::TimeDelta& timestamp) |
+ : ui::TouchEventImpl(ConvertToUIEvent(touch_point.state), |
+ touch_point.position, |
+ touch_point.id, |
+ timestamp) { |
+ set_radius(touch_point.radiusX, touch_point.radiusY); |
+ set_rotation_angle(touch_point.rotationAngle); |
+ set_force(touch_point.force); |
} |
- // Returns a copy of the touch event at the specified index. |
- const LocalTouchEvent& Index( size_t index) const { |
- const int touch_history_size = 40; |
- static LocalTouchEvent touch_history[touch_history_size]; |
- static int touch_history_index; |
- int current = (touch_history_index++ % touch_history_size); |
- touch_history[current].data() = data(); |
- touch_history[current].index_ = index; |
- return touch_history[current]; |
- } |
+ virtual ~TouchEventFromWebTouchPoint() {} |
private: |
- size_t index_; |
- |
- DISALLOW_COPY_AND_ASSIGN(LocalTouchEvent); |
+ DISALLOW_COPY_AND_ASSIGN(TouchEventFromWebTouchPoint); |
}; |
} // namespace |
@@ -551,17 +494,19 @@ class WebTouchState { |
bool ReleaseTouchPoints(); |
// The contained WebTouchEvent. |
- const WebKit::WebTouchEvent& touch_event() { return touch_event_.data(); } |
- const LocalTouchEvent* ui_touch_event() { return &touch_event_; } |
+ const WebKit::WebTouchEvent& touch_event() { return touch_event_; } |
// Returns if any touches are modified in the event. |
- bool is_changed() { return touch_event_.data().changedTouchesLength != 0; } |
+ bool is_changed() { return touch_event_.changedTouchesLength != 0; } |
void QueueEvents(ui::GestureConsumer* consumer, ui::GestureRecognizer* gr) { |
- if (touch_event_.data().touchesLength > 0) |
- touch_count_.push(touch_event_.data().touchesLength); |
- for (size_t i = 0; i < touch_event_.data().touchesLength; ++i) { |
- gr->QueueTouchEventForGesture(consumer, touch_event_.Index(i)); |
+ if (touch_event_.touchesLength > 0) |
+ touch_count_.push(touch_event_.touchesLength); |
+ base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( |
+ touch_event_.timeStampSeconds * 1000); |
+ for (size_t i = 0; i < touch_event_.touchesLength; ++i) { |
+ gr->QueueTouchEventForGesture(consumer, |
+ TouchEventFromWebTouchPoint(touch_event_.touches[i], timestamp)); |
} |
} |
@@ -595,7 +540,7 @@ class WebTouchState { |
// send the correct number of AdvanceTouchQueue's |
std::stack<int> touch_count_; |
- LocalTouchEvent touch_event_; |
+ WebKit::WebTouchEvent touch_event_; |
const RenderWidgetHostViewWin* const window_; |
// Maps OS touch Id's into an internal (WebKit-friendly) touch-id. |
@@ -1314,7 +1259,7 @@ ui::TouchEvent* RenderWidgetHostViewWin::CreateTouchEvent( |
const gfx::Point& location, |
int touch_id, |
base::TimeDelta time_stamp) { |
- return new LocalTouchEvent(type, location, touch_id, time_stamp); |
+ return new ui::TouchEventImpl(type, location, touch_id, time_stamp); |
} |
bool RenderWidgetHostViewWin::DispatchLongPressGestureEvent( |
@@ -1327,9 +1272,10 @@ bool RenderWidgetHostViewWin::DispatchCancelTouchEvent( |
if (!render_widget_host_ || !touch_events_enabled_) |
return false; |
DCHECK(event->GetEventType() == WebKit::WebInputEvent::TouchCancel); |
- LocalTouchEvent touchEvent(event->GetEventType(), |
- event->GetLocation(), event->GetTouchId(), event->GetTimestamp()); |
- render_widget_host_->ForwardTouchEvent(touchEvent.data()); |
+ WebKit::WebTouchEvent cancel_event; |
+ cancel_event.type = WebKit::WebInputEvent::TouchCancel; |
+ cancel_event.timeStampSeconds = event->GetTimestamp().InSecondsF(); |
+ render_widget_host_->ForwardTouchEvent(cancel_event); |
return true; |
} |
@@ -2101,18 +2047,18 @@ size_t WebTouchState::UpdateTouchPoints( |
// and alter/add any touchpoints (from the touch input buffer) that we can |
// coalesce into a single message. The return value is the number of consumed |
// input message. |
- WebKit::WebTouchPoint* point = touch_event_.data().touches; |
- WebKit::WebTouchPoint* end = point + touch_event_.data().touchesLength; |
+ WebKit::WebTouchPoint* point = touch_event_.touches; |
+ WebKit::WebTouchPoint* end = point + touch_event_.touchesLength; |
while (point < end) { |
if (point->state == WebKit::WebTouchPoint::StateReleased) { |
*point = *(--end); |
- --touch_event_.data().touchesLength; |
+ --touch_event_.touchesLength; |
} else { |
point->state = WebKit::WebTouchPoint::StateStationary; |
point++; |
} |
} |
- touch_event_.data().changedTouchesLength = 0; |
+ touch_event_.changedTouchesLength = 0; |
// Consume all events of the same type and add them to the changed list. |
int last_type = 0; |
@@ -2120,9 +2066,9 @@ size_t WebTouchState::UpdateTouchPoints( |
unsigned int mapped_id = GetMappedTouch(points[i].dwID); |
WebKit::WebTouchPoint* point = NULL; |
- for (unsigned j = 0; j < touch_event_.data().touchesLength; ++j) { |
- if (static_cast<DWORD>(touch_event_.data().touches[j].id) == mapped_id) { |
- point = &touch_event_.data().touches[j]; |
+ for (unsigned j = 0; j < touch_event_.touchesLength; ++j) { |
+ if (static_cast<DWORD>(touch_event_.touches[j].id) == mapped_id) { |
+ point = &touch_event_.touches[j]; |
break; |
} |
} |
@@ -2133,18 +2079,17 @@ size_t WebTouchState::UpdateTouchPoints( |
SetTouchType(&points[i], TOUCHEVENTF_MOVE); |
// Stop processing when the event type changes. |
- if (touch_event_.data().changedTouchesLength && type != last_type) |
+ if (touch_event_.changedTouchesLength && type != last_type) |
return i; |
- touch_event_.SetTimestamp( |
- base::TimeDelta::FromMilliseconds(points[i].dwTime)); |
+ touch_event_.timeStampSeconds = points[i].dwTime / 1000.0; |
last_type = type; |
switch (type) { |
case TOUCHEVENTF_DOWN: { |
if (!(point = AddTouchPoint(&points[i]))) |
continue; |
- touch_event_.data().type = WebKit::WebInputEvent::TouchStart; |
+ touch_event_.type = WebKit::WebInputEvent::TouchStart; |
break; |
} |
@@ -2153,7 +2098,7 @@ size_t WebTouchState::UpdateTouchPoints( |
continue; |
point->state = WebKit::WebTouchPoint::StateReleased; |
UpdateTouchPoint(point, &points[i]); |
- touch_event_.data().type = WebKit::WebInputEvent::TouchEnd; |
+ touch_event_.type = WebKit::WebInputEvent::TouchEnd; |
break; |
} |
@@ -2163,8 +2108,8 @@ size_t WebTouchState::UpdateTouchPoints( |
// Don't update the message if the point didn't really move. |
if (UpdateTouchPoint(point, &points[i])) |
continue; |
- touch_event_.data().type = WebKit::WebInputEvent::TouchMove; |
- } else if (touch_event_.data().changedTouchesLength) { |
+ touch_event_.type = WebKit::WebInputEvent::TouchMove; |
+ } else if (touch_event_.changedTouchesLength) { |
RemoveExpiredMappings(); |
// Can't add a point if we're already handling move events. |
return i; |
@@ -2174,7 +2119,7 @@ size_t WebTouchState::UpdateTouchPoints( |
continue; |
last_type = TOUCHEVENTF_DOWN; |
SetTouchType(&points[i], TOUCHEVENTF_DOWN); |
- touch_event_.data().type = WebKit::WebInputEvent::TouchStart; |
+ touch_event_.type = WebKit::WebInputEvent::TouchStart; |
} |
break; |
} |
@@ -2183,8 +2128,7 @@ size_t WebTouchState::UpdateTouchPoints( |
NOTREACHED(); |
continue; |
} |
- touch_event_.data().changedTouches[ |
- touch_event_.data().changedTouchesLength++] = *point; |
+ touch_event_.changedTouches[touch_event_.changedTouchesLength++] = *point; |
} |
RemoveExpiredMappings(); |
@@ -2196,8 +2140,8 @@ void WebTouchState::RemoveExpiredMappings() { |
for (MapType::iterator it = touch_map_.begin(); |
it != touch_map_.end(); |
++it) { |
- WebKit::WebTouchPoint* point = touch_event_.data().touches; |
- WebKit::WebTouchPoint* end = point + touch_event_.data().touchesLength; |
+ WebKit::WebTouchPoint* point = touch_event_.touches; |
+ WebKit::WebTouchPoint* end = point + touch_event_.touchesLength; |
while (point < end) { |
if ((point->id == it->second) && |
(point->state != WebKit::WebTouchPoint::StateReleased)) { |
@@ -2212,14 +2156,14 @@ void WebTouchState::RemoveExpiredMappings() { |
bool WebTouchState::ReleaseTouchPoints() { |
- if (touch_event_.data().touchesLength == 0) |
+ if (touch_event_.touchesLength == 0) |
return false; |
// Mark every active touchpoint as released. |
- touch_event_.data().type = WebKit::WebInputEvent::TouchEnd; |
- touch_event_.data().changedTouchesLength = touch_event_.data().touchesLength; |
- for (unsigned int i = 0; i < touch_event_.data().touchesLength; ++i) { |
- touch_event_.data().touches[i].state = WebKit::WebTouchPoint::StateReleased; |
- touch_event_.data().changedTouches[i].state = |
+ touch_event_.type = WebKit::WebInputEvent::TouchEnd; |
+ touch_event_.changedTouchesLength = touch_event_.touchesLength; |
+ for (unsigned int i = 0; i < touch_event_.touchesLength; ++i) { |
+ touch_event_.touches[i].state = WebKit::WebTouchPoint::StateReleased; |
+ touch_event_.changedTouches[i].state = |
WebKit::WebTouchPoint::StateReleased; |
} |
@@ -2228,13 +2172,13 @@ bool WebTouchState::ReleaseTouchPoints() { |
WebKit::WebTouchPoint* WebTouchState::AddTouchPoint( |
TOUCHINPUT* touch_input) { |
- DCHECK(touch_event_.data().touchesLength < |
+ DCHECK(touch_event_.touchesLength < |
WebKit::WebTouchEvent::touchesLengthCap); |
- if (touch_event_.data().touchesLength >= |
+ if (touch_event_.touchesLength >= |
WebKit::WebTouchEvent::touchesLengthCap) |
return NULL; |
WebKit::WebTouchPoint* point = |
- &touch_event_.data().touches[touch_event_.data().touchesLength++]; |
+ &touch_event_.touches[touch_event_.touchesLength++]; |
point->state = WebKit::WebTouchPoint::StatePressed; |
point->id = GetMappedTouch(touch_input->dwID); |
UpdateTouchPoint(point, touch_input); |
@@ -2313,11 +2257,14 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam, |
touch_state_->QueueEvents(this, gesture_recognizer_.get()); |
} |
} else { |
- const LocalTouchEvent* touch_event = touch_state_->ui_touch_event(); |
- for (size_t i = 0; i < touch_event->data().touchesLength; ++i) { |
+ const WebKit::WebTouchEvent& touch_event = touch_state_->touch_event(); |
+ base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( |
+ touch_event.timeStampSeconds * 1000); |
+ for (size_t i = 0; i < touch_event.touchesLength; ++i) { |
scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( |
- touch_event->Index(i), ui::TOUCH_STATUS_UNKNOWN, this)); |
+ TouchEventFromWebTouchPoint(touch_event.touches[i], timestamp), |
+ ui::TOUCH_STATUS_UNKNOWN, this)); |
ProcessGestures(gestures.get()); |
} |
} |