Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 921443003: Fix RenderFrameCreated and RenderFrameDeleted WebContentsObserver methods (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Delete pending callbacks in ManifestManagerHost destructor. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden)); 177 rwh_delegate, GetProcess(), MSG_ROUTING_NONE, hidden));
178 render_widget_host_->set_owned_by_render_frame_host(true); 178 render_widget_host_->set_owned_by_render_frame_host(true);
179 } 179 }
180 } 180 }
181 181
182 RenderFrameHostImpl::~RenderFrameHostImpl() { 182 RenderFrameHostImpl::~RenderFrameHostImpl() {
183 GetProcess()->RemoveRoute(routing_id_); 183 GetProcess()->RemoveRoute(routing_id_);
184 g_routing_id_frame_map.Get().erase( 184 g_routing_id_frame_map.Get().erase(
185 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); 185 RenderFrameHostID(GetProcess()->GetID(), routing_id_));
186 186
187 if (delegate_) 187 if (delegate_ && render_frame_created_)
188 delegate_->RenderFrameDeleted(this); 188 delegate_->RenderFrameDeleted(this);
189 189
190 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this); 190 FrameAccessibility::GetInstance()->OnRenderFrameHostDestroyed(this);
191 191
192 // If this was swapped out, it already decremented the active frame count of 192 // If this was swapped out, it already decremented the active frame count of
193 // the SiteInstance it belongs to. 193 // the SiteInstance it belongs to.
194 if (IsRFHStateActive(rfh_state_)) 194 if (IsRFHStateActive(rfh_state_))
195 GetSiteInstance()->decrement_active_frame_count(); 195 GetSiteInstance()->decrement_active_frame_count();
196 196
197 // Notify the FrameTree that this RFH is going away, allowing it to shut down 197 // Notify the FrameTree that this RFH is going away, allowing it to shut down
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 render_view_host_->IsRenderViewLive() : 612 render_view_host_->IsRenderViewLive() :
613 GetProcess()->HasConnection() && render_frame_created_; 613 GetProcess()->HasConnection() && render_frame_created_;
614 614
615 // Sanity check: the RenderView should always be live if the RenderFrame is. 615 // Sanity check: the RenderView should always be live if the RenderFrame is.
616 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); 616 DCHECK(!is_live || render_view_host_->IsRenderViewLive());
617 617
618 return is_live; 618 return is_live;
619 } 619 }
620 620
621 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) { 621 void RenderFrameHostImpl::SetRenderFrameCreated(bool created) {
622 // If the current status is different than the new status, the delegate
623 // needs to be notified.
624 if (delegate_ && (created != render_frame_created_)) {
625 if (created)
626 delegate_->RenderFrameCreated(this);
627 else
628 delegate_->RenderFrameDeleted(this);
629 }
630
622 render_frame_created_ = created; 631 render_frame_created_ = created;
623 if (created && render_widget_host_) 632 if (created && render_widget_host_)
624 render_widget_host_->InitForFrame(); 633 render_widget_host_->InitForFrame();
625 } 634 }
626 635
627 void RenderFrameHostImpl::Init() { 636 void RenderFrameHostImpl::Init() {
628 GetProcess()->ResumeRequestsForView(routing_id_); 637 GetProcess()->ResumeRequestsForView(routing_id_);
629 } 638 }
630 639
631 void RenderFrameHostImpl::OnAddMessageToConsole( 640 void RenderFrameHostImpl::OnAddMessageToConsole(
(...skipping 30 matching lines...) Expand all
662 // frame and it is delivered after this host is swapped out. 671 // frame and it is delivered after this host is swapped out.
663 // Ignore such messages, as we know this RenderFrameHost is going away. 672 // Ignore such messages, as we know this RenderFrameHost is going away.
664 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT) 673 if (rfh_state_ != RenderFrameHostImpl::STATE_DEFAULT)
665 return; 674 return;
666 675
667 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame( 676 RenderFrameHostImpl* new_frame = frame_tree_->AddFrame(
668 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name); 677 frame_tree_node_, GetProcess()->GetID(), new_routing_id, frame_name);
669 if (!new_frame) 678 if (!new_frame)
670 return; 679 return;
671 680
681 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags);
682
672 // We know that the RenderFrame has been created in this case, immediately 683 // We know that the RenderFrame has been created in this case, immediately
673 // after the CreateChildFrame IPC was sent. 684 // after the CreateChildFrame IPC was sent.
674 new_frame->SetRenderFrameCreated(true); 685 new_frame->SetRenderFrameCreated(true);
675
676 new_frame->frame_tree_node()->set_sandbox_flags(sandbox_flags);
677
678 if (delegate_)
679 delegate_->RenderFrameCreated(new_frame);
680 } 686 }
681 687
682 void RenderFrameHostImpl::OnDetach() { 688 void RenderFrameHostImpl::OnDetach() {
683 frame_tree_->RemoveFrame(frame_tree_node_); 689 frame_tree_->RemoveFrame(frame_tree_node_);
684 } 690 }
685 691
686 void RenderFrameHostImpl::OnFrameFocused() { 692 void RenderFrameHostImpl::OnFrameFocused() {
687 frame_tree_->SetFocusedFrame(frame_tree_node_); 693 frame_tree_->SetFocusedFrame(frame_tree_node_);
688 } 694 }
689 695
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 } 1048 }
1043 1049
1044 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { 1050 void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) {
1045 if (frame_tree_node_->IsMainFrame()) { 1051 if (frame_tree_node_->IsMainFrame()) {
1046 // Keep the termination status so we can get at it later when we 1052 // Keep the termination status so we can get at it later when we
1047 // need to know why it died. 1053 // need to know why it died.
1048 render_view_host_->render_view_termination_status_ = 1054 render_view_host_->render_view_termination_status_ =
1049 static_cast<base::TerminationStatus>(status); 1055 static_cast<base::TerminationStatus>(status);
1050 } 1056 }
1051 1057
1052 SetRenderFrameCreated(false);
1053 InvalidateMojoConnection();
1054
1055 // Reset frame tree state associated with this process. This must happen 1058 // Reset frame tree state associated with this process. This must happen
1056 // before RenderViewTerminated because observers expect the subframes of any 1059 // before RenderViewTerminated because observers expect the subframes of any
1057 // affected frames to be cleared first. 1060 // affected frames to be cleared first.
1058 // Note: When a RenderFrameHost is swapped out there is a different one 1061 // Note: When a RenderFrameHost is swapped out there is a different one
1059 // which is the current host. In this case, the FrameTreeNode state must 1062 // which is the current host. In this case, the FrameTreeNode state must
1060 // not be reset. 1063 // not be reset.
1061 if (!is_swapped_out()) 1064 if (!is_swapped_out())
1062 frame_tree_node_->ResetForNewProcess(); 1065 frame_tree_node_->ResetForNewProcess();
1063 1066
1067 // Reset state for the current RenderFrameHost once the FrameTreeNode has been
1068 // reset.
1069 SetRenderFrameCreated(false);
1070 InvalidateMojoConnection();
1071
1064 if (frame_tree_node_->IsMainFrame()) { 1072 if (frame_tree_node_->IsMainFrame()) {
1065 // RenderViewHost/RenderWidgetHost needs to reset some stuff. 1073 // RenderViewHost/RenderWidgetHost needs to reset some stuff.
1066 render_view_host_->RendererExited( 1074 render_view_host_->RendererExited(
1067 render_view_host_->render_view_termination_status_, exit_code); 1075 render_view_host_->render_view_termination_status_, exit_code);
1068 1076
1069 render_view_host_->delegate_->RenderViewTerminated( 1077 render_view_host_->delegate_->RenderViewTerminated(
1070 render_view_host_, static_cast<base::TerminationStatus>(status), 1078 render_view_host_, static_cast<base::TerminationStatus>(status),
1071 exit_code); 1079 exit_code);
1072 } 1080 }
1073 } 1081 }
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
1886 void RenderFrameHostImpl::DidUseGeolocationPermission() { 1894 void RenderFrameHostImpl::DidUseGeolocationPermission() {
1887 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame(); 1895 RenderFrameHost* top_frame = frame_tree_node()->frame_tree()->GetMainFrame();
1888 GetContentClient()->browser()->RegisterPermissionUsage( 1896 GetContentClient()->browser()->RegisterPermissionUsage(
1889 PERMISSION_GEOLOCATION, 1897 PERMISSION_GEOLOCATION,
1890 delegate_->GetAsWebContents(), 1898 delegate_->GetAsWebContents(),
1891 GetLastCommittedURL().GetOrigin(), 1899 GetLastCommittedURL().GetOrigin(),
1892 top_frame->GetLastCommittedURL().GetOrigin()); 1900 top_frame->GetLastCommittedURL().GetOrigin());
1893 } 1901 }
1894 1902
1895 } // namespace content 1903 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/frame_tree_unittest.cc ('k') | content/browser/frame_host/render_frame_host_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698