Chromium Code Reviews| Index: chrome/browser/search/hotword_service.cc |
| diff --git a/chrome/browser/search/hotword_service.cc b/chrome/browser/search/hotword_service.cc |
| index 69366717d4033b22db897fdaed2de5ac042d4389..ed3b94a4c4fa1b24b0f20dac0df484b6b76ce4df 100644 |
| --- a/chrome/browser/search/hotword_service.cc |
| +++ b/chrome/browser/search/hotword_service.cc |
| @@ -7,17 +7,24 @@ |
| #include "base/i18n/case_conversion.h" |
| #include "base/metrics/field_trial.h" |
| #include "base/metrics/histogram.h" |
| +#include "base/path_service.h" |
| #include "base/prefs/pref_service.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| +#include "chrome/browser/plugins/plugin_prefs.h" |
| #include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/search/hotword_service_factory.h" |
| +#include "chrome/common/chrome_paths.h" |
| #include "chrome/common/extensions/extension_constants.h" |
| #include "chrome/common/pref_names.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/notification_service.h" |
| +#include "content/public/browser/plugin_service.h" |
| +#include "content/public/common/webplugininfo.h" |
| #include "extensions/browser/extension_system.h" |
| #include "extensions/common/extension.h" |
| +#include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| // The whole file relies on the extension systems but this file is built on |
| @@ -65,7 +72,20 @@ enum HotwordExtensionAvailability { |
| NUM_HOTWORD_EXTENSION_AVAILABILITY_METRICS |
| }; |
| -void RecordAvailabilityMetrics( |
| +// Enum describing the types of errors that can arise when determining |
| +// if hotwording can be used. NO_ERROR is used so it can be seen how often |
| +// errors arise relative to when they do not. |
| +// This is used for UMA stats -- do not reorder or delete items; only add to |
| +// the end. |
| +enum HotwordError { |
| + NO_ERROR = 0, |
| + GENERIC_ERROR, |
| + NACL_ERROR, |
| + MICROPHONE_ERROR, |
| + NUM_HOTWORD_ERROR_METRICS |
| +}; |
| + |
| +void RecordExtensionAvailabilityMetrics( |
| ExtensionService* service, |
| const extensions::Extension* extension) { |
| HotwordExtensionAvailability availability_state = UNAVAILABLE; |
| @@ -95,6 +115,24 @@ void RecordLoggingMetrics(Profile* profile) { |
| profile->GetPrefs()->GetBoolean(prefs::kHotwordAudioLoggingEnabled)); |
| } |
| +void RecordErrorMetrics(int error_message) { |
| + HotwordError error = NO_ERROR; |
| + switch (error_message) { |
| + case IDS_HOTWORD_GENERIC_ERROR_MESSAGE: |
| + error = GENERIC_ERROR; |
| + break; |
| + case IDS_HOTWORD_NACL_DISABLED_ERROR_MESSAGE: |
| + error = NACL_ERROR; |
| + break; |
| + default: |
|
Jered
2014/05/19 20:47:34
You should probably hook up the other two errors,
rpetterson
2014/05/19 21:04:17
There's only one other error right now -- the micr
Mark P
2014/05/19 22:01:31
This is a fine answer if you're pretty sure the ne
rpetterson
2014/05/19 22:04:19
It will be soon, probably this week. The CL is mos
|
| + error = NO_ERROR; |
| + } |
| + |
| + UMA_HISTOGRAM_ENUMERATION("Hotword.HotwordError", |
| + error, |
| + NUM_HOTWORD_ERROR_METRICS); |
| +} |
| + |
| ExtensionService* GetExtensionService(Profile* profile) { |
| CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| @@ -136,7 +174,8 @@ bool HotwordService::DoesHotwordSupportLanguage(Profile* profile) { |
| HotwordService::HotwordService(Profile* profile) |
| : profile_(profile), |
| - client_(NULL) { |
| + client_(NULL), |
| + error_message_(0) { |
| // This will be called during profile initialization which is a good time |
| // to check the user's hotword state. |
| HotwordEnabled enabled_state = UNSET; |
| @@ -226,6 +265,9 @@ void HotwordService::ShowOptInPopup() { |
| } |
| bool HotwordService::IsServiceAvailable() { |
| + error_message_ = 0; |
| + |
| + // Determine if the extension is available. |
| extensions::ExtensionSystem* system = |
| extensions::ExtensionSystem::Get(profile_); |
| ExtensionService* service = system->extension_service(); |
| @@ -233,11 +275,27 @@ bool HotwordService::IsServiceAvailable() { |
| // if the user opted out. |
| const extensions::Extension* extension = |
| service->GetExtensionById(extension_misc::kHotwordExtensionId, true); |
| + if (!extension) |
| + error_message_ = IDS_HOTWORD_GENERIC_ERROR_MESSAGE; |
| - RecordAvailabilityMetrics(service, extension); |
| + RecordExtensionAvailabilityMetrics(service, extension); |
| RecordLoggingMetrics(profile_); |
| - return extension && IsHotwordAllowed(); |
| + // Determine if NaCl is available. |
| + bool nacl_enabled = false; |
| + base::FilePath path; |
| + if (PathService::Get(chrome::FILE_NACL_PLUGIN, &path)) { |
| + content::WebPluginInfo info; |
| + PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_).get(); |
| + if (content::PluginService::GetInstance()->GetPluginInfoByPath(path, &info)) |
| + nacl_enabled = plugin_prefs->IsPluginEnabled(info); |
| + } |
| + if (!nacl_enabled) |
| + error_message_ = IDS_HOTWORD_NACL_DISABLED_ERROR_MESSAGE; |
| + |
| + RecordErrorMetrics(error_message_); |
| + |
| + return (error_message_ == 0) && IsHotwordAllowed(); |
| } |
| bool HotwordService::IsHotwordAllowed() { |
| @@ -255,15 +313,6 @@ bool HotwordService::IsOptedIntoAudioLogging() { |
| profile_->GetPrefs()->GetBoolean(prefs::kHotwordAudioLoggingEnabled); |
| } |
| -bool HotwordService::RetryHotwordExtension() { |
| - ExtensionService* extension_service = GetExtensionService(profile_); |
| - if (!extension_service) |
| - return false; |
| - |
| - extension_service->ReloadExtension(extension_misc::kHotwordExtensionId); |
| - return true; |
| -} |
| - |
| void HotwordService::EnableHotwordExtension( |
| ExtensionService* extension_service) { |
| if (extension_service) |