1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
content / shell / app / ios / shell_application_ios.mm [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "content/shell/app/ios/shell_application_ios.h"
#include "base/command_line.h"
#include "content/public/app/content_main.h"
#include "content/public/app/content_main_runner.h"
#include "content/shell/app/shell_main_delegate.h"
#include "content/shell/browser/shell.h"
#include "content/shell/browser/shell_browser_context.h"
#include "content/shell/browser/shell_content_browser_client.h"
#include "ui/gfx/geometry/size.h"
static int g_argc = 0;
static const char** g_argv = nullptr;
static std::unique_ptr<content::ContentMainRunner> g_main_runner;
static std::unique_ptr<content::ShellMainDelegate> g_main_delegate;
@interface ShellAppSceneDelegate : UIResponder <UIWindowSceneDelegate>
@end
@implementation ShellAppSceneDelegate
- (void)scene:(UIScene*)scene
willConnectToSession:(UISceneSession*)session
options:(UISceneConnectionOptions*)connectionOptions {
CHECK_EQ(1u, content::Shell::windows().size());
UIWindow* window = content::Shell::windows()[0]->window().Get();
// The rootViewController must be added after a windowScene is set
// so stash it in a temp variable and then reattach it. If we don't
// do this the safe area gets screwed up on orientation changes.
UIViewController* controller = window.rootViewController;
window.rootViewController = nil;
window.windowScene = (UIWindowScene*)scene;
window.rootViewController = controller;
[window makeKeyAndVisible];
}
@end
@implementation ShellAppDelegate
- (UISceneConfiguration*)application:(UIApplication*)application
configurationForConnectingSceneSession:
(UISceneSession*)connectingSceneSession
options:(UISceneConnectionOptions*)options {
UISceneConfiguration* configuration =
[[UISceneConfiguration alloc] initWithName:nil
sessionRole:connectingSceneSession.role];
configuration.delegateClass = ShellAppSceneDelegate.class;
return configuration;
}
- (BOOL)application:(UIApplication*)application
willFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
g_main_delegate = std::make_unique<content::ShellMainDelegate>();
content::ContentMainParams params(g_main_delegate.get());
params.argc = g_argc;
params.argv = g_argv;
g_main_runner = content::ContentMainRunner::Create();
content::RunContentProcess(std::move(params), g_main_runner.get());
return YES;
}
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
return YES;
}
- (void)applicationWillResignActive:(UIApplication*)application {
}
- (void)applicationDidEnterBackground:(UIApplication*)application {
}
- (void)applicationWillEnterForeground:(UIApplication*)application {
}
- (void)applicationDidBecomeActive:(UIApplication*)application {
}
- (void)applicationWillTerminate:(UIApplication*)application {
}
- (BOOL)application:(UIApplication*)application
shouldSaveSecureApplicationState:(NSCoder*)coder {
return YES;
}
- (BOOL)application:(UIApplication*)application
shouldRestoreSecureApplicationState:(NSCoder*)coder {
// TODO(crbug.com/41312374): Make this value configurable in the settings.
return YES;
}
@end
int RunShellApplication(int argc, const char** argv) {
g_argc = argc;
g_argv = argv;
@autoreleasepool {
return UIApplicationMain(argc, const_cast<char**>(argv), nil,
NSStringFromClass([ShellAppDelegate class]));
}
}