15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_COMMON_MAC_APP_MODE_COMMON_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_COMMON_MAC_APP_MODE_COMMON_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Foundation/Foundation.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains constants, interfaces, etc. which are common to the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser application and the app mode loader (a.k.a. shim).
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace app_mode {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are keys for an Apple Event ping that the app shim process sends to
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chrome to get confirmation that Chrome is alive. The main Chrome process
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// doesn't need to register any handlers for them -- the event is just sent for
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the empty reply that's automatically returned by the system.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AEEventClass kAEChromeAppClass = 'cApp';
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AEEventID kAEChromeAppPing = 'ping';
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The IPC socket used to communicate between app shims and Chrome will be
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// created under a temporary directory with this name.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kAppShimSocketShortName[];
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A symlink to allow the app shim to find the socket will be created under the
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// user data dir with this name.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kAppShimSocketSymlinkName[];
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A symlink used to store the version string of the currently running Chrome.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The shim will read this to determine which version of the framework to load.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciextern const char kRunningChromeVersionSymlinkName[];
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Special app mode id used for the App Launcher.
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)extern const char kAppListModeId[];
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// The process ID of the Chrome process that launched the app shim.
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// The presence of this switch instructs the app shim to send LaunchApp with
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// launch_now = false. This associates the shim without launching the app.
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)extern const char kLaunchedByChromeProcessId[];
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Indicates to the shim that it was launched for a test, so don't attempt to
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// launch Chrome.
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)extern const char kLaunchedForTest[];
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Indicates to the shim that this Chrome has rebuilt it once already, i.e. if
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// it fails to launch again, don't trigger another rebuild.
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)extern const char kLaunchedAfterRebuild[];
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Path to an app shim bundle. Indicates to Chrome that this shim attempted to
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// launch but failed.
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern const char kAppShimError[];
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Keys for specifying the file types handled by an app.
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleDocumentTypesKey;
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleTypeExtensionsKey;
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleTypeIconFileKey;
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleTypeNameKey;
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleTypeMIMETypesKey;
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kCFBundleTypeRoleKey;
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuextern NSString* const kBundleTypeRoleViewer;
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// The display name of the bundle as shown in Finder and the Dock. For localized
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// bundles, this overrides the bundle's file name.
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)extern NSString* const kCFBundleDisplayNameKey;
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The Chrome version string in the app shim bundle.
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern NSString* const kCFBundleShortVersionStringKey;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// The key specifying whether the display name should be localized. This makes
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Finder look in localization folders in the app bundle for a display name.
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// (e.g. Content/Resources/en.lproj/)
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)extern NSString* const kLSHasLocalizedDisplayNameKey;
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The key under which the browser's bundle ID will be stored in the
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// app mode launcher bundle's Info.plist.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kBrowserBundleIDKey;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key for the shortcut ID.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kCrAppModeShortcutIDKey;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key for the app's name.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kCrAppModeShortcutNameKey;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key for the app's URL.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kCrAppModeShortcutURLKey;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key for the app user data directory.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kCrAppModeUserDataDirKey;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key for the app's extension path.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern NSString* const kCrAppModeProfileDirKey;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Key for the app's profile display name.
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)extern NSString* const kCrAppModeProfileNameKey;
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the Chrome browser is run, it stores its location in the defaults
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system using this key.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kLastRunAppBundlePathPrefsKey;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Placeholders used in the app mode loader bundle' Info.plist:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kShortcutIdPlaceholder; // Extension shortcut ID.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kShortcutNamePlaceholder; // Extension name.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kShortcutURLPlaceholder;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bundle ID of the Chrome browser bundle.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern NSString* const kShortcutBrowserBundleIDPlaceholder;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Current major/minor version numbers of |ChromeAppModeInfo| (defined below).
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned kCurrentChromeAppModeInfoMajorVersion = 1;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst unsigned kCurrentChromeAppModeInfoMinorVersion = 3;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The structure used to pass information from the app mode loader to the
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (browser) framework. This is versioned using major and minor version numbers,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// written below as v<major>.<minor>. Version-number checking is done by the
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// framework, and the framework must accept all structures with the same major
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version number. It may refuse to load if the major version of the structure
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is different from the one it accepts.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChromeAppModeInfo {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeAppModeInfo();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ChromeAppModeInfo();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Major and minor version number of this structure.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned major_version;  // Required: all versions
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned minor_version;  // Required: all versions
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Original |argc| and |argv|.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int argc;  // Required: v1.0
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char** argv;  // Required: v1.0
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Versioned path to the browser which is being loaded.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath chrome_versioned_path;  // Required: v1.0
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to Chrome app bundle.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath chrome_outer_bundle_path;  // Required: v1.0
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Information about the App Mode shortcut:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to the App Mode Loader application bundle that launched the process.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_mode_bundle_path;  // Optional: v1.0
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Short ID string, preferably derived from |app_mode_short_name|. Should be
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // safe for the file system.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_mode_id;  // Required: v1.0
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unrestricted (e.g., several-word) UTF8-encoded name for the shortcut.
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 app_mode_name;  // Optional: v1.0
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL for the shortcut. Must be a valid URL.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_mode_url;  // Required: v1.0
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to the app's user data directory.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath user_data_dir;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Directory of the profile associated with the app.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_dir;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Check that the socket and its parent directory have the correct permissions
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// and are owned by the user.
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void VerifySocketPermissions(const base::FilePath& socket_path);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace app_mode
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_COMMON_MAC_APP_MODE_COMMON_H_
168