summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryusufo@chromium.org <yusufo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 00:26:01 +0000
committeryusufo@chromium.org <yusufo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-30 00:26:01 +0000
commit3d5c243b1ce05106cfaaa3c236be066c772fec62 (patch)
tree153d1cf5f161dda523f3849c7b560766ced66130
parent8350f16f65f145e137b732578491bc4cc2877784 (diff)
downloadchromium_src-3d5c243b1ce05106cfaaa3c236be066c772fec62.zip
chromium_src-3d5c243b1ce05106cfaaa3c236be066c772fec62.tar.gz
chromium_src-3d5c243b1ce05106cfaaa3c236be066c772fec62.tar.bz2
Change the InputEventAck codepath to use a tri-state-enum instead of a boolean
Right now whenever an input event ACK is sent back to render_widget_host_impl we do not distinguish between events that are returned because they didn't hit any touch event handlers vs events not handled by touch event handler when there is a hit. This change adds a tri-state enum to the IPC message that will be used to distinguish NotProcessed touch events from Returned touch events. BUG=135818 Review URL: https://chromiumcodereview.appspot.com/11363133 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170304 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/DEPS1
-rw-r--r--content/browser/android/content_view_core_impl.cc5
-rw-r--r--content/browser/android/content_view_core_impl.h2
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest_helper.cc5
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest_helper.h3
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc14
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h5
-rw-r--r--content/browser/renderer_host/render_widget_host_unittest.cc6
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.cc5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.h2
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.cc6
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.h5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.cc3
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.h2
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.cc6
-rw-r--r--content/browser/renderer_host/render_widget_host_view_win.h2
-rw-r--r--content/browser/renderer_host/touch_event_queue.cc10
-rw-r--r--content/browser/renderer_host/touch_event_queue.h5
-rw-r--r--content/common/view_messages.h4
-rw-r--r--content/content_common.gypi1
-rw-r--r--content/port/browser/render_widget_host_view_port.h7
-rw-r--r--content/port/common/input_event_ack_state.h19
-rw-r--r--content/renderer/gpu/input_event_filter.cc21
-rw-r--r--content/renderer/gpu/input_event_filter.h5
-rw-r--r--content/renderer/gpu/input_event_filter_unittest.cc12
-rw-r--r--content/renderer/render_view_impl.cc6
-rw-r--r--content/renderer/render_view_impl.h1
-rw-r--r--content/renderer/render_widget.cc16
-rw-r--r--content/renderer/render_widget.h5
29 files changed, 122 insertions, 62 deletions
diff --git a/content/DEPS b/content/DEPS
index db04ce4..09dd65b 100644
--- a/content/DEPS
+++ b/content/DEPS
@@ -9,6 +9,7 @@ include_rules = [
# directories in content/ so we disallow all of them.
"-content",
"+content/common",
+ "+content/port/common",
"+content/public/common",
"+content/public/test",
"+content/shell", # for content_browsertests
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc
index 2cefc27..e6d2d8e 100644
--- a/content/browser/android/content_view_core_impl.cc
+++ b/content/browser/android/content_view_core_impl.cc
@@ -470,12 +470,13 @@ void ContentViewCoreImpl::ShowSelectPopupMenu(
multiple, selected_array.obj());
}
-void ContentViewCoreImpl::ConfirmTouchEvent(bool handled) {
+void ContentViewCoreImpl::ConfirmTouchEvent(InputEventAckState ack_result) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
if (j_obj.is_null())
return;
- Java_ContentViewCore_confirmTouchEvent(env, j_obj.obj(), handled);
+ bool processed = (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED);
+ Java_ContentViewCore_confirmTouchEvent(env, j_obj.obj(), processed);
}
void ContentViewCoreImpl::HasTouchEventHandlers(bool need_touch_events) {
diff --git a/content/browser/android/content_view_core_impl.h b/content/browser/android/content_view_core_impl.h
index 8311484..ed307ca 100644
--- a/content/browser/android/content_view_core_impl.h
+++ b/content/browser/android/content_view_core_impl.h
@@ -215,7 +215,7 @@ class ContentViewCoreImpl : public ContentViewCore,
void SetTitle(const string16& title);
bool HasFocus();
- void ConfirmTouchEvent(bool handled);
+ void ConfirmTouchEvent(InputEventAckState ack_result);
void HasTouchEventHandlers(bool need_touch_events);
void OnSelectionChanged(const std::string& text);
void OnSelectionBoundsChanged(
diff --git a/content/browser/browser_plugin/browser_plugin_guest_helper.cc b/content/browser/browser_plugin/browser_plugin_guest_helper.cc
index b1de4d9..abd2c14 100644
--- a/content/browser/browser_plugin/browser_plugin_guest_helper.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest_helper.cc
@@ -51,8 +51,9 @@ void BrowserPluginGuestHelper::OnUpdateRect(
void BrowserPluginGuestHelper::OnHandleInputEventAck(
WebKit::WebInputEvent::Type event_type,
- bool processed) {
- guest_->HandleInputEventAck(render_view_host(), processed);
+ InputEventAckState ack_result) {
+ guest_->HandleInputEventAck(render_view_host(),
+ ack_result == INPUT_EVENT_ACK_STATE_CONSUMED);
}
void BrowserPluginGuestHelper::OnTakeFocus(bool reverse) {
diff --git a/content/browser/browser_plugin/browser_plugin_guest_helper.h b/content/browser/browser_plugin/browser_plugin_guest_helper.h
index d7ead1d..ea5c536 100644
--- a/content/browser/browser_plugin/browser_plugin_guest_helper.h
+++ b/content/browser/browser_plugin/browser_plugin_guest_helper.h
@@ -5,6 +5,7 @@
#ifndef CONTENT_BROWSER_BROWSER_PLUGIN_BROWSER_PLUGIN_GUEST_HELPER_H_
#define CONTENT_BROWSER_BROWSER_PLUGIN_BROWSER_PLUGIN_GUEST_HELPER_H_
+#include "content/port/common/input_event_ack_state.h"
#include "content/public/browser/render_view_host_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h"
@@ -46,7 +47,7 @@ class BrowserPluginGuestHelper : public RenderViewHostObserver {
void OnUpdateDragCursor(WebKit::WebDragOperation current_op);
void OnUpdateRect(const ViewHostMsg_UpdateRect_Params& params);
void OnHandleInputEventAck(WebKit::WebInputEvent::Type event_type,
- bool processed);
+ InputEventAckState ack_result);
void OnTakeFocus(bool reverse);
void OnShowWidget(int route_id, const gfx::Rect& initial_pos);
void OnMsgHasTouchEventHandlers(bool has_handlers);
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index a2a664b..7ca455b 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -1112,7 +1112,7 @@ void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event,
// to the touch-event queue immediately. Mark the event as not processed,
// to make sure that the touch-scroll gesture that initiated the
// overscroll is updated properly.
- touch_event_queue_->ProcessTouchAck(false);
+ touch_event_queue_->ProcessTouchAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
}
return;
}
@@ -1676,9 +1676,11 @@ void RenderWidgetHostImpl::DidUpdateBackingStore(
"x+y", params.bitmap_rect.x() + params.bitmap_rect.y());
}
-void RenderWidgetHostImpl::OnMsgInputEventAck(WebInputEvent::Type event_type,
- bool processed) {
+void RenderWidgetHostImpl::OnMsgInputEventAck(
+ WebInputEvent::Type event_type, InputEventAckState ack_result) {
TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnMsgInputEventAck");
+ bool processed = (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED);
+
if (!in_process_event_types_.empty() &&
in_process_event_types_.front() == event_type)
in_process_event_types_.pop();
@@ -1714,7 +1716,7 @@ void RenderWidgetHostImpl::OnMsgInputEventAck(WebInputEvent::Type event_type,
} else if (type == WebInputEvent::MouseWheel) {
ProcessWheelAck(processed);
} else if (WebInputEvent::isTouchEventType(type)) {
- ProcessTouchAck(processed);
+ ProcessTouchAck(ack_result);
} else if (WebInputEvent::isGestureEventType(type)) {
ProcessGestureAck(processed, type);
}
@@ -1854,8 +1856,8 @@ void RenderWidgetHostImpl::ProcessGestureAck(bool processed, int type) {
gesture_event_filter_->ProcessGestureAck(processed, type);
}
-void RenderWidgetHostImpl::ProcessTouchAck(bool processed) {
- touch_event_queue_->ProcessTouchAck(processed);
+void RenderWidgetHostImpl::ProcessTouchAck(InputEventAckState ack_result) {
+ touch_event_queue_->ProcessTouchAck(ack_result);
}
void RenderWidgetHostImpl::OnMsgFocus() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index fe67ebd..b2dbae7 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -22,6 +22,7 @@
#include "base/timer.h"
#include "build/build_config.h"
#include "content/common/view_message_enums.h"
+#include "content/port/common/input_event_ack_state.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/common/page_zoom.h"
#include "ipc/ipc_listener.h"
@@ -573,7 +574,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost,
void OnMsgUpdateRect(const ViewHostMsg_UpdateRect_Params& params);
void OnMsgUpdateIsDelayed();
void OnMsgInputEventAck(WebKit::WebInputEvent::Type event_type,
- bool processed);
+ InputEventAckState ack_result);
void OnMsgBeginSmoothScroll(
int gesture_id,
const ViewHostMsg_BeginSmoothScroll_Params &params);
@@ -679,7 +680,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost,
// Called on OnMsgInputEventAck() to process a touch event ack message.
// This can result in a gesture event being generated and sent back to the
// renderer.
- void ProcessTouchAck(bool processed);
+ void ProcessTouchAck(InputEventAckState ack_result);
// Called when there is a new auto resize (using a post to avoid a stack
// which may get in recursive loops).
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 2cd5503..1ada7c6 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -344,7 +344,7 @@ class TestView : public TestRenderWidgetHostView {
return bounds_;
}
virtual void ProcessAckedTouchEvent(const WebTouchEvent& touch,
- bool processed) OVERRIDE {
+ InputEventAckState ack_result) OVERRIDE {
acked_event_ = touch;
++acked_event_count_;
}
@@ -493,8 +493,10 @@ class RenderWidgetHostTest : public testing::Test {
}
void SendInputEventACK(WebInputEvent::Type type, bool processed) {
+ InputEventAckState ack_result = processed ?
+ INPUT_EVENT_ACK_STATE_CONSUMED : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
scoped_ptr<IPC::Message> response(
- new ViewHostMsg_HandleInputEvent_ACK(0, type, processed));
+ new ViewHostMsg_HandleInputEvent_ACK(0, type, ack_result));
host_->OnMessageReceived(*response);
}
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 97d4244..0c55f7d 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -463,10 +463,9 @@ void RenderWidgetHostViewAndroid::UnhandledWheelEvent(
}
void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent(
- const WebKit::WebTouchEvent& touch_event,
- bool processed) {
+ const WebKit::WebTouchEvent& touch_event, InputEventAckState ack_result) {
if (content_view_core_)
- content_view_core_->ConfirmTouchEvent(processed);
+ content_view_core_->ConfirmTouchEvent(ack_result);
}
void RenderWidgetHostViewAndroid::SetHasHorizontalScrollbar(
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 8394d58..205c8d7 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -111,7 +111,7 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
virtual void UnhandledWheelEvent(
const WebKit::WebMouseWheelEvent& event) OVERRIDE;
virtual void ProcessAckedTouchEvent(const WebKit::WebTouchEvent& touch,
- bool processed) OVERRIDE;
+ InputEventAckState ack_result) OVERRIDE;
virtual void SetHasHorizontalScrollbar(
bool has_horizontal_scrollbar) OVERRIDE;
virtual void SetScrollOffsetPinning(
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 25b37f00..e742266 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1048,8 +1048,7 @@ gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() {
}
void RenderWidgetHostViewAura::ProcessAckedTouchEvent(
- const WebKit::WebTouchEvent& touch_event,
- bool processed) {
+ const WebKit::WebTouchEvent& touch_event, InputEventAckState ack_result) {
ScopedVector<ui::TouchEvent> events;
if (!MakeUITouchEventsFromWebTouchEvents(touch_event, &events))
return;
@@ -1059,7 +1058,8 @@ void RenderWidgetHostViewAura::ProcessAckedTouchEvent(
if (!root)
return;
- ui::EventResult result = processed ? ui::ER_HANDLED : ui::ER_UNHANDLED;
+ ui::EventResult result = (ack_result ==
+ INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(),
end = events.end(); iter != end; ++iter) {
root->ProcessedTouchEvent((*iter), window_, result);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index d46251e..d3bfd54 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -128,8 +128,9 @@ class RenderWidgetHostViewAura
virtual void AcceleratedSurfaceRelease(uint64 surface_id) OVERRIDE;
virtual void GetScreenInfo(WebKit::WebScreenInfo* results) OVERRIDE;
virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE;
- virtual void ProcessAckedTouchEvent(const WebKit::WebTouchEvent& touch,
- bool processed) OVERRIDE;
+ virtual void ProcessAckedTouchEvent(
+ const WebKit::WebTouchEvent& touch,
+ InputEventAckState ack_result) OVERRIDE;
virtual void SetHasHorizontalScrollbar(
bool has_horizontal_scrollbar) OVERRIDE;
virtual void SetScrollOffsetPinning(
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index 68404f8..51e530a 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -480,8 +480,7 @@ SmoothScrollGesture* RenderWidgetHostViewBase::CreateSmoothScrollGesture(
}
void RenderWidgetHostViewBase::ProcessAckedTouchEvent(
- const WebKit::WebTouchEvent& touch,
- bool processed) {
+ const WebKit::WebTouchEvent& touch, InputEventAckState ack_result) {
}
} // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index b884b5f..b202f96 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -60,7 +60,7 @@ class CONTENT_EXPORT RenderWidgetHostViewBase
virtual BrowserAccessibilityManager*
GetBrowserAccessibilityManager() const OVERRIDE;
virtual void ProcessAckedTouchEvent(const WebKit::WebTouchEvent& touch,
- bool processed) OVERRIDE;
+ InputEventAckState ack_result) OVERRIDE;
virtual SmoothScrollGesture* CreateSmoothScrollGesture(
bool scroll_down, int pixels_to_scroll, int mouse_event_x,
int mouse_event_y) OVERRIDE;
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 e42bbac..eb25310 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.cc
+++ b/content/browser/renderer_host/render_widget_host_view_win.cc
@@ -815,15 +815,15 @@ void RenderWidgetHostViewWin::SetBackground(const SkBitmap& background) {
}
void RenderWidgetHostViewWin::ProcessAckedTouchEvent(
- const WebKit::WebTouchEvent& touch,
- bool processed) {
+ const WebKit::WebTouchEvent& touch, InputEventAckState ack_result) {
DCHECK(touch_events_enabled_);
ScopedVector<ui::TouchEvent> events;
if (!MakeUITouchEventsFromWebTouchEvents(touch, &events))
return;
- ui::EventResult result = processed ? ui::ER_HANDLED : ui::ER_UNHANDLED;
+ ui::EventResult result = (ack_result ==
+ INPUT_EVENT_ACK_STATE_CONSUMED) ? ui::ER_HANDLED : ui::ER_UNHANDLED;
for (ScopedVector<ui::TouchEvent>::iterator iter = events.begin(),
end = events.end(); iter != end; ++iter) {
scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
diff --git a/content/browser/renderer_host/render_widget_host_view_win.h b/content/browser/renderer_host/render_widget_host_view_win.h
index 2ebbcdf..27ef42a 100644
--- a/content/browser/renderer_host/render_widget_host_view_win.h
+++ b/content/browser/renderer_host/render_widget_host_view_win.h
@@ -202,7 +202,7 @@ class RenderWidgetHostViewWin
skia::PlatformBitmap* output) OVERRIDE;
virtual void OnAcceleratedCompositingStateChange() OVERRIDE;
virtual void ProcessAckedTouchEvent(const WebKit::WebTouchEvent& touch,
- bool processed) OVERRIDE;
+ InputEventAckState ack_result) OVERRIDE;
virtual void SetHasHorizontalScrollbar(
bool has_horizontal_scrollbar) OVERRIDE;
virtual void SetScrollOffsetPinning(
diff --git a/content/browser/renderer_host/touch_event_queue.cc b/content/browser/renderer_host/touch_event_queue.cc
index a9ceedb..178dfde 100644
--- a/content/browser/renderer_host/touch_event_queue.cc
+++ b/content/browser/renderer_host/touch_event_queue.cc
@@ -105,8 +105,8 @@ void TouchEventQueue::QueueEvent(const WebKit::WebTouchEvent& event) {
touch_queue_.push_back(new CoalescedWebTouchEvent(event));
}
-void TouchEventQueue::ProcessTouchAck(bool processed) {
- PopTouchEventToView(processed);
+void TouchEventQueue::ProcessTouchAck(InputEventAckState ack_result) {
+ PopTouchEventToView(ack_result);
// If there's a queued touch-event, then forward it to the renderer now.
if (!touch_queue_.empty()) {
render_widget_host_->ForwardTouchEventImmediately(
@@ -116,7 +116,7 @@ void TouchEventQueue::ProcessTouchAck(bool processed) {
void TouchEventQueue::FlushQueue() {
while (!touch_queue_.empty())
- PopTouchEventToView(false);
+ PopTouchEventToView(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
}
void TouchEventQueue::Reset() {
@@ -131,7 +131,7 @@ const WebKit::WebTouchEvent& TouchEventQueue::GetLatestEvent() const {
return touch_queue_.back()->coalesced_event();
}
-void TouchEventQueue::PopTouchEventToView(bool processed) {
+void TouchEventQueue::PopTouchEventToView(InputEventAckState ack_result) {
if (touch_queue_.empty())
return;
scoped_ptr<CoalescedWebTouchEvent> acked_event(touch_queue_.front());
@@ -144,7 +144,7 @@ void TouchEventQueue::PopTouchEventToView(bool processed) {
for (WebTouchEventList::const_iterator iter = acked_event->begin(),
end = acked_event->end();
iter != end; ++iter) {
- view->ProcessAckedTouchEvent((*iter), processed);
+ view->ProcessAckedTouchEvent((*iter), ack_result);
}
}
diff --git a/content/browser/renderer_host/touch_event_queue.h b/content/browser/renderer_host/touch_event_queue.h
index 6a817d4..bd23a7f 100644
--- a/content/browser/renderer_host/touch_event_queue.h
+++ b/content/browser/renderer_host/touch_event_queue.h
@@ -9,6 +9,7 @@
#include "base/basictypes.h"
#include "content/common/content_export.h"
+#include "content/port/common/input_event_ack_state.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
namespace content {
@@ -32,7 +33,7 @@ class TouchEventQueue {
// Notifies the queue that a touch-event has been processed by the renderer.
// At this point, the queue may send one or more gesture events and/or
// additional queued touch-events to the renderer.
- void ProcessTouchAck(bool processed);
+ void ProcessTouchAck(InputEventAckState ack_result);
// Empties the queue of touch events. This may result in any number of gesture
// events being sent to the renderer.
@@ -55,7 +56,7 @@ class TouchEventQueue {
// Pops the touch-event from the top of the queue and sends it to the
// RenderWidgetHostView. This reduces the size of the queue by one.
- void PopTouchEventToView(bool processed);
+ void PopTouchEventToView(InputEventAckState ack_result);
// The RenderWidgetHost that owns this event-queue.
RenderWidgetHostImpl* render_widget_host_;
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 507b9e7..c2c6dcd 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -13,6 +13,7 @@
#include "content/common/edit_command.h"
#include "content/common/navigation_gesture.h"
#include "content/common/view_message_enums.h"
+#include "content/port/common/input_event_ack_state.h"
#include "content/public/common/common_param_traits.h"
#include "content/public/common/context_menu_params.h"
#include "content/public/common/file_chooser_params.h"
@@ -71,6 +72,7 @@ IPC_ENUM_TRAITS(WebKit::WebTextDirection)
IPC_ENUM_TRAITS(WebMenuItem::Type)
IPC_ENUM_TRAITS(WindowContainerType)
IPC_ENUM_TRAITS(content::FileChooserParams::Mode)
+IPC_ENUM_TRAITS(content::InputEventAckState)
IPC_ENUM_TRAITS(content::JavaScriptMessageType)
IPC_ENUM_TRAITS(content::NavigationGesture)
IPC_ENUM_TRAITS(content::PageZoom)
@@ -1734,7 +1736,7 @@ IPC_MESSAGE_ROUTED1(ViewHostMsg_DidActivateAcceleratedCompositing,
// Acknowledges receipt of a ViewMsg_HandleInputEvent message.
IPC_MESSAGE_ROUTED2(ViewHostMsg_HandleInputEvent_ACK,
WebKit::WebInputEvent::Type,
- bool /* processed */)
+ content::InputEventAckState /* ack_result */)
IPC_STRUCT_BEGIN(ViewHostMsg_BeginSmoothScroll_Params)
IPC_STRUCT_MEMBER(bool, scroll_down)
diff --git a/content/content_common.gypi b/content/content_common.gypi
index 504aedf..a1a6a1d 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -375,6 +375,7 @@
'common/webmessageportchannel_impl.h',
'common/worker_messages.h',
'common/zygote_commands_linux.h',
+ 'port/common/input_event_ack_state.h',
'public/common/common_param_traits.cc',
'public/common/common_param_traits.h',
'public/common/common_param_traits_macros.h',
diff --git a/content/port/browser/render_widget_host_view_port.h b/content/port/browser/render_widget_host_view_port.h
index b09e22a..6d4806a 100644
--- a/content/port/browser/render_widget_host_view_port.h
+++ b/content/port/browser/render_widget_host_view_port.h
@@ -9,6 +9,7 @@
#include "base/process_util.h"
#include "base/string16.h"
#include "content/common/content_export.h"
+#include "content/port/common/input_event_ack_state.h"
#include "content/public/browser/render_widget_host_view.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebTextDirection.h"
@@ -269,10 +270,10 @@ class CONTENT_EXPORT RenderWidgetHostViewPort : public RenderWidgetHostView {
// Because the associated remote WebKit instance can asynchronously
// prevent-default on a dispatched touch event, the touch events are queued in
// the GestureRecognizer until invocation of ProcessAckedTouchEvent releases
- // it to be processed (when |processed| is false) or ignored (when |processed|
- // is true).
+ // it to be consumed (when |ack_result| is NOT_CONSUMED OR NO_CONSUMER_EXISTS)
+ // or ignored (when |ack_result| is CONSUMED).
virtual void ProcessAckedTouchEvent(const WebKit::WebTouchEvent& touch,
- bool processed) = 0;
+ InputEventAckState ack_result) = 0;
// Asks the view to create a smooth scroll gesture that will be used to
// simulate a user-initiated scroll.
diff --git a/content/port/common/input_event_ack_state.h b/content/port/common/input_event_ack_state.h
new file mode 100644
index 0000000..77a1363
--- /dev/null
+++ b/content/port/common/input_event_ack_state.h
@@ -0,0 +1,19 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PORT_COMMON_INPUT_EVENT_ACK_STATE_H_
+#define CONTENT_PORT_COMMON_INPUT_EVENT_ACK_STATE_H_
+
+namespace content {
+
+// Describes the state of the input event ACK coming back to the browser side.
+enum InputEventAckState {
+ INPUT_EVENT_ACK_STATE_CONSUMED,
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED,
+ INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS,
+};
+
+} // namespace content
+
+#endif // CONTENT_PORT_COMMON_INPUT_EVENT_ACK_STATE_H_
diff --git a/content/renderer/gpu/input_event_filter.cc b/content/renderer/gpu/input_event_filter.cc
index e2c885d..df1abf3 100644
--- a/content/renderer/gpu/input_event_filter.cc
+++ b/content/renderer/gpu/input_event_filter.cc
@@ -38,8 +38,7 @@ void InputEventFilter::RemoveRoute(int routing_id) {
void InputEventFilter::DidHandleInputEvent() {
DCHECK(target_loop_->BelongsToCurrentThread());
- bool processed = true;
- SendACK(messages_.front(), processed);
+ SendACK(messages_.front(), INPUT_EVENT_ACK_STATE_CONSUMED);
messages_.pop();
}
@@ -56,8 +55,7 @@ void InputEventFilter::DidNotHandleInputEvent(bool send_to_widget) {
this, messages_.front()));
} else {
TRACE_EVENT0("InputEventFilter::DidNotHandleInputEvent", "LeaveUnhandled");
- bool processed = false;
- SendACK(messages_.front(), processed);
+ SendACK(messages_.front(), INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
}
messages_.pop();
}
@@ -130,25 +128,28 @@ void InputEventFilter::ForwardToHandler(const IPC::Message& message) {
handler_.Run(message.routing_id(), CrackMessage(message));
}
-void InputEventFilter::SendACK(const IPC::Message& message, bool processed) {
+void InputEventFilter::SendACK(const IPC::Message& message,
+ InputEventAckState ack_result) {
DCHECK(target_loop_->BelongsToCurrentThread());
io_loop_->PostTask(
FROM_HERE,
base::Bind(&InputEventFilter::SendACKOnIOThread, this,
- message.routing_id(), CrackMessage(message)->type, processed));
+ message.routing_id(), CrackMessage(message)->type,
+ ack_result));
}
-void InputEventFilter::SendACKOnIOThread(int routing_id,
- WebInputEvent::Type event_type,
- bool processed) {
+void InputEventFilter::SendACKOnIOThread(
+ int routing_id,
+ WebInputEvent::Type event_type,
+ InputEventAckState ack_result) {
DCHECK(io_loop_->BelongsToCurrentThread());
if (!sender_)
return; // Filter was removed.
sender_->Send(
- new ViewHostMsg_HandleInputEvent_ACK(routing_id, event_type, processed));
+ new ViewHostMsg_HandleInputEvent_ACK(routing_id, event_type, ack_result));
}
} // namespace content
diff --git a/content/renderer/gpu/input_event_filter.h b/content/renderer/gpu/input_event_filter.h
index eaf6050..690e9bd 100644
--- a/content/renderer/gpu/input_event_filter.h
+++ b/content/renderer/gpu/input_event_filter.h
@@ -11,6 +11,7 @@
#include "base/callback_forward.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
+#include "content/port/common/input_event_ack_state.h"
#include "ipc/ipc_channel_proxy.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
@@ -70,9 +71,9 @@ class CONTENT_EXPORT InputEventFilter
void ForwardToMainListener(const IPC::Message& message);
void ForwardToHandler(const IPC::Message& message);
- void SendACK(const IPC::Message& message, bool processed);
+ void SendACK(const IPC::Message& message, InputEventAckState ack_result);
void SendACKOnIOThread(int routing_id, WebKit::WebInputEvent::Type event_type,
- bool processed);
+ InputEventAckState ack_result);
scoped_refptr<base::MessageLoopProxy> main_loop_;
IPC::Listener* main_listener_;
diff --git a/content/renderer/gpu/input_event_filter_unittest.cc b/content/renderer/gpu/input_event_filter_unittest.cc
index aa65372..781560c 100644
--- a/content/renderer/gpu/input_event_filter_unittest.cc
+++ b/content/renderer/gpu/input_event_filter_unittest.cc
@@ -162,11 +162,11 @@ TEST(InputEventFilterTest, Basic) {
EXPECT_EQ(ViewHostMsg_HandleInputEvent_ACK::ID, message->type());
WebInputEvent::Type event_type = WebInputEvent::Undefined;
- bool processed = false;
+ InputEventAckState ack_result = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
EXPECT_TRUE(ViewHostMsg_HandleInputEvent_ACK::Read(message, &event_type,
- &processed));
+ &ack_result));
EXPECT_EQ(kEvents[i].type, event_type);
- EXPECT_FALSE(processed);
+ EXPECT_EQ(ack_result, INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
const WebInputEvent* event = event_recorder.record_at(i);
ASSERT_TRUE(event);
@@ -211,11 +211,11 @@ TEST(InputEventFilterTest, Basic) {
EXPECT_EQ(ViewHostMsg_HandleInputEvent_ACK::ID, message->type());
WebInputEvent::Type event_type = WebInputEvent::Undefined;
- bool processed = false;
+ InputEventAckState ack_result = INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
EXPECT_TRUE(ViewHostMsg_HandleInputEvent_ACK::Read(message, &event_type,
- &processed));
+ &ack_result));
EXPECT_EQ(kEvents[i].type, event_type);
- EXPECT_TRUE(processed);
+ EXPECT_EQ(ack_result, INPUT_EVENT_ACK_STATE_CONSUMED);
}
filter->OnFilterRemoved();
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 5f1411c..6a5ca3c 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -5728,6 +5728,12 @@ void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) {
FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event));
}
+bool RenderViewImpl::HasTouchEventHandlersAt(const gfx::Point& point) const {
+ if (!webview())
+ return false;
+ return webview()->hasTouchEventHandlersAt(point);
+}
+
void RenderViewImpl::OnWasHidden() {
RenderWidget::OnWasHidden();
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index ec3dcb4e..1c40767 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -761,6 +761,7 @@ class CONTENT_EXPORT RenderViewImpl
const WebKit::WebGestureEvent& event) OVERRIDE;
virtual void DidHandleMouseEvent(const WebKit::WebMouseEvent& event) OVERRIDE;
virtual void DidHandleTouchEvent(const WebKit::WebTouchEvent& event) OVERRIDE;
+ virtual bool HasTouchEventHandlersAt(const gfx::Point& point) const OVERRIDE;
virtual void OnSetFocus(bool enable) OVERRIDE;
virtual void OnWasHidden() OVERRIDE;
virtual void OnWasShown(bool needs_repainting) OVERRIDE;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index b09cc01..2b42bc2 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -590,9 +590,19 @@ void RenderWidget::OnHandleInputEvent(const IPC::Message& message) {
if (!processed && is_keyboard_shortcut)
suppress_next_char_events_ = true;
+ InputEventAckState ack_result = processed ?
+ INPUT_EVENT_ACK_STATE_CONSUMED : INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
+ if (!processed && input_event->type == WebInputEvent::TouchStart) {
+ const WebTouchEvent& touch_event =
+ *static_cast<const WebTouchEvent*>(input_event);
+ ack_result = HasTouchEventHandlersAt(touch_event.touches[0].position) ?
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED :
+ INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS;
+ }
+
IPC::Message* response =
new ViewHostMsg_HandleInputEvent_ACK(routing_id_, input_event->type,
- processed);
+ ack_result);
bool event_type_gets_rate_limited =
input_event->type == WebInputEvent::MouseMove ||
input_event->type == WebInputEvent::MouseWheel ||
@@ -1968,4 +1978,8 @@ bool RenderWidget::WebWidgetHandlesCompositorScheduling() const {
return false;
}
+bool RenderWidget::HasTouchEventHandlersAt(const gfx::Point& point) const {
+ return true;
+}
+
} // namespace content
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 11a0937..b194ca5 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -45,6 +45,7 @@ namespace WebKit {
class WebGestureEvent;
class WebMouseEvent;
struct WebRenderingStatsImpl;
+struct WebPoint;
class WebTouchEvent;
}
@@ -430,6 +431,10 @@ class CONTENT_EXPORT RenderWidget
// just handled.
virtual void DidHandleTouchEvent(const WebKit::WebTouchEvent& event) {}
+ // Check whether the WebWidget has any touch event handlers registered
+ // at the given point.
+ virtual bool HasTouchEventHandlersAt(const gfx::Point& point) const;
+
// Should return true if the underlying WebWidget is responsible for
// the scheduling of compositing requests.
virtual bool WebWidgetHandlesCompositorScheduling() const;