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 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <tuple> | 10 #include <tuple> |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 has_touch_handler_(false), | 281 has_touch_handler_(false), |
282 is_in_touchpad_gesture_scroll_(false), | 282 is_in_touchpad_gesture_scroll_(false), |
283 is_in_touchscreen_gesture_scroll_(false), | 283 is_in_touchscreen_gesture_scroll_(false), |
284 received_paint_after_load_(false), | 284 received_paint_after_load_(false), |
285 latency_tracker_(), | 285 latency_tracker_(), |
286 next_browser_snapshot_id_(1), | 286 next_browser_snapshot_id_(1), |
287 owned_by_render_frame_host_(false), | 287 owned_by_render_frame_host_(false), |
288 is_focused_(false), | 288 is_focused_(false), |
289 hung_renderer_delay_( | 289 hung_renderer_delay_( |
290 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), | 290 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), |
291 hang_monitor_reason_( | |
292 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN), | |
293 hang_monitor_event_type_(blink::WebInputEvent::Undefined), | 291 hang_monitor_event_type_(blink::WebInputEvent::Undefined), |
294 last_event_type_(blink::WebInputEvent::Undefined), | 292 last_event_type_(blink::WebInputEvent::Undefined), |
295 new_content_rendering_delay_( | 293 new_content_rendering_delay_( |
296 base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), | 294 base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)), |
297 current_content_source_id_(0), | 295 current_content_source_id_(0), |
298 weak_factory_(this) { | 296 weak_factory_(this) { |
299 CHECK(delegate_); | 297 CHECK(delegate_); |
300 CHECK_NE(MSG_ROUTING_NONE, routing_id_); | 298 CHECK_NE(MSG_ROUTING_NONE, routing_id_); |
301 latency_tracker_.SetDelegate(delegate_); | 299 latency_tracker_.SetDelegate(delegate_); |
302 | 300 |
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 repaint_start_time_ = TimeTicks::Now(); | 939 repaint_start_time_ = TimeTicks::Now(); |
942 repaint_ack_pending_ = true; | 940 repaint_ack_pending_ = true; |
943 TRACE_EVENT_ASYNC_BEGIN0( | 941 TRACE_EVENT_ASYNC_BEGIN0( |
944 "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); | 942 "renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); |
945 Send(new ViewMsg_Repaint(routing_id_, current_size_)); | 943 Send(new ViewMsg_Repaint(routing_id_, current_size_)); |
946 return true; | 944 return true; |
947 } | 945 } |
948 | 946 |
949 void RenderWidgetHostImpl::StartHangMonitorTimeout( | 947 void RenderWidgetHostImpl::StartHangMonitorTimeout( |
950 base::TimeDelta delay, | 948 base::TimeDelta delay, |
951 blink::WebInputEvent::Type event_type, | 949 blink::WebInputEvent::Type event_type) { |
952 RendererUnresponsiveType hang_monitor_reason) { | |
953 if (!hang_monitor_timeout_) | 950 if (!hang_monitor_timeout_) |
954 return; | 951 return; |
955 if (!hang_monitor_timeout_->IsRunning()) | 952 if (!hang_monitor_timeout_->IsRunning()) |
956 hang_monitor_event_type_ = event_type; | 953 hang_monitor_event_type_ = event_type; |
957 last_event_type_ = event_type; | 954 last_event_type_ = event_type; |
958 hang_monitor_timeout_->Start(delay); | 955 hang_monitor_timeout_->Start(delay); |
959 hang_monitor_reason_ = hang_monitor_reason; | |
960 } | 956 } |
961 | 957 |
962 void RenderWidgetHostImpl::RestartHangMonitorTimeoutIfNecessary() { | 958 void RenderWidgetHostImpl::RestartHangMonitorTimeoutIfNecessary() { |
963 if (!hang_monitor_timeout_) | 959 if (!hang_monitor_timeout_) |
964 return; | 960 return; |
965 if (in_flight_event_count_ > 0 && !is_hidden_) { | 961 if (in_flight_event_count_ > 0 && !is_hidden_) |
966 if (hang_monitor_reason_ == | |
967 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN) { | |
968 hang_monitor_reason_ = | |
969 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS; | |
970 } | |
971 hang_monitor_timeout_->Restart(hung_renderer_delay_); | 962 hang_monitor_timeout_->Restart(hung_renderer_delay_); |
972 } | |
973 } | 963 } |
974 | 964 |
975 void RenderWidgetHostImpl::DisableHangMonitorForTesting() { | 965 void RenderWidgetHostImpl::DisableHangMonitorForTesting() { |
976 StopHangMonitorTimeout(); | 966 StopHangMonitorTimeout(); |
977 hang_monitor_timeout_.reset(); | 967 hang_monitor_timeout_.reset(); |
978 } | 968 } |
979 | 969 |
980 void RenderWidgetHostImpl::StopHangMonitorTimeout() { | 970 void RenderWidgetHostImpl::StopHangMonitorTimeout() { |
981 if (hang_monitor_timeout_) { | 971 if (hang_monitor_timeout_) |
982 hang_monitor_timeout_->Stop(); | 972 hang_monitor_timeout_->Stop(); |
983 hang_monitor_reason_ = | |
984 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN; | |
985 } | |
986 RendererIsResponsive(); | 973 RendererIsResponsive(); |
987 } | 974 } |
988 | 975 |
989 void RenderWidgetHostImpl::StartNewContentRenderingTimeout( | 976 void RenderWidgetHostImpl::StartNewContentRenderingTimeout( |
990 uint32_t next_source_id) { | 977 uint32_t next_source_id) { |
991 current_content_source_id_ = next_source_id; | 978 current_content_source_id_ = next_source_id; |
992 // It is possible for a compositor frame to arrive before the browser is | 979 // It is possible for a compositor frame to arrive before the browser is |
993 // notified about the page being committed, in which case no timer is | 980 // notified about the page being committed, in which case no timer is |
994 // necessary. | 981 // necessary. |
995 if (received_paint_after_load_) { | 982 if (received_paint_after_load_) { |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1697 delete this; | 1684 delete this; |
1698 } | 1685 } |
1699 } | 1686 } |
1700 | 1687 |
1701 void RenderWidgetHostImpl::RendererIsUnresponsive() { | 1688 void RenderWidgetHostImpl::RendererIsUnresponsive() { |
1702 NotificationService::current()->Notify( | 1689 NotificationService::current()->Notify( |
1703 NOTIFICATION_RENDER_WIDGET_HOST_HANG, | 1690 NOTIFICATION_RENDER_WIDGET_HOST_HANG, |
1704 Source<RenderWidgetHost>(this), | 1691 Source<RenderWidgetHost>(this), |
1705 NotificationService::NoDetails()); | 1692 NotificationService::NoDetails()); |
1706 is_unresponsive_ = true; | 1693 is_unresponsive_ = true; |
1707 RendererUnresponsiveType reason = hang_monitor_reason_; | |
1708 hang_monitor_reason_ = | |
1709 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_UNKNOWN; | |
1710 | 1694 |
1711 if (delegate_) | 1695 if (delegate_) |
1712 delegate_->RendererUnresponsive(this, reason); | 1696 delegate_->RendererUnresponsive(this); |
1713 | 1697 |
1714 // Do not add code after this since the Delegate may delete this | 1698 // Do not add code after this since the Delegate may delete this |
1715 // RenderWidgetHostImpl in RendererUnresponsive. | 1699 // RenderWidgetHostImpl in RendererUnresponsive. |
1716 } | 1700 } |
1717 | 1701 |
1718 void RenderWidgetHostImpl::RendererIsResponsive() { | 1702 void RenderWidgetHostImpl::RendererIsResponsive() { |
1719 if (is_unresponsive_) { | 1703 if (is_unresponsive_) { |
1720 is_unresponsive_ = false; | 1704 is_unresponsive_ = false; |
1721 if (delegate_) | 1705 if (delegate_) |
1722 delegate_->RendererResponsive(this); | 1706 delegate_->RendererResponsive(this); |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2105 } | 2089 } |
2106 } | 2090 } |
2107 | 2091 |
2108 return view_ ? view_->FilterInputEvent(event) | 2092 return view_ ? view_->FilterInputEvent(event) |
2109 : INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 2093 : INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
2110 } | 2094 } |
2111 | 2095 |
2112 void RenderWidgetHostImpl::IncrementInFlightEventCount( | 2096 void RenderWidgetHostImpl::IncrementInFlightEventCount( |
2113 blink::WebInputEvent::Type event_type) { | 2097 blink::WebInputEvent::Type event_type) { |
2114 increment_in_flight_event_count(); | 2098 increment_in_flight_event_count(); |
2115 if (!is_hidden_) { | 2099 if (!is_hidden_) |
2116 StartHangMonitorTimeout( | 2100 StartHangMonitorTimeout(hung_renderer_delay_, event_type); |
2117 hung_renderer_delay_, event_type, | |
2118 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_IN_FLIGHT_EVENTS); | |
2119 } | |
2120 } | 2101 } |
2121 | 2102 |
2122 void RenderWidgetHostImpl::DecrementInFlightEventCount( | 2103 void RenderWidgetHostImpl::DecrementInFlightEventCount( |
2123 InputEventAckSource ack_source) { | 2104 InputEventAckSource ack_source) { |
2124 if (decrement_in_flight_event_count() <= 0) { | 2105 if (decrement_in_flight_event_count() <= 0) { |
2125 // Cancel pending hung renderer checks since the renderer is responsive. | 2106 // Cancel pending hung renderer checks since the renderer is responsive. |
2126 StopHangMonitorTimeout(); | 2107 StopHangMonitorTimeout(); |
2127 } else { | 2108 } else { |
2128 // Only restart the hang monitor timer if we got a response from the | 2109 // Only restart the hang monitor timer if we got a response from the |
2129 // main thread. | 2110 // main thread. |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2514 // different from the receiver's. | 2495 // different from the receiver's. |
2515 file_system_file.url = | 2496 file_system_file.url = |
2516 GURL(storage::GetIsolatedFileSystemRootURIString( | 2497 GURL(storage::GetIsolatedFileSystemRootURIString( |
2517 file_system_url.origin(), filesystem_id, std::string()) | 2498 file_system_url.origin(), filesystem_id, std::string()) |
2518 .append(register_name)); | 2499 .append(register_name)); |
2519 file_system_file.filesystem_id = filesystem_id; | 2500 file_system_file.filesystem_id = filesystem_id; |
2520 } | 2501 } |
2521 } | 2502 } |
2522 | 2503 |
2523 } // namespace content | 2504 } // namespace content |
OLD | NEW |