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/browser/renderer_host/render_widget_host_impl.h" | 5 #include "content/browser/renderer_host/render_widget_host_impl.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event, | 94 bool ShouldCoalesceMouseWheelEvents(const WebMouseWheelEvent& last_event, |
95 const WebMouseWheelEvent& new_event) { | 95 const WebMouseWheelEvent& new_event) { |
96 return last_event.modifiers == new_event.modifiers && | 96 return last_event.modifiers == new_event.modifiers && |
97 last_event.scrollByPage == new_event.scrollByPage && | 97 last_event.scrollByPage == new_event.scrollByPage && |
98 last_event.hasPreciseScrollingDeltas | 98 last_event.hasPreciseScrollingDeltas |
99 == new_event.hasPreciseScrollingDeltas && | 99 == new_event.hasPreciseScrollingDeltas && |
100 last_event.phase == new_event.phase && | 100 last_event.phase == new_event.phase && |
101 last_event.momentumPhase == new_event.momentumPhase; | 101 last_event.momentumPhase == new_event.momentumPhase; |
102 } | 102 } |
103 | 103 |
| 104 int64 g_current_input_number; |
| 105 |
104 } // namespace | 106 } // namespace |
105 | 107 |
106 | 108 |
107 // static | 109 // static |
108 void RenderWidgetHost::RemoveAllBackingStores() { | 110 void RenderWidgetHost::RemoveAllBackingStores() { |
109 BackingStoreManager::RemoveAllBackingStores(); | 111 BackingStoreManager::RemoveAllBackingStores(); |
110 } | 112 } |
111 | 113 |
112 // static | 114 // static |
113 size_t RenderWidgetHost::BackingStoreMemorySize() { | 115 size_t RenderWidgetHost::BackingStoreMemorySize() { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 text_direction_updated_(false), | 150 text_direction_updated_(false), |
149 text_direction_(WebKit::WebTextDirectionLeftToRight), | 151 text_direction_(WebKit::WebTextDirectionLeftToRight), |
150 text_direction_canceled_(false), | 152 text_direction_canceled_(false), |
151 suppress_next_char_events_(false), | 153 suppress_next_char_events_(false), |
152 pending_mouse_lock_request_(false), | 154 pending_mouse_lock_request_(false), |
153 allow_privileged_mouse_lock_(false), | 155 allow_privileged_mouse_lock_(false), |
154 has_touch_handler_(false), | 156 has_touch_handler_(false), |
155 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), | 157 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
156 tick_active_smooth_scroll_gestures_task_posted_(false), | 158 tick_active_smooth_scroll_gestures_task_posted_(false), |
157 touch_event_queue_(new TouchEventQueue(this)), | 159 touch_event_queue_(new TouchEventQueue(this)), |
158 gesture_event_filter_(new GestureEventFilter(this)) { | 160 gesture_event_filter_(new GestureEventFilter(this)), |
| 161 incremented_input_number_(false), |
| 162 current_input_number_(0) { |
159 CHECK(delegate_); | 163 CHECK(delegate_); |
160 if (routing_id_ == MSG_ROUTING_NONE) { | 164 if (routing_id_ == MSG_ROUTING_NONE) { |
161 routing_id_ = process_->GetNextRoutingID(); | 165 routing_id_ = process_->GetNextRoutingID(); |
162 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( | 166 surface_id_ = GpuSurfaceTracker::Get()->AddSurfaceForRenderer( |
163 process_->GetID(), | 167 process_->GetID(), |
164 routing_id_); | 168 routing_id_); |
165 } else { | 169 } else { |
166 // TODO(piman): This is a O(N) lookup, where we could forward the | 170 // TODO(piman): This is a O(N) lookup, where we could forward the |
167 // information from the RenderWidgetHelper. The problem is that doing so | 171 // information from the RenderWidgetHelper. The problem is that doing so |
168 // currently leaks outside of content all the way to chrome classes, and | 172 // currently leaks outside of content all the way to chrome classes, and |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 // When accelerated compositing is on, we must always repaint, even when | 438 // When accelerated compositing is on, we must always repaint, even when |
435 // the backing store exists. | 439 // the backing store exists. |
436 bool needs_repainting; | 440 bool needs_repainting; |
437 if (needs_repainting_on_restore_ || !backing_store || | 441 if (needs_repainting_on_restore_ || !backing_store || |
438 is_accelerated_compositing_active()) { | 442 is_accelerated_compositing_active()) { |
439 needs_repainting = true; | 443 needs_repainting = true; |
440 needs_repainting_on_restore_ = false; | 444 needs_repainting_on_restore_ = false; |
441 } else { | 445 } else { |
442 needs_repainting = false; | 446 needs_repainting = false; |
443 } | 447 } |
| 448 |
| 449 SendStartFrame(); |
| 450 |
444 Send(new ViewMsg_WasShown(routing_id_, needs_repainting)); | 451 Send(new ViewMsg_WasShown(routing_id_, needs_repainting)); |
445 | 452 |
446 process_->WidgetRestored(); | 453 process_->WidgetRestored(); |
447 | 454 |
448 bool is_visible = true; | 455 bool is_visible = true; |
449 NotificationService::current()->Notify( | 456 NotificationService::current()->Notify( |
450 NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 457 NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
451 Source<RenderWidgetHost>(this), | 458 Source<RenderWidgetHost>(this), |
452 Details<bool>(&is_visible)); | 459 Details<bool>(&is_visible)); |
453 | 460 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 return; | 496 return; |
490 | 497 |
491 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_ && | 498 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_ && |
492 !fullscreen_changed) | 499 !fullscreen_changed) |
493 return; | 500 return; |
494 | 501 |
495 // We don't expect to receive an ACK when the requested size is empty. | 502 // We don't expect to receive an ACK when the requested size is empty. |
496 if (!new_size.IsEmpty() && size_changed) | 503 if (!new_size.IsEmpty() && size_changed) |
497 resize_ack_pending_ = true; | 504 resize_ack_pending_ = true; |
498 | 505 |
| 506 SendStartFrame(); |
499 if (!Send(new ViewMsg_Resize(routing_id_, new_size, | 507 if (!Send(new ViewMsg_Resize(routing_id_, new_size, |
500 GetRootWindowResizerRect(), is_fullscreen_))) { | 508 GetRootWindowResizerRect(), is_fullscreen_))) { |
501 resize_ack_pending_ = false; | 509 resize_ack_pending_ = false; |
502 } else { | 510 } else { |
503 in_flight_size_ = new_size; | 511 in_flight_size_ = new_size; |
504 } | 512 } |
505 } | 513 } |
506 | 514 |
507 void RenderWidgetHostImpl::ResizeRectChanged(const gfx::Rect& new_rect) { | 515 void RenderWidgetHostImpl::ResizeRectChanged(const gfx::Rect& new_rect) { |
508 Send(new ViewMsg_ChangeResizeRect(routing_id_, new_rect)); | 516 Send(new ViewMsg_ChangeResizeRect(routing_id_, new_rect)); |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 "x", mouse_event.x, "y", mouse_event.y); | 906 "x", mouse_event.x, "y", mouse_event.y); |
899 if (ignore_input_events_ || process_->IgnoreInputEvents()) | 907 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
900 return; | 908 return; |
901 | 909 |
902 if (CommandLine::ForCurrentProcess()->HasSwitch( | 910 if (CommandLine::ForCurrentProcess()->HasSwitch( |
903 switches::kSimulateTouchScreenWithMouse)) { | 911 switches::kSimulateTouchScreenWithMouse)) { |
904 SimulateTouchGestureWithMouse(mouse_event); | 912 SimulateTouchGestureWithMouse(mouse_event); |
905 return; | 913 return; |
906 } | 914 } |
907 | 915 |
| 916 IncrementInputNumber(); |
| 917 |
908 if (mouse_event.type == WebInputEvent::MouseDown && | 918 if (mouse_event.type == WebInputEvent::MouseDown && |
909 gesture_event_filter_->GetTapSuppressionController()-> | 919 gesture_event_filter_->GetTapSuppressionController()-> |
910 ShouldDeferMouseDown(mouse_event)) | 920 ShouldDeferMouseDown(mouse_event)) |
911 return; | 921 return; |
912 if (mouse_event.type == WebInputEvent::MouseUp && | 922 if (mouse_event.type == WebInputEvent::MouseUp && |
913 gesture_event_filter_->GetTapSuppressionController()-> | 923 gesture_event_filter_->GetTapSuppressionController()-> |
914 ShouldSuppressMouseUp()) | 924 ShouldSuppressMouseUp()) |
915 return; | 925 return; |
916 | 926 |
917 ForwardMouseEventImmediately(mouse_event); | 927 ForwardMouseEventImmediately(mouse_event); |
918 } | 928 } |
919 | 929 |
920 void RenderWidgetHostImpl::OnPointerEventActivate() { | 930 void RenderWidgetHostImpl::OnPointerEventActivate() { |
921 } | 931 } |
922 | 932 |
923 void RenderWidgetHostImpl::ForwardWheelEvent( | 933 void RenderWidgetHostImpl::ForwardWheelEvent( |
924 const WebMouseWheelEvent& wheel_event) { | 934 const WebMouseWheelEvent& wheel_event) { |
925 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardWheelEvent"); | 935 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardWheelEvent"); |
926 if (ignore_input_events_ || process_->IgnoreInputEvents()) | 936 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
927 return; | 937 return; |
928 | 938 |
| 939 IncrementInputNumber(); |
929 // If there's already a mouse wheel event waiting to be sent to the renderer, | 940 // If there's already a mouse wheel event waiting to be sent to the renderer, |
930 // add the new deltas to that event. Not doing so (e.g., by dropping the old | 941 // add the new deltas to that event. Not doing so (e.g., by dropping the old |
931 // event, as for mouse moves) results in very slow scrolling on the Mac (on | 942 // event, as for mouse moves) results in very slow scrolling on the Mac (on |
932 // which many, very small wheel events are sent). | 943 // which many, very small wheel events are sent). |
933 if (mouse_wheel_pending_) { | 944 if (mouse_wheel_pending_) { |
934 if (coalesced_mouse_wheel_events_.empty() || | 945 if (coalesced_mouse_wheel_events_.empty() || |
935 !ShouldCoalesceMouseWheelEvents(coalesced_mouse_wheel_events_.back(), | 946 !ShouldCoalesceMouseWheelEvents(coalesced_mouse_wheel_events_.back(), |
936 wheel_event)) { | 947 wheel_event)) { |
937 coalesced_mouse_wheel_events_.push_back(wheel_event); | 948 coalesced_mouse_wheel_events_.push_back(wheel_event); |
938 } else { | 949 } else { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1083 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); | 1094 HISTOGRAM_COUNTS_100("Renderer.KeyboardQueueSize", key_queue_.size()); |
1084 | 1095 |
1085 gesture_event_filter_->FlingHasBeenHalted(); | 1096 gesture_event_filter_->FlingHasBeenHalted(); |
1086 | 1097 |
1087 // Only forward the non-native portions of our event. | 1098 // Only forward the non-native portions of our event. |
1088 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), | 1099 ForwardInputEvent(key_event, sizeof(WebKeyboardEvent), |
1089 is_keyboard_shortcut); | 1100 is_keyboard_shortcut); |
1090 } | 1101 } |
1091 } | 1102 } |
1092 | 1103 |
| 1104 void RenderWidgetHostImpl::IncrementInputNumber() { |
| 1105 if (incremented_input_number_) |
| 1106 return; |
| 1107 g_current_input_number++; |
| 1108 current_input_number_ = g_current_input_number; |
| 1109 incremented_input_number_ = true; |
| 1110 TRACE_EVENT_ASYNC_BEGIN1("frame", "Input processing", this, |
| 1111 "input_number", current_input_number_); |
| 1112 } |
| 1113 |
| 1114 void RenderWidgetHostImpl::SendStartFrame() { |
| 1115 IncrementInputNumber(); |
| 1116 TRACE_EVENT_ASYNC_END1("frame", "Input processing", this, |
| 1117 "input_number", current_input_number_); |
| 1118 Send(new ViewMsg_StartFrame(routing_id_, current_input_number_)); |
| 1119 incremented_input_number_ = false; |
| 1120 } |
| 1121 |
1093 void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, | 1122 void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, |
1094 int event_size, | 1123 int event_size, |
1095 bool is_keyboard_shortcut) { | 1124 bool is_keyboard_shortcut) { |
| 1125 IncrementInputNumber(); |
| 1126 incremented_input_number_ = false; |
| 1127 |
| 1128 TRACE_EVENT_ASYNC_END1("frame", "Input processing", this, |
| 1129 "input_number", current_input_number_); |
| 1130 |
1096 input_event_start_time_ = TimeTicks::Now(); | 1131 input_event_start_time_ = TimeTicks::Now(); |
1097 Send(new ViewMsg_HandleInputEvent( | 1132 Send(new ViewMsg_HandleInputEvent( |
1098 routing_id_, &input_event, is_keyboard_shortcut)); | 1133 routing_id_, current_input_number_, &input_event, is_keyboard_shortcut)); |
1099 increment_in_flight_event_count(); | 1134 increment_in_flight_event_count(); |
1100 } | 1135 } |
1101 | 1136 |
1102 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, | 1137 void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, |
1103 int event_size, | 1138 int event_size, |
1104 bool is_keyboard_shortcut) { | 1139 bool is_keyboard_shortcut) { |
1105 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent"); | 1140 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::ForwardInputEvent"); |
1106 | 1141 |
1107 if (!process_->HasConnection()) | 1142 if (!process_->HasConnection()) |
1108 return; | 1143 return; |
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 frame.metadata.page_scale_factor, | 1560 frame.metadata.page_scale_factor, |
1526 frame.metadata.min_page_scale_factor, | 1561 frame.metadata.min_page_scale_factor, |
1527 frame.metadata.max_page_scale_factor, | 1562 frame.metadata.max_page_scale_factor, |
1528 gfx::ToCeiledSize(content_size)); | 1563 gfx::ToCeiledSize(content_size)); |
1529 } | 1564 } |
1530 #endif | 1565 #endif |
1531 } | 1566 } |
1532 | 1567 |
1533 void RenderWidgetHostImpl::OnUpdateRect( | 1568 void RenderWidgetHostImpl::OnUpdateRect( |
1534 const ViewHostMsg_UpdateRect_Params& params) { | 1569 const ViewHostMsg_UpdateRect_Params& params) { |
1535 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnUpdateRect"); | 1570 TRACE_EVENT2("renderer_host", "RenderWidgetHostImpl::OnUpdateRect", |
| 1571 "input_number", params.latency_info.inputNumber, |
| 1572 "render_thread_frame_number", |
| 1573 params.latency_info.rendererMainFrameNumber); |
1536 TimeTicks paint_start = TimeTicks::Now(); | 1574 TimeTicks paint_start = TimeTicks::Now(); |
1537 | 1575 |
1538 // Update our knowledge of the RenderWidget's size. | 1576 // Update our knowledge of the RenderWidget's size. |
1539 current_size_ = params.view_size; | 1577 current_size_ = params.view_size; |
1540 // Update our knowledge of the RenderWidget's scroll offset. | 1578 // Update our knowledge of the RenderWidget's scroll offset. |
1541 last_scroll_offset_ = params.scroll_offset; | 1579 last_scroll_offset_ = params.scroll_offset; |
1542 | 1580 |
1543 bool is_resize_ack = | 1581 bool is_resize_ack = |
1544 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); | 1582 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); |
1545 | 1583 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 } | 1666 } |
1629 | 1667 |
1630 void RenderWidgetHostImpl::OnUpdateIsDelayed() { | 1668 void RenderWidgetHostImpl::OnUpdateIsDelayed() { |
1631 if (in_get_backing_store_) | 1669 if (in_get_backing_store_) |
1632 abort_get_backing_store_ = true; | 1670 abort_get_backing_store_ = true; |
1633 } | 1671 } |
1634 | 1672 |
1635 void RenderWidgetHostImpl::DidUpdateBackingStore( | 1673 void RenderWidgetHostImpl::DidUpdateBackingStore( |
1636 const ViewHostMsg_UpdateRect_Params& params, | 1674 const ViewHostMsg_UpdateRect_Params& params, |
1637 const TimeTicks& paint_start) { | 1675 const TimeTicks& paint_start) { |
1638 TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::DidUpdateBackingStore"); | 1676 TRACE_EVENT2("renderer_host", "RenderWidgetHostImpl::DidUpdateBackingStore", |
| 1677 "input_number", params.latency_info.inputNumber, |
| 1678 "render_thread_frame_number", |
| 1679 params.latency_info.rendererMainFrameNumber); |
1639 TimeTicks update_start = TimeTicks::Now(); | 1680 TimeTicks update_start = TimeTicks::Now(); |
1640 | 1681 |
1641 if (params.needs_ack) { | 1682 if (params.needs_ack) { |
1642 // ACK early so we can prefetch the next PaintRect if there is a next one. | 1683 // ACK early so we can prefetch the next PaintRect if there is a next one. |
1643 // This must be done AFTER we're done painting with the bitmap supplied by | 1684 // This must be done AFTER we're done painting with the bitmap supplied by |
1644 // the renderer. This ACK is a signal to the renderer that the backing store | 1685 // the renderer. This ACK is a signal to the renderer that the backing store |
1645 // can be re-used, so the bitmap may be invalid after this call. | 1686 // can be re-used, so the bitmap may be invalid after this call. |
1646 Send(new ViewMsg_UpdateRect_ACK(routing_id_)); | 1687 Send(new ViewMsg_UpdateRect_ACK(routing_id_)); |
1647 } | 1688 } |
1648 | 1689 |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2293 void RenderWidgetHostImpl::AcknowledgeBufferPresent( | 2334 void RenderWidgetHostImpl::AcknowledgeBufferPresent( |
2294 int32 route_id, int gpu_host_id, | 2335 int32 route_id, int gpu_host_id, |
2295 const AcceleratedSurfaceMsg_BufferPresented_Params& params) { | 2336 const AcceleratedSurfaceMsg_BufferPresented_Params& params) { |
2296 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); | 2337 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); |
2297 if (ui_shim) { | 2338 if (ui_shim) { |
2298 ui_shim->Send(new AcceleratedSurfaceMsg_BufferPresented(route_id, | 2339 ui_shim->Send(new AcceleratedSurfaceMsg_BufferPresented(route_id, |
2299 params)); | 2340 params)); |
2300 } | 2341 } |
2301 } | 2342 } |
2302 | 2343 |
| 2344 void RenderWidgetHostImpl::NotifyFrameDisplayed( |
| 2345 int route_id, int gpu_host_id, |
| 2346 const cc::LatencyInfo& latency_info) { |
| 2347 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); |
| 2348 if (ui_shim) |
| 2349 ui_shim->Send(new AcceleratedSurfaceMsg_FrameDisplayed(route_id, |
| 2350 latency_info)); |
| 2351 } |
| 2352 |
2303 void RenderWidgetHostImpl::AcknowledgeSwapBuffersToRenderer() { | 2353 void RenderWidgetHostImpl::AcknowledgeSwapBuffersToRenderer() { |
2304 if (!is_threaded_compositing_enabled_) | 2354 if (!is_threaded_compositing_enabled_) |
2305 Send(new ViewMsg_SwapBuffers_ACK(routing_id_)); | 2355 Send(new ViewMsg_SwapBuffers_ACK(routing_id_)); |
2306 } | 2356 } |
2307 | 2357 |
2308 #if defined(USE_AURA) | 2358 #if defined(USE_AURA) |
2309 | 2359 |
2310 void RenderWidgetHostImpl::ParentChanged(gfx::NativeViewId new_parent) { | 2360 void RenderWidgetHostImpl::ParentChanged(gfx::NativeViewId new_parent) { |
2311 #if defined(OS_WIN) | 2361 #if defined(OS_WIN) |
2312 HWND hwnd = reinterpret_cast<HWND>(new_parent); | 2362 HWND hwnd = reinterpret_cast<HWND>(new_parent); |
(...skipping 18 matching lines...) Expand all Loading... |
2331 return; | 2381 return; |
2332 | 2382 |
2333 OnRenderAutoResized(new_size); | 2383 OnRenderAutoResized(new_size); |
2334 } | 2384 } |
2335 | 2385 |
2336 void RenderWidgetHostImpl::DetachDelegate() { | 2386 void RenderWidgetHostImpl::DetachDelegate() { |
2337 delegate_ = NULL; | 2387 delegate_ = NULL; |
2338 } | 2388 } |
2339 | 2389 |
2340 } // namespace content | 2390 } // namespace content |
OLD | NEW |