Chromium Code Reviews| 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/metrics/histogram.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "content/browser/frame_host/frame_tree.h" | 10 #include "content/browser/frame_host/frame_tree.h" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 void NavigatorImpl::DidStartProvisionalLoad( | 118 void NavigatorImpl::DidStartProvisionalLoad( |
| 119 RenderFrameHostImpl* render_frame_host, | 119 RenderFrameHostImpl* render_frame_host, |
| 120 const GURL& url) { | 120 const GURL& url) { |
| 121 bool is_error_page = (url.spec() == kUnreachableWebDataURL); | 121 bool is_error_page = (url.spec() == kUnreachableWebDataURL); |
| 122 bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); | 122 bool is_iframe_srcdoc = (url.spec() == kAboutSrcDocURL); |
| 123 GURL validated_url(url); | 123 GURL validated_url(url); |
| 124 RenderProcessHost* render_process_host = render_frame_host->GetProcess(); | 124 RenderProcessHost* render_process_host = render_frame_host->GetProcess(); |
| 125 render_process_host->FilterURL(false, &validated_url); | 125 render_process_host->FilterURL(false, &validated_url); |
| 126 | 126 |
| 127 bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); | 127 bool is_main_frame = render_frame_host->frame_tree_node()->IsMainFrame(); |
| 128 NavigationEntryImpl* pending_entry = controller_->GetPendingEntry(); | 128 if (is_main_frame && !is_error_page) |
| 129 if (is_main_frame) { | 129 MainFrameNavigationStarted(validated_url, |
| 130 // If there is no browser-initiated pending entry for this navigation and it | 130 render_frame_host->GetSiteInstance()); |
| 131 // is not for the error URL, create a pending entry using the current | |
| 132 // SiteInstance, and ensure the address bar updates accordingly. We don't | |
| 133 // know the referrer or extra headers at this point, but the referrer will | |
| 134 // be set properly upon commit. | |
| 135 bool has_browser_initiated_pending_entry = pending_entry && | |
| 136 !pending_entry->is_renderer_initiated(); | |
| 137 if (!has_browser_initiated_pending_entry && !is_error_page) { | |
| 138 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | |
| 139 controller_->CreateNavigationEntry(validated_url, | |
| 140 content::Referrer(), | |
| 141 ui::PAGE_TRANSITION_LINK, | |
| 142 true /* is_renderer_initiated */, | |
| 143 std::string(), | |
| 144 controller_->GetBrowserContext())); | |
| 145 entry->set_site_instance(render_frame_host->GetSiteInstance()); | |
| 146 // TODO(creis): If there's a pending entry already, find a safe way to | |
| 147 // update it instead of replacing it and copying over things like this. | |
| 148 if (pending_entry) { | |
| 149 entry->set_transferred_global_request_id( | |
| 150 pending_entry->transferred_global_request_id()); | |
| 151 entry->set_should_replace_entry(pending_entry->should_replace_entry()); | |
| 152 entry->SetRedirectChain(pending_entry->GetRedirectChain()); | |
| 153 } | |
| 154 controller_->SetPendingEntry(entry); | |
| 155 if (delegate_) | |
| 156 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); | |
| 157 } | |
| 158 } | |
| 159 | 131 |
| 160 if (delegate_) { | 132 if (delegate_) { |
| 161 // Notify the observer about the start of the provisional load. | 133 // Notify the observer about the start of the provisional load. |
| 162 delegate_->DidStartProvisionalLoad( | 134 delegate_->DidStartProvisionalLoad( |
| 163 render_frame_host, validated_url, is_error_page, is_iframe_srcdoc); | 135 render_frame_host, validated_url, is_error_page, is_iframe_srcdoc); |
| 164 } | 136 } |
| 165 } | 137 } |
| 166 | 138 |
| 167 | 139 |
| 168 void NavigatorImpl::DidFailProvisionalLoadWithError( | 140 void NavigatorImpl::DidFailProvisionalLoadWithError( |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 660 | 632 |
| 661 // In all other cases the current navigation, if any, is canceled and a new | 633 // In all other cases the current navigation, if any, is canceled and a new |
| 662 // NavigationRequest is created for the node. | 634 // NavigationRequest is created for the node. |
| 663 scoped_ptr<NavigationRequest> navigation_request = | 635 scoped_ptr<NavigationRequest> navigation_request = |
| 664 NavigationRequest::CreateRendererInitiated( | 636 NavigationRequest::CreateRendererInitiated( |
| 665 frame_tree_node, common_params, begin_params, body, | 637 frame_tree_node, common_params, begin_params, body, |
| 666 controller_->GetLastCommittedEntryIndex(), | 638 controller_->GetLastCommittedEntryIndex(), |
| 667 controller_->GetEntryCount()); | 639 controller_->GetEntryCount()); |
| 668 frame_tree_node->SetNavigationRequest(navigation_request.Pass()); | 640 frame_tree_node->SetNavigationRequest(navigation_request.Pass()); |
| 669 | 641 |
| 670 if (frame_tree_node->IsMainFrame()) | 642 if (frame_tree_node->IsMainFrame()) { |
|
Charlie Reis
2015/06/02 17:36:18
Do we not get here for error pages?
clamy
2015/06/03 09:11:10
No this is the beginning of a normal navigation.
| |
| 643 // In the case of a renderer-initiated main frame navigation, the | |
| 644 // RenderFrameHost will not be swapped. Therefore it is safe to call | |
|
Charlie Reis
2015/06/02 17:36:18
This first sentence isn't true in general. Render
clamy
2015/06/03 09:11:10
No they don't, edited the comment to precise that.
Charlie Reis
2015/06/03 20:26:04
Acknowledged.
| |
| 645 // MainFrameNavigationStarted with the SiteInstance from the current | |
| 646 // RenderFrameHost. | |
| 647 MainFrameNavigationStarted( | |
| 648 common_params.url, | |
|
Charlie Reis
2015/06/02 17:36:18
I just noticed that we're not validating the URL w
clamy
2015/06/03 09:11:10
Acknowledged. Added a TODO at the beginning of the
| |
| 649 frame_tree_node->current_frame_host()->GetSiteInstance()); | |
| 671 navigation_data_.reset(); | 650 navigation_data_.reset(); |
| 651 } | |
| 672 | 652 |
| 673 BeginNavigation(frame_tree_node); | 653 BeginNavigation(frame_tree_node); |
| 674 } | 654 } |
| 675 | 655 |
| 676 // PlzNavigate | 656 // PlzNavigate |
| 677 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node, | 657 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node, |
| 678 ResourceResponse* response, | 658 ResourceResponse* response, |
| 679 scoped_ptr<StreamHandle> body) { | 659 scoped_ptr<StreamHandle> body) { |
| 680 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 660 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 681 switches::kEnableBrowserSideNavigation)); | 661 switches::kEnableBrowserSideNavigation)); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 904 UMA_HISTOGRAM_TIMES( | 884 UMA_HISTOGRAM_TIMES( |
| 905 "Navigation.TimeToCommit_ExistingRenderer_BeforeUnloadDiscounted", | 885 "Navigation.TimeToCommit_ExistingRenderer_BeforeUnloadDiscounted", |
| 906 time_to_commit); | 886 time_to_commit); |
| 907 UMA_HISTOGRAM_TIMES( | 887 UMA_HISTOGRAM_TIMES( |
| 908 "Navigation.TimeToURLJobStart_ExistingRenderer_BeforeUnloadDiscounted", | 888 "Navigation.TimeToURLJobStart_ExistingRenderer_BeforeUnloadDiscounted", |
| 909 time_to_network); | 889 time_to_network); |
| 910 } | 890 } |
| 911 navigation_data_.reset(); | 891 navigation_data_.reset(); |
| 912 } | 892 } |
| 913 | 893 |
| 894 void NavigatorImpl::MainFrameNavigationStarted( | |
| 895 const GURL& url, | |
| 896 SiteInstanceImpl* site_instance) { | |
| 897 // If there is no browser-initiated pending entry for this navigation and it | |
| 898 // is not for the error URL, create a pending entry using the current | |
| 899 // SiteInstance, and ensure the address bar updates accordingly. We don't | |
| 900 // know the referrer or extra headers at this point, but the referrer will | |
| 901 // be set properly upon commit. | |
| 902 NavigationEntryImpl* pending_entry = controller_->GetPendingEntry(); | |
| 903 bool has_browser_initiated_pending_entry = | |
| 904 pending_entry && !pending_entry->is_renderer_initiated(); | |
| 905 if (!has_browser_initiated_pending_entry) { | |
| 906 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | |
| 907 controller_->CreateNavigationEntry( | |
| 908 url, content::Referrer(), ui::PAGE_TRANSITION_LINK, | |
| 909 true /* is_renderer_initiated */, std::string(), | |
| 910 controller_->GetBrowserContext())); | |
| 911 entry->set_site_instance(site_instance); | |
| 912 // TODO(creis): If there's a pending entry already, find a safe way to | |
| 913 // update it instead of replacing it and copying over things like this. | |
| 914 if (pending_entry) { | |
| 915 entry->set_transferred_global_request_id( | |
| 916 pending_entry->transferred_global_request_id()); | |
| 917 entry->set_should_replace_entry(pending_entry->should_replace_entry()); | |
| 918 entry->SetRedirectChain(pending_entry->GetRedirectChain()); | |
| 919 } | |
| 920 controller_->SetPendingEntry(entry); | |
| 921 if (delegate_) | |
| 922 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); | |
| 923 } | |
| 924 } | |
| 925 | |
| 914 } // namespace content | 926 } // namespace content |
| OLD | NEW |