Index: chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc |
diff --git a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc |
index e47c7ad10f96d3a801b44b0f14e9630dd8d51b20..5209e73bf1ce60e839de1e5de3a47b680a544c0e 100644 |
--- a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc |
+++ b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc |
@@ -12,10 +12,13 @@ |
#include "base/command_line.h" |
#include "base/files/file_path.h" |
#include "base/metrics/histogram_macros.h" |
+#include "base/metrics/user_metrics.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/stringprintf.h" |
#include "base/sys_info.h" |
#include "base/task_scheduler/post_task.h" |
+#include "base/threading/thread_task_runner_handle.h" |
+#include "base/time/time.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/arc/arc_migration_constants.h" |
#include "chrome/browser/chromeos/login/ui/login_feedback.h" |
@@ -46,17 +49,22 @@ constexpr char kCheckStoragePath[] = "/home"; |
constexpr char kJsApiStartMigration[] = "startMigration"; |
constexpr char kJsApiSkipMigration[] = "skipMigration"; |
constexpr char kJsApiRequestRestart[] = "requestRestart"; |
+constexpr char kJsApiRequestRestartOnFailure[] = "requestRestartOnFailure"; |
constexpr char kJsApiOpenFeedbackDialog[] = "openFeedbackDialog"; |
// UMA names. |
constexpr char kUmaNameFirstScreen[] = "Cryptohome.MigrationUI.FirstScreen"; |
constexpr char kUmaNameUserChoice[] = "Cryptohome.MigrationUI.UserChoice"; |
+constexpr char kUmaNameMigrationResult[] = |
+ "Cryptohome.MigrationUI.MigrationResult"; |
+constexpr char kUmaNameRemoveCryptohomeResult[] = |
+ "Cryptohome.MigrationUI.RemoveCryptohomeResult"; |
constexpr char kUmaNameConsumedBatteryPercent[] = |
"Cryptohome.MigrationUI.ConsumedBatteryPercent"; |
-// This enum must match the numbering for Cryptohome.MigrationUI.FirstScreen in |
-// histograms.xml. Do not reorder or remove items, only add new items before |
-// FIRST_SCREEN_MAX. |
+// This enum must match the numbering for MigrationUIFirstScreen in |
+// histograms/enums.xml. Do not reorder or remove items, only add new items |
+// before FIRST_SCREEN_COUNT. |
enum class FirstScreen { |
FIRST_SCREEN_READY = 0, |
FIRST_SCREEN_RESUME = 1, |
@@ -64,15 +72,37 @@ enum class FirstScreen { |
FIRST_SCREEN_COUNT |
}; |
-// This enum must match the numbering for Cryptohome.MigrationUI.UserChoice in |
-// histograms.xml. Do not reorder or remove items, only add new items before |
-// FIRST_SCREEN_MAX. |
+// This enum must match the numbering for MigrationUIUserChoice in |
+// histograms/enums.xml. Do not reorder or remove items, only add new items |
+// before USER_CHOICE_COUNT. |
enum class UserChoice { |
USER_CHOICE_UPDATE = 0, |
USER_CHOICE_SKIP = 1, |
USER_CHOICE_COUNT |
}; |
+// This enum must match the numbering for MigrationUIMigrationResult in |
+// histograms/enums.xml. Do not reorder or remove items, only add new items |
+// before COUNT. |
+enum class MigrationResult { |
fukino
2017/05/31 12:21:28
MigrationResult and RemoveCryptohomeResult have th
|
+ SUCCESS_IN_NEW_MIGRATION = 0, |
+ SUCCESS_IN_RESUMED_MIGRATION = 1, |
+ FAILURE_IN_NEW_MIGRATION = 2, |
+ FAILURE_IN_RESUMED_MIGRATION = 3, |
+ COUNT |
+}; |
+ |
+// This enum must match the numbering for MigrationUIRemoveCryptohomeResult in |
+// histograms/enums.xml. Do not reorder or remove items, only add new items |
+// before COUNT. |
+enum class RemoveCryptohomeResult { |
+ SUCCESS_IN_NEW_MIGRATION = 0, |
+ SUCCESS_IN_RESUMED_MIGRATION = 1, |
+ FAILURE_IN_NEW_MIGRATION = 2, |
+ FAILURE_IN_RESUMED_MIGRATION = 3, |
+ COUNT |
+}; |
+ |
bool IsTestingUI() { |
return base::CommandLine::ForCurrentProcess()->HasSwitch( |
chromeos::switches::kTestEncryptionMigrationUI); |
@@ -89,6 +119,36 @@ void RecordUserChoice(UserChoice user_choice) { |
static_cast<int>(UserChoice::USER_CHOICE_COUNT)); |
} |
+void RecordMigrationResult(bool success, bool is_resumed_migration) { |
+ MigrationResult result = |
+ success ? (is_resumed_migration |
+ ? MigrationResult::SUCCESS_IN_RESUMED_MIGRATION |
+ : MigrationResult::SUCCESS_IN_NEW_MIGRATION) |
+ : (is_resumed_migration |
+ ? MigrationResult::FAILURE_IN_RESUMED_MIGRATION |
+ : MigrationResult::FAILURE_IN_NEW_MIGRATION); |
+ UMA_HISTOGRAM_ENUMERATION(kUmaNameMigrationResult, static_cast<int>(result), |
+ static_cast<int>(MigrationResult::COUNT)); |
Ilya Sherman
2017/05/31 23:34:44
nit: static_casts shouldn't be needed anymore when
fukino
2017/06/01 09:28:38
Done.
|
+} |
+ |
+void RecordRemoveCryptohomeResult(bool success, bool is_resumed_migration) { |
+ RemoveCryptohomeResult result = |
+ success ? (is_resumed_migration |
+ ? RemoveCryptohomeResult::SUCCESS_IN_RESUMED_MIGRATION |
+ : RemoveCryptohomeResult::SUCCESS_IN_NEW_MIGRATION) |
+ : (is_resumed_migration |
+ ? RemoveCryptohomeResult::FAILURE_IN_RESUMED_MIGRATION |
+ : RemoveCryptohomeResult::FAILURE_IN_NEW_MIGRATION); |
+ UMA_HISTOGRAM_ENUMERATION(kUmaNameRemoveCryptohomeResult, |
+ static_cast<int>(result), |
+ static_cast<int>(RemoveCryptohomeResult::COUNT)); |
+} |
+ |
+void RecordShowFailureScreen() { |
+ base::RecordAction( |
+ base::UserMetricsAction("Cryptohome.MigrationUI.ShowFailureScreen")); |
+} |
+ |
} // namespace |
namespace chromeos { |
@@ -205,6 +265,8 @@ void EncryptionMigrationScreenHandler::RegisterMessages() { |
&EncryptionMigrationScreenHandler::HandleSkipMigration); |
AddCallback(kJsApiRequestRestart, |
&EncryptionMigrationScreenHandler::HandleRequestRestart); |
+ AddCallback(kJsApiRequestRestartOnFailure, |
+ &EncryptionMigrationScreenHandler::HandleRequestRestartOnFailure); |
AddCallback(kJsApiOpenFeedbackDialog, |
&EncryptionMigrationScreenHandler::HandleOpenFeedbackDialog); |
} |
@@ -261,6 +323,12 @@ void EncryptionMigrationScreenHandler::HandleRequestRestart() { |
DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); |
} |
+void EncryptionMigrationScreenHandler::HandleRequestRestartOnFailure() { |
+ base::RecordAction(base::UserMetricsAction( |
+ "Cryptohome.MigrationUI.RestartClickedOnFailure")); |
+ DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); |
+} |
+ |
void EncryptionMigrationScreenHandler::HandleOpenFeedbackDialog() { |
const std::string description = base::StringPrintf( |
"Auto generated feedback for http://crbug.com/719266.\n" |
@@ -398,6 +466,7 @@ void EncryptionMigrationScreenHandler::OnRemoveCryptohome( |
cryptohome::MountError return_code) { |
LOG_IF(ERROR, !success) << "Removing cryptohome failed. return code: " |
<< return_code; |
+ RecordRemoveCryptohomeResult(success, should_resume_); |
UpdateUIState(UIState::MIGRATION_FAILED); |
} |
@@ -429,6 +498,7 @@ void EncryptionMigrationScreenHandler::OnMigrationProgress( |
CallJS("setMigrationProgress", static_cast<double>(current) / total); |
break; |
case cryptohome::DIRCRYPTO_MIGRATION_SUCCESS: |
+ RecordMigrationResult(true, should_resume_); |
// If the battery level decreased during migration, record the consumed |
// battery level. |
if (*current_battery_percent_ < initial_battery_percent_) { |
@@ -441,6 +511,15 @@ void EncryptionMigrationScreenHandler::OnMigrationProgress( |
DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); |
break; |
case cryptohome::DIRCRYPTO_MIGRATION_FAILED: |
+ RecordMigrationResult(false, should_resume_); |
+ // Record an event that the user sees the failure screen. |
+ // We record it after delay to make sure that the user was actually able |
+ // to see the failure screen. There is a potential race condition where |
+ // the user can see only flash of failure screen on shutting down. |
+ // crbug.com/727980. |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, base::BindOnce(&RecordShowFailureScreen), |
+ base::TimeDelta::FromSeconds(1)); |
// Stop listening to the progress updates. |
DBusThreadManager::Get() |
->GetCryptohomeClient() |