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

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

Issue 135723003: Move DidCommitProvisionalLoad code from RenderView to RenderFrame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Some clean up, ready to start reviewing. Created 6 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 | 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/navigator_impl.h" 5 #include "content/browser/frame_host/navigator_impl.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "content/browser/frame_host/frame_tree.h" 8 #include "content/browser/frame_host/frame_tree.h"
9 #include "content/browser/frame_host/frame_tree_node.h" 9 #include "content/browser/frame_host/frame_tree_node.h"
10 #include "content/browser/frame_host/navigation_controller_impl.h" 10 #include "content/browser/frame_host/navigation_controller_impl.h"
11 #include "content/browser/frame_host/navigation_entry_impl.h" 11 #include "content/browser/frame_host/navigation_entry_impl.h"
12 #include "content/browser/frame_host/navigator_delegate.h" 12 #include "content/browser/frame_host/navigator_delegate.h"
13 #include "content/browser/frame_host/render_frame_host_impl.h" 13 #include "content/browser/frame_host/render_frame_host_impl.h"
14 #include "content/browser/renderer_host/render_view_host_impl.h" 14 #include "content/browser/renderer_host/render_view_host_impl.h"
15 #include "content/browser/site_instance_impl.h" 15 #include "content/browser/site_instance_impl.h"
16 #include "content/browser/webui/web_ui_controller_factory_registry.h" 16 #include "content/browser/webui/web_ui_controller_factory_registry.h"
17 #include "content/common/frame_messages.h" 17 #include "content/common/frame_messages.h"
18 #include "content/common/view_messages.h" 18 #include "content/common/view_messages.h"
19 #include "content/public/browser/browser_context.h" 19 #include "content/public/browser/browser_context.h"
20 #include "content/public/browser/content_browser_client.h" 20 #include "content/public/browser/content_browser_client.h"
21 #include "content/public/browser/invalidate_type.h" 21 #include "content/public/browser/invalidate_type.h"
22 #include "content/public/browser/navigation_controller.h" 22 #include "content/public/browser/navigation_controller.h"
23 #include "content/public/browser/navigation_details.h"
23 #include "content/public/browser/render_view_host.h" 24 #include "content/public/browser/render_view_host.h"
24 #include "content/public/common/bindings_policy.h" 25 #include "content/public/common/bindings_policy.h"
26 #include "content/public/common/content_client.h"
25 #include "content/public/common/content_switches.h" 27 #include "content/public/common/content_switches.h"
26 #include "content/public/common/url_constants.h" 28 #include "content/public/common/url_constants.h"
27 #include "content/public/common/url_utils.h" 29 #include "content/public/common/url_utils.h"
28 30
31 namespace {
Charlie Reis 2014/02/05 23:30:37 Why not put this in the namespace below, alongside
nasko 2014/02/06 01:55:13 Moved to the namespace below. I think we will have
32
33 content::RenderFrameHostManager* GetRenderManager(
34 content::RenderFrameHostImpl* rfh) {
35 return rfh->frame_tree_node()->render_manager();
36 }
37
38 } // namespace
39
29 namespace content { 40 namespace content {
30 41
31 namespace { 42 namespace {
32 43
33 ViewMsg_Navigate_Type::Value GetNavigationType( 44 ViewMsg_Navigate_Type::Value GetNavigationType(
34 BrowserContext* browser_context, const NavigationEntryImpl& entry, 45 BrowserContext* browser_context, const NavigationEntryImpl& entry,
35 NavigationController::ReloadType reload_type) { 46 NavigationController::ReloadType reload_type) {
36 switch (reload_type) { 47 switch (reload_type) {
37 case NavigationControllerImpl::RELOAD: 48 case NavigationControllerImpl::RELOAD:
38 return ViewMsg_Navigate_Type::RELOAD; 49 return ViewMsg_Navigate_Type::RELOAD;
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 return NavigateToEntry( 365 return NavigateToEntry(
355 render_frame_host, 366 render_frame_host,
356 *NavigationEntryImpl::FromNavigationEntry(controller_->GetPendingEntry()), 367 *NavigationEntryImpl::FromNavigationEntry(controller_->GetPendingEntry()),
357 reload_type); 368 reload_type);
358 } 369 }
359 370
360 base::TimeTicks NavigatorImpl::GetCurrentLoadStart() { 371 base::TimeTicks NavigatorImpl::GetCurrentLoadStart() {
361 return current_load_start_; 372 return current_load_start_;
362 } 373 }
363 374
375 void NavigatorImpl::DidNavigate(
376 RenderFrameHostImpl* render_frame_host,
377 const FrameHostMsg_DidCommitProvisionalLoad_Params& input_params) {
378 FrameHostMsg_DidCommitProvisionalLoad_Params params(input_params);
379 FrameTree* frame_tree = render_frame_host->frame_tree_node()->frame_tree();
380 RenderViewHostImpl* rvh = render_frame_host->render_view_host();
381 bool use_site_per_process =
382 CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess);
383 if (frame_tree->IsFirstNavigationAfterSwap()) {
384 // First navigation should be a main frame navigation.
385 // TODO(creis): This DCHECK is currently disabled for --site-per-process
386 // because cross-process subframe navigations still have a main frame
387 // PageTransition.
388 if (!use_site_per_process)
389 DCHECK(PageTransitionIsMainFrame(params.transition));
390 frame_tree->OnFirstNavigationAfterSwap(params.frame_id);
391 }
392
393 // When using --site-per-process, look up the FrameTreeNode ID that the
394 // renderer-specific frame ID corresponds to.
395 int64 frame_tree_node_id = frame_tree->root()->frame_tree_node_id();
396 if (use_site_per_process) {
397 FrameTreeNode* source_node = frame_tree->FindByFrameID(params.frame_id);
398 if (source_node)
399 frame_tree_node_id = source_node->frame_tree_node_id();
Charlie Reis 2014/02/05 23:30:37 I think we can get frame_tree_node_id from render_
nasko 2014/02/06 01:55:13 I agree with the simpler code, so fixed. I don't t
Charlie Reis 2014/02/06 21:49:07 Ah, good point.
400
401 // TODO(creis): In the short term, cross-process subframe navigations are
402 // happening in the pending RenderViewHost's top-level frame. (We need to
403 // both mirror the frame tree and get the navigation to occur in the correct
404 // subframe to fix this.) Until then, we should check whether we have a
405 // pending NavigationEntry with a frame ID and if so, treat the
406 // cross-process "main frame" navigation as a subframe navigation. This
407 // limits us to a single cross-process subframe per RVH, and it affects
408 // NavigateToEntry, NavigatorImpl::DidStartProvisionalLoad, and
409 // OnDidFinishLoad.
410 NavigationEntryImpl* pending_entry =
411 NavigationEntryImpl::FromNavigationEntry(
412 controller_->GetPendingEntry());
413 int root_ftn_id = frame_tree->root()->frame_tree_node_id();
414 if (pending_entry &&
415 pending_entry->frame_tree_node_id() != -1 &&
416 pending_entry->frame_tree_node_id() != root_ftn_id) {
417 params.transition = PAGE_TRANSITION_AUTO_SUBFRAME;
418 frame_tree_node_id = pending_entry->frame_tree_node_id();
Charlie Reis 2014/02/05 23:30:37 This part is probably still necessary, unlike the
nasko 2014/02/06 01:55:13 Done.
419 }
420 }
421
422 if (PageTransitionIsMainFrame(params.transition)) {
423 // When overscroll navigation gesture is enabled, a screenshot of the page
424 // in its current state is taken so that it can be used during the
425 // nav-gesture. It is necessary to take the screenshot here, before calling
426 // RenderFrameHostManager::DidNavigateMainFrame, because that can change
427 // WebContents::GetRenderViewHost to return the new host, instead of the one
428 // that may have just been swapped out.
429 if (delegate_ && delegate_->CanOverscrollContent())
430 controller_->TakeScreenshot();
431
432 if (!use_site_per_process)
433 GetRenderManager(render_frame_host)->DidNavigateMainFrame(rvh);
434 }
435
436 // When using --site-per-process, we notify the RFHM for all navigations,
437 // not just main frame navigations.
438 if (use_site_per_process) {
439 FrameTreeNode* frame = frame_tree->FindByID(frame_tree_node_id);
440 // TODO(creis): Rename to DidNavigateFrame.
441 frame->render_manager()->DidNavigateMainFrame(rvh);
442 }
443
444 // Update the site of the SiteInstance if it doesn't have one yet, unless
445 // assigning a site is not necessary for this URL. In that case, the
446 // SiteInstance can still be considered unused until a navigation to a real
447 // page.
448 if (!static_cast<SiteInstanceImpl*>(
449 render_frame_host->GetSiteInstance())->HasSite() &&
Charlie Reis 2014/02/05 23:30:37 Let's make this easier to read by grabbing site_in
nasko 2014/02/06 01:55:13 Done.
450 ShouldAssignSiteForURL(params.url)) {
451 static_cast<SiteInstanceImpl*>(
452 render_frame_host->GetSiteInstance())->SetSite(params.url);
453 }
454
455 // The MIME type is updated only for the main frame. For a subframe,
456 // RenderView::UpdateURL does not set params.contents_mime_type.
Charlie Reis 2014/02/05 23:30:37 Please preserve the rest of jungshik's comment. (
nasko 2014/02/06 01:55:13 Done.
457 if (PageTransitionIsMainFrame(params.transition) && delegate_)
458 delegate_->SetMainFrameMimeType(params.contents_mime_type);
459
460 LoadCommittedDetails details;
461 bool did_navigate = controller_->RendererDidNavigate(rvh, params, &details);
462
463 // For now, keep track of each frame's URL in its FrameTreeNode. This lets
464 // us estimate our process count for implementing OOP iframes.
465 // TODO(creis): Remove this when we track which pages commit in each frame.
466 frame_tree->SetFrameUrl(params.frame_id, params.url);
467
468 // Send notification about committed provisional loads. This notification is
469 // different from the NAV_ENTRY_COMMITTED notification which doesn't include
470 // the actual URL navigated to and isn't sent for AUTO_SUBFRAME navigations.
471 if (details.type != NAVIGATION_TYPE_NAV_IGNORE && delegate_) {
472 // For AUTO_SUBFRAME navigations, an event for the main frame is generated
473 // that is not recorded in the navigation history. For the purpose of
474 // tracking navigation events, we treat this event as a sub frame navigation
475 // event.
476 bool is_main_frame = did_navigate ? details.is_main_frame : false;
477 PageTransition transition_type = params.transition;
478 // Whether or not a page transition was triggered by going backward or
479 // forward in the history is only stored in the navigation controller's
480 // entry list.
481 if (did_navigate &&
482 (controller_->GetLastCommittedEntry()->GetTransitionType() &
483 PAGE_TRANSITION_FORWARD_BACK)) {
484 transition_type = PageTransitionFromInt(
485 params.transition | PAGE_TRANSITION_FORWARD_BACK);
486 }
487
488 delegate_->DidCommitProvisionalLoad(params.frame_id,
489 params.frame_unique_name,
490 is_main_frame,
491 params.url,
492 transition_type,
493 render_frame_host);
494 }
495
496 if (!did_navigate)
497 return; // No navigation happened.
498
499 // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen
500 // for the appropriate notification (best) or you can add it to
501 // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if
502 // necessary, please).
503
504 // Run post-commit tasks.
505 if (delegate_) {
506 if (details.is_main_frame)
507 delegate_->DidNavigateMainFramePostCommit(details, params);
508
509 delegate_->DidNavigateAnyFramePostCommit(
510 render_frame_host, details, params);
511 }
512 }
513
514 bool NavigatorImpl::ShouldAssignSiteForURL(const GURL& url) {
515 // about:blank should not "use up" a new SiteInstance. The SiteInstance can
516 // still be used for a normal web site.
517 if (url == GURL(kAboutBlankURL))
518 return false;
519
520 // The embedder will then have the opportunity to determine if the URL
521 // should "use up" the SiteInstance.
522 return GetContentClient()->browser()->ShouldAssignSiteForURL(url);
523 }
524
364 } // namespace content 525 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698