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

Side by Side Diff: chrome/browser/prerender/prerender_manager.cc

Issue 7605020: Move prerender histograms out of prerender manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/prerender/prerender_manager.h" 5 #include "chrome/browser/prerender/prerender_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/metrics/field_trial.h"
12 #include "base/metrics/histogram.h"
13 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/string_util.h"
14 #include "base/time.h" 13 #include "base/time.h"
15 #include "base/values.h" 14 #include "base/values.h"
16 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
17 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/favicon/favicon_tab_helper.h" 17 #include "chrome/browser/favicon/favicon_tab_helper.h"
19 #include "chrome/browser/prerender/prerender_condition.h" 18 #include "chrome/browser/prerender/prerender_condition.h"
20 #include "chrome/browser/prerender/prerender_contents.h" 19 #include "chrome/browser/prerender/prerender_contents.h"
21 #include "chrome/browser/prerender/prerender_final_status.h" 20 #include "chrome/browser/prerender/prerender_final_status.h"
21 #include "chrome/browser/prerender/prerender_histograms.h"
22 #include "chrome/browser/prerender/prerender_history.h" 22 #include "chrome/browser/prerender/prerender_history.h"
23 #include "chrome/browser/prerender/prerender_observer.h" 23 #include "chrome/browser/prerender/prerender_observer.h"
24 #include "chrome/browser/prerender/prerender_tracker.h" 24 #include "chrome/browser/prerender/prerender_tracker.h"
25 #include "chrome/browser/prerender/prerender_util.h" 25 #include "chrome/browser/prerender/prerender_util.h"
26 #include "chrome/browser/profiles/profile.h" 26 #include "chrome/browser/profiles/profile.h"
27 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 27 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
28 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" 28 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h"
29 #include "chrome/common/chrome_switches.h" 29 #include "chrome/common/chrome_switches.h"
30 #include "chrome/common/render_messages.h" 30 #include "chrome/common/render_messages.h"
31 #include "content/browser/browser_thread.h" 31 #include "content/browser/browser_thread.h"
(...skipping 29 matching lines...) Expand all
61 "OPTIONS", 61 "OPTIONS",
62 "POST", 62 "POST",
63 "TRACE", 63 "TRACE",
64 }; 64 };
65 65
66 // Length of prerender history, for display in chrome://net-internals 66 // Length of prerender history, for display in chrome://net-internals
67 const int kHistoryLength = 100; 67 const int kHistoryLength = 100;
68 68
69 } // namespace 69 } // namespace
70 70
71 // Helper macros for experiment-based and origin-based histogram reporting.
72 #define PREFIXED_HISTOGRAM(histogram) \
73 PREFIXED_HISTOGRAM_INTERNAL(GetCurrentOrigin(), GetCurrentExperimentId(), \
74 IsOriginExperimentWash(), histogram)
75
76 #define PREFIXED_HISTOGRAM_PRERENDER_MANAGER(pm, histogram) \
77 PREFIXED_HISTOGRAM_INTERNAL(pm->GetCurrentOrigin(), \
78 pm->GetCurrentExperimentId(), \
79 pm->IsOriginExperimentWash(), histogram)
80
81 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment, histogram) \
82 PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, false, histogram)
83
84 #define PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, wash, histogram) { \
85 static uint8 recording_experiment = kNoExperiment; \
86 if (recording_experiment == kNoExperiment && experiment != kNoExperiment) \
87 recording_experiment = experiment; \
88 if (wash) { \
89 histogram; \
90 } else if (experiment != kNoExperiment && \
91 (origin != ORIGIN_LINK_REL_PRERENDER || \
92 experiment != recording_experiment)) { \
93 } else if (experiment != kNoExperiment) { \
94 histogram; \
95 } else if (origin == ORIGIN_OMNIBOX) { \
96 histogram; \
97 } else { \
98 histogram; \
99 } \
100 }
101
102 class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate { 71 class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
103 public: 72 public:
104 OnCloseTabContentsDeleter(PrerenderManager* manager, 73 OnCloseTabContentsDeleter(PrerenderManager* manager,
105 TabContentsWrapper* tab) 74 TabContentsWrapper* tab)
106 : manager_(manager), 75 : manager_(manager),
107 tab_(tab) { 76 tab_(tab) {
108 tab_->tab_contents()->set_delegate(this); 77 tab_->tab_contents()->set_delegate(this);
109 } 78 }
110 79
111 virtual void CloseContents(TabContents* source) OVERRIDE { 80 virtual void CloseContents(TabContents* source) OVERRIDE {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 GURL referrer_; 165 GURL referrer_;
197 Origin origin_; 166 Origin origin_;
198 }; 167 };
199 168
200 PrerenderManager::PrerenderManager(Profile* profile, 169 PrerenderManager::PrerenderManager(Profile* profile,
201 PrerenderTracker* prerender_tracker) 170 PrerenderTracker* prerender_tracker)
202 : enabled_(true), 171 : enabled_(true),
203 profile_(profile), 172 profile_(profile),
204 prerender_tracker_(prerender_tracker), 173 prerender_tracker_(prerender_tracker),
205 prerender_contents_factory_(PrerenderContents::CreateFactory()), 174 prerender_contents_factory_(PrerenderContents::CreateFactory()),
206 last_experiment_id_(kNoExperiment),
207 last_origin_(ORIGIN_LINK_REL_PRERENDER),
208 origin_experiment_wash_(false),
209 last_prerender_start_time_(GetCurrentTimeTicks() - 175 last_prerender_start_time_(GetCurrentTimeTicks() -
210 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), 176 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)),
211 runnable_method_factory_(this), 177 runnable_method_factory_(this),
212 prerender_history_(new PrerenderHistory(kHistoryLength)) { 178 prerender_history_(new PrerenderHistory(kHistoryLength)),
179 histograms_(new PrerenderHistograms(config_.max_age)) {
dominich 2011/08/10 00:32:46 If max_age is ever changed dynamically we should r
tburkard 2011/08/10 01:05:13 Only an issue for tests, in which case histograms
dominich 2011/08/10 15:53:37 For now, but there's nothing stopping someone from
tburkard 2011/08/10 17:11:33 Ok I changed it by passing in the value into the o
213 // There are some assumptions that the PrerenderManager is on the UI thread. 180 // There are some assumptions that the PrerenderManager is on the UI thread.
214 // Any other checks simply make sure that the PrerenderManager is accessed on 181 // Any other checks simply make sure that the PrerenderManager is accessed on
215 // the same thread that it was created on. 182 // the same thread that it was created on.
216 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
217 } 184 }
218 185
219 PrerenderManager::~PrerenderManager() { 186 PrerenderManager::~PrerenderManager() {
220 DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN); 187 DestroyAllContents(FINAL_STATUS_MANAGER_SHUTDOWN);
221 STLDeleteElements(&prerender_conditions_); 188 STLDeleteElements(&prerender_conditions_);
222 } 189 }
(...skipping 23 matching lines...) Expand all
246 return AddPrerender(ORIGIN_OMNIBOX, std::make_pair(-1, -1), url, GURL()); 213 return AddPrerender(ORIGIN_OMNIBOX, std::make_pair(-1, -1), url, GURL());
247 } 214 }
248 215
249 bool PrerenderManager::AddPrerender( 216 bool PrerenderManager::AddPrerender(
250 Origin origin, 217 Origin origin,
251 const std::pair<int, int>& child_route_id_pair, 218 const std::pair<int, int>& child_route_id_pair,
252 const GURL& url_arg, 219 const GURL& url_arg,
253 const GURL& referrer) { 220 const GURL& referrer) {
254 DCHECK(CalledOnValidThread()); 221 DCHECK(CalledOnValidThread());
255 222
256 // Check if we are doing an experiment. 223 if (origin == ORIGIN_LINK_REL_PRERENDER &&
257 uint8 experiment = GetQueryStringBasedExperiment(url_arg); 224 StartsWithASCII(referrer.host(), std::string("www.google."), true)) {
dominich 2011/08/10 00:32:46 Is the referrer ever google.* without the www.?
tburkard 2011/08/10 01:05:13 No. On 2011/08/10 00:32:46, dominich wrote:
258 225 origin = ORIGIN_GWS_PRERENDER;
259 // We need to update last_experiment_id_, last_origin_, and
260 // origin_experiment_wash_.
261 if (!WithinWindow()) {
262 // If we are outside a window, this is a fresh start and we are fine,
263 // and there is no mix.
264 origin_experiment_wash_ = false;
265 } else {
266 // If we are inside the last window, there is a mish mash of origins
267 // and experiments if either there was a mish mash before, or the current
268 // experiment/origin does not match the previous one.
269 if (experiment != last_experiment_id_ || origin != last_origin_)
270 origin_experiment_wash_ = true;
271 } 226 }
272 227
273 last_origin_ = origin; 228 histograms_->RecordPrerender(origin, url_arg);
274 last_experiment_id_ = experiment;
275
276 // If we observe multiple tags within the 30 second window, we will still
277 // reset the window to begin at the most recent occurrence, so that we will
278 // always be in a window in the 30 seconds from each occurrence.
279 last_prerender_seen_time_ = GetCurrentTimeTicks();
280 229
281 // If the referring page is prerendering, defer the prerender. 230 // If the referring page is prerendering, defer the prerender.
282 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) != 231 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
283 prerender_list_.end()) { 232 prerender_list_.end()) {
284 AddPendingPrerender(origin, child_route_id_pair, url_arg, referrer); 233 AddPendingPrerender(origin, child_route_id_pair, url_arg, referrer);
285 return true; 234 return true;
286 } 235 }
287 236
288 DeleteOldEntries(); 237 DeleteOldEntries();
289 DeletePendingDeleteEntries(); 238 DeletePendingDeleteEntries();
290 239
291 GURL url = url_arg; 240 GURL url = url_arg;
292 GURL alias_url; 241 GURL alias_url;
293 if (IsControlGroup() && MaybeGetQueryStringBasedAliasURL(url, &alias_url)) { 242 if (IsControlGroup() && MaybeGetQueryStringBasedAliasURL(url, &alias_url)) {
294 url = alias_url; 243 url = alias_url;
295 } 244 }
296 245
297 if (FindEntry(url)) 246 if (FindEntry(url))
298 return false; 247 return false;
299 248
249 uint8 experiment = GetQueryStringBasedExperiment(url_arg);
250
300 // Do not prerender if there are too many render processes, and we would 251 // Do not prerender if there are too many render processes, and we would
301 // have to use an existing one. We do not want prerendering to happen in 252 // have to use an existing one. We do not want prerendering to happen in
302 // a shared process, so that we can always reliably lower the CPU 253 // a shared process, so that we can always reliably lower the CPU
303 // priority for prerendering. 254 // priority for prerendering.
304 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns 255 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns
305 // true, so that case needs to be explicitly checked for. 256 // true, so that case needs to be explicitly checked for.
306 // TODO(tburkard): Figure out how to cancel prerendering in the opposite 257 // TODO(tburkard): Figure out how to cancel prerendering in the opposite
307 // case, when a new tab is added to a process used for prerendering. 258 // case, when a new tab is added to a process used for prerendering.
308 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() && 259 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() &&
309 !RenderProcessHost::run_renderer_in_process()) { 260 !RenderProcessHost::run_renderer_in_process()) {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 CHECK(prerender_contents->GetChildId(&child_id)); 456 CHECK(prerender_contents->GetChildId(&child_id));
506 CHECK(prerender_contents->GetRouteId(&route_id)); 457 CHECK(prerender_contents->GetRouteId(&route_id));
507 458
508 // Try to set the prerendered page as used, so any subsequent attempts to 459 // Try to set the prerendered page as used, so any subsequent attempts to
509 // cancel on other threads will fail. If this fails because the prerender 460 // cancel on other threads will fail. If this fails because the prerender
510 // was already cancelled, possibly on another thread, fail. 461 // was already cancelled, possibly on another thread, fail.
511 if (!prerender_tracker_->TryUse(child_id, route_id)) 462 if (!prerender_tracker_->TryUse(child_id, route_id))
512 return false; 463 return false;
513 464
514 if (!prerender_contents->load_start_time().is_null()) 465 if (!prerender_contents->load_start_time().is_null())
515 RecordTimeUntilUsed(GetCurrentTimeTicks() - 466 histograms_->RecordTimeUntilUsed(GetCurrentTimeTicks() -
516 prerender_contents->load_start_time()); 467 prerender_contents->load_start_time());
517 468
518 PREFIXED_HISTOGRAM(UMA_HISTOGRAM_COUNTS( 469 histograms_->RecordPerSessionCount(++prerenders_per_session_count_);
519 GetDefaultHistogramName("PrerendersPerSessionCount"),
520 ++prerenders_per_session_count_));
521 prerender_contents->set_final_status(FINAL_STATUS_USED); 470 prerender_contents->set_final_status(FINAL_STATUS_USED);
522 471
523 RenderViewHost* render_view_host = 472 RenderViewHost* render_view_host =
524 prerender_contents->prerender_contents()->render_view_host(); 473 prerender_contents->prerender_contents()->render_view_host();
525 DCHECK(render_view_host); 474 DCHECK(render_view_host);
526 render_view_host->Send( 475 render_view_host->Send(
527 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); 476 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false));
528 477
529 TabContentsWrapper* new_tab_contents = 478 TabContentsWrapper* new_tab_contents =
530 prerender_contents->ReleasePrerenderContents(); 479 prerender_contents->ReleasePrerenderContents();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 598 }
650 599
651 void PrerenderManager::DeletePendingDeleteEntries() { 600 void PrerenderManager::DeletePendingDeleteEntries() {
652 while (!pending_delete_list_.empty()) { 601 while (!pending_delete_list_.empty()) {
653 PrerenderContents* contents = pending_delete_list_.front(); 602 PrerenderContents* contents = pending_delete_list_.front();
654 pending_delete_list_.pop_front(); 603 pending_delete_list_.pop_front();
655 delete contents; 604 delete contents;
656 } 605 }
657 } 606 }
658 607
659 // Helper macro for histograms.
660 #define RECORD_PLT(tag, perceived_page_load_time) { \
661 PREFIXED_HISTOGRAM_PRERENDER_MANAGER(prerender_manager, \
662 UMA_HISTOGRAM_CUSTOM_TIMES( \
663 base::FieldTrial::MakeName( \
664 prerender_manager->GetDefaultHistogramName(tag), "Prefetch"), \
665 perceived_page_load_time, \
666 base::TimeDelta::FromMilliseconds(10), \
667 base::TimeDelta::FromSeconds(60), \
668 100)); \
669 }
670
671 // static 608 // static
672 void PrerenderManager::RecordPerceivedPageLoadTime( 609 void PrerenderManager::RecordPerceivedPageLoadTime(
673 base::TimeDelta perceived_page_load_time, 610 base::TimeDelta perceived_page_load_time,
674 TabContents* tab_contents) { 611 TabContents* tab_contents) {
675 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 612 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
676 Profile* profile = 613 Profile* profile =
677 Profile::FromBrowserContext(tab_contents->browser_context()); 614 Profile::FromBrowserContext(tab_contents->browser_context());
678 PrerenderManager* prerender_manager = profile->GetPrerenderManager(); 615 PrerenderManager* prerender_manager = profile->GetPrerenderManager();
679 if (!prerender_manager) 616 if (!prerender_manager)
680 return; 617 return;
681 if (!prerender_manager->is_enabled()) 618 if (!prerender_manager->is_enabled())
682 return; 619 return;
683 bool within_window = prerender_manager->WithinWindow(); 620 bool was_prerender =
684 RECORD_PLT("PerceivedPLT", perceived_page_load_time);
685 if (within_window)
686 RECORD_PLT("PerceivedPLTWindowed", perceived_page_load_time);
687 if (prerender_manager &&
688 ((mode_ == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP && 621 ((mode_ == PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP &&
689 prerender_manager->WouldTabContentsBePrerendered(tab_contents)) || 622 prerender_manager->WouldTabContentsBePrerendered(tab_contents)) ||
690 (mode_ == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP && 623 (mode_ == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP &&
691 prerender_manager->IsTabContentsPrerendered(tab_contents)))) { 624 prerender_manager->IsTabContentsPrerendered(tab_contents)));
692 RECORD_PLT("PerceivedPLTMatched", perceived_page_load_time); 625 prerender_manager->histograms_->RecordPerceivedPageLoadTime(
693 } else { 626 perceived_page_load_time, was_prerender);
694 if (within_window)
695 RECORD_PLT("PerceivedPLTWindowNotMatched", perceived_page_load_time);
696 }
697 } 627 }
698 628
699 bool PrerenderManager::is_enabled() const { 629 bool PrerenderManager::is_enabled() const {
700 DCHECK(CalledOnValidThread()); 630 DCHECK(CalledOnValidThread());
701 if (!enabled_) 631 if (!enabled_)
702 return false; 632 return false;
703 for (std::list<const PrerenderCondition*>::const_iterator it = 633 for (std::list<const PrerenderCondition*>::const_iterator it =
704 prerender_conditions_.begin(); 634 prerender_conditions_.begin();
705 it != prerender_conditions_.end(); 635 it != prerender_conditions_.end();
706 ++it) { 636 ++it) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 bool has_route_id = has_child_id && entry->GetRouteId(&route_id); 689 bool has_route_id = has_child_id && entry->GetRouteId(&route_id);
760 690
761 // If the entry doesn't have a RenderViewHost then it didn't start 691 // If the entry doesn't have a RenderViewHost then it didn't start
762 // prerendering and there shouldn't be any pending preloads to remove. 692 // prerendering and there shouldn't be any pending preloads to remove.
763 if (has_child_id && has_route_id) { 693 if (has_child_id && has_route_id) {
764 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id); 694 std::pair<int, int> child_route_pair = std::make_pair(child_id, route_id);
765 pending_prerender_list_.erase(child_route_pair); 695 pending_prerender_list_.erase(child_route_pair);
766 } 696 }
767 } 697 }
768 698
769 bool PrerenderManager::WithinWindow() const {
770 DCHECK(CalledOnValidThread());
771 if (last_prerender_seen_time_.is_null())
772 return false;
773 base::TimeDelta elapsed_time =
774 base::TimeTicks::Now() - last_prerender_seen_time_;
775 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds);
776 }
777
778 bool PrerenderManager::DoesRateLimitAllowPrerender() const { 699 bool PrerenderManager::DoesRateLimitAllowPrerender() const {
779 DCHECK(CalledOnValidThread()); 700 DCHECK(CalledOnValidThread());
780 base::TimeDelta elapsed_time = 701 base::TimeDelta elapsed_time =
781 GetCurrentTimeTicks() - last_prerender_start_time_; 702 GetCurrentTimeTicks() - last_prerender_start_time_;
782 PREFIXED_HISTOGRAM( 703 histograms_->RecordTimeBetweenPrerenderRequests(elapsed_time);
783 UMA_HISTOGRAM_TIMES(
784 GetDefaultHistogramName("TimeBetweenPrerenderRequests"),
785 elapsed_time));
786 if (!config_.rate_limit_enabled) 704 if (!config_.rate_limit_enabled)
787 return true; 705 return true;
788 return elapsed_time > 706 return elapsed_time >
789 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); 707 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
790 } 708 }
791 709
792 void PrerenderManager::StartSchedulingPeriodicCleanups() { 710 void PrerenderManager::StartSchedulingPeriodicCleanups() {
793 DCHECK(CalledOnValidThread()); 711 DCHECK(CalledOnValidThread());
794 if (repeating_timer_.IsRunning()) 712 if (repeating_timer_.IsRunning())
795 return; 713 return;
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 void PrerenderManager::DestroyAllContents(FinalStatus final_status) { 932 void PrerenderManager::DestroyAllContents(FinalStatus final_status) {
1015 DeleteOldTabContents(); 933 DeleteOldTabContents();
1016 while (!prerender_list_.empty()) { 934 while (!prerender_list_.empty()) {
1017 PrerenderContentsData data = prerender_list_.front(); 935 PrerenderContentsData data = prerender_list_.front();
1018 prerender_list_.pop_front(); 936 prerender_list_.pop_front();
1019 data.contents_->Destroy(final_status); 937 data.contents_->Destroy(final_status);
1020 } 938 }
1021 DeletePendingDeleteEntries(); 939 DeletePendingDeleteEntries();
1022 } 940 }
1023 941
1024 void PrerenderManager::RecordTimeUntilUsed(base::TimeDelta time_until_used) {
1025 DCHECK(CalledOnValidThread());
1026 PREFIXED_HISTOGRAM(UMA_HISTOGRAM_CUSTOM_TIMES(
1027 GetDefaultHistogramName("TimeUntilUsed"),
1028 time_until_used,
1029 base::TimeDelta::FromMilliseconds(10),
1030 config_.max_age,
1031 50));
1032 }
1033
1034 void PrerenderManager::RecordFinalStatus(Origin origin, 942 void PrerenderManager::RecordFinalStatus(Origin origin,
1035 uint8 experiment_id, 943 uint8 experiment_id,
1036 FinalStatus final_status) const { 944 FinalStatus final_status) const {
1037 DCHECK(final_status != FINAL_STATUS_MAX); 945 histograms_->RecordFinalStatus(origin, experiment_id, final_status);
1038 // FINAL_STATUS_CONTROL_GROUP indicates that the PrerenderContents
1039 // was created only to measure "would-have-been-prerendered" for
1040 // control group measurements. Don't pollute data with it.
1041 if (PrerenderManager::IsControlGroup() ||
1042 final_status == FINAL_STATUS_CONTROL_GROUP)
1043 return;
1044 PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment_id,
1045 UMA_HISTOGRAM_ENUMERATION(
1046 GetHistogramName(origin, experiment_id, "FinalStatus"),
1047 final_status,
1048 FINAL_STATUS_MAX));
1049 }
1050
1051 std::string PrerenderManager::ComposeHistogramName(
1052 const std::string& prefix_type,
1053 const std::string& name) const {
1054 if (prefix_type.empty())
1055 return std::string("Prerender.") + name;
1056 return std::string("Prerender.") + prefix_type + std::string("_") + name;
1057 }
1058
1059 std::string PrerenderManager::GetHistogramName(Origin origin,
1060 uint8 experiment_id,
1061 const std::string& name) const {
1062 switch (origin) {
1063 case ORIGIN_OMNIBOX:
1064 if (experiment_id != kNoExperiment)
1065 return ComposeHistogramName("wash", name);
1066 return ComposeHistogramName("omnibox", name);
1067 case ORIGIN_LINK_REL_PRERENDER:
1068 if (experiment_id == kNoExperiment)
1069 return ComposeHistogramName("", name);
1070 return ComposeHistogramName("exp" + std::string(1, experiment_id + '0'),
1071 name);
1072 default:
1073 NOTREACHED();
1074 break;
1075 };
1076
1077 // Dummy return value to make the compiler happy.
1078 NOTREACHED();
1079 return ComposeHistogramName("wash", name);
1080 }
1081
1082 std::string PrerenderManager::GetDefaultHistogramName(
1083 const std::string& name) const {
1084 if (!WithinWindow())
1085 return ComposeHistogramName("", name);
1086 if (origin_experiment_wash_)
1087 return ComposeHistogramName("wash", name);
1088 return GetHistogramName(last_origin_, last_experiment_id_, name);
1089 }
1090
1091 uint8 PrerenderManager::GetCurrentExperimentId() const {
1092 if (!WithinWindow())
1093 return kNoExperiment;
1094 return last_experiment_id_;
1095 }
1096
1097 Origin PrerenderManager::GetCurrentOrigin() const {
1098 if (!WithinWindow())
1099 return ORIGIN_LINK_REL_PRERENDER;
1100 return last_origin_;
1101 }
1102
1103 bool PrerenderManager::IsOriginExperimentWash() const {
1104 if (!WithinWindow())
1105 return false;
1106 return origin_experiment_wash_;
1107 } 946 }
1108 947
1109 } // namespace prerender 948 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698