| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "ios/chrome/browser/metrics/ios_stability_metrics_provider.h" |
| 6 |
| 7 #include <Foundation/Foundation.h> |
| 8 |
| 9 #include "base/logging.h" |
| 10 #include "base/metrics/histogram_macros.h" |
| 11 #include "components/metrics/metrics_service.h" |
| 12 #include "ios/chrome/browser/crash_report/breakpad_helper.h" |
| 13 #import "ios/chrome/browser/crash_report/crash_report_background_uploader.h" |
| 14 #import "ios/chrome/browser/metrics/previous_session_info.h" |
| 15 |
| 16 namespace { |
| 17 |
| 18 // Logs |type| in the shutdown type histogram. |
| 19 void LogShutdownType(MobileSessionShutdownType type) { |
| 20 UMA_STABILITY_HISTOGRAM_ENUMERATION("Stability.MobileSessionShutdownType", |
| 21 type, MOBILE_SESSION_SHUTDOWN_TYPE_COUNT); |
| 22 } |
| 23 |
| 24 } // namespace |
| 25 |
| 26 IOSStabilityMetricsProvider::IOSStabilityMetricsProvider( |
| 27 metrics::MetricsService* metrics_service) |
| 28 : metrics_service_(metrics_service) { |
| 29 DCHECK(metrics_service_); |
| 30 } |
| 31 |
| 32 IOSStabilityMetricsProvider::~IOSStabilityMetricsProvider() { |
| 33 } |
| 34 |
| 35 bool IOSStabilityMetricsProvider::HasInitialStabilityMetrics() { |
| 36 return true; |
| 37 } |
| 38 |
| 39 void IOSStabilityMetricsProvider::ProvideInitialStabilityMetrics( |
| 40 metrics::SystemProfileProto* system_profile_proto) { |
| 41 // If this is the first launch after an upgrade, existing crash reports |
| 42 // may have been deleted before this code runs, so log this case in its |
| 43 // own bucket. |
| 44 if (IsFirstLaunchAfterUpgrade()) { |
| 45 LogShutdownType(FIRST_LAUNCH_AFTER_UPGRADE); |
| 46 return; |
| 47 } |
| 48 |
| 49 // If the last app lifetime did not end with a crash, then log it as a |
| 50 // normal shutdown while in the background. |
| 51 if (metrics_service_->WasLastShutdownClean()) { |
| 52 LogShutdownType(SHUTDOWN_IN_BACKGROUND); |
| 53 return; |
| 54 } |
| 55 |
| 56 // If the last app lifetime ended in a crash, log the type of crash. |
| 57 MobileSessionShutdownType shutdown_type; |
| 58 const bool with_crash_log = |
| 59 HasUploadedCrashReportsInBackground() || HasCrashLogs(); |
| 60 if (ReceivedMemoryWarningBeforeLastShutdown()) { |
| 61 if (with_crash_log) { |
| 62 shutdown_type = SHUTDOWN_IN_FOREGROUND_WITH_CRASH_LOG_WITH_MEMORY_WARNING; |
| 63 } else { |
| 64 shutdown_type = SHUTDOWN_IN_FOREGROUND_NO_CRASH_LOG_WITH_MEMORY_WARNING; |
| 65 } |
| 66 } else { |
| 67 if (with_crash_log) { |
| 68 shutdown_type = SHUTDOWN_IN_FOREGROUND_WITH_CRASH_LOG_NO_MEMORY_WARNING; |
| 69 } else { |
| 70 shutdown_type = SHUTDOWN_IN_FOREGROUND_NO_CRASH_LOG_NO_MEMORY_WARNING; |
| 71 } |
| 72 } |
| 73 LogShutdownType(shutdown_type); |
| 74 } |
| 75 |
| 76 bool IOSStabilityMetricsProvider::IsFirstLaunchAfterUpgrade() { |
| 77 return [[PreviousSessionInfo sharedInstance] isFirstSessionAfterUpgrade]; |
| 78 } |
| 79 |
| 80 bool IOSStabilityMetricsProvider::HasCrashLogs() { |
| 81 return breakpad_helper::HasReportToUpload(); |
| 82 } |
| 83 |
| 84 bool IOSStabilityMetricsProvider::HasUploadedCrashReportsInBackground() { |
| 85 return [CrashReportBackgroundUploader hasUploadedCrashReportsInBackground]; |
| 86 } |
| 87 |
| 88 bool IOSStabilityMetricsProvider::ReceivedMemoryWarningBeforeLastShutdown() { |
| 89 return [[PreviousSessionInfo sharedInstance] |
| 90 didSeeMemoryWarningShortlyBeforeTerminating]; |
| 91 } |
| OLD | NEW |