Index: ios/chrome/app/steps/launch_to_background.mm |
diff --git a/ios/chrome/app/steps/launch_to_background.mm b/ios/chrome/app/steps/launch_to_background.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9a1fed66b26826d9b96a3a2ff02367ec111d274a |
--- /dev/null |
+++ b/ios/chrome/app/steps/launch_to_background.mm |
@@ -0,0 +1,131 @@ |
+// 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/steps/launch_to_background.h" |
+ |
+#include <memory> |
+ |
+#include "base/mac/bundle_locations.h" |
+#include "base/mac/foundation_util.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "base/supports_user_data.h" |
+#include "ios/chrome/app/application_state.h" |
+#include "ios/chrome/app/startup/ios_chrome_main.h" |
+#include "ios/chrome/app/startup/register_experimental_settings.h" |
+#include "ios/chrome/browser/application_context.h" |
+#include "ios/chrome/browser/browser_state/chrome_browser_state_manager.h" |
+#include "ios/chrome/browser/web/chrome_web_client.h" |
+#include "ios/web/public/web_client.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+// Step that removes a previously-stored IOSChromeMain instance. |
+@interface StopChromeMain : NSObject<ApplicationStep> |
+@end |
+ |
+namespace { |
+ |
+// A SupportsUserData::Data struct to store an IOSChromeMain object and preserve |
+// its lifetime (by storing it in an ApplicationState's |state| property) beyond |
+// the running time of the -StartChromeMain step. |
+class ChromeMainContainer : public base::SupportsUserData::Data { |
+ public: |
+ explicit ChromeMainContainer(std::unique_ptr<IOSChromeMain> chrome_main) |
+ : main_(std::move(chrome_main)) {} |
+ |
+ private: |
+ std::unique_ptr<IOSChromeMain> main_; |
+}; |
+ |
+// Key for storing the ChromeMainContainer. |
+const char kChromeMainKey[] = "chrome_main"; |
+ |
+} // namespace |
+ |
+@implementation SetupBundleAndUserDefaults |
+ |
+- (BOOL)canRunInState:(ApplicationState*)state { |
+ return state.phase == APPLICATION_BASIC; |
+} |
+ |
+- (void)runInState:(ApplicationState*)state { |
+ NSBundle* baseBundle = base::mac::OuterBundle(); |
+ base::mac::SetBaseBundleID( |
+ base::SysNSStringToUTF8([baseBundle bundleIdentifier]).c_str()); |
+ |
+ [RegisterExperimentalSettings |
+ registerExperimentalSettingsWithUserDefaults:[NSUserDefaults |
+ standardUserDefaults] |
+ bundle:base::mac:: |
+ FrameworkBundle()]; |
+} |
+ |
+@end |
+ |
+@implementation StartChromeMain |
+ |
+- (BOOL)canRunInState:(ApplicationState*)state { |
+ return state.phase == APPLICATION_BASIC; |
+} |
+ |
+- (void)runInState:(ApplicationState*)state { |
+ web::SetWebClient(new ChromeWebClient()); |
+ |
+ // Create and persist an IOSChromeMain instance. |
+ state.persistentState->SetUserData( |
+ kChromeMainKey, |
+ new ChromeMainContainer(base::MakeUnique<IOSChromeMain>())); |
+ |
+ // Add a step to the termination steps of |state| that will stop and remove |
+ // the IOSChromeMain instance. |
+ [[state terminationSteps] addObject:[[StopChromeMain alloc] init]]; |
+ |
+ state.phase = APPLICATION_BACKGROUNDED; |
+} |
+ |
+@end |
+ |
+@implementation StopChromeMain |
+ |
+- (BOOL)canRunInState:(ApplicationState*)state { |
+ return state.phase == APPLICATION_TERMINATING; |
+} |
+ |
+- (void)runInState:(ApplicationState*)state { |
+ // This should be the last step executed while the app is terminating. |
+ if (state.terminationSteps.count) { |
+ // There are other steps waiting to run, so add this to the end and return. |
+ [state.terminationSteps addObject:self]; |
+ return; |
+ } |
+ state.persistentState->RemoveUserData(kChromeMainKey); |
+} |
+ |
+@end |
+ |
+@implementation SetBrowserState |
+ |
+- (BOOL)canRunInState:(ApplicationState*)state { |
+ ApplicationContext* applicationContext = GetApplicationContext(); |
+ if (!applicationContext) |
+ return NO; |
+ |
+ return applicationContext->GetChromeBrowserStateManager() && |
+ state.phase == APPLICATION_BACKGROUNDED; |
+} |
+ |
+- (void)runInState:(ApplicationState*)state { |
+ state.browserState = GetApplicationContext() |
+ ->GetChromeBrowserStateManager() |
+ ->GetLastUsedBrowserState(); |
+} |
+ |
+@end |