OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 next_paint_flags_(0), | 484 next_paint_flags_(0), |
485 auto_resize_mode_(false), | 485 auto_resize_mode_(false), |
486 need_update_rect_for_auto_resize_(false), | 486 need_update_rect_for_auto_resize_(false), |
487 did_show_(false), | 487 did_show_(false), |
488 is_hidden_(hidden), | 488 is_hidden_(hidden), |
489 never_visible_(never_visible), | 489 never_visible_(never_visible), |
490 is_fullscreen_granted_(false), | 490 is_fullscreen_granted_(false), |
491 display_mode_(blink::WebDisplayModeUndefined), | 491 display_mode_(blink::WebDisplayModeUndefined), |
492 has_focus_(false), | 492 has_focus_(false), |
493 handling_input_event_(false), | 493 handling_input_event_(false), |
| 494 handling_event_overscroll_(nullptr), |
494 handling_ime_event_(false), | 495 handling_ime_event_(false), |
495 handling_event_type_(WebInputEvent::Undefined), | 496 handling_event_type_(WebInputEvent::Undefined), |
496 ignore_ack_for_mouse_move_from_debugger_(false), | 497 ignore_ack_for_mouse_move_from_debugger_(false), |
497 closing_(false), | 498 closing_(false), |
498 host_closing_(false), | 499 host_closing_(false), |
499 is_swapped_out_(swapped_out), | 500 is_swapped_out_(swapped_out), |
500 for_oopif_(false), | 501 for_oopif_(false), |
501 input_method_is_active_(false), | 502 input_method_is_active_(false), |
502 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 503 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
503 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 504 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 void RenderWidget::OnSwapBuffersComplete() { | 1061 void RenderWidget::OnSwapBuffersComplete() { |
1061 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersComplete"); | 1062 TRACE_EVENT0("renderer", "RenderWidget::OnSwapBuffersComplete"); |
1062 | 1063 |
1063 // Notify subclasses that composited rendering was flushed to the screen. | 1064 // Notify subclasses that composited rendering was flushed to the screen. |
1064 DidFlushPaint(); | 1065 DidFlushPaint(); |
1065 } | 1066 } |
1066 | 1067 |
1067 void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, | 1068 void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
1068 const ui::LatencyInfo& latency_info, | 1069 const ui::LatencyInfo& latency_info, |
1069 bool is_keyboard_shortcut) { | 1070 bool is_keyboard_shortcut) { |
1070 base::AutoReset<bool> handling_input_event_resetter( | |
1071 &handling_input_event_, true); | |
1072 if (!input_event) | 1071 if (!input_event) |
1073 return; | 1072 return; |
| 1073 base::AutoReset<bool> handling_input_event_resetter(&handling_input_event_, |
| 1074 true); |
1074 base::AutoReset<WebInputEvent::Type> handling_event_type_resetter( | 1075 base::AutoReset<WebInputEvent::Type> handling_event_type_resetter( |
1075 &handling_event_type_, input_event->type); | 1076 &handling_event_type_, input_event->type); |
| 1077 |
| 1078 // Calls into |didOverscroll()| while handling this event will populate |
| 1079 // |event_overscroll|, which in turn will be bundled with the event ack. |
| 1080 scoped_ptr<DidOverscrollParams> event_overscroll; |
| 1081 base::AutoReset<scoped_ptr<DidOverscrollParams>*> |
| 1082 handling_event_overscroll_resetter(&handling_event_overscroll_, |
| 1083 &event_overscroll); |
| 1084 |
1076 #if defined(OS_ANDROID) | 1085 #if defined(OS_ANDROID) |
1077 // On Android, when a key is pressed or sent from the Keyboard using IME, | 1086 // On Android, when a key is pressed or sent from the Keyboard using IME, |
1078 // |AdapterInputConnection| generates input key events to make sure all JS | 1087 // |AdapterInputConnection| generates input key events to make sure all JS |
1079 // listeners that monitor KeyUp and KeyDown events receive the proper key | 1088 // listeners that monitor KeyUp and KeyDown events receive the proper key |
1080 // code. Since this input key event comes from IME, we need to set the | 1089 // code. Since this input key event comes from IME, we need to set the |
1081 // IME event guard here to make sure it does not interfere with other IME | 1090 // IME event guard here to make sure it does not interfere with other IME |
1082 // events. | 1091 // events. |
1083 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; | 1092 scoped_ptr<ImeEventGuard> ime_event_guard_maybe; |
1084 if (WebInputEvent::isKeyboardEventType(input_event->type)) { | 1093 if (WebInputEvent::isKeyboardEventType(input_event->type)) { |
1085 const WebKeyboardEvent& key_event = | 1094 const WebKeyboardEvent& key_event = |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 | 1228 |
1220 TRACE_EVENT_SYNTHETIC_DELAY_END("blink.HandleInputEvent"); | 1229 TRACE_EVENT_SYNTHETIC_DELAY_END("blink.HandleInputEvent"); |
1221 | 1230 |
1222 // Note that we can't use handling_event_type_ here since it will be overriden | 1231 // Note that we can't use handling_event_type_ here since it will be overriden |
1223 // by reentrant calls for events after the paused one. | 1232 // by reentrant calls for events after the paused one. |
1224 bool no_ack = ignore_ack_for_mouse_move_from_debugger_ && | 1233 bool no_ack = ignore_ack_for_mouse_move_from_debugger_ && |
1225 input_event->type == WebInputEvent::MouseMove; | 1234 input_event->type == WebInputEvent::MouseMove; |
1226 if (WebInputEventTraits::WillReceiveAckFromRenderer(*input_event) && | 1235 if (WebInputEventTraits::WillReceiveAckFromRenderer(*input_event) && |
1227 !no_ack) { | 1236 !no_ack) { |
1228 InputEventAck ack(input_event->type, ack_result, swap_latency_info, | 1237 InputEventAck ack(input_event->type, ack_result, swap_latency_info, |
| 1238 event_overscroll.Pass(), |
1229 WebInputEventTraits::GetUniqueTouchEventId(*input_event)); | 1239 WebInputEventTraits::GetUniqueTouchEventId(*input_event)); |
1230 scoped_ptr<IPC::Message> response( | 1240 scoped_ptr<IPC::Message> response( |
1231 new InputHostMsg_HandleInputEvent_ACK(routing_id_, ack)); | 1241 new InputHostMsg_HandleInputEvent_ACK(routing_id_, ack)); |
1232 if (rate_limiting_wanted && frame_pending && !is_hidden_) { | 1242 if (rate_limiting_wanted && frame_pending && !is_hidden_) { |
1233 // We want to rate limit the input events in this case, so we'll wait for | 1243 // We want to rate limit the input events in this case, so we'll wait for |
1234 // painting to finish before ACKing this message. | 1244 // painting to finish before ACKing this message. |
1235 TRACE_EVENT_INSTANT0("renderer", | 1245 TRACE_EVENT_INSTANT0("renderer", |
1236 "RenderWidget::OnHandleInputEvent ack throttled", | 1246 "RenderWidget::OnHandleInputEvent ack throttled", |
1237 TRACE_EVENT_SCOPE_THREAD); | 1247 TRACE_EVENT_SCOPE_THREAD); |
1238 if (pending_input_event_ack_) { | 1248 if (pending_input_event_ack_) { |
1239 TRACE_EVENT_ASYNC_END0("input", "RenderWidget::ThrottledInputEventAck", | 1249 TRACE_EVENT_ASYNC_END0("input", "RenderWidget::ThrottledInputEventAck", |
1240 pending_input_event_ack_.get()); | 1250 pending_input_event_ack_.get()); |
1241 // As two different kinds of events could cause us to postpone an ack | 1251 // As two different kinds of events could cause us to postpone an ack |
1242 // we send it now, if we have one pending. The Browser should never | 1252 // we send it now, if we have one pending. The Browser should never |
1243 // send us the same kind of event we are delaying the ack for. | 1253 // send us the same kind of event we are delaying the ack for. |
1244 Send(pending_input_event_ack_.release()); | 1254 Send(pending_input_event_ack_.release()); |
1245 } | 1255 } |
1246 pending_input_event_ack_ = response.Pass(); | 1256 pending_input_event_ack_ = response.Pass(); |
1247 TRACE_EVENT_ASYNC_BEGIN0("input", "RenderWidget::ThrottledInputEventAck", | 1257 TRACE_EVENT_ASYNC_BEGIN0("input", "RenderWidget::ThrottledInputEventAck", |
1248 pending_input_event_ack_.get()); | 1258 pending_input_event_ack_.get()); |
1249 if (compositor_) | 1259 if (compositor_) |
1250 compositor_->NotifyInputThrottledUntilCommit(); | 1260 compositor_->NotifyInputThrottledUntilCommit(); |
1251 } else { | 1261 } else { |
1252 Send(response.release()); | 1262 Send(response.release()); |
1253 } | 1263 } |
| 1264 } else { |
| 1265 DCHECK(!event_overscroll) << "Unexpected overscroll for un-acked event"; |
1254 } | 1266 } |
1255 if (!no_ack && RenderThreadImpl::current()) { | 1267 if (!no_ack && RenderThreadImpl::current()) { |
1256 RenderThreadImpl::current() | 1268 RenderThreadImpl::current() |
1257 ->GetRendererScheduler() | 1269 ->GetRendererScheduler() |
1258 ->DidHandleInputEventOnMainThread(*input_event); | 1270 ->DidHandleInputEventOnMainThread(*input_event); |
1259 } | 1271 } |
1260 if (input_event->type == WebInputEvent::MouseMove) | 1272 if (input_event->type == WebInputEvent::MouseMove) |
1261 ignore_ack_for_mouse_move_from_debugger_ = false; | 1273 ignore_ack_for_mouse_move_from_debugger_ = false; |
1262 | 1274 |
1263 #if defined(OS_ANDROID) | 1275 #if defined(OS_ANDROID) |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2214 } | 2226 } |
2215 #endif | 2227 #endif |
2216 } | 2228 } |
2217 | 2229 |
2218 void RenderWidget::didOverscroll( | 2230 void RenderWidget::didOverscroll( |
2219 const blink::WebFloatSize& unusedDelta, | 2231 const blink::WebFloatSize& unusedDelta, |
2220 const blink::WebFloatSize& accumulatedRootOverScroll, | 2232 const blink::WebFloatSize& accumulatedRootOverScroll, |
2221 const blink::WebFloatPoint& position, | 2233 const blink::WebFloatPoint& position, |
2222 const blink::WebFloatSize& velocity) { | 2234 const blink::WebFloatSize& velocity) { |
2223 DidOverscrollParams params; | 2235 DidOverscrollParams params; |
2224 // TODO(jdduke): Consider bundling the overscroll with the input event ack to | |
2225 // save an IPC. | |
2226 params.accumulated_overscroll = gfx::Vector2dF( | 2236 params.accumulated_overscroll = gfx::Vector2dF( |
2227 accumulatedRootOverScroll.width, accumulatedRootOverScroll.height); | 2237 accumulatedRootOverScroll.width, accumulatedRootOverScroll.height); |
2228 params.latest_overscroll_delta = | 2238 params.latest_overscroll_delta = |
2229 gfx::Vector2dF(unusedDelta.width, unusedDelta.height); | 2239 gfx::Vector2dF(unusedDelta.width, unusedDelta.height); |
2230 // TODO(sataya.m): don't negate velocity once http://crbug.com/499743 is | 2240 // TODO(sataya.m): don't negate velocity once http://crbug.com/499743 is |
2231 // fixed. | 2241 // fixed. |
2232 params.current_fling_velocity = | 2242 params.current_fling_velocity = |
2233 gfx::Vector2dF(-velocity.width, -velocity.height); | 2243 gfx::Vector2dF(-velocity.width, -velocity.height); |
2234 params.causal_event_viewport_point = gfx::PointF(position.x, position.y); | 2244 params.causal_event_viewport_point = gfx::PointF(position.x, position.y); |
| 2245 |
| 2246 // If we're currently handling an event, stash the overscroll data such that |
| 2247 // it can be bundled in the event ack. |
| 2248 if (handling_event_overscroll_) { |
| 2249 handling_event_overscroll_->reset(new DidOverscrollParams(params)); |
| 2250 return; |
| 2251 } |
| 2252 |
2235 Send(new InputHostMsg_DidOverscroll(routing_id_, params)); | 2253 Send(new InputHostMsg_DidOverscroll(routing_id_, params)); |
2236 } | 2254 } |
2237 | 2255 |
2238 void RenderWidget::StartCompositor() { | 2256 void RenderWidget::StartCompositor() { |
2239 // For widgets that are never visible, we don't need the compositor to run | 2257 // For widgets that are never visible, we don't need the compositor to run |
2240 // at all. | 2258 // at all. |
2241 if (never_visible_) | 2259 if (never_visible_) |
2242 return; | 2260 return; |
2243 // In tests without a RenderThreadImpl, don't set ready as this kicks | 2261 // In tests without a RenderThreadImpl, don't set ready as this kicks |
2244 // off creating output surfaces that the test can't create. | 2262 // off creating output surfaces that the test can't create. |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2455 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { | 2473 void RenderWidget::RegisterVideoHoleFrame(RenderFrameImpl* frame) { |
2456 video_hole_frames_.AddObserver(frame); | 2474 video_hole_frames_.AddObserver(frame); |
2457 } | 2475 } |
2458 | 2476 |
2459 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { | 2477 void RenderWidget::UnregisterVideoHoleFrame(RenderFrameImpl* frame) { |
2460 video_hole_frames_.RemoveObserver(frame); | 2478 video_hole_frames_.RemoveObserver(frame); |
2461 } | 2479 } |
2462 #endif // defined(VIDEO_HOLE) | 2480 #endif // defined(VIDEO_HOLE) |
2463 | 2481 |
2464 } // namespace content | 2482 } // namespace content |
OLD | NEW |