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