|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "ios/chrome/browser/crash_loop_detection_util.h" | 
|  |  | 
|  | #import <Foundation/Foundation.h> | 
|  |  | 
|  | #if !defined(__has_feature) || !__has_feature(objc_arc) | 
|  | #error "This file requires ARC support." | 
|  | #endif | 
|  |  | 
|  | namespace { | 
|  | static int startup_attempt_count = -1; | 
|  | NSString* const kAppStartupFailureCountKey = @"AppStartupFailureCount"; | 
|  | } | 
|  |  | 
|  | namespace crash_util { | 
|  |  | 
|  | int GetFailedStartupAttemptCount() { | 
|  | if (startup_attempt_count == -1) { | 
|  | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
|  | startup_attempt_count = [defaults integerForKey:kAppStartupFailureCountKey]; | 
|  | } | 
|  | return startup_attempt_count; | 
|  | } | 
|  |  | 
|  | void IncrementFailedStartupAttemptCount(bool flush_immediately) { | 
|  | int startup_attempt_count = GetFailedStartupAttemptCount(); | 
|  | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
|  | [defaults setInteger:(startup_attempt_count + 1) | 
|  | forKey:kAppStartupFailureCountKey]; | 
|  | if (flush_immediately) | 
|  | [defaults synchronize]; | 
|  | } | 
|  |  | 
|  | void ResetFailedStartupAttemptCount() { | 
|  | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
|  | if ([defaults integerForKey:kAppStartupFailureCountKey] != 0) { | 
|  | [defaults setInteger:0 forKey:kAppStartupFailureCountKey]; | 
|  | [defaults synchronize]; | 
|  | } | 
|  | } | 
|  |  | 
|  | void ResetFailedStartupAttemptCountForTests() { | 
|  | ResetFailedStartupAttemptCount(); | 
|  | startup_attempt_count = -1; | 
|  | } | 
|  |  | 
|  | }  // namespace crash_util |