Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index a64f1d1d0b2134cf0ebd7945cb4567d5ff351b65..a55946853546c39f60a750bdb7d7949092de4b6b 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -373,6 +373,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) |
IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) |
+ IPC_MESSAGE_HANDLER(InputMsg_HandleEventPacket, OnHandleEventPacket) |
IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, |
OnCursorVisibilityChange) |
IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) |
@@ -811,17 +812,19 @@ void RenderWidget::OnViewContextSwapBuffersComplete() { |
DoDeferredUpdateAndSendInputAck(); |
} |
-void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
- const ui::LatencyInfo& latency_info, |
- bool is_keyboard_shortcut) { |
+InputEventDisposition RenderWidget::HandleWebEvent( |
+ const WebKit::WebInputEvent* input_event, |
+ const ui::LatencyInfo& latency_info, |
+ bool is_keyboard_shortcut, |
+ bool send_ack) { |
handling_input_event_ = true; |
if (!input_event) { |
handling_input_event_ = false; |
- return; |
+ return INPUT_EVENT_COULD_NOT_DELIVER; |
} |
const char* const event_name = GetEventName(input_event->type); |
- TRACE_EVENT1("renderer", "RenderWidget::OnHandleInputEvent", |
+ TRACE_EVENT1("renderer", "RenderWidget::HandleInputEvent", |
"event", event_name); |
if (compositor_) |
@@ -893,36 +896,39 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; |
} |
- IPC::Message* response = |
- new InputHostMsg_HandleInputEvent_ACK(routing_id_, |
- input_event->type, |
- ack_result, |
- latency_info); |
- bool event_type_gets_rate_limited = |
- input_event->type == WebInputEvent::MouseMove || |
- input_event->type == WebInputEvent::MouseWheel || |
- WebInputEvent::isTouchEventType(input_event->type); |
- |
- bool frame_pending = paint_aggregator_.HasPendingUpdate(); |
- if (is_accelerated_compositing_active_) { |
- frame_pending = compositor_ && |
- compositor_->commitRequested(); |
- } |
- |
- if (event_type_gets_rate_limited && frame_pending && !is_hidden_) { |
- // We want to rate limit the input events in this case, so we'll wait for |
- // painting to finish before ACKing this message. |
- if (pending_input_event_ack_) { |
- // As two different kinds of events could cause us to postpone an ack |
- // we send it now, if we have one pending. The Browser should never |
- // send us the same kind of event we are delaying the ack for. |
- Send(pending_input_event_ack_.release()); |
+ if (send_ack) { |
+ IPC::Message* response = |
+ new InputHostMsg_HandleInputEvent_ACK(routing_id_, |
+ input_event->type, |
+ ack_result, |
+ latency_info); |
+ |
+ bool event_type_gets_rate_limited = |
+ input_event->type == WebInputEvent::MouseMove || |
+ input_event->type == WebInputEvent::MouseWheel || |
+ WebInputEvent::isTouchEventType(input_event->type); |
+ |
+ bool frame_pending = paint_aggregator_.HasPendingUpdate(); |
+ if (is_accelerated_compositing_active_) { |
+ frame_pending = compositor_ && |
+ compositor_->commitRequested(); |
+ } |
+ |
+ if (event_type_gets_rate_limited && frame_pending && !is_hidden_) { |
+ // We want to rate limit the input events in this case, so we'll wait for |
+ // painting to finish before ACKing this message. |
+ if (pending_input_event_ack_) { |
+ // As two different kinds of events could cause us to postpone an ack |
+ // we send it now, if we have one pending. The Browser should never |
+ // send us the same kind of event we are delaying the ack for. |
+ Send(pending_input_event_ack_.release()); |
+ } |
+ pending_input_event_ack_.reset(response); |
+ if (compositor_) |
+ compositor_->NotifyInputThrottledUntilCommit(); |
+ } else { |
+ Send(response); |
} |
- pending_input_event_ack_.reset(response); |
- if (compositor_) |
- compositor_->NotifyInputThrottledUntilCommit(); |
- } else { |
- Send(response); |
} |
#if defined(OS_ANDROID) |
@@ -942,6 +948,44 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
if (WebInputEvent::isTouchEventType(input_event->type)) |
DidHandleTouchEvent(*(static_cast<const WebTouchEvent*>(input_event))); |
} |
+ |
+ return ToDisposition(ack_result, true, prevent_default); |
+} |
+ |
+InputEventDisposition RenderWidget::Dispatch(const IPC::Message& message) { |
+ OnMessageReceived(message); |
+ return INPUT_EVENT_MAIN_THREAD_CONSUMED; |
+} |
+ |
+InputEventDisposition RenderWidget::Dispatch( |
+ int routing_id, |
+ const WebKit::WebInputEvent* web_event, |
+ const ui::LatencyInfo& latency_info, |
+ bool is_keyboard_shortcut) { |
+ DCHECK_EQ(routing_id_, routing_id); |
+ return HandleWebEvent(web_event, latency_info, is_keyboard_shortcut, false); |
+} |
+ |
+void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
+ const ui::LatencyInfo& latency_info, |
+ bool is_keyboard_shortcut) { |
+ HandleWebEvent(input_event, latency_info, is_keyboard_shortcut, true); |
+} |
+ |
+void RenderWidget::OnHandleEventPacket( |
+ const EventPacket& packet, |
+ const InputEventDispositions& dispositions) { |
+ TRACE_EVENT0("renderer", "OnHandleEventPacket"); |
+ |
+ RendererEventPacket renderer_packet(&packet, dispositions); |
+ |
+ scoped_ptr<IPC::Message> dispatch_result = |
+ renderer_packet.DispatchWith(this, |
+ RendererEventPacket::THREAD_MAIN, |
+ routing_id_); |
+ |
+ DCHECK_EQ(InputHostMsg_HandleEventPacket_ACK::ID, dispatch_result->type()); |
+ Send(dispatch_result.release()); |
} |
void RenderWidget::OnCursorVisibilityChange(bool is_visible) { |