| Index: content/browser/frame_host/render_frame_host_impl.cc
|
| diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
|
| index 61a342837e38f536692c14c9c8b92534e6f024fb..bf074a59bf2ac2c99111ec8ab0386ca239282497 100644
|
| --- a/content/browser/frame_host/render_frame_host_impl.cc
|
| +++ b/content/browser/frame_host/render_frame_host_impl.cc
|
| @@ -136,11 +136,6 @@ base::i18n::TextDirection WebTextDirectionToChromeTextDirection(
|
| } // namespace
|
|
|
| // static
|
| -bool RenderFrameHostImpl::IsRFHStateActive(RenderFrameHostImplState rfh_state) {
|
| - return rfh_state == STATE_DEFAULT;
|
| -}
|
| -
|
| -// static
|
| RenderFrameHost* RenderFrameHost::FromID(int render_process_id,
|
| int render_frame_id) {
|
| return RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
|
| @@ -197,7 +192,7 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance,
|
| frame_tree_node_(frame_tree_node),
|
| render_widget_host_(nullptr),
|
| routing_id_(routing_id),
|
| - rfh_state_(STATE_DEFAULT),
|
| + is_waiting_for_swapout_ack_(false),
|
| render_frame_created_(false),
|
| navigations_suspended_(false),
|
| is_waiting_for_beforeunload_ack_(false),
|
| @@ -267,18 +262,16 @@ RenderFrameHostImpl::~RenderFrameHostImpl() {
|
| if (delegate_ && render_frame_created_)
|
| delegate_->RenderFrameDeleted(this);
|
|
|
| - bool is_active = IsRFHStateActive(rfh_state_);
|
| -
|
| // If this RenderFrameHost is swapped out, it already decremented the active
|
| // frame count of the SiteInstance it belongs to.
|
| - if (is_active)
|
| + if (is_active())
|
| GetSiteInstance()->DecrementActiveFrameCount();
|
|
|
| // If this RenderFrameHost is swapping with a RenderFrameProxyHost, the
|
| // RenderFrame will already be deleted in the renderer process. Main frame
|
| // RenderFrames will be cleaned up as part of deleting its RenderView. In all
|
| // other cases, the RenderFrame should be cleaned up (if it exists).
|
| - if (is_active && !frame_tree_node_->IsMainFrame() && render_frame_created_)
|
| + if (is_active() && !frame_tree_node_->IsMainFrame() && render_frame_created_)
|
| Send(new FrameMsg_Delete(routing_id_));
|
|
|
| // NULL out the swapout timer; in crash dumps this member will be null only if
|
| @@ -844,8 +837,7 @@ void RenderFrameHostImpl::OnCreateChildFrame(
|
| // RenderFrame corresponding to this host sent an IPC message to create a
|
| // frame and it is delivered after this host is swapped out.
|
| // Ignore such messages, as we know this RenderFrameHost is going away.
|
| - if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT ||
|
| - frame_tree_node_->current_frame_host() != this)
|
| + if (!is_active() || frame_tree_node_->current_frame_host() != this)
|
| return;
|
|
|
| frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id,
|
| @@ -1180,9 +1172,9 @@ void RenderFrameHostImpl::SwapOut(
|
| // to be fixed when RenderViewHostImpl::OnSwapOut moves to RenderFrameHost.
|
| TRACE_EVENT_ASYNC_BEGIN0("navigation", "RenderFrameHostImpl::SwapOut", this);
|
|
|
| - // If this RenderFrameHost is not in the default state, it must have already
|
| + // If this RenderFrameHost is already pending deletion, it must have already
|
| // gone through this, therefore just return.
|
| - if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) {
|
| + if (!is_active()) {
|
| NOTREACHED() << "RFH should be in default state when calling SwapOut.";
|
| return;
|
| }
|
| @@ -1204,9 +1196,16 @@ void RenderFrameHostImpl::SwapOut(
|
| replication_state));
|
| }
|
|
|
| - // If this is the last active frame in the SiteInstance, the SetState call
|
| - // below will trigger the deletion of the SiteInstance's proxies.
|
| - SetState(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT);
|
| + // TODO(nasko): If the frame is not live, the RFH should just be deleted by
|
| + // simulating the receipt of swap out ack.
|
| + is_waiting_for_swapout_ack_ = true;
|
| + if (frame_tree_node_->IsMainFrame())
|
| + render_view_host_->set_is_active(false);
|
| +
|
| + // If this is the last active frame in the SiteInstance, the
|
| + // DecrementActiveFrameCount call will trigger the deletion of the
|
| + // SiteInstance's proxies.
|
| + GetSiteInstance()->DecrementActiveFrameCount();
|
|
|
| if (!GetParent())
|
| delegate_->SwappedOut(this);
|
| @@ -1306,7 +1305,7 @@ void RenderFrameHostImpl::OnBeforeUnloadACK(
|
|
|
| bool RenderFrameHostImpl::IsWaitingForUnloadACK() const {
|
| return render_view_host_->is_waiting_for_close_ack_ ||
|
| - rfh_state_ == STATE_PENDING_SWAP_OUT;
|
| + is_waiting_for_swapout_ack_;
|
| }
|
|
|
| void RenderFrameHostImpl::OnSwapOutACK() {
|
| @@ -1340,7 +1339,7 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
|
| // If the process has died, we don't need to wait for the swap out ack from
|
| // this RenderFrame if it is pending deletion. Complete the swap out to
|
| // destroy it.
|
| - if (!IsRFHStateActive(rfh_state()))
|
| + if (!is_active())
|
| OnSwappedOut();
|
|
|
| // Note: don't add any more code at this point in the function because
|
| @@ -1350,7 +1349,7 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
|
|
|
| void RenderFrameHostImpl::OnSwappedOut() {
|
| // Ignore spurious swap out ack.
|
| - if (rfh_state_ != STATE_PENDING_SWAP_OUT)
|
| + if (!is_waiting_for_swapout_ack_)
|
| return;
|
|
|
| TRACE_EVENT_ASYNC_END0("navigation", "RenderFrameHostImpl::SwapOut", this);
|
| @@ -1359,8 +1358,7 @@ void RenderFrameHostImpl::OnSwappedOut() {
|
| ClearAllWebUI();
|
|
|
| // If this is a main frame RFH that's about to be deleted, update its RVH's
|
| - // swapped-out state here, since SetState won't be called once this RFH is
|
| - // deleted below. https://crbug.com/505887
|
| + // swapped-out state here. https://crbug.com/505887
|
| if (frame_tree_node_->IsMainFrame()) {
|
| render_view_host_->set_is_active(false);
|
| render_view_host_->set_is_swapped_out(true);
|
| @@ -1637,8 +1635,7 @@ void RenderFrameHostImpl::OnAccessibilityEvents(
|
| RenderWidgetHostViewBase* view = GetViewForAccessibility();
|
|
|
| AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode();
|
| - if ((accessibility_mode != AccessibilityModeOff) && view &&
|
| - RenderFrameHostImpl::IsRFHStateActive(rfh_state())) {
|
| + if ((accessibility_mode != AccessibilityModeOff) && view && is_active()) {
|
| if (accessibility_mode & AccessibilityModeFlagPlatform)
|
| GetOrCreateBrowserAccessibilityManager();
|
|
|
| @@ -1708,7 +1705,7 @@ void RenderFrameHostImpl::OnAccessibilityLocationChanges(
|
|
|
| RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
|
| render_view_host_->GetWidget()->GetView());
|
| - if (view && RenderFrameHostImpl::IsRFHStateActive(rfh_state())) {
|
| + if (view && is_active()) {
|
| AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode();
|
| if (accessibility_mode & AccessibilityModeFlagPlatform) {
|
| BrowserAccessibilityManager* manager =
|
| @@ -1788,7 +1785,7 @@ void RenderFrameHostImpl::OnDidStartLoading(bool to_different_document) {
|
|
|
| // Only inform the FrameTreeNode of a change in load state if the load state
|
| // of this RenderFrameHost is being tracked.
|
| - if (rfh_state_ == STATE_DEFAULT) {
|
| + if (is_active()) {
|
| frame_tree_node_->DidStartLoading(to_different_document,
|
| was_previously_loading);
|
| }
|
| @@ -1810,7 +1807,7 @@ void RenderFrameHostImpl::OnDidStopLoading() {
|
|
|
| // Only inform the FrameTreeNode of a change in load state if the load state
|
| // of this RenderFrameHost is being tracked.
|
| - if (rfh_state_ == STATE_DEFAULT)
|
| + if (is_active())
|
| frame_tree_node_->DidStopLoading();
|
| }
|
|
|
| @@ -1921,34 +1918,26 @@ void RenderFrameHostImpl::RegisterMojoServices() {
|
| GetServiceRegistry(), this);
|
| }
|
|
|
| -void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) {
|
| - // We decrement the number of RenderFrameHosts in a SiteInstance when the
|
| - // status of a RenderFrameHost gets flipped from active.
|
| - if (IsRFHStateActive(rfh_state_) && !IsRFHStateActive(rfh_state))
|
| - GetSiteInstance()->DecrementActiveFrameCount();
|
| +void RenderFrameHostImpl::ResetWaitingState() {
|
| + DCHECK(is_active());
|
|
|
| // The active state of the RVH is determined by its main frame, since
|
| // subframes should have their own widgets.
|
| if (frame_tree_node_->IsMainFrame()) {
|
| - render_view_host_->set_is_active(IsRFHStateActive(rfh_state));
|
| + render_view_host_->set_is_active(true);
|
| render_view_host_->set_is_swapped_out(false);
|
| }
|
|
|
| - // Whenever we change the RFH state to and from active state, we should not be
|
| - // waiting for beforeunload or close acks. We clear them here to be safe,
|
| - // since they can cause navigations to be ignored in
|
| - // OnDidCommitProvisionalLoad.
|
| - // TODO(creis): Move is_waiting_for_beforeunload_ack_ into the state machine.
|
| - if (rfh_state == STATE_DEFAULT || rfh_state_ == STATE_DEFAULT) {
|
| - if (is_waiting_for_beforeunload_ack_) {
|
| - is_waiting_for_beforeunload_ack_ = false;
|
| - render_view_host_->GetWidget()->decrement_in_flight_event_count();
|
| - render_view_host_->GetWidget()->StopHangMonitorTimeout();
|
| - }
|
| - send_before_unload_start_time_ = base::TimeTicks();
|
| - render_view_host_->is_waiting_for_close_ack_ = false;
|
| + // Whenever we reset the RFH state, we should not be waiting for beforeunload
|
| + // or close acks. We clear them here to be safe, since they can cause
|
| + // navigations to be ignored in OnDidCommitProvisionalLoad.
|
| + if (is_waiting_for_beforeunload_ack_) {
|
| + is_waiting_for_beforeunload_ack_ = false;
|
| + render_view_host_->GetWidget()->decrement_in_flight_event_count();
|
| + render_view_host_->GetWidget()->StopHangMonitorTimeout();
|
| }
|
| - rfh_state_ = rfh_state;
|
| + send_before_unload_start_time_ = base::TimeTicks();
|
| + render_view_host_->is_waiting_for_close_ack_ = false;
|
| }
|
|
|
| bool RenderFrameHostImpl::CanCommitURL(const GURL& url) {
|
| @@ -2014,8 +2003,8 @@ void RenderFrameHostImpl::Navigate(
|
| new NavigationParams(common_params, start_params, request_params));
|
| } else {
|
| // Get back to a clean state, in case we start a new navigation without
|
| - // completing a RFH swap or unload handler.
|
| - SetState(RenderFrameHostImpl::STATE_DEFAULT);
|
| + // completing an unload handler.
|
| + ResetWaitingState();
|
| SendNavigateMessage(common_params, start_params, request_params);
|
| }
|
|
|
| @@ -2180,8 +2169,8 @@ void RenderFrameHostImpl::CommitNavigation(
|
| UpdatePermissionsForNavigation(common_params, request_params);
|
|
|
| // Get back to a clean state, in case we start a new navigation without
|
| - // completing a RFH swap or unload handler.
|
| - SetState(RenderFrameHostImpl::STATE_DEFAULT);
|
| + // completing an unload handler.
|
| + ResetWaitingState();
|
|
|
| // The renderer can exit view source mode when any error or cancellation
|
| // happen. When reusing the same renderer, overwrite to recover the mode.
|
| @@ -2221,8 +2210,8 @@ void RenderFrameHostImpl::FailedNavigation(
|
| bool has_stale_copy_in_cache,
|
| int error_code) {
|
| // Get back to a clean state, in case a new navigation started without
|
| - // completing a RFH swap or unload handler.
|
| - SetState(RenderFrameHostImpl::STATE_DEFAULT);
|
| + // completing an unload handler.
|
| + ResetWaitingState();
|
|
|
| Send(new FrameMsg_FailedNavigation(routing_id_, common_params, request_params,
|
| has_stale_copy_in_cache, error_code));
|
| @@ -2389,7 +2378,7 @@ void RenderFrameHostImpl::ResetLoadingState() {
|
| // When pending deletion, just set the loading state to not loading.
|
| // Otherwise, OnDidStopLoading will take care of that, as well as sending
|
| // notification to the FrameTreeNode about the change in loading state.
|
| - if (rfh_state_ != STATE_DEFAULT)
|
| + if (!is_active())
|
| is_loading_ = false;
|
| else
|
| OnDidStopLoading();
|
| @@ -2424,8 +2413,7 @@ void RenderFrameHostImpl::SetAccessibilityCallbackForTesting(
|
|
|
| void RenderFrameHostImpl::UpdateAXTreeData() {
|
| AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode();
|
| - if (accessibility_mode == AccessibilityModeOff ||
|
| - !RenderFrameHostImpl::IsRFHStateActive(rfh_state())) {
|
| + if (accessibility_mode == AccessibilityModeOff || !is_active()) {
|
| return;
|
| }
|
|
|
| @@ -2556,9 +2544,8 @@ void RenderFrameHostImpl::SetNavigationsSuspended(
|
|
|
| if (!suspend && suspended_nav_params_) {
|
| // There's navigation message params waiting to be sent. Now that we're not
|
| - // suspended anymore, resume navigation by sending them. If we were swapped
|
| - // out, we should also stop filtering out the IPC messages now.
|
| - SetState(RenderFrameHostImpl::STATE_DEFAULT);
|
| + // suspended anymore, resume navigation by sending them.
|
| + ResetWaitingState();
|
|
|
| DCHECK(!proceed_time.is_null());
|
| // TODO(csharrison): Make sure that PlzNavigate and the current architecture
|
|
|