| 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.h" | 5 #include "content/browser/renderer_host/render_widget_host.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/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 } | 70 } |
| 71 | 71 |
| 72 } // namespace | 72 } // namespace |
| 73 | 73 |
| 74 /////////////////////////////////////////////////////////////////////////////// | 74 /////////////////////////////////////////////////////////////////////////////// |
| 75 // RenderWidgetHost | 75 // RenderWidgetHost |
| 76 | 76 |
| 77 RenderWidgetHost::RenderWidgetHost(content::RenderProcessHost* process, | 77 RenderWidgetHost::RenderWidgetHost(content::RenderProcessHost* process, |
| 78 int routing_id) | 78 int routing_id) |
| 79 : renderer_initialized_(false), | 79 : renderer_initialized_(false), |
| 80 hung_renderer_delay_ms_(kHungRendererDelayMs), |
| 80 renderer_accessible_(false), | 81 renderer_accessible_(false), |
| 81 view_(NULL), | 82 view_(NULL), |
| 82 process_(process), | 83 process_(process), |
| 83 routing_id_(routing_id), | 84 routing_id_(routing_id), |
| 84 surface_id_(0), | 85 surface_id_(0), |
| 85 is_loading_(false), | 86 is_loading_(false), |
| 86 is_hidden_(false), | 87 is_hidden_(false), |
| 87 is_accelerated_compositing_active_(false), | 88 is_accelerated_compositing_active_(false), |
| 88 repaint_ack_pending_(false), | 89 repaint_ack_pending_(false), |
| 89 resize_ack_pending_(false), | 90 resize_ack_pending_(false), |
| 90 should_auto_resize_(false), | 91 should_auto_resize_(false), |
| 91 mouse_move_pending_(false), | 92 mouse_move_pending_(false), |
| 92 mouse_wheel_pending_(false), | 93 mouse_wheel_pending_(false), |
| 93 touch_move_pending_(false), | 94 touch_move_pending_(false), |
| 94 touch_event_is_queued_(false), | 95 touch_event_is_queued_(false), |
| 95 needs_repainting_on_restore_(false), | 96 needs_repainting_on_restore_(false), |
| 96 is_unresponsive_(false), | 97 is_unresponsive_(false), |
| 98 in_flight_event_count_(0), |
| 97 in_get_backing_store_(false), | 99 in_get_backing_store_(false), |
| 98 view_being_painted_(false), | 100 view_being_painted_(false), |
| 99 ignore_input_events_(false), | 101 ignore_input_events_(false), |
| 100 text_direction_updated_(false), | 102 text_direction_updated_(false), |
| 101 text_direction_(WebKit::WebTextDirectionLeftToRight), | 103 text_direction_(WebKit::WebTextDirectionLeftToRight), |
| 102 text_direction_canceled_(false), | 104 text_direction_canceled_(false), |
| 103 suppress_next_char_events_(false), | 105 suppress_next_char_events_(false), |
| 104 pending_mouse_lock_request_(false), | 106 pending_mouse_lock_request_(false), |
| 105 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { | 107 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
| 106 if (routing_id_ == MSG_ROUTING_NONE) { | 108 if (routing_id_ == MSG_ROUTING_NONE) { |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 // fire sooner. | 533 // fire sooner. |
| 532 time_when_considered_hung_ = requested_end_time; | 534 time_when_considered_hung_ = requested_end_time; |
| 533 hung_renderer_timer_.Stop(); | 535 hung_renderer_timer_.Stop(); |
| 534 hung_renderer_timer_.Start(FROM_HERE, delay, this, | 536 hung_renderer_timer_.Start(FROM_HERE, delay, this, |
| 535 &RenderWidgetHost::CheckRendererIsUnresponsive); | 537 &RenderWidgetHost::CheckRendererIsUnresponsive); |
| 536 } | 538 } |
| 537 | 539 |
| 538 void RenderWidgetHost::RestartHangMonitorTimeout() { | 540 void RenderWidgetHost::RestartHangMonitorTimeout() { |
| 539 // Setting to null will cause StartHangMonitorTimeout to restart the timer. | 541 // Setting to null will cause StartHangMonitorTimeout to restart the timer. |
| 540 time_when_considered_hung_ = Time(); | 542 time_when_considered_hung_ = Time(); |
| 541 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); | 543 StartHangMonitorTimeout( |
| 544 TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
| 542 } | 545 } |
| 543 | 546 |
| 544 void RenderWidgetHost::StopHangMonitorTimeout() { | 547 void RenderWidgetHost::StopHangMonitorTimeout() { |
| 545 time_when_considered_hung_ = Time(); | 548 time_when_considered_hung_ = Time(); |
| 546 RendererIsResponsive(); | 549 RendererIsResponsive(); |
| 547 | |
| 548 // We do not bother to stop the hung_renderer_timer_ here in case it will be | 550 // We do not bother to stop the hung_renderer_timer_ here in case it will be |
| 549 // started again shortly, which happens to be the common use case. | 551 // started again shortly, which happens to be the common use case. |
| 550 } | 552 } |
| 551 | 553 |
| 552 void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { | 554 void RenderWidgetHost::ForwardMouseEvent(const WebMouseEvent& mouse_event) { |
| 553 TRACE_EVENT2("renderer_host", "RenderWidgetHost::ForwardMouseEvent", | 555 TRACE_EVENT2("renderer_host", "RenderWidgetHost::ForwardMouseEvent", |
| 554 "x", mouse_event.x, "y", mouse_event.y); | 556 "x", mouse_event.x, "y", mouse_event.y); |
| 555 if (ignore_input_events_ || process_->IgnoreInputEvents()) | 557 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 556 return; | 558 return; |
| 557 | 559 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 | 714 |
| 713 // Any non-wheel input event cancels pending wheel events. | 715 // Any non-wheel input event cancels pending wheel events. |
| 714 if (input_event.type != WebInputEvent::MouseWheel) | 716 if (input_event.type != WebInputEvent::MouseWheel) |
| 715 coalesced_mouse_wheel_events_.clear(); | 717 coalesced_mouse_wheel_events_.clear(); |
| 716 | 718 |
| 717 // Any input event cancels a pending mouse move event. Note that | 719 // Any input event cancels a pending mouse move event. Note that |
| 718 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| | 720 // |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| |
| 719 // after this line. | 721 // after this line. |
| 720 next_mouse_move_.reset(); | 722 next_mouse_move_.reset(); |
| 721 | 723 |
| 722 StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kHungRendererDelayMs)); | 724 in_flight_event_count_++; |
| 725 StartHangMonitorTimeout( |
| 726 TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
| 723 } | 727 } |
| 724 | 728 |
| 725 void RenderWidgetHost::ForwardTouchEvent( | 729 void RenderWidgetHost::ForwardTouchEvent( |
| 726 const WebKit::WebTouchEvent& touch_event) { | 730 const WebKit::WebTouchEvent& touch_event) { |
| 727 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardTouchEvent"); | 731 TRACE_EVENT0("renderer_host", "RenderWidgetHost::ForwardTouchEvent"); |
| 728 if (ignore_input_events_ || process_->IgnoreInputEvents()) | 732 if (ignore_input_events_ || process_->IgnoreInputEvents()) |
| 729 return; | 733 return; |
| 730 | 734 |
| 731 if (touch_event.type == WebInputEvent::TouchMove && | 735 if (touch_event.type == WebInputEvent::TouchMove && |
| 732 touch_move_pending_) { | 736 touch_move_pending_) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 763 | 767 |
| 764 // Reset some fields in preparation for recovering from a crash. | 768 // Reset some fields in preparation for recovering from a crash. |
| 765 resize_ack_pending_ = false; | 769 resize_ack_pending_ = false; |
| 766 repaint_ack_pending_ = false; | 770 repaint_ack_pending_ = false; |
| 767 | 771 |
| 768 in_flight_size_.SetSize(0, 0); | 772 in_flight_size_.SetSize(0, 0); |
| 769 current_size_.SetSize(0, 0); | 773 current_size_.SetSize(0, 0); |
| 770 is_hidden_ = false; | 774 is_hidden_ = false; |
| 771 is_accelerated_compositing_active_ = false; | 775 is_accelerated_compositing_active_ = false; |
| 772 | 776 |
| 777 // Reset this to ensure the hung renderer mechanism is working properly. |
| 778 in_flight_event_count_ = 0; |
| 779 |
| 773 if (view_) { | 780 if (view_) { |
| 774 view_->RenderViewGone(status, exit_code); | 781 view_->RenderViewGone(status, exit_code); |
| 775 view_ = NULL; // The View should be deleted by RenderViewGone. | 782 view_ = NULL; // The View should be deleted by RenderViewGone. |
| 776 } | 783 } |
| 777 | 784 |
| 778 BackingStoreManager::RemoveBackingStore(this); | 785 BackingStoreManager::RemoveBackingStore(this); |
| 779 } | 786 } |
| 780 | 787 |
| 781 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) { | 788 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) { |
| 782 text_direction_updated_ = true; | 789 text_direction_updated_ = true; |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1142 | 1149 |
| 1143 void RenderWidgetHost::OnMsgInputEventAck(WebInputEvent::Type event_type, | 1150 void RenderWidgetHost::OnMsgInputEventAck(WebInputEvent::Type event_type, |
| 1144 bool processed) { | 1151 bool processed) { |
| 1145 TRACE_EVENT0("renderer_host", "RenderWidgetHost::OnMsgInputEventAck"); | 1152 TRACE_EVENT0("renderer_host", "RenderWidgetHost::OnMsgInputEventAck"); |
| 1146 | 1153 |
| 1147 // Log the time delta for processing an input event. | 1154 // Log the time delta for processing an input event. |
| 1148 TimeDelta delta = TimeTicks::Now() - input_event_start_time_; | 1155 TimeDelta delta = TimeTicks::Now() - input_event_start_time_; |
| 1149 UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta); | 1156 UMA_HISTOGRAM_TIMES("MPArch.RWH_InputEventDelta", delta); |
| 1150 | 1157 |
| 1151 // Cancel pending hung renderer checks since the renderer is responsive. | 1158 // Cancel pending hung renderer checks since the renderer is responsive. |
| 1152 StopHangMonitorTimeout(); | 1159 if (--in_flight_event_count_ == 0) |
| 1160 StopHangMonitorTimeout(); |
| 1153 | 1161 |
| 1154 int type = static_cast<int>(event_type); | 1162 int type = static_cast<int>(event_type); |
| 1155 if (type < WebInputEvent::Undefined) { | 1163 if (type < WebInputEvent::Undefined) { |
| 1156 content::RecordAction(UserMetricsAction("BadMessageTerminate_RWH2")); | 1164 content::RecordAction(UserMetricsAction("BadMessageTerminate_RWH2")); |
| 1157 process()->ReceivedBadMessage(); | 1165 process()->ReceivedBadMessage(); |
| 1158 } else if (type == WebInputEvent::MouseMove) { | 1166 } else if (type == WebInputEvent::MouseMove) { |
| 1159 mouse_move_pending_ = false; | 1167 mouse_move_pending_ = false; |
| 1160 | 1168 |
| 1161 // now, we can send the next mouse move event | 1169 // now, we can send the next mouse move event |
| 1162 if (next_mouse_move_.get()) { | 1170 if (next_mouse_move_.get()) { |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 ui_shim->Send(new AcceleratedSurfaceMsg_BuffersSwappedACK(route_id)); | 1540 ui_shim->Send(new AcceleratedSurfaceMsg_BuffersSwappedACK(route_id)); |
| 1533 } | 1541 } |
| 1534 | 1542 |
| 1535 // static | 1543 // static |
| 1536 void RenderWidgetHost::AcknowledgePostSubBuffer(int32 route_id, | 1544 void RenderWidgetHost::AcknowledgePostSubBuffer(int32 route_id, |
| 1537 int gpu_host_id) { | 1545 int gpu_host_id) { |
| 1538 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); | 1546 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); |
| 1539 if (ui_shim) | 1547 if (ui_shim) |
| 1540 ui_shim->Send(new AcceleratedSurfaceMsg_PostSubBufferACK(route_id)); | 1548 ui_shim->Send(new AcceleratedSurfaceMsg_PostSubBufferACK(route_id)); |
| 1541 } | 1549 } |
| OLD | NEW |