| OLD | NEW |
| 1 // Copyright (c) 2010 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 "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/rand_util.h" | 11 #include "base/rand_util.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 34 InstantController::HostBlacklist* InstantController::host_blacklist_ = NULL; | 34 InstantController::HostBlacklist* InstantController::host_blacklist_ = NULL; |
| 35 | 35 |
| 36 InstantController::InstantController(Profile* profile, | 36 InstantController::InstantController(Profile* profile, |
| 37 InstantDelegate* delegate) | 37 InstantDelegate* delegate) |
| 38 : delegate_(delegate), | 38 : delegate_(delegate), |
| 39 tab_contents_(NULL), | 39 tab_contents_(NULL), |
| 40 is_active_(false), | 40 is_active_(false), |
| 41 is_displayable_(false), | 41 is_displayable_(false), |
| 42 commit_on_mouse_up_(false), | 42 commit_on_mouse_up_(false), |
| 43 last_transition_type_(PageTransition::LINK), | 43 last_transition_type_(PageTransition::LINK), |
| 44 ALLOW_THIS_IN_INITIALIZER_LIST(destroy_factory_(this)), | 44 ALLOW_THIS_IN_INITIALIZER_LIST(destroy_factory_(this)) { |
| 45 type_(FIRST_TYPE) { | |
| 46 bool enabled = GetType(profile, &type_); | |
| 47 DCHECK(enabled); | |
| 48 PrefService* service = profile->GetPrefs(); | 45 PrefService* service = profile->GetPrefs(); |
| 49 if (service) { | 46 if (service) { |
| 50 // kInstantWasEnabledOnce was added after instant, set it now to make sure | 47 // kInstantWasEnabledOnce was added after instant, set it now to make sure |
| 51 // it is correctly set. | 48 // it is correctly set. |
| 52 service->SetBoolean(prefs::kInstantEnabledOnce, true); | 49 service->SetBoolean(prefs::kInstantEnabledOnce, true); |
| 53 } | 50 } |
| 54 } | 51 } |
| 55 | 52 |
| 56 InstantController::~InstantController() { | 53 InstantController::~InstantController() { |
| 57 } | 54 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 72 | 69 |
| 73 PrefService* service = profile->GetPrefs(); | 70 PrefService* service = profile->GetPrefs(); |
| 74 if (service) { | 71 if (service) { |
| 75 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); | 72 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); |
| 76 if (!enable_time) { | 73 if (!enable_time) { |
| 77 service->SetInt64(prefs::kInstantEnabledTime, | 74 service->SetInt64(prefs::kInstantEnabledTime, |
| 78 base::Time::Now().ToInternalValue()); | 75 base::Time::Now().ToInternalValue()); |
| 79 } else { | 76 } else { |
| 80 base::TimeDelta delta = | 77 base::TimeDelta delta = |
| 81 base::Time::Now() - base::Time::FromInternalValue(enable_time); | 78 base::Time::Now() - base::Time::FromInternalValue(enable_time); |
| 82 std::string name = "Instant.EnabledTime. " + GetTypeString(profile); | |
| 83 // Can't use histogram macros as name isn't constant. | |
| 84 // Histogram from 1 hour to 30 days. | 79 // Histogram from 1 hour to 30 days. |
| 85 scoped_refptr<base::Histogram> counter = | 80 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.EnabledTime.Predictive", |
| 86 base::Histogram::FactoryGet(name, 1, 30 * 24, 50, | 81 delta.InHours(), 1, 30 * 24, 50); |
| 87 base::Histogram::kUmaTargetedHistogramFlag); | |
| 88 counter->Add(delta.InHours()); | |
| 89 } | 82 } |
| 90 } | 83 } |
| 91 } | 84 } |
| 92 | 85 |
| 93 // static | 86 // static |
| 94 bool InstantController::IsEnabled(Profile* profile) { | 87 bool InstantController::IsEnabled(Profile* profile) { |
| 95 Type type; | 88 PrefService* prefs = profile->GetPrefs(); |
| 96 return GetType(profile, &type); | 89 return prefs->GetBoolean(prefs::kInstantEnabled); |
| 97 } | 90 } |
| 98 | 91 |
| 99 // static | 92 // static |
| 100 bool InstantController::IsEnabled(Profile* profile, Type type) { | |
| 101 Type enabled_type; | |
| 102 return GetType(profile, &enabled_type) && type == enabled_type; | |
| 103 } | |
| 104 | |
| 105 // static | |
| 106 void InstantController::Enable(Profile* profile) { | 93 void InstantController::Enable(Profile* profile) { |
| 107 PromoCounter* promo_counter = profile->GetInstantPromoCounter(); | 94 PromoCounter* promo_counter = profile->GetInstantPromoCounter(); |
| 108 if (promo_counter) | 95 if (promo_counter) |
| 109 promo_counter->Hide(); | 96 promo_counter->Hide(); |
| 110 | 97 |
| 111 PrefService* service = profile->GetPrefs(); | 98 PrefService* service = profile->GetPrefs(); |
| 112 if (!service) | 99 if (!service) |
| 113 return; | 100 return; |
| 114 | 101 |
| 115 service->SetBoolean(prefs::kInstantEnabled, true); | 102 service->SetBoolean(prefs::kInstantEnabled, true); |
| 116 service->SetBoolean(prefs::kInstantConfirmDialogShown, true); | 103 service->SetBoolean(prefs::kInstantConfirmDialogShown, true); |
| 117 service->SetInt64(prefs::kInstantEnabledTime, | 104 service->SetInt64(prefs::kInstantEnabledTime, |
| 118 base::Time::Now().ToInternalValue()); | 105 base::Time::Now().ToInternalValue()); |
| 119 service->SetBoolean(prefs::kInstantEnabledOnce, true); | 106 service->SetBoolean(prefs::kInstantEnabledOnce, true); |
| 120 } | 107 } |
| 121 | 108 |
| 122 // static | 109 // static |
| 123 void InstantController::Disable(Profile* profile) { | 110 void InstantController::Disable(Profile* profile) { |
| 124 PrefService* service = profile->GetPrefs(); | 111 PrefService* service = profile->GetPrefs(); |
| 125 if (!service || !IsEnabled(profile)) | 112 if (!service || !IsEnabled(profile)) |
| 126 return; | 113 return; |
| 127 | 114 |
| 128 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); | 115 int64 enable_time = service->GetInt64(prefs::kInstantEnabledTime); |
| 129 if (enable_time) { | 116 if (enable_time) { |
| 130 base::TimeDelta delta = | 117 base::TimeDelta delta = |
| 131 base::Time::Now() - base::Time::FromInternalValue(enable_time); | 118 base::Time::Now() - base::Time::FromInternalValue(enable_time); |
| 132 std::string name = "Instant.TimeToDisable." + GetTypeString(profile); | |
| 133 // Can't use histogram macros as name isn't constant. | |
| 134 // Histogram from 1 minute to 10 days. | 119 // Histogram from 1 minute to 10 days. |
| 135 scoped_refptr<base::Histogram> counter = | 120 UMA_HISTOGRAM_CUSTOM_COUNTS("Instant.TimeToDisable.Predictive", |
| 136 base::Histogram::FactoryGet(name, 1, 60 * 24 * 10, 50, | 121 delta.InMinutes(), 1, 60 * 24 * 10, 50); |
| 137 base::Histogram::kUmaTargetedHistogramFlag); | |
| 138 counter->Add(delta.InMinutes()); | |
| 139 } | 122 } |
| 140 | 123 |
| 141 service->SetBoolean(prefs::kInstantEnabled, false); | 124 service->SetBoolean(prefs::kInstantEnabled, false); |
| 142 } | 125 } |
| 143 | 126 |
| 144 // static | 127 // static |
| 145 bool InstantController::CommitIfCurrent(InstantController* controller) { | 128 bool InstantController::CommitIfCurrent(InstantController* controller) { |
| 146 if (controller && controller->IsCurrent()) { | 129 if (controller && controller->IsCurrent()) { |
| 147 controller->CommitCurrentPreview(INSTANT_COMMIT_PRESSED_ENTER); | 130 controller->CommitCurrentPreview(INSTANT_COMMIT_PRESSED_ENTER); |
| 148 return true; | 131 return true; |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 &InstantController::DestroyLoaders)); | 562 &InstantController::DestroyLoaders)); |
| 580 } | 563 } |
| 581 } | 564 } |
| 582 | 565 |
| 583 void InstantController::DestroyLoaders() { | 566 void InstantController::DestroyLoaders() { |
| 584 loaders_to_destroy_.reset(); | 567 loaders_to_destroy_.reset(); |
| 585 } | 568 } |
| 586 | 569 |
| 587 const TemplateURL* InstantController::GetTemplateURL( | 570 const TemplateURL* InstantController::GetTemplateURL( |
| 588 const AutocompleteMatch& match) { | 571 const AutocompleteMatch& match) { |
| 589 if (type_ == VERBATIM_TYPE) { | |
| 590 // When using VERBATIM_TYPE we don't want to attempt to use the instant | |
| 591 // JavaScript API, otherwise the page would show predictive results. By | |
| 592 // returning NULL here we ensure we don't attempt to use the instant API. | |
| 593 // | |
| 594 // TODO: when the full search box API is in place we can lift this | |
| 595 // restriction and force the page to show verbatim results always. | |
| 596 return NULL; | |
| 597 } | |
| 598 | |
| 599 const TemplateURL* template_url = match.template_url; | 572 const TemplateURL* template_url = match.template_url; |
| 600 if (match.type == AutocompleteMatch::SEARCH_WHAT_YOU_TYPED || | 573 if (match.type == AutocompleteMatch::SEARCH_WHAT_YOU_TYPED || |
| 601 match.type == AutocompleteMatch::SEARCH_HISTORY || | 574 match.type == AutocompleteMatch::SEARCH_HISTORY || |
| 602 match.type == AutocompleteMatch::SEARCH_SUGGEST) { | 575 match.type == AutocompleteMatch::SEARCH_SUGGEST) { |
| 603 TemplateURLModel* model = tab_contents_->profile()->GetTemplateURLModel(); | 576 TemplateURLModel* model = tab_contents_->profile()->GetTemplateURLModel(); |
| 604 template_url = model ? model->GetDefaultSearchProvider() : NULL; | 577 template_url = model ? model->GetDefaultSearchProvider() : NULL; |
| 605 } | 578 } |
| 606 return template_url; | 579 return template_url; |
| 607 } | 580 } |
| 608 | |
| 609 // static | |
| 610 bool InstantController::GetType(Profile* profile, Type* type) { | |
| 611 *type = FIRST_TYPE; | |
| 612 // CommandLine takes precedence. | |
| 613 CommandLine* cl = CommandLine::ForCurrentProcess(); | |
| 614 if (cl->HasSwitch(switches::kEnablePredictiveInstant)) { | |
| 615 *type = PREDICTIVE_TYPE; | |
| 616 return true; | |
| 617 } | |
| 618 if (cl->HasSwitch(switches::kEnableVerbatimInstant)) { | |
| 619 *type = VERBATIM_TYPE; | |
| 620 return true; | |
| 621 } | |
| 622 if (cl->HasSwitch(switches::kEnablePredictiveNoAutoCompleteInstant)) { | |
| 623 *type = PREDICTIVE_NO_AUTO_COMPLETE_TYPE; | |
| 624 return true; | |
| 625 } | |
| 626 | |
| 627 // Then prefs. | |
| 628 PrefService* prefs = profile->GetPrefs(); | |
| 629 if (!prefs->GetBoolean(prefs::kInstantEnabled)) | |
| 630 return false; | |
| 631 | |
| 632 // PREDICTIVE_TYPE is the default if enabled via preferences. | |
| 633 *type = PREDICTIVE_TYPE; | |
| 634 return true; | |
| 635 } | |
| 636 | |
| 637 // static | |
| 638 std::string InstantController::GetTypeString(Profile* profile) { | |
| 639 Type type; | |
| 640 if (!GetType(profile, &type)) { | |
| 641 NOTREACHED(); | |
| 642 return std::string(); | |
| 643 } | |
| 644 switch (type) { | |
| 645 case PREDICTIVE_TYPE: | |
| 646 return "Predictive"; | |
| 647 case VERBATIM_TYPE: | |
| 648 return "Verbatim"; | |
| 649 case PREDICTIVE_NO_AUTO_COMPLETE_TYPE: | |
| 650 return "PredictiveNoAutoComplete"; | |
| 651 default: | |
| 652 NOTREACHED(); | |
| 653 return std::string(); | |
| 654 } | |
| 655 } | |
| OLD | NEW |