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

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

Issue 7289020: Updating histograms to allow for experiments & log origin-based histograms. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 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"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 "OPTIONS", 71 "OPTIONS",
72 "POST", 72 "POST",
73 "TRACE", 73 "TRACE",
74 }; 74 };
75 75
76 // Length of prerender history, for display in chrome://net-internals 76 // Length of prerender history, for display in chrome://net-internals
77 const int kHistoryLength = 100; 77 const int kHistoryLength = 100;
78 78
79 } // namespace 79 } // namespace
80 80
81 // Helper macros for experiment-based and origin-based histogram reporting.
82 #define PREFIXED_HISTOGRAM(histogram) \
83 PREFIXED_HISTOGRAM_INTERNAL(GetCurrentOrigin(), GetCurrentExperimentId(), \
84 IsOriginExperimentWash(), histogram)
85
86 #define PREFIXED_HISTOGRAM_PRERENDER_MANAGER(pm, histogram) \
87 PREFIXED_HISTOGRAM_INTERNAL(pm->GetCurrentOrigin(), \
88 pm->GetCurrentExperimentId(), \
89 pm->IsOriginExperimentWash(), histogram)
90
91 #define PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment, histogram) \
92 PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, false, histogram)
93
94 #define PREFIXED_HISTOGRAM_INTERNAL(origin, experiment, wash, histogram) { \
95 static char experiment_id = kNoExperiment; \
dominich.google 2011/06/30 19:55:15 This should be a uint8 now. If you have two histo
tburkard 2011/06/30 21:40:20 Done.
96 if (experiment_id == kNoExperiment && experiment != kNoExperiment) \
97 experiment_id = experiment; \
98 if (wash || \
99 (experiment != kNoExperiment && (origin != ORIGIN_LINK_REL_PRERENDER || \
100 experiment != experiment_id))) { \
101 histogram; \
102 } else if (experiment != kNoExperiment) { \
103 histogram; \
104 } else if (origin == ORIGIN_OMNIBOX) { \
105 histogram; \
106 } else { \
107 histogram; \
108 } \
109 }
110
81 class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate { 111 class PrerenderManager::OnCloseTabContentsDeleter : public TabContentsDelegate {
82 public: 112 public:
83 OnCloseTabContentsDeleter(PrerenderManager* manager, 113 OnCloseTabContentsDeleter(PrerenderManager* manager,
84 TabContentsWrapper* tab) 114 TabContentsWrapper* tab)
85 : manager_(manager), 115 : manager_(manager),
86 tab_(tab) { 116 tab_(tab) {
87 tab_->tab_contents()->set_delegate(this); 117 tab_->tab_contents()->set_delegate(this);
88 } 118 }
89 119
90 virtual void CloseContents(TabContents* source) OVERRIDE { 120 virtual void CloseContents(TabContents* source) OVERRIDE {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 if (!new_url.is_empty() && new_url.is_valid()) { 199 if (!new_url.is_empty() && new_url.is_valid()) {
170 *alias_url = new_url; 200 *alias_url = new_url;
171 return true; 201 return true;
172 } 202 }
173 return false; 203 return false;
174 } 204 }
175 return false; 205 return false;
176 } 206 }
177 207
178 // static 208 // static
209 uint8 PrerenderManager::GetQueryStringBasedExperiment(const GURL& url) {
210 url_parse::Parsed parsed;
211 url_parse::ParseStandardURL(url.spec().c_str(), url.spec().length(),
212 &parsed);
213 url_parse::Component query = parsed.query;
214 url_parse::Component key, value;
215 while (url_parse::ExtractQueryKeyValue(url.spec().c_str(), &query, &key,
216 &value)) {
217 if (key.len != 3 || strncmp(url.spec().c_str() + key.begin, "lpe", key.len))
218 continue;
219
220 // We found a lpe= query string component.
221 if (value.len != 1)
222 continue;
223 uint8 exp = *(url.spec().c_str() + value.begin) - '0';
224 if (exp < 1 || exp > 9)
225 continue;
226 return exp;
227 }
228 return kNoExperiment;
229 }
230
231 // static
179 bool PrerenderManager::IsValidHttpMethod(const std::string& method) { 232 bool PrerenderManager::IsValidHttpMethod(const std::string& method) {
180 // method has been canonicalized to upper case at this point so we can just 233 // method has been canonicalized to upper case at this point so we can just
181 // compare them. 234 // compare them.
182 DCHECK_EQ(method, StringToUpperASCII(method)); 235 DCHECK_EQ(method, StringToUpperASCII(method));
183 for (size_t i = 0; i < arraysize(kValidHttpMethods); ++i) { 236 for (size_t i = 0; i < arraysize(kValidHttpMethods); ++i) {
184 if (method.compare(kValidHttpMethods[i]) == 0) 237 if (method.compare(kValidHttpMethods[i]) == 0)
185 return true; 238 return true;
186 } 239 }
187 240
188 return false; 241 return false;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 PrerenderTracker* prerender_tracker) 275 PrerenderTracker* prerender_tracker)
223 : rate_limit_enabled_(true), 276 : rate_limit_enabled_(true),
224 enabled_(true), 277 enabled_(true),
225 profile_(profile), 278 profile_(profile),
226 prerender_tracker_(prerender_tracker), 279 prerender_tracker_(prerender_tracker),
227 max_prerender_age_(base::TimeDelta::FromSeconds( 280 max_prerender_age_(base::TimeDelta::FromSeconds(
228 kDefaultMaxPrerenderAgeSeconds)), 281 kDefaultMaxPrerenderAgeSeconds)),
229 max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB), 282 max_prerender_memory_mb_(kDefaultMaxPrerenderMemoryMB),
230 max_elements_(kDefaultMaxPrerenderElements), 283 max_elements_(kDefaultMaxPrerenderElements),
231 prerender_contents_factory_(PrerenderContents::CreateFactory()), 284 prerender_contents_factory_(PrerenderContents::CreateFactory()),
285 last_experiment_id_(kNoExperiment),
286 last_origin_(ORIGIN_LINK_REL_PRERENDER),
287 origin_experiment_wash_(false),
232 last_prerender_start_time_(GetCurrentTimeTicks() - 288 last_prerender_start_time_(GetCurrentTimeTicks() -
233 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)), 289 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs)),
234 runnable_method_factory_(this), 290 runnable_method_factory_(this),
235 prerender_history_(new PrerenderHistory(kHistoryLength)) { 291 prerender_history_(new PrerenderHistory(kHistoryLength)) {
236 // There are some assumptions that the PrerenderManager is on the UI thread. 292 // There are some assumptions that the PrerenderManager is on the UI thread.
237 // Any other checks simply make sure that the PrerenderManager is accessed on 293 // Any other checks simply make sure that the PrerenderManager is accessed on
238 // the same thread that it was created on. 294 // the same thread that it was created on.
239 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
240 } 296 }
241 297
(...skipping 26 matching lines...) Expand all
268 return AddPrerender(ORIGIN_OMNIBOX, std::make_pair(-1, -1), url, GURL()); 324 return AddPrerender(ORIGIN_OMNIBOX, std::make_pair(-1, -1), url, GURL());
269 } 325 }
270 326
271 bool PrerenderManager::AddPrerender( 327 bool PrerenderManager::AddPrerender(
272 Origin origin, 328 Origin origin,
273 const std::pair<int, int>& child_route_id_pair, 329 const std::pair<int, int>& child_route_id_pair,
274 const GURL& url_arg, 330 const GURL& url_arg,
275 const GURL& referrer) { 331 const GURL& referrer) {
276 DCHECK(CalledOnValidThread()); 332 DCHECK(CalledOnValidThread());
277 333
334 // Check if we are doing an experiment.
335 uint8 experiment = PrerenderManager::GetQueryStringBasedExperiment(url_arg);
336
337 // We need to update last_experiment_id_, last_origin_, and
338 // origin_experiment_wash_.
339 if (!WithinWindow()) {
340 // If we are outside a window, this is a fresh start and we are fine,
341 // and there is no mix.
342 origin_experiment_wash_ = false;
343 } else {
344 // If we are inside the last window, there is a mish mash of origins
345 // and experiments if either there was a mish mash before, or the current
346 // experiment/origin does not match the previous one.
347 if (experiment != last_experiment_id_ || origin != last_origin_)
348 origin_experiment_wash_ = true;
349 }
350
351 last_origin_ = origin;
352 last_experiment_id_ = experiment;
353
278 // If we observe multiple tags within the 30 second window, we will still 354 // If we observe multiple tags within the 30 second window, we will still
279 // reset the window to begin at the most recent occurrence, so that we will 355 // reset the window to begin at the most recent occurrence, so that we will
280 // always be in a window in the 30 seconds from each occurrence. 356 // always be in a window in the 30 seconds from each occurrence.
281 last_prerender_seen_time_ = GetCurrentTimeTicks(); 357 last_prerender_seen_time_ = GetCurrentTimeTicks();
282 358
283 // If the referring page is prerendering, defer the prerender. 359 // If the referring page is prerendering, defer the prerender.
284 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) != 360 if (FindPrerenderContentsForChildRouteIdPair(child_route_id_pair) !=
285 prerender_list_.end()) { 361 prerender_list_.end()) {
286 AddPendingPrerender(origin, child_route_id_pair, url_arg, referrer); 362 AddPendingPrerender(origin, child_route_id_pair, url_arg, referrer);
287 return true; 363 return true;
(...skipping 16 matching lines...) Expand all
304 // Do not prerender if there are too many render processes, and we would 380 // Do not prerender if there are too many render processes, and we would
305 // have to use an existing one. We do not want prerendering to happen in 381 // have to use an existing one. We do not want prerendering to happen in
306 // a shared process, so that we can always reliably lower the CPU 382 // a shared process, so that we can always reliably lower the CPU
307 // priority for prerendering. 383 // priority for prerendering.
308 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns 384 // In single-process mode, ShouldTryToUseExistingProcessHost() always returns
309 // true, so that case needs to be explicitly checked for. 385 // true, so that case needs to be explicitly checked for.
310 // TODO(tburkard): Figure out how to cancel prerendering in the opposite 386 // TODO(tburkard): Figure out how to cancel prerendering in the opposite
311 // case, when a new tab is added to a process used for prerendering. 387 // case, when a new tab is added to a process used for prerendering.
312 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() && 388 if (RenderProcessHost::ShouldTryToUseExistingProcessHost() &&
313 !RenderProcessHost::run_renderer_in_process()) { 389 !RenderProcessHost::run_renderer_in_process()) {
314 RecordFinalStatus(origin, FINAL_STATUS_TOO_MANY_PROCESSES); 390 RecordFinalStatus(origin, experiment, FINAL_STATUS_TOO_MANY_PROCESSES);
315 return false; 391 return false;
316 } 392 }
317 393
318 // Check if enough time has passed since the last prerender. 394 // Check if enough time has passed since the last prerender.
319 if (!DoesRateLimitAllowPrerender()) { 395 if (!DoesRateLimitAllowPrerender()) {
320 // Cancel the prerender. We could add it to the pending prerender list but 396 // Cancel the prerender. We could add it to the pending prerender list but
321 // this doesn't make sense as the next prerender request will be triggered 397 // this doesn't make sense as the next prerender request will be triggered
322 // by a navigation and is unlikely to be the same site. 398 // by a navigation and is unlikely to be the same site.
323 RecordFinalStatus(origin, FINAL_STATUS_RATE_LIMIT_EXCEEDED); 399 RecordFinalStatus(origin, experiment, FINAL_STATUS_RATE_LIMIT_EXCEEDED);
324 return false; 400 return false;
325 } 401 }
326 402
327 RenderViewHost* source_render_view_host = NULL; 403 RenderViewHost* source_render_view_host = NULL;
328 // This test should fail only during unit tests. 404 // This test should fail only during unit tests.
329 if (child_route_id_pair.first != -1) { 405 if (child_route_id_pair.first != -1) {
330 source_render_view_host = 406 source_render_view_host =
331 RenderViewHost::FromID(child_route_id_pair.first, 407 RenderViewHost::FromID(child_route_id_pair.first,
332 child_route_id_pair.second); 408 child_route_id_pair.second);
333 // Don't prerender page if parent RenderViewHost no longer exists, or it has 409 // Don't prerender page if parent RenderViewHost no longer exists, or it has
334 // no view. The latter should only happen when the RenderView has closed. 410 // no view. The latter should only happen when the RenderView has closed.
335 if (!source_render_view_host || !source_render_view_host->view()) { 411 if (!source_render_view_host || !source_render_view_host->view()) {
336 RecordFinalStatus(origin, FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED); 412 RecordFinalStatus(origin, experiment,
413 FINAL_STATUS_SOURCE_RENDER_VIEW_CLOSED);
337 return false; 414 return false;
338 } 415 }
339 } 416 }
340 417
341 PrerenderContents* prerender_contents = 418 PrerenderContents* prerender_contents =
342 CreatePrerenderContents(url, referrer, origin); 419 CreatePrerenderContents(url, referrer, origin, experiment);
343 if (!prerender_contents || !prerender_contents->Init()) 420 if (!prerender_contents || !prerender_contents->Init())
344 return false; 421 return false;
345 422
346 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents? 423 // TODO(cbentzel): Move invalid checks here instead of PrerenderContents?
347 PrerenderContentsData data(prerender_contents, GetCurrentTime()); 424 PrerenderContentsData data(prerender_contents, GetCurrentTime());
348 425
349 prerender_list_.push_back(data); 426 prerender_list_.push_back(data);
350 427
351 if (IsControlGroup()) { 428 if (IsControlGroup()) {
352 data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP); 429 data.contents_->set_final_status(FINAL_STATUS_CONTROL_GROUP);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 // Try to set the prerendered page as used, so any subsequent attempts to 579 // Try to set the prerendered page as used, so any subsequent attempts to
503 // cancel on other threads will fail. If this fails because the prerender 580 // cancel on other threads will fail. If this fails because the prerender
504 // was already cancelled, possibly on another thread, fail. 581 // was already cancelled, possibly on another thread, fail.
505 if (!prerender_tracker_->TryUse(child_id, route_id)) 582 if (!prerender_tracker_->TryUse(child_id, route_id))
506 return false; 583 return false;
507 584
508 if (!prerender_contents->load_start_time().is_null()) 585 if (!prerender_contents->load_start_time().is_null())
509 RecordTimeUntilUsed(GetCurrentTimeTicks() - 586 RecordTimeUntilUsed(GetCurrentTimeTicks() -
510 prerender_contents->load_start_time()); 587 prerender_contents->load_start_time());
511 588
512 UMA_HISTOGRAM_COUNTS("Prerender.PrerendersPerSessionCount", 589 PREFIXED_HISTOGRAM(UMA_HISTOGRAM_COUNTS(
513 ++prerenders_per_session_count_); 590 GetDefaultHistogramName("Prerender.PrerendersPerSessionCount"),
591 ++prerenders_per_session_count_));
514 prerender_contents->set_final_status(FINAL_STATUS_USED); 592 prerender_contents->set_final_status(FINAL_STATUS_USED);
515 593
516 RenderViewHost* render_view_host = 594 RenderViewHost* render_view_host =
517 prerender_contents->prerender_contents()->render_view_host(); 595 prerender_contents->prerender_contents()->render_view_host();
518 DCHECK(render_view_host); 596 DCHECK(render_view_host);
519 render_view_host->Send( 597 render_view_host->Send(
520 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false)); 598 new ViewMsg_SetIsPrerendering(render_view_host->routing_id(), false));
521 599
522 TabContentsWrapper* new_tab_contents = 600 TabContentsWrapper* new_tab_contents =
523 prerender_contents->ReleasePrerenderContents(); 601 prerender_contents->ReleasePrerenderContents();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 691
614 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const { 692 bool PrerenderManager::IsPrerenderElementFresh(const base::Time start) const {
615 DCHECK(CalledOnValidThread()); 693 DCHECK(CalledOnValidThread());
616 base::Time now = GetCurrentTime(); 694 base::Time now = GetCurrentTime();
617 return (now - start < max_prerender_age_); 695 return (now - start < max_prerender_age_);
618 } 696 }
619 697
620 PrerenderContents* PrerenderManager::CreatePrerenderContents( 698 PrerenderContents* PrerenderManager::CreatePrerenderContents(
621 const GURL& url, 699 const GURL& url,
622 const GURL& referrer, 700 const GURL& referrer,
623 Origin origin) { 701 Origin origin,
702 uint8 experiment_id) {
624 DCHECK(CalledOnValidThread()); 703 DCHECK(CalledOnValidThread());
625 return prerender_contents_factory_->CreatePrerenderContents( 704 return prerender_contents_factory_->CreatePrerenderContents(
626 this, prerender_tracker_, profile_, url, referrer, origin); 705 this, prerender_tracker_, profile_, url, referrer, origin, experiment_id);
627 } 706 }
628 707
629 bool PrerenderManager::IsPendingDelete(PrerenderContents* entry) const { 708 bool PrerenderManager::IsPendingDelete(PrerenderContents* entry) const {
630 DCHECK(CalledOnValidThread()); 709 DCHECK(CalledOnValidThread());
631 for (std::list<PrerenderContents*>::const_iterator it = 710 for (std::list<PrerenderContents*>::const_iterator it =
632 pending_delete_list_.begin(); 711 pending_delete_list_.begin();
633 it != pending_delete_list_.end(); 712 it != pending_delete_list_.end();
634 ++it) { 713 ++it) {
635 if (*it == entry) 714 if (*it == entry)
636 return true; 715 return true;
637 } 716 }
638 717
639 return false; 718 return false;
640 } 719 }
641 720
642 void PrerenderManager::DeletePendingDeleteEntries() { 721 void PrerenderManager::DeletePendingDeleteEntries() {
643 while (!pending_delete_list_.empty()) { 722 while (!pending_delete_list_.empty()) {
644 PrerenderContents* contents = pending_delete_list_.front(); 723 PrerenderContents* contents = pending_delete_list_.front();
645 pending_delete_list_.pop_front(); 724 pending_delete_list_.pop_front();
646 AddToHistory(contents); 725 AddToHistory(contents);
647 delete contents; 726 delete contents;
648 } 727 }
649 } 728 }
650 729
651 // Helper macro for histograms. 730 // Helper macro for histograms.
652 #define RECORD_PLT(tag, perceived_page_load_time) { \ 731 #define RECORD_PLT(tag, perceived_page_load_time) { \
732 PREFIXED_HISTOGRAM_PRERENDER_MANAGER(prerender_manager, \
653 UMA_HISTOGRAM_CUSTOM_TIMES( \ 733 UMA_HISTOGRAM_CUSTOM_TIMES( \
654 base::FieldTrial::MakeName(std::string("Prerender.") + tag, \ 734 base::FieldTrial::MakeName( \
655 "Prefetch"), \ 735 prerender_manager->GetDefaultHistogramName(tag), "Prefetch"), \
656 perceived_page_load_time, \ 736 perceived_page_load_time, \
657 base::TimeDelta::FromMilliseconds(10), \ 737 base::TimeDelta::FromMilliseconds(10), \
658 base::TimeDelta::FromSeconds(60), \ 738 base::TimeDelta::FromSeconds(60), \
659 100); \ 739 100)); \
660 } 740 }
661 741
662 // static 742 // static
663 void PrerenderManager::RecordPerceivedPageLoadTime( 743 void PrerenderManager::RecordPerceivedPageLoadTime(
664 base::TimeDelta perceived_page_load_time, 744 base::TimeDelta perceived_page_load_time,
665 TabContents* tab_contents) { 745 TabContents* tab_contents) {
666 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 746 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
667 PrerenderManager* prerender_manager = 747 PrerenderManager* prerender_manager =
668 tab_contents->profile()->GetPrerenderManager(); 748 tab_contents->profile()->GetPrerenderManager();
669 if (!prerender_manager) 749 if (!prerender_manager)
670 return; 750 return;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 return false; 858 return false;
779 base::TimeDelta elapsed_time = 859 base::TimeDelta elapsed_time =
780 base::TimeTicks::Now() - last_prerender_seen_time_; 860 base::TimeTicks::Now() - last_prerender_seen_time_;
781 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds); 861 return elapsed_time <= base::TimeDelta::FromSeconds(kWindowDurationSeconds);
782 } 862 }
783 863
784 bool PrerenderManager::DoesRateLimitAllowPrerender() const { 864 bool PrerenderManager::DoesRateLimitAllowPrerender() const {
785 DCHECK(CalledOnValidThread()); 865 DCHECK(CalledOnValidThread());
786 base::TimeDelta elapsed_time = 866 base::TimeDelta elapsed_time =
787 GetCurrentTimeTicks() - last_prerender_start_time_; 867 GetCurrentTimeTicks() - last_prerender_start_time_;
788 UMA_HISTOGRAM_TIMES("Prerender.TimeBetweenPrerenderRequests", 868 PREFIXED_HISTOGRAM(
789 elapsed_time); 869 UMA_HISTOGRAM_TIMES(
870 GetDefaultHistogramName("Prerender.TimeBetweenPrerenderRequests"),
871 elapsed_time));
790 if (!rate_limit_enabled_) 872 if (!rate_limit_enabled_)
791 return true; 873 return true;
792 return elapsed_time > 874 return elapsed_time >
793 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs); 875 base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
794 } 876 }
795 877
796 void PrerenderManager::StartSchedulingPeriodicCleanups() { 878 void PrerenderManager::StartSchedulingPeriodicCleanups() {
797 DCHECK(CalledOnValidThread()); 879 DCHECK(CalledOnValidThread());
798 if (repeating_timer_.IsRunning()) 880 if (repeating_timer_.IsRunning())
799 return; 881 return;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 while (!prerender_list_.empty()) { 1101 while (!prerender_list_.empty()) {
1020 PrerenderContentsData data = prerender_list_.front(); 1102 PrerenderContentsData data = prerender_list_.front();
1021 prerender_list_.pop_front(); 1103 prerender_list_.pop_front();
1022 data.contents_->Destroy(final_status); 1104 data.contents_->Destroy(final_status);
1023 } 1105 }
1024 DeletePendingDeleteEntries(); 1106 DeletePendingDeleteEntries();
1025 } 1107 }
1026 1108
1027 void PrerenderManager::RecordTimeUntilUsed(base::TimeDelta time_until_used) { 1109 void PrerenderManager::RecordTimeUntilUsed(base::TimeDelta time_until_used) {
1028 DCHECK(CalledOnValidThread()); 1110 DCHECK(CalledOnValidThread());
1029 UMA_HISTOGRAM_CUSTOM_TIMES( 1111 PREFIXED_HISTOGRAM(UMA_HISTOGRAM_CUSTOM_TIMES(
1030 "Prerender.TimeUntilUsed", 1112 GetDefaultHistogramName("Prerender.TimeUntilUsed"),
1031 time_until_used, 1113 time_until_used,
1032 base::TimeDelta::FromMilliseconds(10), 1114 base::TimeDelta::FromMilliseconds(10),
1033 base::TimeDelta::FromSeconds(kDefaultMaxPrerenderAgeSeconds), 1115 base::TimeDelta::FromSeconds(kDefaultMaxPrerenderAgeSeconds),
1034 50); 1116 50));
1117 }
1118
1119 void PrerenderManager::RecordFinalStatus(Origin origin,
1120 uint8 experiment_id,
1121 FinalStatus final_status) const {
1122 DCHECK(final_status != FINAL_STATUS_MAX);
1123 // FINAL_STATUS_CONTROL_GROUP indicates that the PrerenderContents
1124 // was created only to measure "would-have-been-prerendered" for
1125 // control group measurements. Don't pollute data with it.
1126 if (PrerenderManager::IsControlGroup() ||
1127 final_status == FINAL_STATUS_CONTROL_GROUP)
1128 return;
1129 PREFIXED_HISTOGRAM_ORIGIN_EXPERIMENT(origin, experiment_id,
1130 UMA_HISTOGRAM_ENUMERATION(
1131 GetHistogramName(origin, experiment_id, "FinalStatus"),
1132 final_status,
1133 FINAL_STATUS_MAX));
1134 }
1135
1136 std::string PrerenderManager::ComposeHistogramName(std::string prefix_type,
dominich.google 2011/06/30 19:55:15 const references here
tburkard 2011/06/30 21:40:20 Done.
1137 std::string name) const {
1138 if (prefix_type.empty())
1139 return std::string("Prerender.") + name;
1140 return std::string("Prerender.") + prefix_type + std::string("_") + name;
1141 }
1142
1143 std::string PrerenderManager::GetHistogramName(Origin origin,
1144 uint8 experiment_id,
1145 std::string name) const{
dominich.google 2011/06/30 19:55:15 const reference.
tburkard 2011/06/30 21:40:20 Done.
1146 switch (origin) {
1147 case ORIGIN_OMNIBOX:
1148 if (experiment_id != kNoExperiment)
1149 return ComposeHistogramName("wash", name);
1150 return ComposeHistogramName("omnibox", name);
1151 case ORIGIN_LINK_REL_PRERENDER:
1152 if (experiment_id == kNoExperiment)
1153 return ComposeHistogramName("", name);
1154 return ComposeHistogramName("exp" + std::string(1, experiment_id + '0'),
1155 name);
1156 default:
1157 NOTREACHED();
1158 break;
1159 };
1160
1161 // Dummy return value to make the compiler happy.
1162 NOTREACHED();
1163 return ComposeHistogramName("wash", name);
1164 }
1165
1166 std::string PrerenderManager::GetDefaultHistogramName(std::string name) const {
dominich.google 2011/06/30 19:55:15 const reference.
tburkard 2011/06/30 21:40:20 Done.
1167 if (!WithinWindow())
1168 return ComposeHistogramName("", name);
1169 if (origin_experiment_wash_)
1170 return ComposeHistogramName("wash", name);
1171 return GetHistogramName(last_origin_, last_experiment_id_, name);
1172 }
1173
1174 uint8 PrerenderManager::GetCurrentExperimentId() const {
1175 if (!WithinWindow())
1176 return kNoExperiment;
1177 return last_experiment_id_;
1178 }
1179
1180 Origin PrerenderManager::GetCurrentOrigin() const {
1181 if (!WithinWindow())
1182 return ORIGIN_LINK_REL_PRERENDER;
1183 return last_origin_;
1184 }
1185
1186 bool PrerenderManager::IsOriginExperimentWash() const {
1187 if (!WithinWindow())
1188 return false;
1189 return origin_experiment_wash_;
1035 } 1190 }
1036 1191
1037 } // namespace prerender 1192 } // namespace prerender
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698