1// Copyright (c) 2012 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#ifndef CHROME_COMMON_MAC_APP_MODE_COMMON_H_
6#define CHROME_COMMON_MAC_APP_MODE_COMMON_H_
7
8#import <Foundation/Foundation.h>
9
10#include "base/files/file_path.h"
11#include "base/strings/string16.h"
12
13// This file contains constants, interfaces, etc. which are common to the
14// browser application and the app mode loader (a.k.a. shim).
15
16namespace app_mode {
17
18// These are keys for an Apple Event ping that the app shim process sends to
19// Chrome to get confirmation that Chrome is alive. The main Chrome process
20// doesn't need to register any handlers for them -- the event is just sent for
21// the empty reply that's automatically returned by the system.
22const AEEventClass kAEChromeAppClass = 'cApp';
23const AEEventID kAEChromeAppPing = 'ping';
24
25// The IPC socket used to communicate between app shims and Chrome will be
26// created under a temporary directory with this name.
27extern const char kAppShimSocketShortName[];
28// A symlink to allow the app shim to find the socket will be created under the
29// user data dir with this name.
30extern const char kAppShimSocketSymlinkName[];
31
32// A symlink used to store the version string of the currently running Chrome.
33// The shim will read this to determine which version of the framework to load.
34extern const char kRunningChromeVersionSymlinkName[];
35
36// Special app mode id used for the App Launcher.
37extern const char kAppListModeId[];
38
39// The process ID of the Chrome process that launched the app shim.
40// The presence of this switch instructs the app shim to send LaunchApp with
41// launch_now = false. This associates the shim without launching the app.
42extern const char kLaunchedByChromeProcessId[];
43
44// Indicates to the shim that it was launched for a test, so don't attempt to
45// launch Chrome.
46extern const char kLaunchedForTest[];
47
48// Indicates to the shim that this Chrome has rebuilt it once already, i.e. if
49// it fails to launch again, don't trigger another rebuild.
50extern const char kLaunchedAfterRebuild[];
51
52// Path to an app shim bundle. Indicates to Chrome that this shim attempted to
53// launch but failed.
54extern const char kAppShimError[];
55
56// Keys for specifying the file types handled by an app.
57extern NSString* const kCFBundleDocumentTypesKey;
58extern NSString* const kCFBundleTypeExtensionsKey;
59extern NSString* const kCFBundleTypeIconFileKey;
60extern NSString* const kCFBundleTypeNameKey;
61extern NSString* const kCFBundleTypeMIMETypesKey;
62extern NSString* const kCFBundleTypeRoleKey;
63extern NSString* const kBundleTypeRoleViewer;
64
65// The display name of the bundle as shown in Finder and the Dock. For localized
66// bundles, this overrides the bundle's file name.
67extern NSString* const kCFBundleDisplayNameKey;
68
69// The Chrome version string in the app shim bundle.
70extern NSString* const kCFBundleShortVersionStringKey;
71
72// The key specifying whether the display name should be localized. This makes
73// Finder look in localization folders in the app bundle for a display name.
74// (e.g. Content/Resources/en.lproj/)
75extern NSString* const kLSHasLocalizedDisplayNameKey;
76
77// The key under which the browser's bundle ID will be stored in the
78// app mode launcher bundle's Info.plist.
79extern NSString* const kBrowserBundleIDKey;
80
81// Key for the shortcut ID.
82extern NSString* const kCrAppModeShortcutIDKey;
83
84// Key for the app's name.
85extern NSString* const kCrAppModeShortcutNameKey;
86
87// Key for the app's URL.
88extern NSString* const kCrAppModeShortcutURLKey;
89
90// Key for the app user data directory.
91extern NSString* const kCrAppModeUserDataDirKey;
92
93// Key for the app's extension path.
94extern NSString* const kCrAppModeProfileDirKey;
95
96// Key for the app's profile display name.
97extern NSString* const kCrAppModeProfileNameKey;
98
99// When the Chrome browser is run, it stores its location in the defaults
100// system using this key.
101extern NSString* const kLastRunAppBundlePathPrefsKey;
102
103// Placeholders used in the app mode loader bundle' Info.plist:
104extern NSString* const kShortcutIdPlaceholder; // Extension shortcut ID.
105extern NSString* const kShortcutNamePlaceholder; // Extension name.
106extern NSString* const kShortcutURLPlaceholder;
107// Bundle ID of the Chrome browser bundle.
108extern NSString* const kShortcutBrowserBundleIDPlaceholder;
109
110// Current major/minor version numbers of |ChromeAppModeInfo| (defined below).
111const unsigned kCurrentChromeAppModeInfoMajorVersion = 1;
112const unsigned kCurrentChromeAppModeInfoMinorVersion = 3;
113
114// The structure used to pass information from the app mode loader to the
115// (browser) framework. This is versioned using major and minor version numbers,
116// written below as v<major>.<minor>. Version-number checking is done by the
117// framework, and the framework must accept all structures with the same major
118// version number. It may refuse to load if the major version of the structure
119// is different from the one it accepts.
120struct ChromeAppModeInfo {
121 public:
122  ChromeAppModeInfo();
123  ~ChromeAppModeInfo();
124
125  // Major and minor version number of this structure.
126  unsigned major_version;  // Required: all versions
127  unsigned minor_version;  // Required: all versions
128
129  // Original |argc| and |argv|.
130  int argc;  // Required: v1.0
131  char** argv;  // Required: v1.0
132
133  // Versioned path to the browser which is being loaded.
134  base::FilePath chrome_versioned_path;  // Required: v1.0
135
136  // Path to Chrome app bundle.
137  base::FilePath chrome_outer_bundle_path;  // Required: v1.0
138
139  // Information about the App Mode shortcut:
140
141  // Path to the App Mode Loader application bundle that launched the process.
142  base::FilePath app_mode_bundle_path;  // Optional: v1.0
143
144  // Short ID string, preferably derived from |app_mode_short_name|. Should be
145  // safe for the file system.
146  std::string app_mode_id;  // Required: v1.0
147
148  // Unrestricted (e.g., several-word) UTF8-encoded name for the shortcut.
149  base::string16 app_mode_name;  // Optional: v1.0
150
151  // URL for the shortcut. Must be a valid URL.
152  std::string app_mode_url;  // Required: v1.0
153
154  // Path to the app's user data directory.
155  base::FilePath user_data_dir;
156
157  // Directory of the profile associated with the app.
158  base::FilePath profile_dir;
159};
160
161// Check that the socket and its parent directory have the correct permissions
162// and are owned by the user.
163void VerifySocketPermissions(const base::FilePath& socket_path);
164
165}  // namespace app_mode
166
167#endif  // CHROME_COMMON_MAC_APP_MODE_COMMON_H_
168