OLD | NEW |
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 "base/metrics/histogram.h" |
8 #include "base/time/time.h" | 9 #include "base/time/time.h" |
9 #include "content/browser/frame_host/frame_tree.h" | 10 #include "content/browser/frame_host/frame_tree.h" |
10 #include "content/browser/frame_host/frame_tree_node.h" | 11 #include "content/browser/frame_host/frame_tree_node.h" |
11 #include "content/browser/frame_host/navigation_before_commit_info.h" | 12 #include "content/browser/frame_host/navigation_before_commit_info.h" |
12 #include "content/browser/frame_host/navigation_controller_impl.h" | 13 #include "content/browser/frame_host/navigation_controller_impl.h" |
13 #include "content/browser/frame_host/navigation_entry_impl.h" | 14 #include "content/browser/frame_host/navigation_entry_impl.h" |
14 #include "content/browser/frame_host/navigator_delegate.h" | 15 #include "content/browser/frame_host/navigator_delegate.h" |
15 #include "content/browser/frame_host/render_frame_host_impl.h" | 16 #include "content/browser/frame_host/render_frame_host_impl.h" |
16 #include "content/browser/renderer_host/render_view_host_impl.h" | 17 #include "content/browser/renderer_host/render_view_host_impl.h" |
17 #include "content/browser/site_instance_impl.h" | 18 #include "content/browser/site_instance_impl.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 } // namespace | 75 } // namespace |
75 | 76 |
76 | 77 |
77 NavigatorImpl::NavigatorImpl( | 78 NavigatorImpl::NavigatorImpl( |
78 NavigationControllerImpl* navigation_controller, | 79 NavigationControllerImpl* navigation_controller, |
79 NavigatorDelegate* delegate) | 80 NavigatorDelegate* delegate) |
80 : controller_(navigation_controller), | 81 : controller_(navigation_controller), |
81 delegate_(delegate) { | 82 delegate_(delegate) { |
82 } | 83 } |
83 | 84 |
| 85 NavigatorImpl::~NavigatorImpl() { |
| 86 } |
| 87 |
84 // static. | 88 // static. |
85 void NavigatorImpl::MakeNavigateParams( | 89 void NavigatorImpl::MakeNavigateParams( |
86 const NavigationEntryImpl& entry, | 90 const NavigationEntryImpl& entry, |
87 const NavigationControllerImpl& controller, | 91 const NavigationControllerImpl& controller, |
88 NavigationController::ReloadType reload_type, | 92 NavigationController::ReloadType reload_type, |
89 base::TimeTicks navigation_start, | 93 base::TimeTicks navigation_start, |
90 FrameMsg_Navigate_Params* params) { | 94 FrameMsg_Navigate_Params* params) { |
91 params->page_id = entry.GetPageID(); | 95 params->page_id = entry.GetPageID(); |
92 params->should_clear_history_list = entry.should_clear_history_list(); | 96 params->should_clear_history_list = entry.should_clear_history_list(); |
93 params->should_replace_current_entry = entry.should_replace_entry(); | 97 params->should_replace_current_entry = entry.should_replace_entry(); |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 | 319 |
316 FrameMsg_Navigate_Params navigate_params; | 320 FrameMsg_Navigate_Params navigate_params; |
317 RenderFrameHostManager* manager = | 321 RenderFrameHostManager* manager = |
318 render_frame_host->frame_tree_node()->render_manager(); | 322 render_frame_host->frame_tree_node()->render_manager(); |
319 | 323 |
320 // PlzNavigate: the RenderFrameHosts are no longer asked to navigate. Instead | 324 // PlzNavigate: the RenderFrameHosts are no longer asked to navigate. Instead |
321 // the RenderFrameHostManager handles the navigation requests for that frame | 325 // the RenderFrameHostManager handles the navigation requests for that frame |
322 // node. | 326 // node. |
323 if (CommandLine::ForCurrentProcess()->HasSwitch( | 327 if (CommandLine::ForCurrentProcess()->HasSwitch( |
324 switches::kEnableBrowserSideNavigation)) { | 328 switches::kEnableBrowserSideNavigation)) { |
| 329 navigation_start_time_and_url = MakeTuple(navigation_start, entry.GetURL()); |
325 // Create the navigation parameters. | 330 // Create the navigation parameters. |
326 MakeNavigateParams( | 331 MakeNavigateParams( |
327 entry, *controller_, reload_type, navigation_start, &navigate_params); | 332 entry, *controller_, reload_type, navigation_start, &navigate_params); |
328 return manager->RequestNavigation(entry, navigate_params); | 333 return manager->RequestNavigation(entry, navigate_params); |
329 } | 334 } |
330 | 335 |
331 RenderFrameHostImpl* dest_render_frame_host = manager->Navigate(entry); | 336 RenderFrameHostImpl* dest_render_frame_host = manager->Navigate(entry); |
332 if (!dest_render_frame_host) | 337 if (!dest_render_frame_host) |
333 return false; // Unable to create the desired RenderFrameHost. | 338 return false; // Unable to create the desired RenderFrameHost. |
334 | 339 |
(...skipping 17 matching lines...) Expand all Loading... |
352 | 357 |
353 // Navigate in the desired RenderFrameHost. | 358 // Navigate in the desired RenderFrameHost. |
354 // We can skip this step in the rare case that this is a transfer navigation | 359 // We can skip this step in the rare case that this is a transfer navigation |
355 // which began in the chosen RenderFrameHost, since the request has already | 360 // which began in the chosen RenderFrameHost, since the request has already |
356 // been issued. In that case, simply resume the response. | 361 // been issued. In that case, simply resume the response. |
357 bool is_transfer_to_same = | 362 bool is_transfer_to_same = |
358 navigate_params.transferred_request_child_id != -1 && | 363 navigate_params.transferred_request_child_id != -1 && |
359 navigate_params.transferred_request_child_id == | 364 navigate_params.transferred_request_child_id == |
360 dest_render_frame_host->GetProcess()->GetID(); | 365 dest_render_frame_host->GetProcess()->GetID(); |
361 if (!is_transfer_to_same) { | 366 if (!is_transfer_to_same) { |
| 367 navigation_start_time_and_url = MakeTuple(navigation_start, entry.GetURL()); |
362 dest_render_frame_host->Navigate(navigate_params); | 368 dest_render_frame_host->Navigate(navigate_params); |
363 } else { | 369 } else { |
364 // No need to navigate again. Just resume the deferred request. | 370 // No need to navigate again. Just resume the deferred request. |
365 dest_render_frame_host->GetProcess()->ResumeDeferredNavigation( | 371 dest_render_frame_host->GetProcess()->ResumeDeferredNavigation( |
366 GlobalRequestID(navigate_params.transferred_request_child_id, | 372 GlobalRequestID(navigate_params.transferred_request_child_id, |
367 navigate_params.transferred_request_request_id)); | 373 navigate_params.transferred_request_request_id)); |
368 } | 374 } |
369 | 375 |
370 // Make sure no code called via RFH::Navigate clears the pending entry. | 376 // Make sure no code called via RFH::Navigate clears the pending entry. |
371 CHECK_EQ(controller_->GetPendingEntry(), &entry); | 377 CHECK_EQ(controller_->GetPendingEntry(), &entry); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 } | 519 } |
514 | 520 |
515 if (!did_navigate) | 521 if (!did_navigate) |
516 return; // No navigation happened. | 522 return; // No navigation happened. |
517 | 523 |
518 // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen | 524 // DO NOT ADD MORE STUFF TO THIS FUNCTION! Your component should either listen |
519 // for the appropriate notification (best) or you can add it to | 525 // for the appropriate notification (best) or you can add it to |
520 // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if | 526 // DidNavigateMainFramePostCommit / DidNavigateAnyFramePostCommit (only if |
521 // necessary, please). | 527 // necessary, please). |
522 | 528 |
| 529 // TODO(carlosk): Move this out when PlzNavigate implementation properly calls |
| 530 // the observer methods. |
| 531 if (details.is_main_frame && |
| 532 navigation_start_time_and_url.a.ToInternalValue() != 0 |
| 533 && navigation_start_time_and_url.b == params.original_request_url) { |
| 534 base::TimeDelta time_to_commit = |
| 535 base::TimeTicks::Now() - navigation_start_time_and_url.a; |
| 536 UMA_HISTOGRAM_TIMES("Navigation.TimeToCommit", time_to_commit); |
| 537 navigation_start_time_and_url = MakeTuple(base::TimeTicks(), GURL()); |
| 538 } |
| 539 |
523 // Run post-commit tasks. | 540 // Run post-commit tasks. |
524 if (delegate_) { | 541 if (delegate_) { |
525 if (details.is_main_frame) | 542 if (details.is_main_frame) |
526 delegate_->DidNavigateMainFramePostCommit(details, params); | 543 delegate_->DidNavigateMainFramePostCommit(details, params); |
527 | 544 |
528 delegate_->DidNavigateAnyFramePostCommit( | 545 delegate_->DidNavigateAnyFramePostCommit( |
529 render_frame_host, details, params); | 546 render_frame_host, details, params); |
530 } | 547 } |
531 } | 548 } |
532 | 549 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 | 654 |
638 void NavigatorImpl::CommitNavigation( | 655 void NavigatorImpl::CommitNavigation( |
639 RenderFrameHostImpl* render_frame_host, | 656 RenderFrameHostImpl* render_frame_host, |
640 const NavigationBeforeCommitInfo& info) { | 657 const NavigationBeforeCommitInfo& info) { |
641 CheckWebUIRendererDoesNotDisplayNormalURL( | 658 CheckWebUIRendererDoesNotDisplayNormalURL( |
642 render_frame_host, info.navigation_url); | 659 render_frame_host, info.navigation_url); |
643 // TODO(clamy): the render_frame_host should now send a commit IPC to the | 660 // TODO(clamy): the render_frame_host should now send a commit IPC to the |
644 // renderer. | 661 // renderer. |
645 } | 662 } |
646 | 663 |
| 664 void NavigatorImpl::LogResourceRequestTime( |
| 665 base::TimeTicks timestamp, const GURL& url) { |
| 666 if (navigation_start_time_and_url.a.ToInternalValue() != 0 |
| 667 && navigation_start_time_and_url.b == url) { |
| 668 base::TimeDelta time_to_network = |
| 669 timestamp - navigation_start_time_and_url.a; |
| 670 UMA_HISTOGRAM_TIMES("Navigation.TimeToURLJobStart", time_to_network); |
| 671 } |
| 672 } |
| 673 |
647 void NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL( | 674 void NavigatorImpl::CheckWebUIRendererDoesNotDisplayNormalURL( |
648 RenderFrameHostImpl* render_frame_host, | 675 RenderFrameHostImpl* render_frame_host, |
649 const GURL& url) { | 676 const GURL& url) { |
650 int enabled_bindings = | 677 int enabled_bindings = |
651 render_frame_host->render_view_host()->GetEnabledBindings(); | 678 render_frame_host->render_view_host()->GetEnabledBindings(); |
652 bool is_allowed_in_web_ui_renderer = | 679 bool is_allowed_in_web_ui_renderer = |
653 WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI( | 680 WebUIControllerFactoryRegistry::GetInstance()->IsURLAcceptableForWebUI( |
654 controller_->GetBrowserContext(), url); | 681 controller_->GetBrowserContext(), url); |
655 if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) && | 682 if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) && |
656 !is_allowed_in_web_ui_renderer) { | 683 !is_allowed_in_web_ui_renderer) { |
657 // Log the URL to help us diagnose any future failures of this CHECK. | 684 // Log the URL to help us diagnose any future failures of this CHECK. |
658 GetContentClient()->SetActiveURL(url); | 685 GetContentClient()->SetActiveURL(url); |
659 CHECK(0); | 686 CHECK(0); |
660 } | 687 } |
661 } | 688 } |
662 | 689 |
663 } // namespace content | 690 } // namespace content |
OLD | NEW |