Index: ios/chrome/app/application_state.mm |
diff --git a/ios/chrome/app/application_state.mm b/ios/chrome/app/application_state.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f6a8fb8177a46dc8049ad1d95485c24571f1f8d2 |
--- /dev/null |
+++ b/ios/chrome/app/application_state.mm |
@@ -0,0 +1,110 @@ |
+// Copyright 2016 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. |
+ |
+// ====== New Architecture ===== |
+// = This code is only used in the new iOS Chrome architecture. = |
+// ============================================================================ |
+ |
+#import "ios/chrome/app/application_state.h" |
+ |
+#include <memory> |
+ |
+#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/supports_user_data.h" |
+#import "ios/chrome/app/application_step.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace { |
+ |
+// Specialization of base::SupportsUserData for use in this class. |
+class PersistentApplicationState : public base::SupportsUserData { |
+ public: |
+ ~PersistentApplicationState() override {} |
+}; |
+ |
+} // namespace |
+ |
+@interface ApplicationState () |
+@property(nonatomic, readwrite, copy) NSDictionary* launchOptions; |
+@end |
+ |
+@implementation ApplicationState { |
+ std::unique_ptr<PersistentApplicationState> _persistentState; |
+} |
+ |
+@synthesize application = _application; |
+@synthesize browserState = _browserState; |
+@synthesize URLOpener = _URLOpener; |
+@synthesize phase = _phase; |
+@synthesize window = _window; |
+@synthesize launchSteps = _launchSteps; |
+@synthesize terminationSteps = _terminationSteps; |
+@synthesize backgroundSteps = _backgroundSteps; |
+@synthesize foregroundSteps = _foregroundSteps; |
+@synthesize launchOptions = _launchOptions; |
+ |
+#pragma mark - Object lifecycle |
+ |
+- (instancetype)init { |
+ if ((self = [super init])) { |
+ _phase = APPLICATION_COLD; |
+ _launchSteps = [ApplicationStepArray array]; |
+ _terminationSteps = [ApplicationStepArray array]; |
+ _backgroundSteps = [ApplicationStepArray array]; |
+ _foregroundSteps = [ApplicationStepArray array]; |
+ _persistentState = base::MakeUnique<PersistentApplicationState>(); |
+ } |
+ return self; |
+} |
+ |
+#pragma mark - Public API |
+ |
+- (base::SupportsUserData*)persistentState { |
+ return _persistentState.get(); |
+} |
+ |
+- (void)launchWithOptions:(NSDictionary*)launchOptions { |
+ self.launchOptions = launchOptions; |
+ [self continueLaunch]; |
+} |
+ |
+- (void)continueLaunch { |
+ [self runSteps:self.launchSteps]; |
+} |
+ |
+- (void)terminate { |
+ CHECK(self.phase != APPLICATION_TERMINATING); |
+ self.phase = APPLICATION_TERMINATING; |
+ [self runSteps:self.terminationSteps]; |
+ CHECK(self.terminationSteps.count == 0); |
+} |
+ |
+- (void)background { |
+ [self runSteps:self.backgroundSteps]; |
+} |
+ |
+- (void)foreground { |
+ [self runSteps:self.foregroundSteps]; |
+} |
+ |
+#pragma mark - Running steps |
+ |
+// While the first step in |steps| can run in |self|, pop it, run it, and |
+// release ownership of it. |
+- (void)runSteps:(ApplicationStepArray*)steps { |
+ while ([steps.firstObject canRunInState:self]) { |
+ id<ApplicationStep> nextStep = steps.firstObject; |
+ [steps removeObject:nextStep]; |
+ // |nextStep| should not be in |steps| when -runInState is called. |
+ // (Some steps may re-insert themselves into |steps|, for example). |
+ DCHECK(![steps containsObject:nextStep]); |
+ [nextStep runInState:self]; |
+ } |
+} |
+ |
+@end |