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 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 593 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); | 593 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
| 594 | 594 |
| 595 // The NavigationRequest may have been canceled while the renderer was | 595 // The NavigationRequest may have been canceled while the renderer was |
| 596 // executing the BeforeUnload event. | 596 // executing the BeforeUnload event. |
| 597 if (!navigation_request) | 597 if (!navigation_request) |
| 598 return; | 598 return; |
| 599 | 599 |
| 600 DCHECK_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, | 600 DCHECK_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE, |
| 601 navigation_request->state()); | 601 navigation_request->state()); |
| 602 | 602 |
| 603 // If the navigation is allowed to proceed, send the request to the IO thread. | |
| 603 if (proceed) | 604 if (proceed) |
| 604 BeginNavigation(frame_tree_node); | 605 navigation_request->BeginNavigation(); |
| 605 else | 606 else |
| 606 CancelNavigation(frame_tree_node); | 607 CancelNavigation(frame_tree_node); |
| 607 } | 608 } |
| 608 | 609 |
| 609 // PlzNavigate | 610 // PlzNavigate |
| 610 void NavigatorImpl::OnBeginNavigation( | 611 void NavigatorImpl::OnBeginNavigation( |
| 611 FrameTreeNode* frame_tree_node, | 612 FrameTreeNode* frame_tree_node, |
| 612 const CommonNavigationParams& common_params, | 613 const CommonNavigationParams& common_params, |
| 613 const BeginNavigationParams& begin_params, | 614 const BeginNavigationParams& begin_params, |
| 614 scoped_refptr<ResourceRequestBody> body) { | 615 scoped_refptr<ResourceRequestBody> body) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 // main frame navigation that start via a BeginNavigation IPC, the | 649 // main frame navigation that start via a BeginNavigation IPC, the |
| 649 // RenderFrameHost will not be swapped. Therefore it is safe to call | 650 // RenderFrameHost will not be swapped. Therefore it is safe to call |
| 650 // DidStartMainFrameNavigation with the SiteInstance from the current | 651 // DidStartMainFrameNavigation with the SiteInstance from the current |
| 651 // RenderFrameHost. | 652 // RenderFrameHost. |
| 652 DidStartMainFrameNavigation( | 653 DidStartMainFrameNavigation( |
| 653 common_params.url, | 654 common_params.url, |
| 654 frame_tree_node->current_frame_host()->GetSiteInstance()); | 655 frame_tree_node->current_frame_host()->GetSiteInstance()); |
| 655 navigation_data_.reset(); | 656 navigation_data_.reset(); |
| 656 } | 657 } |
| 657 | 658 |
| 658 BeginNavigation(frame_tree_node); | 659 if (frame_tree_node->navigation_request()->BeginNavigation()) { |
| 660 // If the request was really sent to the IO thread, notify the | |
| 661 // RenderFrameHostManager so it can speculatively create a RenderFrameHost | |
| 662 // (and potentially a new renderer process) in parallel. | |
| 663 frame_tree_node->render_manager()->BeginNavigation( | |
| 664 *frame_tree_node->navigation_request()); | |
| 665 } | |
| 659 } | 666 } |
| 660 | 667 |
| 661 // PlzNavigate | 668 // PlzNavigate |
| 662 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node, | 669 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node, |
| 663 ResourceResponse* response, | 670 ResourceResponse* response, |
| 664 scoped_ptr<StreamHandle> body) { | 671 scoped_ptr<StreamHandle> body) { |
| 665 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 672 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 666 switches::kEnableBrowserSideNavigation)); | 673 switches::kEnableBrowserSideNavigation)); |
| 667 | 674 |
| 668 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); | 675 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 798 void NavigatorImpl::RequestNavigation( | 805 void NavigatorImpl::RequestNavigation( |
| 799 FrameTreeNode* frame_tree_node, | 806 FrameTreeNode* frame_tree_node, |
| 800 const NavigationEntryImpl& entry, | 807 const NavigationEntryImpl& entry, |
| 801 NavigationController::ReloadType reload_type, | 808 NavigationController::ReloadType reload_type, |
| 802 base::TimeTicks navigation_start) { | 809 base::TimeTicks navigation_start) { |
| 803 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 810 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 804 switches::kEnableBrowserSideNavigation)); | 811 switches::kEnableBrowserSideNavigation)); |
| 805 DCHECK(frame_tree_node); | 812 DCHECK(frame_tree_node); |
| 806 FrameMsg_Navigate_Type::Value navigation_type = | 813 FrameMsg_Navigate_Type::Value navigation_type = |
| 807 GetNavigationType(controller_->GetBrowserContext(), entry, reload_type); | 814 GetNavigationType(controller_->GetBrowserContext(), entry, reload_type); |
| 808 scoped_ptr<NavigationRequest> navigation_request = | 815 frame_tree_node->SetNavigationRequest( |
| 809 NavigationRequest::CreateBrowserInitiated(frame_tree_node, entry, | 816 NavigationRequest::CreateBrowserInitiated(frame_tree_node, entry, |
| 810 navigation_type, | 817 navigation_type, |
| 811 navigation_start, controller_); | 818 navigation_start, controller_)); |
| 812 frame_tree_node->SetNavigationRequest(navigation_request.Pass()); | 819 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); |
| 813 frame_tree_node->navigation_request()->SetWaitingForRendererResponse(); | |
| 814 | 820 |
| 815 // Have the current renderer execute its beforeUnload event if needed. If it | 821 // Have the current renderer execute its beforeunload event if needed. |
| 816 // is not needed (eg. the renderer is not live), BeginNavigation should get | |
| 817 // called. If the navigation is synchronous and same-site, then it can be sent | |
| 818 // directly to the renderer (currently this is the case for navigations that | |
| 819 // do not make network requests such as data urls or Javascript urls). | |
| 820 if (NavigationRequest::ShouldMakeNetworkRequest( | 822 if (NavigationRequest::ShouldMakeNetworkRequest( |
|
clamy
2015/06/09 10:02:01
I find the new ordering of comments not clearer. I
carlosk
2015/06/09 15:33:51
Reverted to the previous comment with slight adapt
| |
| 821 frame_tree_node->navigation_request()->common_params().url)) { | 823 navigation_request->common_params().url)) { |
| 824 // If this navigation is not synchronous dispatch the beforeunload request. | |
| 825 navigation_request->SetWaitingForRendererResponse(); | |
| 822 frame_tree_node->current_frame_host()->DispatchBeforeUnload(true); | 826 frame_tree_node->current_frame_host()->DispatchBeforeUnload(true); |
| 827 // Note: At this point if beforeunload was deemed not needed (i.e. there | |
| 828 // was no live renderer) then the request to the IO thread has already been | |
| 829 // sent. | |
| 830 frame_tree_node->render_manager()->BeginNavigation(*navigation_request); | |
| 823 } else { | 831 } else { |
| 824 BeginNavigation(frame_tree_node); | 832 // If the navigation is synchronous and same-site, then the current renderer |
| 833 // will be reused and the NavigationRequest will just commit the navigation. | |
| 834 // This is currently the case for navigations that do not make network | |
| 835 // requests such as data URLs or Javascript URLs. | |
| 836 navigation_request->BeginNavigation(); | |
| 825 } | 837 } |
| 826 } | 838 } |
| 827 | 839 |
| 828 void NavigatorImpl::BeginNavigation(FrameTreeNode* frame_tree_node) { | |
| 829 NavigationRequest* navigation_request = frame_tree_node->navigation_request(); | |
| 830 | |
| 831 // A browser-initiated navigation could have been cancelled while it was | |
| 832 // waiting for the BeforeUnload event to execute. | |
| 833 if (!navigation_request) | |
| 834 return; | |
| 835 | |
| 836 // Start the request. | |
| 837 if (navigation_request->BeginNavigation()) { | |
| 838 // If the request was sent to the IO thread, notify the | |
| 839 // RenderFrameHostManager so it can speculatively create a RenderFrameHost | |
| 840 // (and potentially a new renderer process) in parallel. | |
| 841 frame_tree_node->render_manager()->BeginNavigation(*navigation_request); | |
| 842 } | |
| 843 } | |
| 844 | |
| 845 void NavigatorImpl::RecordNavigationMetrics( | 840 void NavigatorImpl::RecordNavigationMetrics( |
| 846 const LoadCommittedDetails& details, | 841 const LoadCommittedDetails& details, |
| 847 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, | 842 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, |
| 848 SiteInstance* site_instance) { | 843 SiteInstance* site_instance) { |
| 849 DCHECK(site_instance->HasProcess()); | 844 DCHECK(site_instance->HasProcess()); |
| 850 | 845 |
| 851 if (!details.is_in_page) | 846 if (!details.is_in_page) |
| 852 RecordAction(base::UserMetricsAction("FrameLoad")); | 847 RecordAction(base::UserMetricsAction("FrameLoad")); |
| 853 | 848 |
| 854 if (!details.is_main_frame || !navigation_data_ || | 849 if (!details.is_main_frame || !navigation_data_ || |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 922 entry->set_should_replace_entry(pending_entry->should_replace_entry()); | 917 entry->set_should_replace_entry(pending_entry->should_replace_entry()); |
| 923 entry->SetRedirectChain(pending_entry->GetRedirectChain()); | 918 entry->SetRedirectChain(pending_entry->GetRedirectChain()); |
| 924 } | 919 } |
| 925 controller_->SetPendingEntry(entry); | 920 controller_->SetPendingEntry(entry); |
| 926 if (delegate_) | 921 if (delegate_) |
| 927 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); | 922 delegate_->NotifyChangedNavigationState(content::INVALIDATE_TYPE_URL); |
| 928 } | 923 } |
| 929 } | 924 } |
| 930 | 925 |
| 931 } // namespace content | 926 } // namespace content |
| OLD | NEW |