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

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

Issue 872473003: PlzNavigate: Remove the RequestNavigation IPC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed nits + fix compilation error Created 5 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
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 "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"
11 #include "content/browser/frame_host/frame_tree_node.h" 11 #include "content/browser/frame_host/frame_tree_node.h"
12 #include "content/browser/frame_host/navigation_controller_impl.h" 12 #include "content/browser/frame_host/navigation_controller_impl.h"
13 #include "content/browser/frame_host/navigation_entry_impl.h" 13 #include "content/browser/frame_host/navigation_entry_impl.h"
14 #include "content/browser/frame_host/navigation_request.h" 14 #include "content/browser/frame_host/navigation_request.h"
15 #include "content/browser/frame_host/navigation_request_info.h" 15 #include "content/browser/frame_host/navigation_request_info.h"
16 #include "content/browser/frame_host/navigator_delegate.h" 16 #include "content/browser/frame_host/navigator_delegate.h"
17 #include "content/browser/frame_host/render_frame_host_impl.h" 17 #include "content/browser/frame_host/render_frame_host_impl.h"
18 #include "content/browser/renderer_host/render_view_host_impl.h" 18 #include "content/browser/renderer_host/render_view_host_impl.h"
19 #include "content/browser/site_instance_impl.h" 19 #include "content/browser/site_instance_impl.h"
20 #include "content/browser/webui/web_ui_controller_factory_registry.h" 20 #include "content/browser/webui/web_ui_controller_factory_registry.h"
21 #include "content/browser/webui/web_ui_impl.h" 21 #include "content/browser/webui/web_ui_impl.h"
22 #include "content/common/frame_messages.h"
22 #include "content/common/navigation_params.h" 23 #include "content/common/navigation_params.h"
23 #include "content/common/view_messages.h" 24 #include "content/common/view_messages.h"
24 #include "content/public/browser/browser_context.h" 25 #include "content/public/browser/browser_context.h"
25 #include "content/public/browser/content_browser_client.h" 26 #include "content/public/browser/content_browser_client.h"
26 #include "content/public/browser/global_request_id.h" 27 #include "content/public/browser/global_request_id.h"
27 #include "content/public/browser/invalidate_type.h" 28 #include "content/public/browser/invalidate_type.h"
28 #include "content/public/browser/navigation_controller.h" 29 #include "content/public/browser/navigation_controller.h"
29 #include "content/public/browser/navigation_details.h" 30 #include "content/public/browser/navigation_details.h"
30 #include "content/public/browser/page_navigator.h" 31 #include "content/public/browser/page_navigator.h"
31 #include "content/public/browser/render_view_host.h" 32 #include "content/public/browser/render_view_host.h"
32 #include "content/public/browser/stream_handle.h" 33 #include "content/public/browser/stream_handle.h"
33 #include "content/public/browser/user_metrics.h" 34 #include "content/public/browser/user_metrics.h"
34 #include "content/public/common/bindings_policy.h" 35 #include "content/public/common/bindings_policy.h"
35 #include "content/public/common/content_client.h" 36 #include "content/public/common/content_client.h"
36 #include "content/public/common/content_switches.h" 37 #include "content/public/common/content_switches.h"
37 #include "content/public/common/resource_response.h" 38 #include "content/public/common/resource_response.h"
38 #include "content/public/common/url_constants.h" 39 #include "content/public/common/url_constants.h"
39 #include "content/public/common/url_utils.h" 40 #include "content/public/common/url_utils.h"
40 #include "net/base/load_flags.h"
41 #include "net/http/http_request_headers.h"
42 41
43 namespace content { 42 namespace content {
44 43
45 namespace { 44 namespace {
46 45
47 FrameMsg_Navigate_Type::Value GetNavigationType( 46 FrameMsg_Navigate_Type::Value GetNavigationType(
48 BrowserContext* browser_context, const NavigationEntryImpl& entry, 47 BrowserContext* browser_context, const NavigationEntryImpl& entry,
49 NavigationController::ReloadType reload_type) { 48 NavigationController::ReloadType reload_type) {
50 switch (reload_type) { 49 switch (reload_type) {
51 case NavigationControllerImpl::RELOAD: 50 case NavigationControllerImpl::RELOAD:
(...skipping 11 matching lines...) Expand all
63 if (entry.restore_type() == 62 if (entry.restore_type() ==
64 NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) { 63 NavigationEntryImpl::RESTORE_LAST_SESSION_EXITED_CLEANLY) {
65 if (entry.GetHasPostData()) 64 if (entry.GetHasPostData())
66 return FrameMsg_Navigate_Type::RESTORE_WITH_POST; 65 return FrameMsg_Navigate_Type::RESTORE_WITH_POST;
67 return FrameMsg_Navigate_Type::RESTORE; 66 return FrameMsg_Navigate_Type::RESTORE;
68 } 67 }
69 68
70 return FrameMsg_Navigate_Type::NORMAL; 69 return FrameMsg_Navigate_Type::NORMAL;
71 } 70 }
72 71
73 // PlzNavigate
74 // Returns the net load flags to use based on the navigation type.
75 // TODO(clamy): unify the code with what is happening on the renderer side.
76 int LoadFlagFromNavigationType(FrameMsg_Navigate_Type::Value navigation_type) {
77 int load_flags = net::LOAD_NORMAL;
78 switch (navigation_type) {
79 case FrameMsg_Navigate_Type::RELOAD:
80 case FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL:
81 load_flags |= net::LOAD_VALIDATE_CACHE;
82 break;
83 case FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE:
84 load_flags |= net::LOAD_BYPASS_CACHE;
85 break;
86 case FrameMsg_Navigate_Type::RESTORE:
87 load_flags |= net::LOAD_PREFERRING_CACHE;
88 break;
89 case FrameMsg_Navigate_Type::RESTORE_WITH_POST:
90 load_flags |= net::LOAD_ONLY_FROM_CACHE;
91 break;
92 case FrameMsg_Navigate_Type::NORMAL:
93 default:
94 break;
95 }
96 return load_flags;
97 }
98
99 // PlzNavigate
100 // Generates a default FrameHostMsg_BeginNavigation_Params to be used when there
101 // is no live renderer.
102 FrameHostMsg_BeginNavigation_Params MakeDefaultBeginNavigation(
103 const RequestNavigationParams& request_params,
104 FrameMsg_Navigate_Type::Value navigation_type) {
105 FrameHostMsg_BeginNavigation_Params begin_navigation_params;
106 begin_navigation_params.method = request_params.is_post ? "POST" : "GET";
107 begin_navigation_params.load_flags =
108 LoadFlagFromNavigationType(navigation_type);
109
110 // Copy existing headers and add necessary headers that may not be present
111 // in the RequestNavigationParams.
112 net::HttpRequestHeaders headers;
113 headers.AddHeadersFromString(request_params.extra_headers);
114 headers.SetHeaderIfMissing(net::HttpRequestHeaders::kUserAgent,
115 GetContentClient()->GetUserAgent());
116 headers.SetHeaderIfMissing("Accept", "*/*");
117 begin_navigation_params.headers = headers.ToString();
118
119 // Fill POST data from the browser in the request body.
120 if (request_params.is_post) {
121 begin_navigation_params.request_body = new ResourceRequestBody();
122 begin_navigation_params.request_body->AppendBytes(
123 reinterpret_cast<const char *>(
124 &request_params.browser_initiated_post_data.front()),
125 request_params.browser_initiated_post_data.size());
126 }
127
128 begin_navigation_params.has_user_gesture = false;
129 return begin_navigation_params;
130 }
131
132 RenderFrameHostManager* GetRenderManager(RenderFrameHostImpl* rfh) { 72 RenderFrameHostManager* GetRenderManager(RenderFrameHostImpl* rfh) {
133 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 73 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
134 switches::kSitePerProcess)) 74 switches::kSitePerProcess))
135 return rfh->frame_tree_node()->render_manager(); 75 return rfh->frame_tree_node()->render_manager();
136 76
137 return rfh->frame_tree_node()->frame_tree()->root()->render_manager(); 77 return rfh->frame_tree_node()->frame_tree()->root()->render_manager();
138 } 78 }
139 79
140 void MakeNavigateParams(const NavigationEntryImpl& entry, 80 void MakeNavigateParams(const NavigationEntryImpl& entry,
141 NavigationControllerImpl* controller, 81 NavigationControllerImpl* controller,
142 NavigationController::ReloadType reload_type, 82 NavigationController::ReloadType reload_type,
143 base::TimeTicks navigation_start, 83 base::TimeTicks navigation_start,
144 FrameMsg_Navigate_Params* params) { 84 FrameMsg_Navigate_Params* params) {
145 FrameMsg_UILoadMetricsReportType::Value report_type = 85 FrameMsg_UILoadMetricsReportType::Value report_type =
146 FrameMsg_UILoadMetricsReportType::NO_REPORT; 86 FrameMsg_UILoadMetricsReportType::NO_REPORT;
147 base::TimeTicks ui_timestamp = base::TimeTicks(); 87 base::TimeTicks ui_timestamp = base::TimeTicks();
148 #if defined(OS_ANDROID) 88 #if defined(OS_ANDROID)
149 if (!entry.intent_received_timestamp().is_null()) 89 if (!entry.intent_received_timestamp().is_null())
150 report_type = FrameMsg_UILoadMetricsReportType::REPORT_INTENT; 90 report_type = FrameMsg_UILoadMetricsReportType::REPORT_INTENT;
151 ui_timestamp = entry.intent_received_timestamp(); 91 ui_timestamp = entry.intent_received_timestamp();
152 #endif 92 #endif
153 93
154 params->common_params = CommonNavigationParams( 94 params->common_params = CommonNavigationParams(
155 entry.GetURL(), entry.GetReferrer(), entry.GetTransitionType(), 95 entry.GetURL(), entry.GetReferrer(), entry.GetTransitionType(),
156 GetNavigationType(controller->GetBrowserContext(), entry, reload_type), 96 GetNavigationType(controller->GetBrowserContext(), entry, reload_type),
157 !entry.IsViewSourceMode(), ui_timestamp, report_type); 97 !entry.IsViewSourceMode(), ui_timestamp, report_type);
158 params->request_params = RequestNavigationParams(
159 entry.GetHasPostData(),
160 entry.extra_headers(),
161 entry.GetBrowserInitiatedPostData());
162 params->commit_params = CommitNavigationParams( 98 params->commit_params = CommitNavigationParams(
163 entry.GetPageState(), entry.GetIsOverridingUserAgent(), navigation_start); 99 entry.GetPageState(), entry.GetIsOverridingUserAgent(), navigation_start);
100 params->is_post = entry.GetHasPostData();
101 params->extra_headers = entry.extra_headers();
102 if (entry.GetBrowserInitiatedPostData()) {
103 params->browser_initiated_post_data.assign(
104 entry.GetBrowserInitiatedPostData()->front(),
105 entry.GetBrowserInitiatedPostData()->front() +
106 entry.GetBrowserInitiatedPostData()->size());
107 }
108
164 if (!entry.GetBaseURLForDataURL().is_empty()) { 109 if (!entry.GetBaseURLForDataURL().is_empty()) {
165 params->base_url_for_data_url = entry.GetBaseURLForDataURL(); 110 params->base_url_for_data_url = entry.GetBaseURLForDataURL();
166 params->history_url_for_data_url = entry.GetVirtualURL(); 111 params->history_url_for_data_url = entry.GetVirtualURL();
167 } 112 }
168 params->should_replace_current_entry = entry.should_replace_entry(); 113 params->should_replace_current_entry = entry.should_replace_entry();
169 // This is used by the old performance infrastructure to set up DocumentState 114 // This is used by the old performance infrastructure to set up DocumentState
170 // associated with the RenderView. 115 // associated with the RenderView.
171 // TODO(ppi): make it go away. 116 // TODO(ppi): make it go away.
172 params->request_time = base::Time::Now(); 117 params->request_time = base::Time::Now();
173 params->transferred_request_child_id = 118 params->transferred_request_child_id =
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 base::TimeTicks navigation_start = base::TimeTicks::Now(); 341 base::TimeTicks navigation_start = base::TimeTicks::Now();
397 342
398 RenderFrameHostManager* manager = 343 RenderFrameHostManager* manager =
399 render_frame_host->frame_tree_node()->render_manager(); 344 render_frame_host->frame_tree_node()->render_manager();
400 345
401 // PlzNavigate: the RenderFrameHosts are no longer asked to navigate. 346 // PlzNavigate: the RenderFrameHosts are no longer asked to navigate.
402 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 347 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
403 switches::kEnableBrowserSideNavigation)) { 348 switches::kEnableBrowserSideNavigation)) {
404 navigation_data_.reset(new NavigationMetricsData( 349 navigation_data_.reset(new NavigationMetricsData(
405 navigation_start, entry.GetURL(), entry.restore_type())); 350 navigation_start, entry.GetURL(), entry.restore_type()));
406 return RequestNavigation(render_frame_host->frame_tree_node(), 351 RequestNavigation(render_frame_host->frame_tree_node(),
407 entry, 352 entry,
408 reload_type, 353 reload_type,
409 navigation_start); 354 navigation_start);
355 return true;
410 } 356 }
411 357
412 RenderFrameHostImpl* dest_render_frame_host = manager->Navigate(entry); 358 RenderFrameHostImpl* dest_render_frame_host = manager->Navigate(entry);
413 if (!dest_render_frame_host) 359 if (!dest_render_frame_host)
414 return false; // Unable to create the desired RenderFrameHost. 360 return false; // Unable to create the desired RenderFrameHost.
415 361
416 // Make sure no code called via RFHM::Navigate clears the pending entry. 362 // Make sure no code called via RFHM::Navigate clears the pending entry.
417 CHECK_EQ(controller_->GetPendingEntry(), &entry); 363 CHECK_EQ(controller_->GetPendingEntry(), &entry);
418 364
419 // For security, we should never send non-Web-UI URLs to a Web UI renderer. 365 // For security, we should never send non-Web-UI URLs to a Web UI renderer.
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 667
722 // Navigations in Web UI pages count as browser-initiated navigations. 668 // Navigations in Web UI pages count as browser-initiated navigations.
723 params.is_renderer_initiated = false; 669 params.is_renderer_initiated = false;
724 } 670 }
725 671
726 if (delegate_) 672 if (delegate_)
727 delegate_->RequestOpenURL(render_frame_host, params); 673 delegate_->RequestOpenURL(render_frame_host, params);
728 } 674 }
729 675
730 // PlzNavigate 676 // PlzNavigate
731 void NavigatorImpl::OnBeginNavigation( 677 void NavigatorImpl::OnBeforeUnloadACK(FrameTreeNode* frame_tree_node,
732 FrameTreeNode* frame_tree_node, 678 bool proceed) {
733 const FrameHostMsg_BeginNavigation_Params& params,
734 const CommonNavigationParams& common_params) {
735 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 679 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
736 switches::kEnableBrowserSideNavigation)); 680 switches::kEnableBrowserSideNavigation));
737 DCHECK(frame_tree_node); 681 DCHECK(frame_tree_node);
738 682
739 NavigationRequest* navigation_request = 683 NavigationRequest* navigation_request =
740 navigation_request_map_.get(frame_tree_node->frame_tree_node_id()); 684 navigation_request_map_.get(frame_tree_node->frame_tree_node_id());
741 685
742 if (!navigation_request) { 686 // The NavigationRequest may have been canceled while the renderer was
743 // This is a renderer initiated navigation, so generate a new 687 // executing the BeforeUnload event.
744 // NavigationRequest and store it in the map. 688 if (!navigation_request)
745 // TODO(clamy): Check if some PageState should be provided here. 689 return;
746 // TODO(clamy): See how we should handle override of the user agent when the
747 // navigation may start in a renderer and commit in another one.
748 // TODO(clamy): See if the navigation start time should be measured in the
749 // renderer and sent to the browser instead of being measured here.
750 scoped_ptr<NavigationRequest> scoped_request(new NavigationRequest(
751 frame_tree_node, common_params,
752 CommitNavigationParams(PageState(), false, base::TimeTicks::Now()),
753 nullptr));
754 navigation_request = scoped_request.get();
755 navigation_request_map_.set(
756 frame_tree_node->frame_tree_node_id(), scoped_request.Pass());
757 690
758 if (frame_tree_node->IsMainFrame()) 691 DCHECK_EQ(NavigationRequest::WAITING_FOR_RENDERER_RESPONSE,
759 navigation_data_.reset(); 692 navigation_request->state());
760 }
761 DCHECK(navigation_request);
762 693
763 // Update the referrer with the one received from the renderer. 694 if (proceed)
764 navigation_request->common_params().referrer = common_params.referrer; 695 BeginNavigation(frame_tree_node);
765 696 else
766 scoped_ptr<NavigationRequestInfo> info(new NavigationRequestInfo(params)); 697 CancelNavigation(frame_tree_node);
767
768 info->first_party_for_cookies =
769 frame_tree_node->IsMainFrame()
770 ? navigation_request->common_params().url
771 : frame_tree_node->frame_tree()->root()->current_url();
772 info->is_main_frame = frame_tree_node->IsMainFrame();
773 info->parent_is_main_frame = !frame_tree_node->parent() ?
774 false : frame_tree_node->parent()->IsMainFrame();
775
776 // First start the request on the IO thread.
777 navigation_request->BeginNavigation(info.Pass(), params.request_body);
778
779 // Then notify the RenderFrameHostManager so it can speculatively create a
780 // RenderFrameHost (and potentially a new renderer process) in parallel.
781 frame_tree_node->render_manager()->BeginNavigation(*navigation_request);
782 } 698 }
783 699
784 // PlzNavigate 700 // PlzNavigate
701 void NavigatorImpl::OnBeginNavigation(
702 FrameTreeNode* frame_tree_node,
703 const CommonNavigationParams& common_params,
704 const BeginNavigationParams& begin_params,
705 scoped_refptr<ResourceRequestBody> body) {
706 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
707 switches::kEnableBrowserSideNavigation));
708 DCHECK(frame_tree_node);
709
710 // This is a renderer-initiated navigation, so generate a new
711 // NavigationRequest and store it in the map.
712 // TODO(clamy): Renderer-initiated navigations should not always cancel the
713 // current one.
714 scoped_ptr<NavigationRequest> navigation_request =
715 NavigationRequest::CreateRendererInitiated(
716 frame_tree_node, common_params, begin_params, body);
717 navigation_request_map_.set(
718 frame_tree_node->frame_tree_node_id(), navigation_request.Pass());
719
720 if (frame_tree_node->IsMainFrame())
721 navigation_data_.reset();
722
723 BeginNavigation(frame_tree_node);
724 }
725
726 // PlzNavigate
785 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node, 727 void NavigatorImpl::CommitNavigation(FrameTreeNode* frame_tree_node,
786 ResourceResponse* response, 728 ResourceResponse* response,
787 scoped_ptr<StreamHandle> body) { 729 scoped_ptr<StreamHandle> body) {
788 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 730 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
789 switches::kEnableBrowserSideNavigation)); 731 switches::kEnableBrowserSideNavigation));
790 732
791 // HTTP 204 (No Content) and HTTP 205 (Reset Content) responses should not 733 // HTTP 204 (No Content) and HTTP 205 (Reset Content) responses should not
792 // commit; they leave the frame showing the previous page. 734 // commit; they leave the frame showing the previous page.
793 if (response->head.headers.get() && 735 if (response->head.headers.get() &&
794 (response->head.headers->response_code() == 204 || 736 (response->head.headers->response_code() == 204 ||
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 controller_->GetBrowserContext(), url); 816 controller_->GetBrowserContext(), url);
875 if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) && 817 if ((enabled_bindings & BINDINGS_POLICY_WEB_UI) &&
876 !is_allowed_in_web_ui_renderer) { 818 !is_allowed_in_web_ui_renderer) {
877 // Log the URL to help us diagnose any future failures of this CHECK. 819 // Log the URL to help us diagnose any future failures of this CHECK.
878 GetContentClient()->SetActiveURL(url); 820 GetContentClient()->SetActiveURL(url);
879 CHECK(0); 821 CHECK(0);
880 } 822 }
881 } 823 }
882 824
883 // PlzNavigate 825 // PlzNavigate
884 bool NavigatorImpl::RequestNavigation( 826 void NavigatorImpl::RequestNavigation(
885 FrameTreeNode* frame_tree_node, 827 FrameTreeNode* frame_tree_node,
886 const NavigationEntryImpl& entry, 828 const NavigationEntryImpl& entry,
887 NavigationController::ReloadType reload_type, 829 NavigationController::ReloadType reload_type,
888 base::TimeTicks navigation_start) { 830 base::TimeTicks navigation_start) {
889 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 831 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
890 switches::kEnableBrowserSideNavigation)); 832 switches::kEnableBrowserSideNavigation));
891 DCHECK(frame_tree_node); 833 DCHECK(frame_tree_node);
892 int64 frame_tree_node_id = frame_tree_node->frame_tree_node_id(); 834 int64 frame_tree_node_id = frame_tree_node->frame_tree_node_id();
893 FrameMsg_Navigate_Type::Value navigation_type = 835 FrameMsg_Navigate_Type::Value navigation_type =
894 GetNavigationType(controller_->GetBrowserContext(), entry, reload_type); 836 GetNavigationType(controller_->GetBrowserContext(), entry, reload_type);
895 scoped_ptr<NavigationRequest> navigation_request = NavigationRequest::Create( 837 scoped_ptr<NavigationRequest> navigation_request =
896 frame_tree_node, entry, navigation_type, navigation_start); 838 NavigationRequest::CreateBrowserInitiated(
897 RequestNavigationParams request_params(entry.GetHasPostData(), 839 frame_tree_node, entry, navigation_type, navigation_start);
898 entry.extra_headers(),
899 entry.GetBrowserInitiatedPostData());
900 // TODO(clamy): Check if navigations are blocked and if so store the 840 // TODO(clamy): Check if navigations are blocked and if so store the
901 // parameters. 841 // parameters.
902 842
903 // If there is an ongoing request, replace it. 843 // If there is an ongoing request, replace it.
904 navigation_request_map_.set(frame_tree_node_id, navigation_request.Pass()); 844 navigation_request_map_.set(frame_tree_node_id, navigation_request.Pass());
905 845
906 if (frame_tree_node->current_frame_host()->IsRenderFrameLive()) { 846 // Have the current renderer execute its beforeUnload event if needed. If it
907 NavigationRequest* request_to_send = 847 // is not needed (eg. the renderer is not live), BeginNavigation should get
908 navigation_request_map_.get(frame_tree_node_id); 848 // called.
909 frame_tree_node->current_frame_host()->Send(new FrameMsg_RequestNavigation( 849 NavigationRequest* request_to_send =
910 frame_tree_node->current_frame_host()->GetRoutingID(), 850 navigation_request_map_.get(frame_tree_node_id);
911 request_to_send->common_params(), request_params)); 851 request_to_send->SetWaitingForRendererResponse();
912 request_to_send->SetWaitingForRendererResponse(); 852 frame_tree_node->current_frame_host()->DispatchBeforeUnload(true);
913 return true; 853 }
914 }
915 854
916 // The navigation request is sent directly to the IO thread. 855 void NavigatorImpl::BeginNavigation(FrameTreeNode* frame_tree_node) {
917 OnBeginNavigation( 856 NavigationRequest* navigation_request =
918 frame_tree_node, 857 navigation_request_map_.get(frame_tree_node->frame_tree_node_id());
919 MakeDefaultBeginNavigation(request_params, navigation_type), 858
920 navigation_request_map_.get(frame_tree_node_id)->common_params()); 859 // A browser-initiated navigation could have been cancelled while it was
921 return true; 860 // waiting for the BeforeUnload event to execute.
861 if (!navigation_request)
862 return;
863
864 // First start the request on the IO thread.
865 navigation_request->BeginNavigation();
866
867 // Then notify the RenderFrameHostManager so it can speculatively create a
868 // RenderFrameHost (and potentially a new renderer process) in parallel.
869 frame_tree_node->render_manager()->BeginNavigation(*navigation_request);
922 } 870 }
923 871
924 void NavigatorImpl::RecordNavigationMetrics( 872 void NavigatorImpl::RecordNavigationMetrics(
925 const LoadCommittedDetails& details, 873 const LoadCommittedDetails& details,
926 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, 874 const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
927 SiteInstance* site_instance) { 875 SiteInstance* site_instance) {
928 DCHECK(site_instance->HasProcess()); 876 DCHECK(site_instance->HasProcess());
929 877
930 if (!details.is_in_page) 878 if (!details.is_in_page)
931 RecordAction(base::UserMetricsAction("FrameLoad")); 879 RecordAction(base::UserMetricsAction("FrameLoad"));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 "Navigation.TimeToCommit_ExistingRenderer_BeforeUnloadDiscounted", 917 "Navigation.TimeToCommit_ExistingRenderer_BeforeUnloadDiscounted",
970 time_to_commit); 918 time_to_commit);
971 UMA_HISTOGRAM_TIMES( 919 UMA_HISTOGRAM_TIMES(
972 "Navigation.TimeToURLJobStart_ExistingRenderer_BeforeUnloadDiscounted", 920 "Navigation.TimeToURLJobStart_ExistingRenderer_BeforeUnloadDiscounted",
973 time_to_network); 921 time_to_network);
974 } 922 }
975 navigation_data_.reset(); 923 navigation_data_.reset();
976 } 924 }
977 925
978 } // namespace content 926 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigator_impl.h ('k') | content/browser/frame_host/navigator_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698