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

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

Issue 2857213005: PlzNavigate: implement process reuse for ServiceWorkers (Closed)
Patch Set: 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"
(...skipping 25 matching lines...) Expand all
36 #include "content/public/common/url_constants.h" 36 #include "content/public/common/url_constants.h"
37 #include "net/base/net_errors.h" 37 #include "net/base/net_errors.h"
38 #include "net/url_request/redirect_info.h" 38 #include "net/url_request/redirect_info.h"
39 #include "url/gurl.h" 39 #include "url/gurl.h"
40 #include "url/url_constants.h" 40 #include "url/url_constants.h"
41 41
42 namespace content { 42 namespace content {
43 43
44 namespace { 44 namespace {
45 45
46 const int kInvalidRenderProcessHostId = -1;
Charlie Reis 2017/05/15 03:41:52 We should use ChildProcessHost::kInvalidUniqueID w
clamy 2017/05/16 14:50:45 Done.
47
46 void UpdateThrottleCheckResult( 48 void UpdateThrottleCheckResult(
47 NavigationThrottle::ThrottleCheckResult* to_update, 49 NavigationThrottle::ThrottleCheckResult* to_update,
48 NavigationThrottle::ThrottleCheckResult result) { 50 NavigationThrottle::ThrottleCheckResult result) {
49 *to_update = result; 51 *to_update = result;
50 } 52 }
51 53
52 void NotifyAbandonedTransferNavigation(const GlobalRequestID& id) { 54 void NotifyAbandonedTransferNavigation(const GlobalRequestID& id) {
53 DCHECK_CURRENTLY_ON(BrowserThread::IO); 55 DCHECK_CURRENTLY_ON(BrowserThread::IO);
54 if (ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get()) 56 if (ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get())
55 rdh->CancelRequest(id.child_id, id.request_id); 57 rdh->CancelRequest(id.child_id, id.request_id);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 should_replace_current_entry_(false), 114 should_replace_current_entry_(false),
113 redirect_chain_(redirect_chain), 115 redirect_chain_(redirect_chain),
114 is_download_(false), 116 is_download_(false),
115 is_stream_(false), 117 is_stream_(false),
116 started_from_context_menu_(started_from_context_menu), 118 started_from_context_menu_(started_from_context_menu),
117 reload_type_(ReloadType::NONE), 119 reload_type_(ReloadType::NONE),
118 restore_type_(RestoreType::NONE), 120 restore_type_(RestoreType::NONE),
119 navigation_type_(NAVIGATION_TYPE_UNKNOWN), 121 navigation_type_(NAVIGATION_TYPE_UNKNOWN),
120 should_check_main_world_csp_(should_check_main_world_csp), 122 should_check_main_world_csp_(should_check_main_world_csp),
121 is_form_submission_(is_form_submission), 123 is_form_submission_(is_form_submission),
124 speculative_render_process_host_id_(kInvalidRenderProcessHostId),
125 should_inform_process_on_redirects_(false),
122 weak_factory_(this) { 126 weak_factory_(this) {
123 TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this, 127 TRACE_EVENT_ASYNC_BEGIN2("navigation", "NavigationHandle", this,
124 "frame_tree_node", 128 "frame_tree_node",
125 frame_tree_node_->frame_tree_node_id(), "url", 129 frame_tree_node_->frame_tree_node_id(), "url",
126 url_.possibly_invalid_spec()); 130 url_.possibly_invalid_spec());
127 DCHECK(!navigation_start.is_null()); 131 DCHECK(!navigation_start.is_null());
128 if (redirect_chain_.empty()) 132 if (redirect_chain_.empty())
129 redirect_chain_.push_back(url); 133 redirect_chain_.push_back(url);
130 134
131 starting_site_instance_ = 135 starting_site_instance_ =
(...skipping 27 matching lines...) Expand all
159 navigation_start, "Initial URL", url_.spec()); 163 navigation_start, "Initial URL", url_.spec());
160 } 164 }
161 165
162 if (is_same_page_) { 166 if (is_same_page_) {
163 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 167 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
164 "Same document"); 168 "Same document");
165 } 169 }
166 } 170 }
167 171
168 NavigationHandleImpl::~NavigationHandleImpl() { 172 NavigationHandleImpl::~NavigationHandleImpl() {
173 // Inform the RenderProcessHost to no longer expect a navigation.
174 if (speculative_render_process_host_id_ != kInvalidRenderProcessHostId) {
175 RenderProcessHost* process =
176 RenderProcessHost::FromID(speculative_render_process_host_id_);
177 if (process) {
178 RenderProcessHostImpl::RemoveExpectedNavigationToSite(
179 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
180 process, url_);
181 }
182 }
183
169 // Transfer requests that have not matched up with another navigation request 184 // 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 185 // 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. 186 // the RDHI, so they do not get cancelled when frames are destroyed.
172 if (is_transferring()) { 187 if (is_transferring()) {
173 BrowserThread::PostTask( 188 BrowserThread::PostTask(
174 BrowserThread::IO, FROM_HERE, 189 BrowserThread::IO, FROM_HERE,
175 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID())); 190 base::Bind(&NotifyAbandonedTransferNavigation, GetGlobalRequestID()));
176 } 191 }
177 192
178 if (!IsRendererDebugURL(url_)) 193 if (!IsRendererDebugURL(url_))
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 const std::string& new_method, 596 const std::string& new_method,
582 const GURL& new_referrer_url, 597 const GURL& new_referrer_url,
583 bool new_is_external_protocol, 598 bool new_is_external_protocol,
584 scoped_refptr<net::HttpResponseHeaders> response_headers, 599 scoped_refptr<net::HttpResponseHeaders> response_headers,
585 net::HttpResponseInfo::ConnectionInfo connection_info, 600 net::HttpResponseInfo::ConnectionInfo connection_info,
586 const ThrottleChecksFinishedCallback& callback) { 601 const ThrottleChecksFinishedCallback& callback) {
587 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this, 602 TRACE_EVENT_ASYNC_STEP_INTO1("navigation", "NavigationHandle", this,
588 "WillRedirectRequest", "url", 603 "WillRedirectRequest", "url",
589 new_url.possibly_invalid_spec()); 604 new_url.possibly_invalid_spec());
590 605
606 // Update the speculative process when the redirect is cross-site.
607 BrowserContext* browser_context =
608 frame_tree_node_->navigator()->GetController()->GetBrowserContext();
609 GURL old_site = SiteInstance::GetSiteForURL(browser_context, url_);
610 GURL new_site = SiteInstance::GetSiteForURL(browser_context, new_url);
611 if (speculative_render_process_host_id_ != kInvalidRenderProcessHostId &&
612 old_site != new_site) {
613 RenderProcessHost* process =
614 RenderProcessHost::FromID(speculative_render_process_host_id_);
615 if (process) {
616 RenderProcessHostImpl::RemoveExpectedNavigationToSite(browser_context,
617 process, url_);
618 if (should_inform_process_on_redirects_) {
619 RenderProcessHostImpl::AddExpectedNavigationToSite(browser_context,
620 process, new_url);
621 } else {
622 speculative_render_process_host_id_ = kInvalidRenderProcessHostId;
nasko 2017/05/05 05:21:59 Shouldn't speculative_render_process_host_id_ be c
clamy 2017/05/05 15:10:11 Not in renderer-initiated navigations: we match th
Charlie Reis 2017/05/15 03:41:52 Yes, the confusion here is part of my concern. Se
clamy 2017/05/15 15:21:15 The problem with that is that we don't execute RFH
Charlie Reis 2017/05/15 23:46:18 Can you put some more detail on this redirect case
clamy 2017/05/16 14:50:45 I am now tracking the site url and updating it fro
clamy 2017/05/16 14:50:45 Ok I'll update the design doc so we can follow up
623 }
624 }
625 }
626
591 // Update the navigation parameters. 627 // Update the navigation parameters.
592 url_ = new_url; 628 url_ = new_url;
593 method_ = new_method; 629 method_ = new_method;
594 630
595 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) { 631 if (!(transition_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT)) {
596 sanitized_referrer_.url = new_referrer_url; 632 sanitized_referrer_.url = new_referrer_url;
597 sanitized_referrer_ = 633 sanitized_referrer_ =
598 Referrer::SanitizeForRequest(url_, sanitized_referrer_); 634 Referrer::SanitizeForRequest(url_, sanitized_referrer_);
599 } 635 }
600 636
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 710
675 void NavigationHandleImpl::ReadyToCommitNavigation( 711 void NavigationHandleImpl::ReadyToCommitNavigation(
676 RenderFrameHostImpl* render_frame_host) { 712 RenderFrameHostImpl* render_frame_host) {
677 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 713 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
678 "ReadyToCommitNavigation"); 714 "ReadyToCommitNavigation");
679 715
680 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); 716 DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host);
681 render_frame_host_ = render_frame_host; 717 render_frame_host_ = render_frame_host;
682 state_ = READY_TO_COMMIT; 718 state_ = READY_TO_COMMIT;
683 719
720 if (IsBrowserSideNavigationEnabled()) {
721 // Update the processes about expected navigations if the speculative
722 // RenderFrameHost changed.
723 RenderProcessHost* final_process = render_frame_host->GetProcess();
724 bool should_inform_final_process =
725 speculative_render_process_host_id_ == kInvalidRenderProcessHostId;
726
727 if (speculative_render_process_host_id_ != kInvalidRenderProcessHostId) {
Charlie Reis 2017/05/15 03:41:52 nit: Redundant with should_inform_final_process
clamy 2017/05/16 14:50:45 I have removed this part in favor of calling SetSp
728 RenderProcessHost* process =
729 RenderProcessHost::FromID(speculative_render_process_host_id_);
730 should_inform_final_process = final_process != process;
731 if (process && final_process != process) {
732 RenderProcessHostImpl::RemoveExpectedNavigationToSite(
733 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
734 process, url_);
735 }
736 }
737
738 if (should_inform_final_process) {
739 RenderProcessHostImpl::AddExpectedNavigationToSite(
740 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
741 final_process, url_);
742 speculative_render_process_host_id_ = final_process->GetID();
743 }
744 DCHECK_EQ(speculative_render_process_host_id_, final_process->GetID());
745 }
746
684 if (!IsRendererDebugURL(url_) && !IsSameDocument()) 747 if (!IsRendererDebugURL(url_) && !IsSameDocument())
685 GetDelegate()->ReadyToCommitNavigation(this); 748 GetDelegate()->ReadyToCommitNavigation(this);
686 } 749 }
687 750
688 void NavigationHandleImpl::DidCommitNavigation( 751 void NavigationHandleImpl::DidCommitNavigation(
689 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, 752 const FrameHostMsg_DidCommitProvisionalLoad_Params& params,
690 bool navigation_entry_committed, 753 bool navigation_entry_committed,
691 bool did_replace_entry, 754 bool did_replace_entry,
692 const GURL& previous_url, 755 const GURL& previous_url,
693 NavigationType navigation_type, 756 NavigationType navigation_type,
(...skipping 25 matching lines...) Expand all
719 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 782 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
720 "DidCommitNavigation: error page"); 783 "DidCommitNavigation: error page");
721 state_ = DID_COMMIT_ERROR_PAGE; 784 state_ = DID_COMMIT_ERROR_PAGE;
722 } else { 785 } else {
723 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, 786 TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
724 "DidCommitNavigation"); 787 "DidCommitNavigation");
725 state_ = DID_COMMIT; 788 state_ = DID_COMMIT;
726 } 789 }
727 } 790 }
728 791
792 void NavigationHandleImpl::SetSpeculativeProcessID(
793 int render_process_host_id,
794 bool should_inform_on_redirects) {
795 RenderProcessHost* process =
796 RenderProcessHost::FromID(render_process_host_id);
797 if (!process)
Charlie Reis 2017/05/15 03:41:52 This seems like it should be an error, rather than
clamy 2017/05/16 14:50:45 This function now takes the RenderProcessHost and
798 return;
799 RenderProcessHostImpl::AddExpectedNavigationToSite(
800 frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
801 process, url_);
802 speculative_render_process_host_id_ = render_process_host_id;
803 should_inform_process_on_redirects_ = should_inform_on_redirects;
804 }
805
729 void NavigationHandleImpl::Transfer() { 806 void NavigationHandleImpl::Transfer() {
730 DCHECK(!IsBrowserSideNavigationEnabled()); 807 DCHECK(!IsBrowserSideNavigationEnabled());
731 // This is an actual transfer. Inform the NavigationResourceThrottle. This 808 // This is an actual transfer. Inform the NavigationResourceThrottle. This
732 // will allow to mark the URLRequest as transferring. When it is marked as 809 // 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 810 // transferring, the URLRequest can no longer be cancelled by its original
734 // RenderFrame. Instead it will persist until being picked up by the transfer 811 // RenderFrame. Instead it will persist until being picked up by the transfer
735 // RenderFrame, even if the original RenderFrame is destroyed. 812 // RenderFrame, even if the original RenderFrame is destroyed.
736 // Note: |transfer_callback_| can be null in unit tests. 813 // Note: |transfer_callback_| can be null in unit tests.
737 if (!transfer_callback_.is_null()) 814 if (!transfer_callback_.is_null())
738 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_); 815 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, transfer_callback_);
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 if (node->current_url().EqualsIgnoringRef(url_)) { 1124 if (node->current_url().EqualsIgnoringRef(url_)) {
1048 if (found_self_reference) 1125 if (found_self_reference)
1049 return true; 1126 return true;
1050 found_self_reference = true; 1127 found_self_reference = true;
1051 } 1128 }
1052 } 1129 }
1053 return false; 1130 return false;
1054 } 1131 }
1055 1132
1056 } // namespace content 1133 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698