diff options
author | yusufo@chromium.org <yusufo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 00:26:01 +0000 |
---|---|---|
committer | yusufo@chromium.org <yusufo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-30 00:26:01 +0000 |
commit | 3d5c243b1ce05106cfaaa3c236be066c772fec62 (patch) | |
tree | 153d1cf5f161dda523f3849c7b560766ced66130 | |
parent | 8350f16f65f145e137b732578491bc4cc2877784 (diff) | |
download | chromium_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
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 ¶ms); @@ -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; |