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

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

Issue 498883002: Add/improve tracing in navigation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on ToT. Created 6 years, 3 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 | Annotate | Revision Log
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/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 entry.bindings() != NavigationEntryImpl::kInvalidBindings && 181 entry.bindings() != NavigationEntryImpl::kInvalidBindings &&
182 pending_web_ui_->GetBindings() != entry.bindings()) { 182 pending_web_ui_->GetBindings() != entry.bindings()) {
183 RecordAction( 183 RecordAction(
184 base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); 184 base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM"));
185 pending_web_ui_.reset(); 185 pending_web_ui_.reset();
186 } 186 }
187 } 187 }
188 188
189 RenderFrameHostImpl* RenderFrameHostManager::Navigate( 189 RenderFrameHostImpl* RenderFrameHostManager::Navigate(
190 const NavigationEntryImpl& entry) { 190 const NavigationEntryImpl& entry) {
191 TRACE_EVENT0("browser", "RenderFrameHostManager:Navigate");
Charlie Reis 2014/08/27 22:05:13 I think it's better to keep this one than UpdateSt
nasko 2014/08/27 23:30:01 Done.
192 // Create a pending RenderFrameHost to use for the navigation. 191 // Create a pending RenderFrameHost to use for the navigation.
193 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate(entry); 192 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate(entry);
194 if (!dest_render_frame_host) 193 if (!dest_render_frame_host)
195 return NULL; // We weren't able to create a pending render frame host. 194 return NULL; // We weren't able to create a pending render frame host.
196 195
197 // If the current render_frame_host_ isn't live, we should create it so 196 // If the current render_frame_host_ isn't live, we should create it so
198 // that we don't show a sad tab while the dest_render_frame_host fetches 197 // that we don't show a sad tab while the dest_render_frame_host fetches
199 // its first page. (Bug 1145340) 198 // its first page. (Bug 1145340)
200 if (dest_render_frame_host != render_frame_host_ && 199 if (dest_render_frame_host != render_frame_host_ &&
201 !render_frame_host_->render_view_host()->IsRenderViewLive()) { 200 !render_frame_host_->render_view_host()->IsRenderViewLive()) {
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // Now delete them. 490 // Now delete them.
492 while (!ids_to_remove.empty()) { 491 while (!ids_to_remove.empty()) {
493 delete proxy_hosts_[ids_to_remove.back()]; 492 delete proxy_hosts_[ids_to_remove.back()];
494 proxy_hosts_.erase(ids_to_remove.back()); 493 proxy_hosts_.erase(ids_to_remove.back());
495 ids_to_remove.pop_back(); 494 ids_to_remove.pop_back();
496 } 495 }
497 } 496 }
498 497
499 void RenderFrameHostManager::SwapOutOldPage( 498 void RenderFrameHostManager::SwapOutOldPage(
500 RenderFrameHostImpl* old_render_frame_host) { 499 RenderFrameHostImpl* old_render_frame_host) {
500 TRACE_EVENT1("navigation", "RenderFrameHostManager::SwapOutOldPage",
501 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
501 // Should only see this while we have a pending renderer. 502 // Should only see this while we have a pending renderer.
502 CHECK(cross_navigation_pending_); 503 CHECK(cross_navigation_pending_);
503 504
504 // Tell the renderer to suppress any further modal dialogs so that we can swap 505 // Tell the renderer to suppress any further modal dialogs so that we can swap
505 // it out. This must be done before canceling any current dialog, in case 506 // it out. This must be done before canceling any current dialog, in case
506 // there is a loop creating additional dialogs. 507 // there is a loop creating additional dialogs.
507 // TODO(creis): Handle modal dialogs in subframe processes. 508 // TODO(creis): Handle modal dialogs in subframe processes.
508 old_render_frame_host->render_view_host()->SuppressDialogsUntilSwapOut(); 509 old_render_frame_host->render_view_host()->SuppressDialogsUntilSwapOut();
509 510
510 // Now close any modal dialogs that would prevent us from swapping out. This 511 // Now close any modal dialogs that would prevent us from swapping out. This
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 1215
1215 RenderFrameProxyHostMap::iterator iter = 1216 RenderFrameProxyHostMap::iterator iter =
1216 proxy_hosts_.find(site_instance->GetId()); 1217 proxy_hosts_.find(site_instance->GetId());
1217 if (iter != proxy_hosts_.end()) 1218 if (iter != proxy_hosts_.end())
1218 return iter->second->GetRoutingID(); 1219 return iter->second->GetRoutingID();
1219 1220
1220 return MSG_ROUTING_NONE; 1221 return MSG_ROUTING_NONE;
1221 } 1222 }
1222 1223
1223 void RenderFrameHostManager::CommitPending() { 1224 void RenderFrameHostManager::CommitPending() {
1225 TRACE_EVENT1("navigation", "RenderFrameHostManager::CommitPending",
1226 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
1224 // First check whether we're going to want to focus the location bar after 1227 // First check whether we're going to want to focus the location bar after
1225 // this commit. We do this now because the navigation hasn't formally 1228 // this commit. We do this now because the navigation hasn't formally
1226 // committed yet, so if we've already cleared |pending_web_ui_| the call chain 1229 // committed yet, so if we've already cleared |pending_web_ui_| the call chain
1227 // this triggers won't be able to figure out what's going on. 1230 // this triggers won't be able to figure out what's going on.
1228 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); 1231 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault();
1229 1232
1230 // Next commit the Web UI, if any. Either replace |web_ui_| with 1233 // Next commit the Web UI, if any. Either replace |web_ui_| with
1231 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or 1234 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or
1232 // leave |web_ui_| as is if reusing it. 1235 // leave |web_ui_| as is if reusing it.
1233 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); 1236 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get()));
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 FrameTree* tree = rvh->GetDelegate()->GetFrameTree(); 1415 FrameTree* tree = rvh->GetDelegate()->GetFrameTree();
1413 tree->ForEach(base::Bind( 1416 tree->ForEach(base::Bind(
1414 &RenderFrameHostManager::ClearProxiesInSiteInstance, 1417 &RenderFrameHostManager::ClearProxiesInSiteInstance,
1415 site_instance_id)); 1418 site_instance_id));
1416 } 1419 }
1417 } 1420 }
1418 } 1421 }
1419 1422
1420 RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate( 1423 RenderFrameHostImpl* RenderFrameHostManager::UpdateStateForNavigate(
1421 const NavigationEntryImpl& entry) { 1424 const NavigationEntryImpl& entry) {
1425 TRACE_EVENT1("navigation",
1426 "RenderFrameHostManager::UpdateStateForNavigate",
1427 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
1422 // If we are currently navigating cross-process, we want to get back to normal 1428 // If we are currently navigating cross-process, we want to get back to normal
1423 // and then navigate as usual. 1429 // and then navigate as usual.
1424 if (cross_navigation_pending_) { 1430 if (cross_navigation_pending_) {
1425 if (pending_render_frame_host_) 1431 if (pending_render_frame_host_)
1426 CancelPending(); 1432 CancelPending();
1427 cross_navigation_pending_ = false; 1433 cross_navigation_pending_ = false;
1428 } 1434 }
1429 1435
1430 SiteInstance* current_instance = render_frame_host_->GetSiteInstance(); 1436 SiteInstance* current_instance = render_frame_host_->GetSiteInstance();
1431 scoped_refptr<SiteInstance> new_instance = 1437 scoped_refptr<SiteInstance> new_instance =
1432 GetSiteInstanceForNavigation( 1438 GetSiteInstanceForNavigation(
1433 entry.GetURL(), 1439 entry.GetURL(),
1434 entry.site_instance(), 1440 entry.site_instance(),
1435 entry.GetTransitionType(), 1441 entry.GetTransitionType(),
1436 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE, 1442 entry.restore_type() != NavigationEntryImpl::RESTORE_NONE,
1437 entry.IsViewSourceMode()); 1443 entry.IsViewSourceMode());
1438 1444
1439 const NavigationEntry* current_entry = 1445 const NavigationEntry* current_entry =
1440 delegate_->GetLastCommittedNavigationEntryForRenderManager(); 1446 delegate_->GetLastCommittedNavigationEntryForRenderManager();
1441 1447
1442 if (new_instance.get() != current_instance) { 1448 if (new_instance.get() != current_instance) {
1449 TRACE_EVENT_INSTANT2(
1450 "navigation",
1451 "RenderFrameHostManager::UpdateStateForNavigate:New SiteInstance",
Charlie Reis 2014/08/27 22:05:13 Is this just so that we mark the cases that we hav
nasko 2014/08/27 23:30:01 Yes. Also to log the new SiteInstance ID, in case
1452 TRACE_EVENT_SCOPE_THREAD,
1453 "current_instance id", current_instance->GetId(),
1454 "new_instance id", new_instance->GetId());
1455
1443 // New SiteInstance: create a pending RFH to navigate. 1456 // New SiteInstance: create a pending RFH to navigate.
1444 DCHECK(!cross_navigation_pending_); 1457 DCHECK(!cross_navigation_pending_);
1445 1458
1446 // This will possibly create (set to NULL) a Web UI object for the pending 1459 // This will possibly create (set to NULL) a Web UI object for the pending
1447 // page. We'll use this later to give the page special access. This must 1460 // page. We'll use this later to give the page special access. This must
1448 // happen before the new renderer is created below so it will get bindings. 1461 // happen before the new renderer is created below so it will get bindings.
1449 // It must also happen after the above conditional call to CancelPending(), 1462 // It must also happen after the above conditional call to CancelPending(),
1450 // otherwise CancelPending may clear the pending_web_ui_ and the page will 1463 // otherwise CancelPending may clear the pending_web_ui_ and the page will
1451 // not have its bindings set appropriately. 1464 // not have its bindings set appropriately.
1452 SetPendingWebUI(entry); 1465 SetPendingWebUI(entry);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1546 if (entry.IsViewSourceMode()) { 1559 if (entry.IsViewSourceMode()) {
1547 render_frame_host_->render_view_host()->Send( 1560 render_frame_host_->render_view_host()->Send(
1548 new ViewMsg_EnableViewSourceMode( 1561 new ViewMsg_EnableViewSourceMode(
1549 render_frame_host_->render_view_host()->GetRoutingID())); 1562 render_frame_host_->render_view_host()->GetRoutingID()));
1550 } 1563 }
1551 1564
1552 return render_frame_host_.get(); 1565 return render_frame_host_.get();
1553 } 1566 }
1554 1567
1555 void RenderFrameHostManager::CancelPending() { 1568 void RenderFrameHostManager::CancelPending() {
1569 TRACE_EVENT1("navigation", "RenderFrameHostManager::CancelPending",
1570 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
1556 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = 1571 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host =
1557 pending_render_frame_host_.Pass(); 1572 pending_render_frame_host_.Pass();
1558 1573
1559 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( 1574 RenderViewDevToolsAgentHost::OnCancelPendingNavigation(
1560 pending_render_frame_host->render_view_host(), 1575 pending_render_frame_host->render_view_host(),
1561 render_frame_host_->render_view_host()); 1576 render_frame_host_->render_view_host());
1562 1577
1563 // We no longer need to prevent the process from exiting. 1578 // We no longer need to prevent the process from exiting.
1564 pending_render_frame_host->GetProcess()->RemovePendingView(); 1579 pending_render_frame_host->GetProcess()->RemovePendingView();
1565 1580
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1673 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1659 SiteInstance* instance) { 1674 SiteInstance* instance) {
1660 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1675 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1661 if (iter != proxy_hosts_.end()) { 1676 if (iter != proxy_hosts_.end()) {
1662 delete iter->second; 1677 delete iter->second;
1663 proxy_hosts_.erase(iter); 1678 proxy_hosts_.erase(iter);
1664 } 1679 }
1665 } 1680 }
1666 1681
1667 } // namespace content 1682 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698