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

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

Issue 869533004: Fix WCO::RenderFrameCreated and WCO::RenderFrameDeleted notifications. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes for RenderFrameHostChanged. 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_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 Delegate* delegate) 57 Delegate* delegate)
58 : frame_tree_node_(frame_tree_node), 58 : frame_tree_node_(frame_tree_node),
59 delegate_(delegate), 59 delegate_(delegate),
60 cross_navigation_pending_(false), 60 cross_navigation_pending_(false),
61 render_frame_delegate_(render_frame_delegate), 61 render_frame_delegate_(render_frame_delegate),
62 render_view_delegate_(render_view_delegate), 62 render_view_delegate_(render_view_delegate),
63 render_widget_delegate_(render_widget_delegate), 63 render_widget_delegate_(render_widget_delegate),
64 interstitial_page_(nullptr), 64 interstitial_page_(nullptr),
65 should_reuse_web_ui_(false), 65 should_reuse_web_ui_(false),
66 weak_factory_(this) { 66 weak_factory_(this) {
67 LOG(ERROR) << "RFHM[" << this << "]::RFHM";
67 DCHECK(frame_tree_node_); 68 DCHECK(frame_tree_node_);
68 } 69 }
69 70
70 RenderFrameHostManager::~RenderFrameHostManager() { 71 RenderFrameHostManager::~RenderFrameHostManager() {
71 if (pending_render_frame_host_) 72 if (pending_render_frame_host_)
72 UnsetPendingRenderFrameHost(); 73 UnsetPendingRenderFrameHost();
73 74
74 if (speculative_render_frame_host_) 75 if (speculative_render_frame_host_)
75 UnsetSpeculativeRenderFrameHost(); 76 UnsetSpeculativeRenderFrameHost();
76 77
77 if (render_frame_host_ && 78 if (render_frame_host_ &&
78 render_frame_host_->GetSiteInstance()->active_frame_count() <= 1U) { 79 render_frame_host_->GetSiteInstance()->active_frame_count() <= 1U) {
79 ShutdownRenderFrameProxyHostsInSiteInstance( 80 ShutdownRenderFrameProxyHostsInSiteInstance(
80 render_frame_host_->GetSiteInstance()->GetId()); 81 render_frame_host_->GetSiteInstance()->GetId());
81 } 82 }
82 83
83 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts. 84 // Delete any RenderFrameProxyHosts and swapped out RenderFrameHosts.
84 // It is important to delete those prior to deleting the current 85 // It is important to delete those prior to deleting the current
85 // RenderFrameHost, since the CrossProcessFrameConnector (owned by 86 // RenderFrameHost, since the CrossProcessFrameConnector (owned by
86 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with 87 // RenderFrameProxyHost) points to the RenderWidgetHostView associated with
87 // the current RenderFrameHost and uses it during its destructor. 88 // the current RenderFrameHost and uses it during its destructor.
88 STLDeleteValues(&proxy_hosts_); 89 STLDeleteValues(&proxy_hosts_);
89 90
90 // We should always have a current RenderFrameHost except in some tests. 91 // We should always have a current RenderFrameHost except in some tests.
91 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); 92 SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>());
93
94 LOG(ERROR) << "RFHM[" << this << "]::~RFHM";
92 } 95 }
93 96
94 void RenderFrameHostManager::Init(BrowserContext* browser_context, 97 void RenderFrameHostManager::Init(BrowserContext* browser_context,
95 SiteInstance* site_instance, 98 SiteInstance* site_instance,
96 int view_routing_id, 99 int view_routing_id,
97 int frame_routing_id) { 100 int frame_routing_id) {
101 LOG(ERROR) << "RFHM[" << this << "]::Init";
102
98 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It 103 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It
99 // is important to immediately give this SiteInstance to a RenderViewHost so 104 // is important to immediately give this SiteInstance to a RenderViewHost so
100 // that the SiteInstance is ref counted. 105 // that the SiteInstance is ref counted.
101 if (!site_instance) 106 if (!site_instance)
102 site_instance = SiteInstance::Create(browser_context); 107 site_instance = SiteInstance::Create(browser_context);
103 108
104 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0; 109 int flags = delegate_->IsHidden() ? CREATE_RF_HIDDEN : 0;
105 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id, 110 SetRenderFrameHost(CreateRenderFrameHost(site_instance, view_routing_id,
106 frame_routing_id, flags)); 111 frame_routing_id, flags));
107 112
113 if (!frame_tree_node_->IsMainFrame()) {
114 delegate_->NotifySwappedFromRenderManager(
115 nullptr, render_frame_host_.get(), false);
116 }
117
108 // Keep track of renderer processes as they start to shut down or are 118 // Keep track of renderer processes as they start to shut down or are
109 // crashed/killed. 119 // crashed/killed.
110 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, 120 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED,
111 NotificationService::AllSources()); 121 NotificationService::AllSources());
112 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, 122 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING,
113 NotificationService::AllSources()); 123 NotificationService::AllSources());
114 } 124 }
115 125
116 RenderViewHostImpl* RenderFrameHostManager::current_host() const { 126 RenderViewHostImpl* RenderFrameHostManager::current_host() const {
117 if (!render_frame_host_) 127 if (!render_frame_host_)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); 177 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM"));
168 return nullptr; 178 return nullptr;
169 } 179 }
170 return new_web_ui.Pass(); 180 return new_web_ui.Pass();
171 } 181 }
172 182
173 RenderFrameHostImpl* RenderFrameHostManager::Navigate( 183 RenderFrameHostImpl* RenderFrameHostManager::Navigate(
174 const NavigationEntryImpl& entry) { 184 const NavigationEntryImpl& entry) {
175 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", 185 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate",
176 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 186 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
187 LOG(ERROR) << "RFHM[" << this << "]::Navigate: "
188 << entry.GetURL();
189
177 // Create a pending RenderFrameHost to use for the navigation. 190 // Create a pending RenderFrameHost to use for the navigation.
178 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( 191 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate(
179 entry.GetURL(), entry.source_site_instance(), entry.site_instance(), 192 entry.GetURL(), entry.source_site_instance(), entry.site_instance(),
180 entry.GetTransitionType(), 193 entry.GetTransitionType(),
181 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, 194 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE,
182 entry.IsViewSourceMode(), entry.transferred_global_request_id(), 195 entry.IsViewSourceMode(), entry.transferred_global_request_id(),
183 entry.bindings()); 196 entry.bindings());
184 if (!dest_render_frame_host) 197 if (!dest_render_frame_host)
185 return NULL; // We weren't able to create a pending render frame host. 198 return NULL; // We weren't able to create a pending render frame host.
186 199
(...skipping 29 matching lines...) Expand all
216 MSG_ROUTING_NONE, 229 MSG_ROUTING_NONE,
217 frame_tree_node_->IsMainFrame())) 230 frame_tree_node_->IsMainFrame()))
218 return NULL; 231 return NULL;
219 232
220 // Now that we've created a new renderer, be sure to hide it if it isn't 233 // Now that we've created a new renderer, be sure to hide it if it isn't
221 // our primary one. Otherwise, we might crash if we try to call Show() 234 // our primary one. Otherwise, we might crash if we try to call Show()
222 // on it later. 235 // on it later.
223 if (dest_render_frame_host != render_frame_host_ && 236 if (dest_render_frame_host != render_frame_host_ &&
224 dest_render_frame_host->GetView()) { 237 dest_render_frame_host->GetView()) {
225 dest_render_frame_host->GetView()->Hide(); 238 dest_render_frame_host->GetView()->Hide();
226 } else {
227 // Notify here as we won't be calling CommitPending (which does the
228 // notify).
229 delegate_->NotifySwappedFromRenderManager(
230 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame());
231 } 239 }
232 } 240 }
233 241
234 // If entry includes the request ID of a request that is being transferred, 242 // If entry includes the request ID of a request that is being transferred,
235 // the destination render frame will take ownership, so release ownership of 243 // the destination render frame will take ownership, so release ownership of
236 // the request. 244 // the request.
237 if (cross_site_transferring_request_.get() && 245 if (cross_site_transferring_request_.get() &&
238 cross_site_transferring_request_->request_id() == 246 cross_site_transferring_request_->request_id() ==
239 entry.transferred_global_request_id()) { 247 entry.transferred_global_request_id()) {
240 cross_site_transferring_request_->ReleaseRequest(); 248 cross_site_transferring_request_->ReleaseRequest();
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 } 1322 }
1315 return true; 1323 return true;
1316 } 1324 }
1317 1325
1318 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame( 1326 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
1319 SiteInstance* instance, 1327 SiteInstance* instance,
1320 WebUIImpl* web_ui, 1328 WebUIImpl* web_ui,
1321 int opener_route_id, 1329 int opener_route_id,
1322 int flags, 1330 int flags,
1323 int* view_routing_id_ptr) { 1331 int* view_routing_id_ptr) {
1332 LOG(ERROR) << "RFHM[" << this << "]::CreateRenderFrame:";
1333
1324 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 1334 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
1325 CHECK(instance); 1335 CHECK(instance);
1326 // Swapped out views should always be hidden. 1336 // Swapped out views should always be hidden.
1327 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN)); 1337 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN));
1328 1338
1329 // TODO(nasko): Remove the following CHECK once cross-site navigation no 1339 // TODO(nasko): Remove the following CHECK once cross-site navigation no
1330 // longer relies on swapped out RFH for the top-level frame. 1340 // longer relies on swapped out RFH for the top-level frame.
1331 if (!frame_tree_node_->IsMainFrame()) 1341 if (!frame_tree_node_->IsMainFrame())
1332 CHECK(!swapped_out); 1342 CHECK(!swapped_out);
1333 1343
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1404 } else if (!swapped_out) { 1414 } else if (!swapped_out) {
1405 // Init the RFH, so a RenderFrame is created in the renderer. 1415 // Init the RFH, so a RenderFrame is created in the renderer.
1406 DCHECK(new_render_frame_host.get()); 1416 DCHECK(new_render_frame_host.get());
1407 success = InitRenderFrame(new_render_frame_host.get()); 1417 success = InitRenderFrame(new_render_frame_host.get());
1408 } 1418 }
1409 } 1419 }
1410 1420
1411 if (success) { 1421 if (success) {
1412 if (view_routing_id_ptr) 1422 if (view_routing_id_ptr)
1413 *view_routing_id_ptr = render_view_host->GetRoutingID(); 1423 *view_routing_id_ptr = render_view_host->GetRoutingID();
1414
1415 // A brand new RenderFrame was created by one of the Init calls above.
1416 // Announce it to observers.
1417 if (swapped_out)
1418 render_frame_delegate_->RenderFrameCreated(proxy->render_frame_host());
1419 else
1420 render_frame_delegate_->RenderFrameCreated(new_render_frame_host.get());
1421 } 1424 }
1422 } 1425 }
1423 1426
1424 // Returns the new RFH if it isn't swapped out. 1427 // Returns the new RFH if it isn't swapped out.
1425 if (success && !swapped_out) { 1428 if (success && !swapped_out) {
1426 DCHECK(new_render_frame_host->GetSiteInstance() == instance); 1429 DCHECK(new_render_frame_host->GetSiteInstance() == instance);
1427 return new_render_frame_host.Pass(); 1430 return new_render_frame_host.Pass();
1428 } 1431 }
1429 return nullptr; 1432 return nullptr;
1430 } 1433 }
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1956 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1954 SiteInstance* instance) { 1957 SiteInstance* instance) {
1955 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1958 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1956 if (iter != proxy_hosts_.end()) { 1959 if (iter != proxy_hosts_.end()) {
1957 delete iter->second; 1960 delete iter->second;
1958 proxy_hosts_.erase(iter); 1961 proxy_hosts_.erase(iter);
1959 } 1962 }
1960 } 1963 }
1961 1964
1962 } // namespace content 1965 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/render_frame_host_impl.cc ('k') | content/browser/renderer_host/render_view_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698