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_BROWSER_WEB_APPLICATIONS_WEB_APP_MAC_H_ 6 #define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_MAC_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/files/file_path.h" 13 #include "base/gtest_prod_util.h" 14 #include "chrome/browser/shell_integration.h" 15 #include "chrome/browser/web_applications/web_app.h" 16 17 namespace web_app { 18 19 // Returns the full path of the .app shim that would be created by 20 // web_app::CreateShortcuts(). 21 base::FilePath GetAppInstallPath( 22 const ShellIntegration::ShortcutInfo& shortcut_info); 23 24 // If necessary, launch the shortcut for an app. 25 void MaybeLaunchShortcut(const ShellIntegration::ShortcutInfo& shortcut_info); 26 27 // Creates a shortcut for a web application. The shortcut is a stub app 28 // that simply loads the browser framework and runs the given app. 29 class WebAppShortcutCreator { 30 public: 31 // Creates a new shortcut based on information in |shortcut_info|. 32 // A copy of the shortcut is placed in |app_data_dir|. 33 // |chrome_bundle_id| is the CFBundleIdentifier of the Chrome browser bundle. 34 WebAppShortcutCreator( 35 const base::FilePath& app_data_dir, 36 const ShellIntegration::ShortcutInfo& shortcut_info); 37 38 virtual ~WebAppShortcutCreator(); 39 40 // Returns the base name for the shortcut. 41 base::FilePath GetShortcutBasename() const; 42 43 // Returns a path to the Chrome Apps folder in the relevant applications 44 // folder. E.g. ~/Applications or /Applications. 45 virtual base::FilePath GetApplicationsDirname() const; 46 47 // The full path to the app bundle under the relevant Applications folder. 48 base::FilePath GetApplicationsShortcutPath() const; 49 50 // The full path to the app bundle under the profile folder. 51 base::FilePath GetInternalShortcutPath() const; 52 53 bool CreateShortcuts(ShortcutCreationReason creation_reason, 54 ShellIntegration::ShortcutLocations creation_locations); 55 void DeleteShortcuts(); 56 bool UpdateShortcuts(); 57 58 protected: 59 // Returns a path to an app bundle with the given id. Or an empty path if no 60 // matching bundle was found. 61 // Protected and virtual so it can be mocked out for testing. 62 virtual base::FilePath GetAppBundleById(const std::string& bundle_id) const; 63 64 // Show the bundle we just generated in the Finder. 65 virtual void RevealAppShimInFinder() const; 66 67 private: 68 FRIEND_TEST_ALL_PREFIXES(WebAppShortcutCreatorTest, DeleteShortcuts); 69 FRIEND_TEST_ALL_PREFIXES(WebAppShortcutCreatorTest, UpdateIcon); 70 FRIEND_TEST_ALL_PREFIXES(WebAppShortcutCreatorTest, UpdateShortcuts); 71 72 // Returns the bundle identifier to use for this app bundle. 73 std::string GetBundleIdentifier() const; 74 75 // Returns the bundle identifier for the internal copy of the bundle. 76 std::string GetInternalBundleIdentifier() const; 77 78 // Copies the app loader template into a temporary directory and fills in all 79 // relevant information. 80 bool BuildShortcut(const base::FilePath& staging_path) const; 81 82 // Builds a shortcut and copies it into the given destination folders. 83 // Returns with the number of successful copies. Returns on the first failure. 84 size_t CreateShortcutsIn(const std::vector<base::FilePath>& folders) const; 85 86 // Updates the InfoPlist.string inside |app_path| with the display name for 87 // the app. 88 bool UpdateDisplayName(const base::FilePath& app_path) const; 89 90 // Updates the bundle id of the internal copy of the app shim bundle. 91 bool UpdateInternalBundleIdentifier() const; 92 93 // Updates the plist inside |app_path| with information about the app. 94 bool UpdatePlist(const base::FilePath& app_path) const; 95 96 // Updates the icon for the shortcut. 97 bool UpdateIcon(const base::FilePath& app_path) const; 98 99 // Path to the data directory for this app. For example: 100 // ~/Library/Application Support/Chromium/Default/Web Applications/_crx_abc/ 101 base::FilePath app_data_dir_; 102 103 // Information about the app. 104 ShellIntegration::ShortcutInfo info_; 105 106 DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreator); 107 }; 108 109 } // namespace web_app 110 111 #endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_MAC_H_ 112