| 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 e15d3915cc910c9dacb7657fb2b6c567ec90e47e..6391c41eeac57baff9e38664a98f5583fa60ce7a 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_win.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_win.cc
|
| @@ -7,6 +7,7 @@
|
| #include <algorithm>
|
| #include <map>
|
| #include <peninputpanel_i.c>
|
| +#include <stack>
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| @@ -499,7 +500,7 @@ class LocalTouchEvent :
|
| }
|
|
|
| // Returns a copy of the touch event at the specified index.
|
| - const LocalTouchEvent& Index( size_t 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;
|
| @@ -538,11 +539,19 @@ class WebTouchState {
|
| bool is_changed() { return touch_event_.data().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));
|
| }
|
| }
|
|
|
| + int GetNextTouchCount() {
|
| + int result = touch_count_.top();
|
| + touch_count_.pop();
|
| + return result;
|
| + }
|
| +
|
| private:
|
| typedef std::map<unsigned int, int> MapType;
|
|
|
| @@ -560,6 +569,12 @@ class WebTouchState {
|
| // Remove any mappings that are no longer in use.
|
| void RemoveExpiredMappings();
|
|
|
| + // The gesture recognizer processes touch events one at a time, but WebKit
|
| + // (ForwardTouchEvent) takes a set of touch events. |touchCount_| tracks how
|
| + // many individual touch events were sent to ForwardTouchEvent, so we can
|
| + // send the correct number of AdvanceTouchQueue's
|
| + std::stack<int> touch_count_;
|
| +
|
| LocalTouchEvent touch_event_;
|
| const RenderWidgetHostViewWin* const window_;
|
|
|
| @@ -1195,9 +1210,16 @@ void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) {
|
|
|
| void RenderWidgetHostViewWin::ProcessTouchAck(
|
| WebKit::WebInputEvent::Type type, bool processed) {
|
| - scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| - gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed));
|
| - ProcessGestures(gestures.get());
|
| +
|
| + DCHECK(render_widget_host_->has_touch_handler() &&
|
| + touch_events_enabled_);
|
| +
|
| + int touch_count = touch_state_->GetNextTouchCount();
|
| + for (int i = 0; i < touch_count; ++i) {
|
| + scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| + gestures.reset(gesture_recognizer_->AdvanceTouchQueue(this, processed));
|
| + ProcessGestures(gestures.get());
|
| + }
|
|
|
| if (type == WebKit::WebInputEvent::TouchStart)
|
| UpdateDesiredTouchMode(processed);
|
| @@ -1572,9 +1594,6 @@ void RenderWidgetHostViewWin::OnSetFocus(HWND window) {
|
|
|
| render_widget_host_->GotFocus();
|
| render_widget_host_->SetActive(true);
|
| -
|
| - if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_)
|
| - render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
|
| }
|
|
|
| void RenderWidgetHostViewWin::OnKillFocus(HWND window) {
|
| @@ -1584,9 +1603,6 @@ void RenderWidgetHostViewWin::OnKillFocus(HWND window) {
|
|
|
| render_widget_host_->SetActive(false);
|
| render_widget_host_->Blur();
|
| -
|
| - if (touch_state_->ReleaseTouchPoints() && touch_events_enabled_)
|
| - render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
|
| }
|
|
|
| void RenderWidgetHostViewWin::OnCaptureChanged(HWND window) {
|
| @@ -2281,15 +2297,18 @@ LRESULT RenderWidgetHostViewWin::OnTouchEvent(UINT message, WPARAM wparam,
|
| for (size_t start = 0; start < total;) {
|
| start += touch_state_->UpdateTouchPoints(points + start, total - start);
|
| if (has_touch_handler) {
|
| - if (touch_state_->is_changed())
|
| + if (touch_state_->is_changed()) {
|
| render_widget_host_->ForwardTouchEvent(touch_state_->touch_event());
|
| - touch_state_->QueueEvents(this,gesture_recognizer_.get());
|
| + touch_state_->QueueEvents(this, gesture_recognizer_.get());
|
| + }
|
| } else {
|
| - // TODO: This probably needs to be updated to call Next()
|
| - scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| - gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
|
| - *touch_state_->ui_touch_event(), ui::TOUCH_STATUS_UNKNOWN, this));
|
| - ProcessGestures(gestures.get());
|
| + const LocalTouchEvent* touch_event = touch_state_->ui_touch_event();
|
| + for (size_t i = 0; i < touch_event->data().touchesLength; ++i) {
|
| + scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
|
| + gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
|
| + touch_event->Index(i), ui::TOUCH_STATUS_UNKNOWN, this));
|
| + ProcessGestures(gestures.get());
|
| + }
|
| }
|
| }
|
|
|
|
|