| 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_view_host_impl.h" | 5 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "components/variations/variations_associated_data.h" | 31 #include "components/variations/variations_associated_data.h" |
| 32 #include "content/browser/bad_message.h" | 32 #include "content/browser/bad_message.h" |
| 33 #include "content/browser/child_process_security_policy_impl.h" | 33 #include "content/browser/child_process_security_policy_impl.h" |
| 34 #include "content/browser/dom_storage/session_storage_namespace_impl.h" | 34 #include "content/browser/dom_storage/session_storage_namespace_impl.h" |
| 35 #include "content/browser/frame_host/frame_tree.h" | 35 #include "content/browser/frame_host/frame_tree.h" |
| 36 #include "content/browser/gpu/compositor_util.h" | 36 #include "content/browser/gpu/compositor_util.h" |
| 37 #include "content/browser/gpu/gpu_data_manager_impl.h" | 37 #include "content/browser/gpu/gpu_data_manager_impl.h" |
| 38 #include "content/browser/gpu/gpu_process_host.h" | 38 #include "content/browser/gpu/gpu_process_host.h" |
| 39 #include "content/browser/host_zoom_map_impl.h" | 39 #include "content/browser/host_zoom_map_impl.h" |
| 40 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 40 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 41 #include "content/browser/renderer_host/input/timeout_monitor.h" |
| 41 #include "content/browser/renderer_host/render_process_host_impl.h" | 42 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 42 #include "content/browser/renderer_host/render_view_host_delegate.h" | 43 #include "content/browser/renderer_host/render_view_host_delegate.h" |
| 43 #include "content/browser/renderer_host/render_view_host_delegate_view.h" | 44 #include "content/browser/renderer_host/render_view_host_delegate_view.h" |
| 44 #include "content/browser/renderer_host/render_widget_host_delegate.h" | 45 #include "content/browser/renderer_host/render_widget_host_delegate.h" |
| 45 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 46 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 46 #include "content/common/browser_plugin/browser_plugin_messages.h" | 47 #include "content/common/browser_plugin/browser_plugin_messages.h" |
| 47 #include "content/common/content_switches_internal.h" | 48 #include "content/common/content_switches_internal.h" |
| 48 #include "content/common/frame_messages.h" | 49 #include "content/common/frame_messages.h" |
| 49 #include "content/common/input_messages.h" | 50 #include "content/common/input_messages.h" |
| 50 #include "content/common/inter_process_time_ticks_converter.h" | 51 #include "content/common/inter_process_time_ticks_converter.h" |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 // make their way to the new renderer once its restarted. | 223 // make their way to the new renderer once its restarted. |
| 223 GetProcess()->EnableSendQueue(); | 224 GetProcess()->EnableSendQueue(); |
| 224 | 225 |
| 225 if (ResourceDispatcherHostImpl::Get()) { | 226 if (ResourceDispatcherHostImpl::Get()) { |
| 226 BrowserThread::PostTask( | 227 BrowserThread::PostTask( |
| 227 BrowserThread::IO, FROM_HERE, | 228 BrowserThread::IO, FROM_HERE, |
| 228 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, | 229 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, |
| 229 base::Unretained(ResourceDispatcherHostImpl::Get()), | 230 base::Unretained(ResourceDispatcherHostImpl::Get()), |
| 230 GetProcess()->GetID(), GetRoutingID())); | 231 GetProcess()->GetID(), GetRoutingID())); |
| 231 } | 232 } |
| 233 |
| 234 close_timeout_.reset(new TimeoutMonitor(base::Bind( |
| 235 &RenderViewHostImpl::ClosePageTimeout, weak_factory_.GetWeakPtr()))); |
| 232 } | 236 } |
| 233 | 237 |
| 234 RenderViewHostImpl::~RenderViewHostImpl() { | 238 RenderViewHostImpl::~RenderViewHostImpl() { |
| 235 if (ResourceDispatcherHostImpl::Get()) { | 239 if (ResourceDispatcherHostImpl::Get()) { |
| 236 BrowserThread::PostTask( | 240 BrowserThread::PostTask( |
| 237 BrowserThread::IO, FROM_HERE, | 241 BrowserThread::IO, FROM_HERE, |
| 238 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, | 242 base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, |
| 239 base::Unretained(ResourceDispatcherHostImpl::Get()), | 243 base::Unretained(ResourceDispatcherHostImpl::Get()), |
| 240 GetProcess()->GetID(), GetRoutingID())); | 244 GetProcess()->GetID(), GetRoutingID())); |
| 241 } | 245 } |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 &prefs.expensive_background_throttling_max_budget); | 572 &prefs.expensive_background_throttling_max_budget); |
| 569 SetFloatParameterFromMap(expensive_background_throttling_prefs, "max_delay", | 573 SetFloatParameterFromMap(expensive_background_throttling_prefs, "max_delay", |
| 570 &prefs.expensive_background_throttling_max_delay); | 574 &prefs.expensive_background_throttling_max_delay); |
| 571 | 575 |
| 572 GetContentClient()->browser()->OverrideWebkitPrefs(this, &prefs); | 576 GetContentClient()->browser()->OverrideWebkitPrefs(this, &prefs); |
| 573 return prefs; | 577 return prefs; |
| 574 } | 578 } |
| 575 | 579 |
| 576 void RenderViewHostImpl::ClosePage() { | 580 void RenderViewHostImpl::ClosePage() { |
| 577 is_waiting_for_close_ack_ = true; | 581 is_waiting_for_close_ack_ = true; |
| 578 GetWidget()->StartHangMonitorTimeout( | |
| 579 TimeDelta::FromMilliseconds(kUnloadTimeoutMS), | |
| 580 blink::WebInputEvent::Undefined, | |
| 581 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE); | |
| 582 | 582 |
| 583 bool is_javascript_dialog_showing = delegate_->IsJavaScriptDialogShowing(); | 583 bool is_javascript_dialog_showing = delegate_->IsJavaScriptDialogShowing(); |
| 584 | 584 |
| 585 // If there is a JavaScript dialog up, don't bother sending the renderer the | 585 // If there is a JavaScript dialog up, don't bother sending the renderer the |
| 586 // close event because it is known unresponsive, waiting for the reply from | 586 // close event because it is known unresponsive, waiting for the reply from |
| 587 // the dialog. | 587 // the dialog. |
| 588 if (IsRenderViewLive() && !is_javascript_dialog_showing) { | 588 if (IsRenderViewLive() && !is_javascript_dialog_showing) { |
| 589 // Since we are sending an IPC message to the renderer, increase the event | 589 close_timeout_->Start(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
| 590 // count to prevent the hang monitor timeout from being stopped by input | |
| 591 // event acknowledgments. | |
| 592 GetWidget()->increment_in_flight_event_count(); | |
| 593 | 590 |
| 594 // TODO(creis): Should this be moved to Shutdown? It may not be called for | 591 // TODO(creis): Should this be moved to Shutdown? It may not be called for |
| 595 // RenderViewHosts that have been swapped out. | 592 // RenderViewHosts that have been swapped out. |
| 596 NotificationService::current()->Notify( | 593 NotificationService::current()->Notify( |
| 597 NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, | 594 NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, |
| 598 Source<RenderViewHost>(this), | 595 Source<RenderViewHost>(this), |
| 599 NotificationService::NoDetails()); | 596 NotificationService::NoDetails()); |
| 600 | 597 |
| 601 Send(new ViewMsg_ClosePage(GetRoutingID())); | 598 Send(new ViewMsg_ClosePage(GetRoutingID())); |
| 602 } else { | 599 } else { |
| 603 // This RenderViewHost doesn't have a live renderer, so just skip the close | 600 // This RenderViewHost doesn't have a live renderer, so just skip the close |
| 604 // event and close the page. | 601 // event and close the page. |
| 605 ClosePageIgnoringUnloadEvents(); | 602 ClosePageIgnoringUnloadEvents(); |
| 606 } | 603 } |
| 607 } | 604 } |
| 608 | 605 |
| 609 void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() { | 606 void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() { |
| 610 GetWidget()->StopHangMonitorTimeout(); | 607 close_timeout_->Stop(); |
| 611 is_waiting_for_close_ack_ = false; | 608 is_waiting_for_close_ack_ = false; |
| 612 | 609 |
| 613 sudden_termination_allowed_ = true; | 610 sudden_termination_allowed_ = true; |
| 614 delegate_->Close(this); | 611 delegate_->Close(this); |
| 615 } | 612 } |
| 616 | 613 |
| 617 void RenderViewHostImpl::RenderProcessReady(RenderProcessHost* host) { | 614 void RenderViewHostImpl::RenderProcessReady(RenderProcessHost* host) { |
| 618 if (render_view_ready_on_process_launch_) { | 615 if (render_view_ready_on_process_launch_) { |
| 619 render_view_ready_on_process_launch_ = false; | 616 render_view_ready_on_process_launch_ = false; |
| 620 RenderViewReady(); | 617 RenderViewReady(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 delegate_->RouteCloseEvent(this); | 843 delegate_->RouteCloseEvent(this); |
| 847 } | 844 } |
| 848 | 845 |
| 849 void RenderViewHostImpl::OnTakeFocus(bool reverse) { | 846 void RenderViewHostImpl::OnTakeFocus(bool reverse) { |
| 850 RenderViewHostDelegateView* view = delegate_->GetDelegateView(); | 847 RenderViewHostDelegateView* view = delegate_->GetDelegateView(); |
| 851 if (view) | 848 if (view) |
| 852 view->TakeFocus(reverse); | 849 view->TakeFocus(reverse); |
| 853 } | 850 } |
| 854 | 851 |
| 855 void RenderViewHostImpl::OnClosePageACK() { | 852 void RenderViewHostImpl::OnClosePageACK() { |
| 856 GetWidget()->decrement_in_flight_event_count(); | |
| 857 ClosePageIgnoringUnloadEvents(); | 853 ClosePageIgnoringUnloadEvents(); |
| 858 } | 854 } |
| 859 | 855 |
| 860 void RenderViewHostImpl::OnFocus() { | 856 void RenderViewHostImpl::OnFocus() { |
| 861 // Note: We allow focus and blur from swapped out RenderViewHosts, even when | 857 // Note: We allow focus and blur from swapped out RenderViewHosts, even when |
| 862 // the active RenderViewHost is in a different BrowsingInstance (e.g., WebUI). | 858 // the active RenderViewHost is in a different BrowsingInstance (e.g., WebUI). |
| 863 delegate_->Activate(); | 859 delegate_->Activate(); |
| 864 } | 860 } |
| 865 | 861 |
| 866 void RenderViewHostImpl::RenderWidgetDidForwardMouseEvent( | 862 void RenderViewHostImpl::RenderWidgetDidForwardMouseEvent( |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 952 weak_factory_.GetWeakPtr())); | 948 weak_factory_.GetWeakPtr())); |
| 953 } else { | 949 } else { |
| 954 render_view_ready_on_process_launch_ = true; | 950 render_view_ready_on_process_launch_ = true; |
| 955 } | 951 } |
| 956 } | 952 } |
| 957 | 953 |
| 958 void RenderViewHostImpl::RenderViewReady() { | 954 void RenderViewHostImpl::RenderViewReady() { |
| 959 delegate_->RenderViewReady(this); | 955 delegate_->RenderViewReady(this); |
| 960 } | 956 } |
| 961 | 957 |
| 958 void RenderViewHostImpl::ClosePageTimeout() { |
| 959 if (delegate_->ShouldIgnoreUnresponsiveRenderer()) |
| 960 return; |
| 961 |
| 962 UMA_HISTOGRAM_ENUMERATION( |
| 963 "ChildProcess.HangRendererType", |
| 964 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_CLOSE_PAGE, |
| 965 RendererUnresponsiveType::RENDERER_UNRESPONSIVE_MAX); |
| 966 |
| 967 ClosePageIgnoringUnloadEvents(); |
| 968 } |
| 969 |
| 962 } // namespace content | 970 } // namespace content |
| OLD | NEW |