OLD | NEW |
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/instant/instant_controller.h" | 5 #include "chrome/browser/instant/instant_controller.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/rand_util.h" |
10 #include "build/build_config.h" | 11 #include "build/build_config.h" |
11 #include "chrome/browser/autocomplete/autocomplete_match.h" | 12 #include "chrome/browser/autocomplete/autocomplete_match.h" |
12 #include "chrome/browser/instant/instant_delegate.h" | 13 #include "chrome/browser/instant/instant_delegate.h" |
| 14 #include "chrome/browser/instant/instant_field_trial.h" |
13 #include "chrome/browser/instant/instant_loader.h" | 15 #include "chrome/browser/instant/instant_loader.h" |
14 #include "chrome/browser/instant/instant_loader_manager.h" | 16 #include "chrome/browser/instant/instant_loader_manager.h" |
15 #include "chrome/browser/instant/promo_counter.h" | 17 #include "chrome/browser/instant/promo_counter.h" |
16 #include "chrome/browser/platform_util.h" | 18 #include "chrome/browser/platform_util.h" |
17 #include "chrome/browser/prefs/pref_service.h" | 19 #include "chrome/browser/prefs/pref_service.h" |
18 #include "chrome/browser/prerender/prerender_manager.h" | 20 #include "chrome/browser/prerender/prerender_manager.h" |
19 #include "chrome/browser/profiles/profile.h" | 21 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/search_engines/template_url.h" | 22 #include "chrome/browser/search_engines/template_url.h" |
21 #include "chrome/browser/search_engines/template_url_service.h" | 23 #include "chrome/browser/search_engines/template_url_service.h" |
22 #include "chrome/browser/search_engines/template_url_service_factory.h" | 24 #include "chrome/browser/search_engines/template_url_service_factory.h" |
(...skipping 19 matching lines...) Expand all Loading... |
42 InstantController::InstantController(Profile* profile, | 44 InstantController::InstantController(Profile* profile, |
43 InstantDelegate* delegate) | 45 InstantDelegate* delegate) |
44 : delegate_(delegate), | 46 : delegate_(delegate), |
45 tab_contents_(NULL), | 47 tab_contents_(NULL), |
46 is_active_(false), | 48 is_active_(false), |
47 displayable_loader_(NULL), | 49 displayable_loader_(NULL), |
48 commit_on_mouse_up_(false), | 50 commit_on_mouse_up_(false), |
49 last_transition_type_(PageTransition::LINK), | 51 last_transition_type_(PageTransition::LINK), |
50 ALLOW_THIS_IN_INITIALIZER_LIST(destroy_factory_(this)) { | 52 ALLOW_THIS_IN_INITIALIZER_LIST(destroy_factory_(this)) { |
51 PrefService* service = profile->GetPrefs(); | 53 PrefService* service = profile->GetPrefs(); |
52 if (service) { | 54 if (service && |
53 // kInstantWasEnabledOnce was added after instant, set it now to make sure | 55 InstantFieldTrial::GetGroup(profile) == InstantFieldTrial::INACTIVE) { |
54 // it is correctly set. | 56 // kInstantEnabledOnce was added after instant, set it now to make sure it |
| 57 // is correctly set. |
55 service->SetBoolean(prefs::kInstantEnabledOnce, true); | 58 service->SetBoolean(prefs::kInstantEnabledOnce, true); |
56 } | 59 } |
57 } | 60 } |
58 | 61 |
59 InstantController::~InstantController() { | 62 InstantController::~InstantController() { |
60 } | 63 } |
61 | 64 |
62 // static | 65 // static |
63 void InstantController::RegisterUserPrefs(PrefService* prefs) { | 66 void InstantController::RegisterUserPrefs(PrefService* prefs) { |
64 prefs->RegisterBooleanPref(prefs::kInstantConfirmDialogShown, | 67 prefs->RegisterBooleanPref(prefs::kInstantConfirmDialogShown, |
65 false, | 68 false, |
66 PrefService::UNSYNCABLE_PREF); | 69 PrefService::UNSYNCABLE_PREF); |
67 prefs->RegisterBooleanPref(prefs::kInstantEnabled, | 70 prefs->RegisterBooleanPref(prefs::kInstantEnabled, |
68 false, | 71 false, |
69 PrefService::UNSYNCABLE_PREF); | 72 PrefService::UNSYNCABLE_PREF); |
70 prefs->RegisterBooleanPref(prefs::kInstantEnabledOnce, | 73 prefs->RegisterBooleanPref(prefs::kInstantEnabledOnce, |
71 false, | 74 false, |
72 PrefService::UNSYNCABLE_PREF); | 75 PrefService::UNSYNCABLE_PREF); |
73 prefs->RegisterInt64Pref(prefs::kInstantEnabledTime, | 76 prefs->RegisterInt64Pref(prefs::kInstantEnabledTime, |
74 false, | 77 false, |
75 PrefService::UNSYNCABLE_PREF); | 78 PrefService::UNSYNCABLE_PREF); |
| 79 prefs->RegisterIntegerPref(prefs::kInstantFieldTrialRandomDraw, |
| 80 base::RandInt(0, 9999), |
| 81 PrefService::UNSYNCABLE_PREF); |
76 PromoCounter::RegisterUserPrefs(prefs, prefs::kInstantPromo); | 82 PromoCounter::RegisterUserPrefs(prefs, prefs::kInstantPromo); |
77 } | 83 } |
78 | 84 |
79 // static | 85 // static |
80 void InstantController::RecordMetrics(Profile* profile) { | 86 void InstantController::RecordMetrics(Profile* profile) { |
81 if (!IsEnabled(profile)) | 87 if (!IsEnabled(profile)) |
82 return; | 88 return; |
83 | 89 |
84 PrefService* service = profile->GetPrefs(); | 90 PrefService* service = profile->GetPrefs(); |
85 if (service) { | 91 if (service) { |
86 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); | 92 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); |
87 if (!enable_time) { | 93 if (!enable_time) { |
88 service->SetInt64(prefs::kInstantEnabledTime, | 94 service->SetInt64(prefs::kInstantEnabledTime, |
89 base::Time::Now().ToInternalValue()); | 95 base::Time::Now().ToInternalValue()); |
90 } else { | 96 } else { |
91 base::TimeDelta delta = | 97 base::TimeDelta delta = |
92 base::Time::Now() - base::Time::FromInternalValue(enable_time); | 98 base::Time::Now() - base::Time::FromInternalValue(enable_time); |
93 // Histogram from 1 hour to 30 days. | 99 // Histogram from 1 hour to 30 days. |
94 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.EnabledTime.Predictive", | 100 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.EnabledTime.Predictive", |
95 delta.InHours(), 1, 30 * 24, 50); | 101 delta.InHours(), 1, 30 * 24, 50); |
96 } | 102 } |
97 } | 103 } |
98 } | 104 } |
99 | 105 |
100 // static | 106 // static |
101 bool InstantController::IsEnabled(Profile* profile) { | 107 bool InstantController::IsEnabled(Profile* profile) { |
102 PrefService* prefs = profile->GetPrefs(); | 108 PrefService* prefs = profile->GetPrefs(); |
103 return prefs->GetBoolean(prefs::kInstantEnabled); | 109 return prefs->GetBoolean(prefs::kInstantEnabled) || |
| 110 InstantFieldTrial::IsExperimentGroup(profile); |
104 } | 111 } |
105 | 112 |
106 // static | 113 // static |
107 void InstantController::Enable(Profile* profile) { | 114 void InstantController::Enable(Profile* profile) { |
108 PromoCounter* promo_counter = profile->GetInstantPromoCounter(); | 115 PromoCounter* promo_counter = profile->GetInstantPromoCounter(); |
109 if (promo_counter) | 116 if (promo_counter) |
110 promo_counter->Hide(); | 117 promo_counter->Hide(); |
111 | 118 |
112 PrefService* service = profile->GetPrefs(); | 119 PrefService* service = profile->GetPrefs(); |
113 if (!service) | 120 if (!service) |
114 return; | 121 return; |
115 | 122 |
| 123 service->SetBoolean(prefs::kInstantEnabledOnce, true); |
116 service->SetBoolean(prefs::kInstantEnabled, true); | 124 service->SetBoolean(prefs::kInstantEnabled, true); |
117 service->SetBoolean(prefs::kInstantConfirmDialogShown, true); | 125 service->SetBoolean(prefs::kInstantConfirmDialogShown, true); |
118 service->SetInt64(prefs::kInstantEnabledTime, | 126 service->SetInt64(prefs::kInstantEnabledTime, |
119 base::Time::Now().ToInternalValue()); | 127 base::Time::Now().ToInternalValue()); |
120 service->SetBoolean(prefs::kInstantEnabledOnce, true); | |
121 } | 128 } |
122 | 129 |
123 // static | 130 // static |
124 void InstantController::Disable(Profile* profile) { | 131 void InstantController::Disable(Profile* profile) { |
125 PrefService* service = profile->GetPrefs(); | 132 PrefService* service = profile->GetPrefs(); |
126 if (!service || !IsEnabled(profile)) | 133 if (!service || !IsEnabled(profile)) |
127 return; | 134 return; |
128 | 135 |
129 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); | 136 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); |
130 if (enable_time) { | 137 if (enable_time) { |
131 base::TimeDelta delta = | 138 base::TimeDelta delta = |
132 base::Time::Now() - base::Time::FromInternalValue(enable_time); | 139 base::Time::Now() - base::Time::FromInternalValue(enable_time); |
133 // Histogram from 1 minute to 10 days. | 140 // Histogram from 1 minute to 10 days. |
134 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.TimeToDisable.Predictive", | 141 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.TimeToDisable.Predictive", |
135 delta.InMinutes(), 1, 60 * 24 * 10, 50); | 142 delta.InMinutes(), 1, 60 * 24 * 10, 50); |
136 } | 143 } |
137 | 144 |
| 145 if (InstantFieldTrial::IsExperimentGroup(profile)) { |
| 146 UMA_HISTOGRAM_COUNTS( |
| 147 "Instant.FieldTrialOptOut." + InstantFieldTrial::GetGroupName(profile), |
| 148 1); |
| 149 } |
| 150 |
138 service->SetBoolean(prefs::kInstantEnabledOnce, true); | 151 service->SetBoolean(prefs::kInstantEnabledOnce, true); |
139 service->SetBoolean(prefs::kInstantEnabled, false); | 152 service->SetBoolean(prefs::kInstantEnabled, false); |
140 } | 153 } |
141 | 154 |
142 // static | 155 // static |
143 bool InstantController::CommitIfCurrent(InstantController* controller) { | 156 bool InstantController::CommitIfCurrent(InstantController* controller) { |
144 if (controller && controller->IsCurrent()) { | 157 if (controller && controller->IsCurrent()) { |
145 controller->CommitCurrentPreview(INSTANT_COMMIT_PRESSED_ENTER); | 158 controller->CommitCurrentPreview(INSTANT_COMMIT_PRESSED_ENTER); |
146 return true; | 159 return true; |
147 } | 160 } |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 return; | 383 return; |
371 } | 384 } |
372 | 385 |
373 DestroyPreviewContents(); | 386 DestroyPreviewContents(); |
374 } | 387 } |
375 #endif | 388 #endif |
376 | 389 |
377 void InstantController::OnAutocompleteGotFocus( | 390 void InstantController::OnAutocompleteGotFocus( |
378 TabContentsWrapper* tab_contents) { | 391 TabContentsWrapper* tab_contents) { |
379 CommandLine* cl = CommandLine::ForCurrentProcess(); | 392 CommandLine* cl = CommandLine::ForCurrentProcess(); |
380 if (!cl->HasSwitch(switches::kPreloadInstantSearch)) | 393 if (!cl->HasSwitch(switches::kPreloadInstantSearch) && |
| 394 !InstantFieldTrial::IsExperimentGroup(tab_contents->profile())) { |
381 return; | 395 return; |
| 396 } |
382 | 397 |
383 if (is_active_) | 398 if (is_active_) |
384 return; | 399 return; |
385 | 400 |
386 TemplateURLService* model = TemplateURLServiceFactory::GetForProfile( | 401 TemplateURLService* model = TemplateURLServiceFactory::GetForProfile( |
387 tab_contents->profile()); | 402 tab_contents->profile()); |
388 if (!model) | 403 if (!model) |
389 return; | 404 return; |
390 | 405 |
391 const TemplateURL* template_url = model->GetDefaultSearchProvider(); | 406 const TemplateURL* template_url = model->GetDefaultSearchProvider(); |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 | 713 |
699 // Extension keywords don't have a real destination URL. | 714 // Extension keywords don't have a real destination URL. |
700 if (match.template_url && match.template_url->IsExtensionKeyword()) | 715 if (match.template_url && match.template_url->IsExtensionKeyword()) |
701 return PREVIEW_CONDITION_EXTENSION_KEYWORD; | 716 return PREVIEW_CONDITION_EXTENSION_KEYWORD; |
702 | 717 |
703 // Was the host blacklisted? | 718 // Was the host blacklisted? |
704 if (host_blacklist_ && host_blacklist_->count(match.destination_url.host())) | 719 if (host_blacklist_ && host_blacklist_->count(match.destination_url.host())) |
705 return PREVIEW_CONDITION_BLACKLISTED; | 720 return PREVIEW_CONDITION_BLACKLISTED; |
706 | 721 |
707 const CommandLine* cl = CommandLine::ForCurrentProcess(); | 722 const CommandLine* cl = CommandLine::ForCurrentProcess(); |
708 if (cl->HasSwitch(switches::kRestrictInstantToSearch) && | 723 if ((cl->HasSwitch(switches::kRestrictInstantToSearch) || |
| 724 InstantFieldTrial::IsExperimentGroup(tab_contents_->profile())) && |
709 match.type != AutocompleteMatch::SEARCH_WHAT_YOU_TYPED && | 725 match.type != AutocompleteMatch::SEARCH_WHAT_YOU_TYPED && |
710 match.type != AutocompleteMatch::SEARCH_HISTORY && | 726 match.type != AutocompleteMatch::SEARCH_HISTORY && |
711 match.type != AutocompleteMatch::SEARCH_SUGGEST && | 727 match.type != AutocompleteMatch::SEARCH_SUGGEST && |
712 match.type != AutocompleteMatch::SEARCH_OTHER_ENGINE) { | 728 match.type != AutocompleteMatch::SEARCH_OTHER_ENGINE) { |
713 return PREVIEW_CONDITION_INSTANT_SEARCH_ONLY; | 729 return PREVIEW_CONDITION_INSTANT_SEARCH_ONLY; |
714 } | 730 } |
715 | 731 |
716 return PREVIEW_CONDITION_SUCCESS; | 732 return PREVIEW_CONDITION_SUCCESS; |
717 } | 733 } |
718 | 734 |
(...skipping 14 matching lines...) Expand all Loading... |
733 if (destroy_factory_.empty()) { | 749 if (destroy_factory_.empty()) { |
734 MessageLoop::current()->PostTask( | 750 MessageLoop::current()->PostTask( |
735 FROM_HERE, destroy_factory_.NewRunnableMethod( | 751 FROM_HERE, destroy_factory_.NewRunnableMethod( |
736 &InstantController::DestroyLoaders)); | 752 &InstantController::DestroyLoaders)); |
737 } | 753 } |
738 } | 754 } |
739 | 755 |
740 void InstantController::DestroyLoaders() { | 756 void InstantController::DestroyLoaders() { |
741 loaders_to_destroy_.reset(); | 757 loaders_to_destroy_.reset(); |
742 } | 758 } |
OLD | NEW |