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

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

Issue 2857213005: PlzNavigate: implement process reuse for ServiceWorkers (Closed)
Patch Set: Addressed comments + fixed tests Created 3 years, 7 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/navigation_handle_impl.h" 5 #include "content/browser/frame_host/navigation_handle_impl.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "content/browser/appcache/appcache_navigation_handle.h" 10 #include "content/browser/appcache/appcache_navigation_handle.h"
11 #include "content/browser/appcache/appcache_service_impl.h" 11 #include "content/browser/appcache/appcache_service_impl.h"
12 #include "content/browser/browsing_data/clear_site_data_throttle.h" 12 #include "content/browser/browsing_data/clear_site_data_throttle.h"
13 #include "content/browser/child_process_security_policy_impl.h" 13 #include "content/browser/child_process_security_policy_impl.h"
14 #include "content/browser/devtools/render_frame_devtools_agent_host.h" 14 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
15 #include "content/browser/frame_host/ancestor_throttle.h" 15 #include "content/browser/frame_host/ancestor_throttle.h"
16 #include "content/browser/frame_host/data_url_navigation_throttle.h" 16 #include "content/browser/frame_host/data_url_navigation_throttle.h"
17 #include "content/browser/frame_host/debug_urls.h" 17 #include "content/browser/frame_host/debug_urls.h"
18 #include "content/browser/frame_host/form_submission_throttle.h" 18 #include "content/browser/frame_host/form_submission_throttle.h"
19 #include "content/browser/frame_host/frame_tree_node.h" 19 #include "content/browser/frame_host/frame_tree_node.h"
20 #include "content/browser/frame_host/mixed_content_navigation_throttle.h" 20 #include "content/browser/frame_host/mixed_content_navigation_throttle.h"
21 #include "content/browser/frame_host/navigation_controller_impl.h" 21 #include "content/browser/frame_host/navigation_controller_impl.h"
22 #include "content/browser/frame_host/navigation_entry_impl.h" 22 #include "content/browser/frame_host/navigation_entry_impl.h"
23 #include "content/browser/frame_host/navigator.h" 23 #include "content/browser/frame_host/navigator.h"
24 #include "content/browser/frame_host/navigator_delegate.h" 24 #include "content/browser/frame_host/navigator_delegate.h"
25 #include "content/browser/loader/resource_dispatcher_host_impl.h" 25 #include "content/browser/loader/resource_dispatcher_host_impl.h"
26 #include "content/browser/service_worker/service_worker_context_wrapper.h" 26 #include "content/browser/service_worker/service_worker_context_wrapper.h"
27 #include "content/browser/service_worker/service_worker_navigation_handle.h" 27 #include "content/browser/service_worker/service_worker_navigation_handle.h"
28 #include "content/common/child_process_host_impl.h"
28 #include "content/common/frame_messages.h" 29 #include "content/common/frame_messages.h"
29 #include "content/common/resource_request_body_impl.h" 30 #include "content/common/resource_request_body_impl.h"
30 #include "content/common/site_isolation_policy.h" 31 #include "content/common/site_isolation_policy.h"
31 #include "content/public/browser/content_browser_client.h" 32 #include "content/public/browser/content_browser_client.h"
32 #include "content/public/browser/navigation_ui_data.h" 33 #include "content/public/browser/navigation_ui_data.h"
33 #include "content/public/browser/site_instance.h" 34 #include "content/public/browser/site_instance.h"
34 #include "content/public/common/browser_side_navigation_policy.h" 35 #include "content/public/common/browser_side_navigation_policy.h"
35 #include "content/public/common/content_client.h" 36 #include "content/public/common/content_client.h"
36 #include "content/public/common/url_constants.h" 37 #include "content/public/common/url_constants.h"
37 #include "net/base/net_errors.h" 38 #include "net/base/net_errors.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 should_replace_current_entry_(false), 113 should_replace_current_entry_(false),
113 redirect_chain_(redirect_chain), 114 redirect_chain_(redirect_chain),
114 is_download_(false), 115 is_download_(false),
115 is_stream_(false), 116 is_stream_(false),
116 started_from_context_menu_(started_from_context_menu), 117 started_from_context_menu_(started_from_context_menu),
117 reload_type_(ReloadType::NONE), 118 reload_type_(ReloadType::NONE),
118 restore_type_(RestoreType::NONE), 119 restore_type_(RestoreType::NONE),
119 navigation_type_(NAVIGATION_TYPE_UNKNOWN), 120 navigation_type_(NAVIGATION_TYPE_UNKNOWN),
120 should_check_main_world_csp_(should_check_main_world_csp), 121 should_check_main_world_csp_(should_check_main_world_csp),
121 is_form_submission_(is_form_submission), 122 is_form_submission_(is_form_submission),
123 expected_render_process_host_id_(ChildProcessHost::kInvalidUniqueID),
122 weak_factory_(this) { 124 weak_factory_(this) {
123 TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this, 125 TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this,
124 "frame_tree_node", 126 "frame_tree_node",
125 frame_tree_node_->frame_tree_node_id(), "url", 127 frame_tree_node_->frame_tree_node_id(), "url",
126 url_.possibly_invalid_spec()); 128 url_.possibly_invalid_spec());
127 DCHECK(!navigation_start.is_null()); 129 DCHECK(!navigation_start.is_null());
130
131 site_url_ = SiteInstance::GetSiteForURL(
132 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
133 url_);
128 if (redirect_chain_.empty()) 134 if (redirect_chain_.empty())
129 redirect_chain_.push_back(url); 135 redirect_chain_.push_back(url);
130 136
131 starting_site_instance_ = 137 starting_site_instance_ =
132 frame_tree_node_->current_frame_host()->GetSiteInstance(); 138 frame_tree_node_->current_frame_host()->GetSiteInstance();
133 139
134 if (pending_nav_entry_id_) { 140 if (pending_nav_entry_id_) {
135 NavigationControllerImpl* nav_controller = 141 NavigationControllerImpl* nav_controller =
136 static_cast<NavigationControllerImpl*>( 142 static_cast<NavigationControllerImpl*>(
137 frame_tree_node_->navigator()->GetController()); 143 frame_tree_node_->navigator()->GetController());
(...skipping 21 matching lines...) Expand all
159 navigation_start, "Initial URL", url_.spec()); 165 navigation_start, "Initial URL", url_.spec());
160 } 166 }
161 167
162 if (is_same_page_) { 168 if (is_same_page_) {
163 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 169 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
164 "Same document"); 170 "Same document");
165 } 171 }
166 } 172 }
167 173
168 NavigationHandleImpl::~NavigationHandleImpl() { 174 NavigationHandleImpl::~NavigationHandleImpl() {
175 // Inform the RenderProcessHost to no longer expect a navigation.
176 if (expected_render_process_host_id_ != ChildProcessHost::kInvalidUniqueID) {
177 RenderProcessHost* process =
178 RenderProcessHost::FromID(expected_render_process_host_id_);
179 if (process) {
180 RenderProcessHostImpl::RemoveExpectedNavigationToSite(
181 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
182 process, site_url_);
183 }
184 }
185
169 // Transfer requests that have not matched up with another navigation request 186 // Transfer requests that have not matched up with another navigation request
170 // from the renderer need to be cleaned up. These are marked as protected in 187 // from the renderer need to be cleaned up. These are marked as protected in
171 // the RDHI, so they do not get cancelled when frames are destroyed. 188 // the RDHI, so they do not get cancelled when frames are destroyed.
172 if (is_transferring()) { 189 if (is_transferring()) {
173 BrowserThread::PostTask( 190 BrowserThread::PostTask(
174 BrowserThread::IO, FROM_HERE, 191 BrowserThread::IO, FROM_HERE,
175 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID())); 192 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID()));
176 } 193 }
177 194
178 if (!IsRendererDebugURL(url_)) 195 if (!IsRendererDebugURL(url_))
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 scoped_refptr<net::HttpResponseHeaders> response_headers, 601 scoped_refptr<net::HttpResponseHeaders> response_headers,
585 net::HttpResponseInfo::ConnectionInfo connection_info, 602 net::HttpResponseInfo::ConnectionInfo connection_info,
586 const ThrottleChecksFinishedCallback& callback) { 603 const ThrottleChecksFinishedCallback& callback) {
587 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this, 604 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
588 "WillRedirectRequest", "url", 605 "WillRedirectRequest", "url",
589 new_url.possibly_invalid_spec()); 606 new_url.possibly_invalid_spec());
590 607
591 // Update the navigation parameters. 608 // Update the navigation parameters.
592 url_ = new_url; 609 url_ = new_url;
593 method_ = new_method; 610 method_ = new_method;
611 UpdateSiteURL();
594 612
595 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) { 613 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) {
596 sanitized_referrer_.url = new_referrer_url; 614 sanitized_referrer_.url = new_referrer_url;
597 sanitized_referrer_ = 615 sanitized_referrer_ =
598 Referrer::SanitizeForRequest(url_, sanitized_referrer_); 616 Referrer::SanitizeForRequest(url_, sanitized_referrer_);
599 } 617 }
600 618
601 is_external_protocol_ = new_is_external_protocol; 619 is_external_protocol_ = new_is_external_protocol;
602 response_headers_ = response_headers; 620 response_headers_ = response_headers;
603 connection_info_ = connection_info; 621 connection_info_ = connection_info;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 692
675 void NavigationHandleImpl::ReadyToCommitNavigation( 693 void NavigationHandleImpl::ReadyToCommitNavigation(
676 RenderFrameHostImpl* render_frame_host) { 694 RenderFrameHostImpl* render_frame_host) {
677 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 695 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
678 "ReadyToCommitNavigation"); 696 "ReadyToCommitNavigation");
679 697
680 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); 698 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host);
681 render_frame_host_ = render_frame_host; 699 render_frame_host_ = render_frame_host;
682 state_ = READY_TO_COMMIT; 700 state_ = READY_TO_COMMIT;
683 701
702 if (IsBrowserSideNavigationEnabled())
703 SetExpectedProcess(render_frame_host->GetProcess());
704
684 if (!IsRendererDebugURL(url_) && !IsSameDocument()) 705 if (!IsRendererDebugURL(url_) && !IsSameDocument())
685 GetDelegate()->ReadyToCommitNavigation(this); 706 GetDelegate()->ReadyToCommitNavigation(this);
686 } 707 }
687 708
688 void NavigationHandleImpl::DidCommitNavigation( 709 void NavigationHandleImpl::DidCommitNavigation(
689 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, 710 const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
690 bool navigation_entry_committed, 711 bool navigation_entry_committed,
691 bool did_replace_entry, 712 bool did_replace_entry,
692 const GURL& previous_url, 713 const GURL& previous_url,
693 NavigationType navigation_type, 714 NavigationType navigation_type,
(...skipping 25 matching lines...) Expand all
719 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 740 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
720 "DidCommitNavigation: error page"); 741 "DidCommitNavigation: error page");
721 state_ = DID_COMMIT_ERROR_PAGE; 742 state_ = DID_COMMIT_ERROR_PAGE;
722 } else { 743 } else {
723 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 744 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
724 "DidCommitNavigation"); 745 "DidCommitNavigation");
725 state_ = DID_COMMIT; 746 state_ = DID_COMMIT;
726 } 747 }
727 } 748 }
728 749
750 void NavigationHandleImpl::SetExpectedProcess(
751 RenderProcessHost* expected_process) {
752 if (expected_process &&
753 expected_process->GetID() == expected_render_process_host_id_) {
754 // This |expected_process| has already been informed of the navigation,
755 // no need to update it again.
756 return;
757 }
758
759 // If a RenderProcessHost was expecting this navigation to commit, have it
760 // stop tracking this site.
761 RenderProcessHost* old_process =
762 RenderProcessHost::FromID(expected_render_process_host_id_);
763 if (old_process) {
764 RenderProcessHostImpl::RemoveExpectedNavigationToSite(
765 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
766 old_process, site_url_);
767 }
768
769 if (expected_process == nullptr) {
770 expected_render_process_host_id_ = ChildProcessHost::kInvalidUniqueID;
771 return;
772 }
773
774 // Keep track of the speculative RenderProcessHost and tell it to expect a
775 // navigation to |site_url_|.
776 expected_render_process_host_id_ = expected_process->GetID();
777 RenderProcessHostImpl::AddExpectedNavigationToSite(
778 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
779 expected_process, site_url_);
780 }
781
729 void NavigationHandleImpl::Transfer() { 782 void NavigationHandleImpl::Transfer() {
730 DCHECK(!IsBrowserSideNavigationEnabled()); 783 DCHECK(!IsBrowserSideNavigationEnabled());
731 // This is an actual transfer. Inform the NavigationResourceThrottle. This 784 // This is an actual transfer. Inform the NavigationResourceThrottle. This
732 // will allow to mark the URLRequest as transferring. When it is marked as 785 // will allow to mark the URLRequest as transferring. When it is marked as
733 // transferring, the URLRequest can no longer be cancelled by its original 786 // transferring, the URLRequest can no longer be cancelled by its original
734 // RenderFrame. Instead it will persist until being picked up by the transfer 787 // RenderFrame. Instead it will persist until being picked up by the transfer
735 // RenderFrame, even if the original RenderFrame is destroyed. 788 // RenderFrame, even if the original RenderFrame is destroyed.
736 // Note: |transfer_callback_| can be null in unit tests. 789 // Note: |transfer_callback_| can be null in unit tests.
737 if (!transfer_callback_.is_null()) 790 if (!transfer_callback_.is_null())
738 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_); 791 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 node = node->parent()) { 1099 node = node->parent()) {
1047 if (node->current_url().EqualsIgnoringRef(url_)) { 1100 if (node->current_url().EqualsIgnoringRef(url_)) {
1048 if (found_self_reference) 1101 if (found_self_reference)
1049 return true; 1102 return true;
1050 found_self_reference = true; 1103 found_self_reference = true;
1051 } 1104 }
1052 } 1105 }
1053 return false; 1106 return false;
1054 } 1107 }
1055 1108
1109 void NavigationHandleImpl::UpdateSiteURL() {
1110 GURL new_site_url = SiteInstance::GetSiteForURL(
1111 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
1112 url_);
1113 if (new_site_url == site_url_)
1114 return;
1115
1116 // When redirecting cross-site, stop telling the speculative
1117 // RenderProcessHost to expect a navigation commit.
1118 SetExpectedProcess(nullptr);
1119 site_url_ = new_site_url;
1120 }
1121
1056 } // namespace content 1122 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_handle_impl.h ('k') | content/browser/frame_host/navigation_request.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698