Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "chrome/browser/predictors/loading_predictor.h" | 5 #include "chrome/browser/predictors/loading_predictor.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/metrics/histogram_macros.h" | |
| 9 #include "chrome/browser/predictors/resource_prefetch_common.h" | |
| 8 #include "chrome/browser/predictors/resource_prefetch_predictor.h" | 10 #include "chrome/browser/predictors/resource_prefetch_predictor.h" |
| 9 | 11 |
| 10 namespace predictors { | 12 namespace predictors { |
| 11 | 13 |
| 14 using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary; | |
| 15 | |
| 12 LoadingPredictor::LoadingPredictor(const LoadingPredictorConfig& config, | 16 LoadingPredictor::LoadingPredictor(const LoadingPredictorConfig& config, |
| 13 Profile* profile) { | 17 Profile* profile) |
| 14 resource_prefetch_predictor_ = | 18 : config_(config), |
| 15 base::MakeUnique<ResourcePrefetchPredictor>(config, profile); | 19 profile_(profile), |
| 16 } | 20 resource_prefetch_predictor_( |
| 21 base::MakeUnique<ResourcePrefetchPredictor>(config, profile)) {} | |
| 17 | 22 |
| 18 LoadingPredictor::~LoadingPredictor() = default; | 23 LoadingPredictor::~LoadingPredictor() = default; |
| 19 | 24 |
| 20 void LoadingPredictor::PrepareForPageLoad(const GURL& url, HintOrigin origin) { | 25 void LoadingPredictor::PrepareForPageLoad(const GURL& url, HintOrigin origin) { |
| 21 resource_prefetch_predictor_->StartPrefetching(url, origin); | 26 // To report hint durations. |
| 27 if (active_hints_.find(url) == active_hints_.end()) | |
| 28 active_hints_.emplace(url, base::TimeTicks::Now()); | |
|
alexilin
2017/05/30 16:19:14
We used to report a hint duration only for prefetc
Benoit L
2017/05/31 14:34:41
Done.
| |
| 29 | |
| 30 if (!config_.IsPrefetchingEnabledForOrigin(profile_, origin) || | |
| 31 !resource_prefetch_predictor_->IsUrlPrefetchable(url)) { | |
|
alexilin
2017/05/30 16:19:14
nit:
There is no real need to check for IsUrlPrefe
Benoit L
2017/05/31 14:34:42
Kept the check anyway, both for tracking and also
| |
| 32 return; | |
| 33 } | |
| 34 | |
| 35 resource_prefetch_predictor_->StartPrefetching(url); | |
|
alexilin
2017/05/30 16:19:14
Should we do something if the url is already in ac
Benoit L
2017/05/31 14:34:41
Done.
| |
| 22 } | 36 } |
| 23 | 37 |
| 24 void LoadingPredictor::CancelPageLoadHint(const GURL& url) { | 38 void LoadingPredictor::CancelPageLoadHint(const GURL& url) { |
| 25 resource_prefetch_predictor_->StopPrefetching(url); | 39 auto it = active_hints_.find(url); |
| 40 CancelActiveHint(it); | |
|
alexilin
2017/05/30 16:19:14
tiny tiny nit:
Why not in one line?
CancelActiveHi
Benoit L
2017/05/31 14:34:41
Done.
| |
| 26 } | 41 } |
| 27 | 42 |
| 28 void LoadingPredictor::StartInitialization() { | 43 void LoadingPredictor::StartInitialization() { |
| 29 resource_prefetch_predictor_->StartInitialization(); | 44 resource_prefetch_predictor_->StartInitialization(); |
| 30 } | 45 } |
| 31 | 46 |
| 32 ResourcePrefetchPredictor* LoadingPredictor::resource_prefetch_predictor() | 47 ResourcePrefetchPredictor* LoadingPredictor::resource_prefetch_predictor() |
| 33 const { | 48 const { |
| 34 return resource_prefetch_predictor_.get(); | 49 return resource_prefetch_predictor_.get(); |
| 35 } | 50 } |
| 36 | 51 |
| 37 void LoadingPredictor::Shutdown() { | 52 void LoadingPredictor::Shutdown() { |
| 38 resource_prefetch_predictor_->Shutdown(); | 53 resource_prefetch_predictor_->Shutdown(); |
| 39 } | 54 } |
| 40 | 55 |
| 56 void LoadingPredictor::OnMainFrameRequest(const URLRequestSummary& summary) { | |
| 57 const NavigationID& navigation_id = summary.navigation_id; | |
| 58 CleanupAbandonedHintsAndNavigations(navigation_id); | |
| 59 active_navigations_.emplace( | |
|
alexilin
2017/05/30 11:55:27
Shouldn't it be a part of LoadingDataCollector? I'
Benoit L
2017/05/31 14:34:42
After offline discussion, decided to keep it this
| |
| 60 navigation_id, | |
| 61 std::make_pair(navigation_id.main_frame_url, base::TimeTicks::Now())); | |
|
alexilin
2017/05/30 16:19:14
The second member of the pair is unused.
You're us
Benoit L
2017/05/31 14:34:41
Done.
| |
| 62 PrepareForPageLoad(navigation_id.main_frame_url, HintOrigin::NAVIGATION); | |
| 63 } | |
| 64 | |
| 65 void LoadingPredictor::OnMainFrameRedirect(const URLRequestSummary& summary) { | |
| 66 auto it = active_navigations_.find(summary.navigation_id); | |
| 67 if (it != active_navigations_.end()) { | |
| 68 NavigationID navigation_id = summary.navigation_id; | |
| 69 navigation_id.main_frame_url = summary.redirect_url; | |
|
alexilin
2017/05/30 16:19:14
What if redirect_url == main_frame_url?
I know red
Benoit L
2017/05/31 14:34:42
That's likely filtered lower in the stack (as unle
alexilin
2017/05/31 16:02:03
Well, a redirect response could set a new cookie s
| |
| 70 active_navigations_.emplace(navigation_id, it->second); | |
| 71 active_navigations_.erase(it); | |
| 72 } | |
| 73 } | |
| 74 | |
| 75 void LoadingPredictor::OnMainFrameResponse(const URLRequestSummary& summary) { | |
| 76 const NavigationID& navigation_id = summary.navigation_id; | |
| 77 auto it = active_navigations_.find(navigation_id); | |
| 78 if (it != active_navigations_.end()) { | |
| 79 const auto& initial_url = it->second.first; | |
|
alexilin
2017/05/30 16:19:14
nit:
s/auto/GURL/ since it's the same number of ch
Benoit L
2017/05/31 14:34:42
Done.
| |
| 80 CancelPageLoadHint(initial_url); | |
| 81 active_navigations_.erase(it); | |
| 82 } else { | |
| 83 CancelPageLoadHint(navigation_id.main_frame_url); | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 std::map<GURL, base::TimeTicks>::iterator LoadingPredictor::CancelActiveHint( | |
| 88 std::map<GURL, base::TimeTicks>::iterator hint_it) { | |
| 89 if (hint_it == active_hints_.end()) | |
| 90 return hint_it; | |
| 91 | |
| 92 const GURL& url = hint_it->first; | |
| 93 resource_prefetch_predictor_->StopPrefetching(url); | |
| 94 | |
| 95 UMA_HISTOGRAM_TIMES( | |
| 96 internal::kResourcePrefetchPredictorPrefetchingDurationHistogram, | |
| 97 base::TimeTicks::Now() - hint_it->second); | |
| 98 return active_hints_.erase(hint_it); | |
| 99 } | |
| 100 | |
| 101 void LoadingPredictor::CleanupAbandonedHintsAndNavigations( | |
| 102 const NavigationID& navigation_id) { | |
| 103 base::TimeTicks time_now = base::TimeTicks::Now(); | |
| 104 const base::TimeDelta max_navigation_age = | |
| 105 base::TimeDelta::FromSeconds(config_.max_navigation_lifetime_seconds); | |
| 106 | |
| 107 // Hints. | |
| 108 for (auto it = active_hints_.begin(); it != active_hints_.end();) { | |
| 109 base::TimeDelta prefetch_age = time_now - it->second; | |
| 110 if (prefetch_age > max_navigation_age) { | |
| 111 // Will to the last bucket meaning that the duration was unlimited. | |
|
alexilin
2017/05/30 15:06:00
nit:
Delete the comment because it isn't relevant.
Benoit L
2017/05/31 14:34:41
I actually wanted to point that out, clarified the
alexilin
2017/05/31 16:02:03
s/Will to/Will go to/
Initially I was confused by
| |
| 112 it = CancelActiveHint(it); | |
| 113 } else { | |
| 114 ++it; | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 // Navigations. | |
| 119 for (auto it = active_navigations_.begin(); | |
| 120 it != active_navigations_.end();) { | |
| 121 if ((it->first.tab_id == navigation_id.tab_id) || | |
| 122 (time_now - it->first.creation_time > max_navigation_age)) { | |
| 123 const GURL& initial_url = it->second.first; | |
| 124 CancelActiveHint(active_hints_.find(initial_url)); | |
|
alexilin
2017/05/30 16:19:14
nit:
CancelPageLoadHint(initial_url) since we don'
Benoit L
2017/05/31 14:34:41
I would prefer to keep it as is to be consistent w
| |
| 125 it = active_navigations_.erase(it); | |
| 126 } else { | |
| 127 ++it; | |
| 128 } | |
| 129 } | |
| 130 } | |
| 131 | |
| 41 } // namespace predictors | 132 } // namespace predictors |
| OLD | NEW |