Chromium Code Reviews| Index: chrome/browser/net/predictor_tab_helper.cc |
| diff --git a/chrome/browser/net/predictor_tab_helper.cc b/chrome/browser/net/predictor_tab_helper.cc |
| index 20f4157dc7a7f79007760e8283694255455f9516..5cf75e2ddebce06c23cab7b1bd38248ecce07cdb 100644 |
| --- a/chrome/browser/net/predictor_tab_helper.cc |
| +++ b/chrome/browser/net/predictor_tab_helper.cc |
| @@ -5,11 +5,18 @@ |
| #include "chrome/browser/net/predictor_tab_helper.h" |
| #include "base/feature_list.h" |
| +#include "base/trace_event/trace_event.h" |
| +#include "chrome/browser/net/prediction_options.h" |
| #include "chrome/browser/net/predictor.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/url_constants.h" |
| +#include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/navigation_handle.h" |
| +#include "content/public/browser/render_process_host.h" |
| +#include "content/public/browser/service_worker_context.h" |
| +#include "content/public/browser/storage_partition.h" |
| #include "content/public/common/browser_side_navigation_policy.h" |
| +#include "content/public/common/content_features.h" |
| #if defined(OS_CHROMEOS) |
| #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| @@ -30,14 +37,16 @@ const base::Feature kPreconnectMore{"PreconnectMore", |
| PredictorTabHelper::PredictorTabHelper(content::WebContents* web_contents) |
| : content::WebContentsObserver(web_contents), |
| - predicted_from_pending_entry_(false) { |
| -} |
| + predicted_from_pending_entry_(false), |
| + weak_factory_(this) {} |
| PredictorTabHelper::~PredictorTabHelper() { |
| } |
| void PredictorTabHelper::DidStartNavigation( |
| content::NavigationHandle* navigation_handle) { |
| + TRACE_EVENT1("net", "PredictorTabHelper::DidStartNavigation", "url", |
| + navigation_handle->GetURL().spec()); |
| if (!base::FeatureList::IsEnabled(kPreconnectMore) && |
| (!content::IsBrowserSideNavigationEnabled() || |
| navigation_handle->IsRendererInitiated())) |
| @@ -49,19 +58,21 @@ void PredictorTabHelper::DidStartNavigation( |
| predicted_from_pending_entry_ = false; |
| return; |
| } |
| - PreconnectUrl(navigation_handle->GetURL()); |
| + HandleNavigation(navigation_handle->GetURL()); |
| } |
| void PredictorTabHelper::DidStartNavigationToPendingEntry( |
| const GURL& url, |
| content::ReloadType reload_type) { |
| + TRACE_EVENT1("net", "PredictorTabHelper::DidStartNavigationToPendingEntry", |
| + "url", url.spec()); |
| // This method isn't needed with PlzNavigate (see comment in header for |
| // predicted_from_pending_entry_) |
| if (content::IsBrowserSideNavigationEnabled()) |
| return; |
| // The standard way to preconnect based on navigation. |
| - PreconnectUrl(url); |
| + HandleNavigation(url); |
| predicted_from_pending_entry_ = true; |
| } |
| @@ -77,12 +88,54 @@ void PredictorTabHelper::DocumentOnLoadCompletedInMainFrame() { |
| predictor->SaveStateForNextStartup(); |
| } |
| -void PredictorTabHelper::PreconnectUrl(const GURL& url) { |
| +void PredictorTabHelper::HandleNavigation(const GURL& url) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + TRACE_EVENT1("net", "PredictorTabHelper::HandleNavigation", "url", |
| + url.spec()); |
| + if (!url.SchemeIsHTTPOrHTTPS()) |
| + return; |
| + content::RenderProcessHost* host = web_contents()->GetRenderProcessHost(); |
| + NetworkPredictionOptionsForServiceWorker options = |
| + GetNetworkPredictionOptionsForServiceWorker(); |
| + if (!host || |
| + options == NetworkPredictionOptionsForServiceWorker::PRECONNECT_ONLY) { |
| + PreconnectUrlWithPredictor(url); |
| + return; |
| + } |
| + |
| + host->GetStoragePartition() |
| + ->GetServiceWorkerContext() |
| + ->StartServiceWorkerForNavigationPreconnect( |
| + url, host, |
| + base::Bind( |
| + &PredictorTabHelper::DidStartServiceWorkerForNavigaionPreconnect, |
| + weak_factory_.GetWeakPtr(), url)); |
| + if (options == NetworkPredictionOptionsForServiceWorker:: |
| + START_SERVICE_WORKER_AND_PRECONNECT) { |
| + PreconnectUrlWithPredictor(url); |
| + } |
| +} |
| + |
| +void PredictorTabHelper::DidStartServiceWorkerForNavigaionPreconnect( |
| + const GURL& url, |
| + bool success) { |
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| + TRACE_EVENT1("net", "PredictorTabHelper::DidStartServiceWorkerForPreconnect", |
| + "success", success); |
| + if (!success || GetNetworkPredictionOptionsForServiceWorker() == |
|
kinuko
2017/06/01 05:31:28
Wouldn't this trigger PreconnectUrlWithPredictor t
horo
2017/06/01 05:52:54
Done.
|
| + NetworkPredictionOptionsForServiceWorker:: |
| + START_SERVICE_WORKER_AND_DEFER_PRECONNECT) { |
| + PreconnectUrlWithPredictor(url); |
| + } |
| +} |
| + |
| +void PredictorTabHelper::PreconnectUrlWithPredictor(const GURL& url) { |
| Profile* profile = |
| Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| Predictor* predictor(profile->GetNetworkPredictor()); |
| - if (predictor && url.SchemeIsHTTPOrHTTPS()) |
| - predictor->PreconnectUrlAndSubresources(url, GURL()); |
| + if (!predictor) |
| + return; |
| + predictor->PreconnectUrlAndSubresources(url, GURL()); |
| } |
| } // namespace chrome_browser_net |