Index: content/browser/renderer_host/render_view_host_impl.cc |
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc |
index 6b78d742666d65b1250cd7dc0bf49d84688efca6..ed5cc127b505814522cb614fb8d6a5090aa35340 100644 |
--- a/content/browser/renderer_host/render_view_host_impl.cc |
+++ b/content/browser/renderer_host/render_view_host_impl.cc |
@@ -34,7 +34,6 @@ |
#include "content/browser/host_zoom_map_impl.h" |
#include "content/browser/loader/resource_dispatcher_host_impl.h" |
#include "content/browser/renderer_host/dip_util.h" |
-#include "content/browser/renderer_host/input/timeout_monitor.h" |
#include "content/browser/renderer_host/media/audio_renderer_host.h" |
#include "content/browser/renderer_host/render_process_host_impl.h" |
#include "content/browser/renderer_host/render_view_host_delegate.h" |
@@ -136,14 +135,6 @@ const int RenderViewHostImpl::kUnloadTimeoutMS = 1000; |
// RenderViewHost, public: |
// static |
-bool RenderViewHostImpl::IsRVHStateActive(RenderViewHostImplState rvh_state) { |
- if (rvh_state == STATE_DEFAULT || |
- rvh_state == STATE_WAITING_FOR_CLOSE) |
- return true; |
- return false; |
-} |
- |
-// static |
RenderViewHost* RenderViewHost::FromID(int render_process_id, |
int render_view_id) { |
return RenderViewHostImpl::FromID(render_process_id, render_view_id); |
@@ -186,11 +177,12 @@ RenderViewHostImpl::RenderViewHostImpl( |
waiting_for_drag_context_response_(false), |
enabled_bindings_(0), |
page_id_(-1), |
+ is_active_(!swapped_out), |
+ is_swapped_out_(swapped_out), |
main_frame_routing_id_(main_frame_routing_id), |
run_modal_reply_msg_(NULL), |
run_modal_opener_id_(MSG_ROUTING_NONE), |
- is_waiting_for_beforeunload_ack_(false), |
- unload_ack_is_for_cross_site_transition_(false), |
+ is_waiting_for_close_ack_(false), |
sudden_termination_allowed_(false), |
render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING), |
virtual_keyboard_requested_(false), |
@@ -202,13 +194,6 @@ RenderViewHostImpl::RenderViewHostImpl( |
GetProcess()->EnableSendQueue(); |
- if (swapped_out) { |
- rvh_state_ = STATE_SWAPPED_OUT; |
- } else { |
- rvh_state_ = STATE_DEFAULT; |
- instance_->increment_active_view_count(); |
- } |
- |
if (ResourceDispatcherHostImpl::Get()) { |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
@@ -220,9 +205,6 @@ RenderViewHostImpl::RenderViewHostImpl( |
#if defined(ENABLE_BROWSER_CDMS) |
media_web_contents_observer_.reset(new MediaWebContentsObserver(this)); |
#endif |
- |
- unload_event_monitor_timeout_.reset(new TimeoutMonitor(base::Bind( |
- &RenderViewHostImpl::OnSwappedOut, weak_factory_.GetWeakPtr(), true))); |
} |
RenderViewHostImpl::~RenderViewHostImpl() { |
@@ -235,18 +217,13 @@ RenderViewHostImpl::~RenderViewHostImpl() { |
} |
delegate_->RenderViewDeleted(this); |
- |
- // If this was swapped out, it already decremented the active view |
- // count of the SiteInstance it belongs to. |
- if (IsRVHStateActive(rvh_state_)) |
- instance_->decrement_active_view_count(); |
} |
RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() const { |
return delegate_; |
} |
-SiteInstance* RenderViewHostImpl::GetSiteInstance() const { |
+SiteInstanceImpl* RenderViewHostImpl::GetSiteInstance() const { |
return instance_.get(); |
} |
@@ -292,7 +269,7 @@ bool RenderViewHostImpl::CreateRenderView( |
params.frame_name = frame_name; |
// Ensure the RenderView sets its opener correctly. |
params.opener_route_id = opener_route_id; |
- params.swapped_out = !IsRVHStateActive(rvh_state_); |
+ params.swapped_out = !is_active_; |
params.proxy_routing_id = proxy_route_id; |
params.hidden = is_hidden(); |
params.never_visible = delegate_->IsNeverVisible(); |
@@ -490,73 +467,8 @@ void RenderViewHostImpl::SuppressDialogsUntilSwapOut() { |
Send(new ViewMsg_SuppressDialogsUntilSwapOut(GetRoutingID())); |
} |
-void RenderViewHostImpl::OnSwappedOut(bool timed_out) { |
- // Ignore spurious swap out ack. |
- if (!IsWaitingForUnloadACK()) |
- return; |
- |
- TRACE_EVENT0("navigation", "RenderViewHostImpl::OnSwappedOut"); |
- unload_event_monitor_timeout_->Stop(); |
- if (timed_out) { |
- base::ProcessHandle process_handle = GetProcess()->GetHandle(); |
- int views = 0; |
- |
- // Count the number of active widget hosts for the process, which |
- // is equivalent to views using the process as of this writing. |
- scoped_ptr<RenderWidgetHostIterator> widgets( |
- RenderWidgetHost::GetRenderWidgetHosts()); |
- while (RenderWidgetHost* widget = widgets->GetNextHost()) { |
- if (widget->GetProcess()->GetID() == GetProcess()->GetID()) |
- ++views; |
- } |
- |
- if (!RenderProcessHost::run_renderer_in_process() && |
- process_handle && views <= 1) { |
- // The process can safely be terminated, only if WebContents sets |
- // SuddenTerminationAllowed, which indicates that the timer has expired. |
- // This is not the case if we load data URLs or about:blank. The reason |
- // is that those have no network requests and this code is hit without |
- // setting the unresponsiveness timer. This allows a corner case where a |
- // navigation to a data URL will leave a process running, if the |
- // beforeunload handler completes fine, but the unload handler hangs. |
- // At this time, the complexity to solve this edge case is not worthwhile. |
- if (SuddenTerminationAllowed()) { |
- // We should kill the process, but for now, just log the data so we can |
- // diagnose the kill rate and investigate if separate timer is needed. |
- // http://crbug.com/104346. |
- |
- // Log a histogram point to help us diagnose how many of those kills |
- // we have performed. 1 is the enum value for RendererType Normal for |
- // the histogram. |
- UMA_HISTOGRAM_PERCENTAGE( |
- "BrowserRenderProcessHost.ChildKillsUnresponsive", 1); |
- } |
- } |
- // This is going to be incorrect for subframes and will only hit if |
- // --site-per-process is specified. |
- TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this); |
- } |
- |
- switch (rvh_state_) { |
- case STATE_PENDING_SWAP_OUT: |
- SetState(STATE_SWAPPED_OUT); |
- break; |
- case STATE_PENDING_SHUTDOWN: |
- DCHECK(!pending_shutdown_on_swap_out_.is_null()); |
- pending_shutdown_on_swap_out_.Run(); |
- break; |
- default: |
- NOTREACHED(); |
- } |
-} |
- |
-void RenderViewHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { |
- pending_shutdown_on_swap_out_ = on_swap_out; |
- SetState(STATE_PENDING_SHUTDOWN); |
-} |
- |
void RenderViewHostImpl::ClosePage() { |
- SetState(STATE_WAITING_FOR_CLOSE); |
+ is_waiting_for_close_ack_ = true; |
StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
if (IsRenderViewLive()) { |
@@ -582,7 +494,7 @@ void RenderViewHostImpl::ClosePage() { |
void RenderViewHostImpl::ClosePageIgnoringUnloadEvents() { |
StopHangMonitorTimeout(); |
- is_waiting_for_beforeunload_ack_ = false; |
+ is_waiting_for_close_ack_ = false; |
sudden_termination_allowed_ = true; |
delegate_->Close(this); |
@@ -873,7 +785,7 @@ bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { |
// Filter out most IPC messages if this renderer is swapped out. |
// We still want to handle certain ACKs to keep our state consistent. |
- if (IsSwappedOut()) { |
+ if (is_swapped_out_) { |
if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) { |
// If this is a synchronous message and we decided not to handle it, |
// we must send an error reply, or else the renderer will be stuck |
@@ -1017,7 +929,7 @@ void RenderViewHostImpl::OnShowView(int route_id, |
WindowOpenDisposition disposition, |
const gfx::Rect& initial_pos, |
bool user_gesture) { |
- if (IsRVHStateActive(rvh_state_)) { |
+ if (is_active_) { |
delegate_->ShowCreatedWindow( |
route_id, disposition, initial_pos, user_gesture); |
} |
@@ -1026,13 +938,13 @@ void RenderViewHostImpl::OnShowView(int route_id, |
void RenderViewHostImpl::OnShowWidget(int route_id, |
const gfx::Rect& initial_pos) { |
- if (IsRVHStateActive(rvh_state_)) |
+ if (is_active_) |
delegate_->ShowCreatedWidget(route_id, initial_pos); |
Send(new ViewMsg_Move_ACK(route_id)); |
} |
void RenderViewHostImpl::OnShowFullscreenWidget(int route_id) { |
- if (IsRVHStateActive(rvh_state_)) |
+ if (is_active_) |
delegate_->ShowCreatedFullscreenWidget(route_id); |
Send(new ViewMsg_Move_ACK(route_id)); |
} |
@@ -1095,7 +1007,7 @@ void RenderViewHostImpl::OnUpdateState(int32 page_id, const PageState& state) { |
} |
void RenderViewHostImpl::OnUpdateTargetURL(const GURL& url) { |
- if (IsRVHStateActive(rvh_state_)) |
+ if (is_active_) |
delegate_->UpdateTargetURL(url); |
// Send a notification back to the renderer that we are ready to |
@@ -1110,7 +1022,7 @@ void RenderViewHostImpl::OnClose() { |
} |
void RenderViewHostImpl::OnRequestMove(const gfx::Rect& pos) { |
- if (IsRVHStateActive(rvh_state_)) |
+ if (is_active_) |
delegate_->RequestMove(pos); |
Send(new ViewMsg_Move_ACK(GetRoutingID())); |
} |
@@ -1260,8 +1172,7 @@ void RenderViewHostImpl::OnClosePageACK() { |
} |
void RenderViewHostImpl::NotifyRendererUnresponsive() { |
- delegate_->RendererUnresponsive( |
- this, is_waiting_for_beforeunload_ack_, IsWaitingForUnloadACK()); |
+ delegate_->RendererUnresponsive(this); |
} |
void RenderViewHostImpl::NotifyRendererResponsive() { |
@@ -1335,12 +1246,6 @@ void RenderViewHostImpl::ForwardKeyboardEvent( |
RenderWidgetHostImpl::ForwardKeyboardEvent(key_event); |
} |
-bool RenderViewHostImpl::IsWaitingForUnloadACK() const { |
- return rvh_state_ == STATE_WAITING_FOR_CLOSE || |
- rvh_state_ == STATE_PENDING_SHUTDOWN || |
- rvh_state_ == STATE_PENDING_SWAP_OUT; |
-} |
- |
void RenderViewHostImpl::OnTextSurroundingSelectionResponse( |
const base::string16& content, |
size_t start_offset, |
@@ -1469,27 +1374,6 @@ void RenderViewHostImpl::OnFocusedNodeTouched(bool editable) { |
#endif |
} |
-void RenderViewHostImpl::SetState(RenderViewHostImplState rvh_state) { |
- // We update the number of RenderViews in a SiteInstance when the |
- // swapped out status of this RenderView gets flipped to/from live. |
- if (!IsRVHStateActive(rvh_state_) && IsRVHStateActive(rvh_state)) |
- instance_->increment_active_view_count(); |
- else if (IsRVHStateActive(rvh_state_) && !IsRVHStateActive(rvh_state)) |
- instance_->decrement_active_view_count(); |
- |
- // Whenever we change the RVH state to and from live or swapped out state, we |
- // should not be waiting for beforeunload or unload acks. We clear them here |
- // to be safe, since they can cause navigations to be ignored in OnNavigate. |
- if (rvh_state == STATE_DEFAULT || |
- rvh_state == STATE_SWAPPED_OUT || |
- rvh_state_ == STATE_DEFAULT || |
- rvh_state_ == STATE_SWAPPED_OUT) { |
- is_waiting_for_beforeunload_ack_ = false; |
- } |
- rvh_state_ = rvh_state; |
- |
-} |
- |
bool RenderViewHostImpl::CanAccessFilesOfPageState( |
const PageState& state) const { |
ChildProcessSecurityPolicyImpl* policy = |