From 2b80a369197cef31f4ce61108344b5eff9b94531 Mon Sep 17 00:00:00 2001 From: "jeremya@chromium.org" Date: Wed, 20 Mar 2013 11:57:35 +0000 Subject: [mac] Create app shortcuts in a subfolder of /Applications App shortcuts will be created in /Applications/Chrome Apps.localized, to support future localization of the directory name (see https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPInternational/Articles/LocalizingPathnames.html for details) R=benwells@chromium.org, rsesek@chromium.org BUG=180745 Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=188944 Review URL: https://chromiumcodereview.appspot.com/12912003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@189243 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/web_applications/web_app_mac.h | 3 +- chrome/browser/web_applications/web_app_mac.mm | 38 +++++++++++++++------- .../web_applications/web_app_mac_unittest.mm | 8 ++--- 3 files changed, 31 insertions(+), 18 deletions(-) (limited to 'chrome/browser/web_applications') diff --git a/chrome/browser/web_applications/web_app_mac.h b/chrome/browser/web_applications/web_app_mac.h index 177142a..8f9b90c 100644 --- a/chrome/browser/web_applications/web_app_mac.h +++ b/chrome/browser/web_applications/web_app_mac.h @@ -43,8 +43,7 @@ class WebAppShortcutCreator { base::FilePath GetAppLoaderPath() const; // Returns a path to the destination where the app should be written to. - virtual base::FilePath GetDestinationPath( - const base::FilePath& app_file_name) const; + virtual base::FilePath GetDestinationPath() const; // Updates the plist inside |app_path| with information about the app. bool UpdatePlist(const base::FilePath& app_path) const; diff --git a/chrome/browser/web_applications/web_app_mac.mm b/chrome/browser/web_applications/web_app_mac.mm index 2c61548..dc6b930 100644 --- a/chrome/browser/web_applications/web_app_mac.mm +++ b/chrome/browser/web_applications/web_app_mac.mm @@ -80,11 +80,24 @@ bool AddBitmapImageRepToIconFamily(IconFamily* icon_family, } } +base::FilePath GetWritableApplicationsDirectory() { + base::FilePath path; + if (base::mac::GetLocalDirectory(NSApplicationDirectory, &path) && + file_util::PathIsWritable(path)) { + return path; + } + if (base::mac::GetUserDirectory(NSApplicationDirectory, &path)) + return path; + return base::FilePath(); +} + } // namespace namespace web_app { +const char kChromeAppDirName[] = "Chrome Apps.localized"; + WebAppShortcutCreator::WebAppShortcutCreator( const base::FilePath& user_data_dir, const ShellIntegration::ShortcutInfo& shortcut_info, @@ -119,7 +132,15 @@ bool WebAppShortcutCreator::CreateShortcut() { if (!UpdateIcon(staging_path)) return false; - base::FilePath dst_path = GetDestinationPath(app_file_name); + base::FilePath dst_path = GetDestinationPath(); + if (dst_path.empty() || !file_util::DirectoryExists(dst_path.DirName())) { + LOG(ERROR) << "Couldn't find an Applications directory to copy app to."; + return false; + } + if (!file_util::CreateDirectory(dst_path)) { + LOG(ERROR) << "Creating directory " << dst_path.value() << " failed."; + return false; + } if (!file_util::CopyDirectory(staging_path, dst_path, true)) { LOG(ERROR) << "Copying app to dst path: " << dst_path.value() << " failed"; return false; @@ -137,18 +158,11 @@ base::FilePath WebAppShortcutCreator::GetAppLoaderPath() const { base::mac::NSToCFCast(@"app_mode_loader.app")); } -base::FilePath WebAppShortcutCreator::GetDestinationPath( - const base::FilePath& app_file_name) const { - base::FilePath path; - if (base::mac::GetLocalDirectory(NSApplicationDirectory, &path) && - file_util::PathIsWritable(path)) { - return path; - } - - if (base::mac::GetUserDirectory(NSApplicationDirectory, &path)) +base::FilePath WebAppShortcutCreator::GetDestinationPath() const { + base::FilePath path = GetWritableApplicationsDirectory(); + if (path.empty()) return path; - - return base::FilePath(); + return path.Append(kChromeAppDirName); } bool WebAppShortcutCreator::UpdatePlist(const base::FilePath& app_path) const { diff --git a/chrome/browser/web_applications/web_app_mac_unittest.mm b/chrome/browser/web_applications/web_app_mac_unittest.mm index 75643f62..069a584 100644 --- a/chrome/browser/web_applications/web_app_mac_unittest.mm +++ b/chrome/browser/web_applications/web_app_mac_unittest.mm @@ -38,7 +38,7 @@ class WebAppShortcutCreatorMock : public web_app::WebAppShortcutCreator { UTF8ToUTF16("fake.cfbundleidentifier")) { } - MOCK_CONST_METHOD1(GetDestinationPath, base::FilePath(const base::FilePath&)); + MOCK_CONST_METHOD0(GetDestinationPath, base::FilePath()); MOCK_CONST_METHOD1(RevealGeneratedBundleInFinder, void (const base::FilePath&)); }; @@ -67,7 +67,7 @@ TEST(WebAppShortcutCreatorTest, CreateShortcut) { base::FilePath dst_path = dst_folder.Append(UTF16ToUTF8(info.title) + ".app"); NiceMock shortcut_creator(info); - EXPECT_CALL(shortcut_creator, GetDestinationPath(_)) + EXPECT_CALL(shortcut_creator, GetDestinationPath()) .WillRepeatedly(Return(dst_folder)); EXPECT_CALL(shortcut_creator, RevealGeneratedBundleInFinder(dst_path)); @@ -105,7 +105,7 @@ TEST(WebAppShortcutCreatorTest, RunShortcut) { base::FilePath dst_path = dst_folder.Append(UTF16ToUTF8(info.title) + ".app"); NiceMock shortcut_creator(info); - EXPECT_CALL(shortcut_creator, GetDestinationPath(_)) + EXPECT_CALL(shortcut_creator, GetDestinationPath()) .WillRepeatedly(Return(dst_folder)); EXPECT_CALL(shortcut_creator, RevealGeneratedBundleInFinder(dst_path)); @@ -126,7 +126,7 @@ TEST(WebAppShortcutCreatorTest, CreateFailure) { scoped_temp_dir.path().Append("not-existent").Append("name.app"); NiceMock shortcut_creator(GetShortcutInfo()); - EXPECT_CALL(shortcut_creator, GetDestinationPath(_)) + EXPECT_CALL(shortcut_creator, GetDestinationPath()) .WillRepeatedly(Return(non_existent_path)); EXPECT_FALSE(shortcut_creator.CreateShortcut()); } -- cgit v1.1