| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/web_applications/web_app_mac.h" | 5 #import "chrome/browser/web_applications/web_app_mac.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <sys/xattr.h> | 9 #include <sys/xattr.h> |
| 10 | 10 |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
| 13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/mac/foundation_util.h" | 14 #include "base/mac/foundation_util.h" |
| 15 #include "base/mac/scoped_nsobject.h" | 15 #include "base/mac/scoped_nsobject.h" |
| 16 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 17 #include "base/strings/sys_string_conversions.h" | 18 #include "base/strings/sys_string_conversions.h" |
| 18 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 19 #include "chrome/common/chrome_paths.h" | 20 #include "chrome/common/chrome_paths.h" |
| 20 #include "chrome/common/chrome_switches.h" | 21 #include "chrome/common/chrome_switches.h" |
| 21 #include "chrome/common/chrome_version_info.h" | 22 #include "chrome/common/chrome_version_info.h" |
| 22 #import "chrome/common/mac/app_mode_common.h" | 23 #import "chrome/common/mac/app_mode_common.h" |
| 23 #include "grit/theme_resources.h" | 24 #include "grit/theme_resources.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" | 25 #include "testing/gmock/include/gmock/gmock.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #import "testing/gtest_mac.h" | 27 #import "testing/gtest_mac.h" |
| 27 #include "third_party/skia/include/core/SkBitmap.h" | 28 #include "third_party/skia/include/core/SkBitmap.h" |
| 28 #include "ui/base/resource/resource_bundle.h" | 29 #include "ui/base/resource/resource_bundle.h" |
| 29 #include "ui/gfx/image/image.h" | 30 #include "ui/gfx/image/image.h" |
| 30 | 31 |
| 31 using ::testing::_; | 32 using ::testing::_; |
| 32 using ::testing::Return; | 33 using ::testing::Return; |
| 33 using ::testing::NiceMock; | 34 using ::testing::NiceMock; |
| 34 | 35 |
| 35 namespace { | 36 namespace { |
| 36 | 37 |
| 37 const char kFakeChromeBundleId[] = "fake.cfbundleidentifier"; | 38 const char kFakeChromeBundleId[] = "fake.cfbundleidentifier"; |
| 38 | 39 |
| 39 class WebAppShortcutCreatorMock : public web_app::WebAppShortcutCreator { | 40 class WebAppShortcutCreatorMock : public web_app::WebAppShortcutCreator { |
| 40 public: | 41 public: |
| 41 WebAppShortcutCreatorMock(const base::FilePath& app_data_dir, | 42 WebAppShortcutCreatorMock(const base::FilePath& app_data_dir, |
| 42 const web_app::ShortcutInfo& shortcut_info) | 43 const web_app::ShortcutInfo* shortcut_info) |
| 43 : WebAppShortcutCreator(app_data_dir, | 44 : WebAppShortcutCreator(app_data_dir, |
| 44 shortcut_info, | 45 shortcut_info, |
| 45 extensions::FileHandlersInfo()) {} | 46 extensions::FileHandlersInfo()) {} |
| 46 | 47 |
| 47 WebAppShortcutCreatorMock( | 48 WebAppShortcutCreatorMock( |
| 48 const base::FilePath& app_data_dir, | 49 const base::FilePath& app_data_dir, |
| 49 const web_app::ShortcutInfo& shortcut_info, | 50 const web_app::ShortcutInfo* shortcut_info, |
| 50 const extensions::FileHandlersInfo& file_handlers_info) | 51 const extensions::FileHandlersInfo& file_handlers_info) |
| 51 : WebAppShortcutCreator(app_data_dir, shortcut_info, file_handlers_info) { | 52 : WebAppShortcutCreator(app_data_dir, shortcut_info, file_handlers_info) { |
| 52 } | 53 } |
| 53 | 54 |
| 54 MOCK_CONST_METHOD0(GetApplicationsDirname, base::FilePath()); | 55 MOCK_CONST_METHOD0(GetApplicationsDirname, base::FilePath()); |
| 55 MOCK_CONST_METHOD1(GetAppBundleById, | 56 MOCK_CONST_METHOD1(GetAppBundleById, |
| 56 base::FilePath(const std::string& bundle_id)); | 57 base::FilePath(const std::string& bundle_id)); |
| 57 MOCK_CONST_METHOD0(RevealAppShimInFinder, void()); | 58 MOCK_CONST_METHOD0(RevealAppShimInFinder, void()); |
| 58 | 59 |
| 59 private: | 60 private: |
| 60 DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreatorMock); | 61 DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreatorMock); |
| 61 }; | 62 }; |
| 62 | 63 |
| 63 web_app::ShortcutInfo GetShortcutInfo() { | 64 scoped_ptr<web_app::ShortcutInfo> GetShortcutInfo() { |
| 64 web_app::ShortcutInfo info; | 65 scoped_ptr<web_app::ShortcutInfo> info(new web_app::ShortcutInfo); |
| 65 info.extension_id = "extensionid"; | 66 info->extension_id = "extensionid"; |
| 66 info.extension_path = base::FilePath("/fake/extension/path"); | 67 info->extension_path = base::FilePath("/fake/extension/path"); |
| 67 info.title = base::ASCIIToUTF16("Shortcut Title"); | 68 info->title = base::ASCIIToUTF16("Shortcut Title"); |
| 68 info.url = GURL("http://example.com/"); | 69 info->url = GURL("http://example.com/"); |
| 69 info.profile_path = base::FilePath("user_data_dir").Append("Profile 1"); | 70 info->profile_path = base::FilePath("user_data_dir").Append("Profile 1"); |
| 70 info.profile_name = "profile name"; | 71 info->profile_name = "profile name"; |
| 71 info.version_for_display = "stable 1.0"; | 72 info->version_for_display = "stable 1.0"; |
| 72 return info; | 73 return info; |
| 73 } | 74 } |
| 74 | 75 |
| 75 class WebAppShortcutCreatorTest : public testing::Test { | 76 class WebAppShortcutCreatorTest : public testing::Test { |
| 76 protected: | 77 protected: |
| 77 WebAppShortcutCreatorTest() {} | 78 WebAppShortcutCreatorTest() {} |
| 78 | 79 |
| 79 void SetUp() override { | 80 void SetUp() override { |
| 80 base::mac::SetBaseBundleID(kFakeChromeBundleId); | 81 base::mac::SetBaseBundleID(kFakeChromeBundleId); |
| 81 | 82 |
| 82 EXPECT_TRUE(temp_app_data_dir_.CreateUniqueTempDir()); | 83 EXPECT_TRUE(temp_app_data_dir_.CreateUniqueTempDir()); |
| 83 EXPECT_TRUE(temp_destination_dir_.CreateUniqueTempDir()); | 84 EXPECT_TRUE(temp_destination_dir_.CreateUniqueTempDir()); |
| 84 app_data_dir_ = temp_app_data_dir_.path(); | 85 app_data_dir_ = temp_app_data_dir_.path(); |
| 85 destination_dir_ = temp_destination_dir_.path(); | 86 destination_dir_ = temp_destination_dir_.path(); |
| 86 | 87 |
| 87 info_ = GetShortcutInfo(); | 88 info_ = GetShortcutInfo(); |
| 88 shim_base_name_ = base::FilePath( | 89 shim_base_name_ = base::FilePath(info_->profile_path.BaseName().value() + |
| 89 info_.profile_path.BaseName().value() + | 90 " " + info_->extension_id + ".app"); |
| 90 " " + info_.extension_id + ".app"); | |
| 91 internal_shim_path_ = app_data_dir_.Append(shim_base_name_); | 91 internal_shim_path_ = app_data_dir_.Append(shim_base_name_); |
| 92 shim_path_ = destination_dir_.Append(shim_base_name_); | 92 shim_path_ = destination_dir_.Append(shim_base_name_); |
| 93 } | 93 } |
| 94 | 94 |
| 95 base::ScopedTempDir temp_app_data_dir_; | 95 base::ScopedTempDir temp_app_data_dir_; |
| 96 base::ScopedTempDir temp_destination_dir_; | 96 base::ScopedTempDir temp_destination_dir_; |
| 97 base::FilePath app_data_dir_; | 97 base::FilePath app_data_dir_; |
| 98 base::FilePath destination_dir_; | 98 base::FilePath destination_dir_; |
| 99 | 99 |
| 100 web_app::ShortcutInfo info_; | 100 scoped_ptr<web_app::ShortcutInfo> info_; |
| 101 base::FilePath shim_base_name_; | 101 base::FilePath shim_base_name_; |
| 102 base::FilePath internal_shim_path_; | 102 base::FilePath internal_shim_path_; |
| 103 base::FilePath shim_path_; | 103 base::FilePath shim_path_; |
| 104 | 104 |
| 105 private: | 105 private: |
| 106 DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreatorTest); | 106 DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreatorTest); |
| 107 }; | 107 }; |
| 108 | 108 |
| 109 | 109 |
| 110 } // namespace | 110 } // namespace |
| 111 | 111 |
| 112 namespace web_app { | 112 namespace web_app { |
| 113 | 113 |
| 114 TEST_F(WebAppShortcutCreatorTest, CreateShortcuts) { | 114 TEST_F(WebAppShortcutCreatorTest, CreateShortcuts) { |
| 115 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 115 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, |
| 116 info_.get()); |
| 116 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 117 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 117 .WillRepeatedly(Return(destination_dir_)); | 118 .WillRepeatedly(Return(destination_dir_)); |
| 118 | 119 |
| 119 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 120 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 120 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 121 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 121 EXPECT_TRUE(base::PathExists(shim_path_)); | 122 EXPECT_TRUE(base::PathExists(shim_path_)); |
| 122 EXPECT_TRUE(base::PathExists(destination_dir_)); | 123 EXPECT_TRUE(base::PathExists(destination_dir_)); |
| 123 EXPECT_EQ(shim_base_name_, shortcut_creator.GetShortcutBasename()); | 124 EXPECT_EQ(shim_base_name_, shortcut_creator.GetShortcutBasename()); |
| 124 | 125 |
| 125 base::FilePath plist_path = | 126 base::FilePath plist_path = |
| 126 shim_path_.Append("Contents").Append("Info.plist"); | 127 shim_path_.Append("Contents").Append("Info.plist"); |
| 127 NSDictionary* plist = [NSDictionary dictionaryWithContentsOfFile: | 128 NSDictionary* plist = [NSDictionary dictionaryWithContentsOfFile: |
| 128 base::mac::FilePathToNSString(plist_path)]; | 129 base::mac::FilePathToNSString(plist_path)]; |
| 129 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.extension_id), | 130 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->extension_id), |
| 130 [plist objectForKey:app_mode::kCrAppModeShortcutIDKey]); | 131 [plist objectForKey:app_mode::kCrAppModeShortcutIDKey]); |
| 131 EXPECT_NSEQ(base::SysUTF16ToNSString(info_.title), | 132 EXPECT_NSEQ(base::SysUTF16ToNSString(info_->title), |
| 132 [plist objectForKey:app_mode::kCrAppModeShortcutNameKey]); | 133 [plist objectForKey:app_mode::kCrAppModeShortcutNameKey]); |
| 133 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.url.spec()), | 134 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->url.spec()), |
| 134 [plist objectForKey:app_mode::kCrAppModeShortcutURLKey]); | 135 [plist objectForKey:app_mode::kCrAppModeShortcutURLKey]); |
| 135 | 136 |
| 136 EXPECT_NSEQ(base::SysUTF8ToNSString(chrome::VersionInfo().Version()), | 137 EXPECT_NSEQ(base::SysUTF8ToNSString(chrome::VersionInfo().Version()), |
| 137 [plist objectForKey:app_mode::kCrBundleVersionKey]); | 138 [plist objectForKey:app_mode::kCrBundleVersionKey]); |
| 138 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.version_for_display), | 139 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->version_for_display), |
| 139 [plist objectForKey:app_mode::kCFBundleShortVersionStringKey]); | 140 [plist objectForKey:app_mode::kCFBundleShortVersionStringKey]); |
| 140 | 141 |
| 141 // Make sure all values in the plist are actually filled in. | 142 // Make sure all values in the plist are actually filled in. |
| 142 for (id key in plist) { | 143 for (id key in plist) { |
| 143 id value = [plist valueForKey:key]; | 144 id value = [plist valueForKey:key]; |
| 144 if (!base::mac::ObjCCast<NSString>(value)) | 145 if (!base::mac::ObjCCast<NSString>(value)) |
| 145 continue; | 146 continue; |
| 146 | 147 |
| 147 EXPECT_EQ([value rangeOfString:@"@APP_"].location, NSNotFound) | 148 EXPECT_EQ([value rangeOfString:@"@APP_"].location, NSNotFound) |
| 148 << [key UTF8String] << ":" << [value UTF8String]; | 149 << [key UTF8String] << ":" << [value UTF8String]; |
| 149 } | 150 } |
| 150 } | 151 } |
| 151 | 152 |
| 152 TEST_F(WebAppShortcutCreatorTest, UpdateShortcuts) { | 153 TEST_F(WebAppShortcutCreatorTest, UpdateShortcuts) { |
| 153 base::ScopedTempDir other_folder_temp_dir; | 154 base::ScopedTempDir other_folder_temp_dir; |
| 154 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); | 155 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); |
| 155 base::FilePath other_folder = other_folder_temp_dir.path(); | 156 base::FilePath other_folder = other_folder_temp_dir.path(); |
| 156 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); | 157 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); |
| 157 | 158 |
| 158 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 159 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, |
| 160 info_.get()); |
| 159 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 161 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 160 .WillRepeatedly(Return(destination_dir_)); | 162 .WillRepeatedly(Return(destination_dir_)); |
| 161 | 163 |
| 162 std::string expected_bundle_id = kFakeChromeBundleId; | 164 std::string expected_bundle_id = kFakeChromeBundleId; |
| 163 expected_bundle_id += ".app.Profile-1-" + info_.extension_id; | 165 expected_bundle_id += ".app.Profile-1-" + info_->extension_id; |
| 164 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) | 166 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) |
| 165 .WillOnce(Return(other_shim_path)); | 167 .WillOnce(Return(other_shim_path)); |
| 166 | 168 |
| 167 EXPECT_TRUE(shortcut_creator.BuildShortcut(other_shim_path)); | 169 EXPECT_TRUE(shortcut_creator.BuildShortcut(other_shim_path)); |
| 168 | 170 |
| 169 EXPECT_TRUE(base::DeleteFile(other_shim_path.Append("Contents"), true)); | 171 EXPECT_TRUE(base::DeleteFile(other_shim_path.Append("Contents"), true)); |
| 170 | 172 |
| 171 EXPECT_TRUE(shortcut_creator.UpdateShortcuts()); | 173 EXPECT_TRUE(shortcut_creator.UpdateShortcuts()); |
| 172 EXPECT_FALSE(base::PathExists(shim_path_)); | 174 EXPECT_FALSE(base::PathExists(shim_path_)); |
| 173 EXPECT_TRUE(base::PathExists(other_shim_path.Append("Contents"))); | 175 EXPECT_TRUE(base::PathExists(other_shim_path.Append("Contents"))); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 189 // When using PathService::Override, it calls base::MakeAbsoluteFilePath. | 191 // When using PathService::Override, it calls base::MakeAbsoluteFilePath. |
| 190 // On Mac this prepends "/private" to the path, but points to the same | 192 // On Mac this prepends "/private" to the path, but points to the same |
| 191 // directory in the file system. | 193 // directory in the file system. |
| 192 app_data_dir_ = base::MakeAbsoluteFilePath(app_data_dir_); | 194 app_data_dir_ = base::MakeAbsoluteFilePath(app_data_dir_); |
| 193 | 195 |
| 194 base::ScopedTempDir other_folder_temp_dir; | 196 base::ScopedTempDir other_folder_temp_dir; |
| 195 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); | 197 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); |
| 196 base::FilePath other_folder = other_folder_temp_dir.path(); | 198 base::FilePath other_folder = other_folder_temp_dir.path(); |
| 197 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); | 199 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); |
| 198 | 200 |
| 199 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 201 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, |
| 202 info_.get()); |
| 200 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 203 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 201 .WillRepeatedly(Return(destination_dir_)); | 204 .WillRepeatedly(Return(destination_dir_)); |
| 202 | 205 |
| 203 std::string expected_bundle_id = kFakeChromeBundleId; | 206 std::string expected_bundle_id = kFakeChromeBundleId; |
| 204 expected_bundle_id += ".app.Profile-1-" + info_.extension_id; | 207 expected_bundle_id += ".app.Profile-1-" + info_->extension_id; |
| 205 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) | 208 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) |
| 206 .WillOnce(Return(other_shim_path)); | 209 .WillOnce(Return(other_shim_path)); |
| 207 | 210 |
| 208 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 211 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 209 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 212 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 210 EXPECT_TRUE(base::PathExists(internal_shim_path_)); | 213 EXPECT_TRUE(base::PathExists(internal_shim_path_)); |
| 211 EXPECT_TRUE(base::PathExists(shim_path_)); | 214 EXPECT_TRUE(base::PathExists(shim_path_)); |
| 212 | 215 |
| 213 // Create an extra shim in another folder. It should be deleted since its | 216 // Create an extra shim in another folder. It should be deleted since its |
| 214 // bundle id matches. | 217 // bundle id matches. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 229 EXPECT_TRUE(PathService::Override(chrome::DIR_USER_DATA, app_data_dir_)); | 232 EXPECT_TRUE(PathService::Override(chrome::DIR_USER_DATA, app_data_dir_)); |
| 230 shortcut_creator.DeleteShortcuts(); | 233 shortcut_creator.DeleteShortcuts(); |
| 231 EXPECT_FALSE(base::PathExists(internal_shim_path_)); | 234 EXPECT_FALSE(base::PathExists(internal_shim_path_)); |
| 232 EXPECT_TRUE(base::PathExists(shim_path_)); | 235 EXPECT_TRUE(base::PathExists(shim_path_)); |
| 233 EXPECT_FALSE(base::PathExists(other_shim_path)); | 236 EXPECT_FALSE(base::PathExists(other_shim_path)); |
| 234 } | 237 } |
| 235 | 238 |
| 236 TEST_F(WebAppShortcutCreatorTest, CreateAppListShortcut) { | 239 TEST_F(WebAppShortcutCreatorTest, CreateAppListShortcut) { |
| 237 // With an empty |profile_name|, the shortcut path should not have the profile | 240 // With an empty |profile_name|, the shortcut path should not have the profile |
| 238 // directory prepended to the extension id on the app bundle name. | 241 // directory prepended to the extension id on the app bundle name. |
| 239 info_.profile_name.clear(); | 242 info_->profile_name.clear(); |
| 240 base::FilePath dst_path = | 243 base::FilePath dst_path = |
| 241 destination_dir_.Append(info_.extension_id + ".app"); | 244 destination_dir_.Append(info_->extension_id + ".app"); |
| 242 | 245 |
| 243 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(base::FilePath(), info_); | 246 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(base::FilePath(), |
| 247 info_.get()); |
| 244 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 248 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 245 .WillRepeatedly(Return(destination_dir_)); | 249 .WillRepeatedly(Return(destination_dir_)); |
| 246 EXPECT_EQ(dst_path.BaseName(), shortcut_creator.GetShortcutBasename()); | 250 EXPECT_EQ(dst_path.BaseName(), shortcut_creator.GetShortcutBasename()); |
| 247 } | 251 } |
| 248 | 252 |
| 249 TEST_F(WebAppShortcutCreatorTest, RunShortcut) { | 253 TEST_F(WebAppShortcutCreatorTest, RunShortcut) { |
| 250 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 254 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, |
| 255 info_.get()); |
| 251 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 256 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 252 .WillRepeatedly(Return(destination_dir_)); | 257 .WillRepeatedly(Return(destination_dir_)); |
| 253 | 258 |
| 254 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 259 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 255 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 260 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 256 EXPECT_TRUE(base::PathExists(shim_path_)); | 261 EXPECT_TRUE(base::PathExists(shim_path_)); |
| 257 | 262 |
| 258 ssize_t status = getxattr( | 263 ssize_t status = getxattr( |
| 259 shim_path_.value().c_str(), "com.apple.quarantine", NULL, 0, 0, 0); | 264 shim_path_.value().c_str(), "com.apple.quarantine", NULL, 0, 0, 0); |
| 260 EXPECT_EQ(-1, status); | 265 EXPECT_EQ(-1, status); |
| 261 EXPECT_EQ(ENOATTR, errno); | 266 EXPECT_EQ(ENOATTR, errno); |
| 262 } | 267 } |
| 263 | 268 |
| 264 TEST_F(WebAppShortcutCreatorTest, CreateFailure) { | 269 TEST_F(WebAppShortcutCreatorTest, CreateFailure) { |
| 265 base::FilePath non_existent_path = | 270 base::FilePath non_existent_path = |
| 266 destination_dir_.Append("not-existent").Append("name.app"); | 271 destination_dir_.Append("not-existent").Append("name.app"); |
| 267 | 272 |
| 268 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 273 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, |
| 274 info_.get()); |
| 269 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 275 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 270 .WillRepeatedly(Return(non_existent_path)); | 276 .WillRepeatedly(Return(non_existent_path)); |
| 271 EXPECT_FALSE(shortcut_creator.CreateShortcuts( | 277 EXPECT_FALSE(shortcut_creator.CreateShortcuts( |
| 272 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 278 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 273 } | 279 } |
| 274 | 280 |
| 275 TEST_F(WebAppShortcutCreatorTest, UpdateIcon) { | 281 TEST_F(WebAppShortcutCreatorTest, UpdateIcon) { |
| 276 gfx::Image product_logo = | 282 gfx::Image product_logo = |
| 277 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | 283 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
| 278 IDR_PRODUCT_LOGO_32); | 284 IDR_PRODUCT_LOGO_32); |
| 279 info_.favicon.Add(product_logo); | 285 info_->favicon.Add(product_logo); |
| 280 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_); | 286 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_.get()); |
| 281 | 287 |
| 282 ASSERT_TRUE(shortcut_creator.UpdateIcon(shim_path_)); | 288 ASSERT_TRUE(shortcut_creator.UpdateIcon(shim_path_)); |
| 283 base::FilePath icon_path = | 289 base::FilePath icon_path = |
| 284 shim_path_.Append("Contents").Append("Resources").Append("app.icns"); | 290 shim_path_.Append("Contents").Append("Resources").Append("app.icns"); |
| 285 | 291 |
| 286 base::scoped_nsobject<NSImage> image([[NSImage alloc] | 292 base::scoped_nsobject<NSImage> image([[NSImage alloc] |
| 287 initWithContentsOfFile:base::mac::FilePathToNSString(icon_path)]); | 293 initWithContentsOfFile:base::mac::FilePathToNSString(icon_path)]); |
| 288 EXPECT_TRUE(image); | 294 EXPECT_TRUE(image); |
| 289 EXPECT_EQ(product_logo.Width(), [image size].width); | 295 EXPECT_EQ(product_logo.Width(), [image size].width); |
| 290 EXPECT_EQ(product_logo.Height(), [image size].height); | 296 EXPECT_EQ(product_logo.Height(), [image size].height); |
| 291 } | 297 } |
| 292 | 298 |
| 293 TEST_F(WebAppShortcutCreatorTest, RevealAppShimInFinder) { | 299 TEST_F(WebAppShortcutCreatorTest, RevealAppShimInFinder) { |
| 294 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_); | 300 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_.get()); |
| 295 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 301 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 296 .WillRepeatedly(Return(destination_dir_)); | 302 .WillRepeatedly(Return(destination_dir_)); |
| 297 | 303 |
| 298 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()) | 304 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()) |
| 299 .Times(0); | 305 .Times(0); |
| 300 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 306 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 301 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 307 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 302 | 308 |
| 303 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()); | 309 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()); |
| 304 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 310 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 305 SHORTCUT_CREATION_BY_USER, web_app::ShortcutLocations())); | 311 SHORTCUT_CREATION_BY_USER, web_app::ShortcutLocations())); |
| 306 } | 312 } |
| 307 | 313 |
| 308 TEST_F(WebAppShortcutCreatorTest, FileHandlers) { | 314 TEST_F(WebAppShortcutCreatorTest, FileHandlers) { |
| 309 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 315 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 310 switches::kEnableAppsFileAssociations); | 316 switches::kEnableAppsFileAssociations); |
| 311 extensions::FileHandlersInfo file_handlers_info; | 317 extensions::FileHandlersInfo file_handlers_info; |
| 312 extensions::FileHandlerInfo handler_0; | 318 extensions::FileHandlerInfo handler_0; |
| 313 handler_0.extensions.insert("ext0"); | 319 handler_0.extensions.insert("ext0"); |
| 314 handler_0.extensions.insert("ext1"); | 320 handler_0.extensions.insert("ext1"); |
| 315 handler_0.types.insert("type0"); | 321 handler_0.types.insert("type0"); |
| 316 handler_0.types.insert("type1"); | 322 handler_0.types.insert("type1"); |
| 317 file_handlers_info.push_back(handler_0); | 323 file_handlers_info.push_back(handler_0); |
| 318 extensions::FileHandlerInfo handler_1; | 324 extensions::FileHandlerInfo handler_1; |
| 319 handler_1.extensions.insert("ext2"); | 325 handler_1.extensions.insert("ext2"); |
| 320 handler_1.types.insert("type2"); | 326 handler_1.types.insert("type2"); |
| 321 file_handlers_info.push_back(handler_1); | 327 file_handlers_info.push_back(handler_1); |
| 322 | 328 |
| 323 NiceMock<WebAppShortcutCreatorMock> shortcut_creator( | 329 NiceMock<WebAppShortcutCreatorMock> shortcut_creator( |
| 324 app_data_dir_, info_, file_handlers_info); | 330 app_data_dir_, info_.get(), file_handlers_info); |
| 325 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 331 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
| 326 .WillRepeatedly(Return(destination_dir_)); | 332 .WillRepeatedly(Return(destination_dir_)); |
| 327 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 333 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
| 328 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 334 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
| 329 | 335 |
| 330 base::FilePath plist_path = | 336 base::FilePath plist_path = |
| 331 shim_path_.Append("Contents").Append("Info.plist"); | 337 shim_path_.Append("Contents").Append("Info.plist"); |
| 332 NSDictionary* plist = [NSDictionary | 338 NSDictionary* plist = [NSDictionary |
| 333 dictionaryWithContentsOfFile:base::mac::FilePathToNSString(plist_path)]; | 339 dictionaryWithContentsOfFile:base::mac::FilePathToNSString(plist_path)]; |
| 334 NSArray* file_handlers = | 340 NSArray* file_handlers = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 351 [file_handler_1 objectForKey:app_mode::kCFBundleTypeRoleKey]); | 357 [file_handler_1 objectForKey:app_mode::kCFBundleTypeRoleKey]); |
| 352 NSArray* file_handler_1_extensions = | 358 NSArray* file_handler_1_extensions = |
| 353 [file_handler_1 objectForKey:app_mode::kCFBundleTypeExtensionsKey]; | 359 [file_handler_1 objectForKey:app_mode::kCFBundleTypeExtensionsKey]; |
| 354 EXPECT_TRUE([file_handler_1_extensions containsObject:@"ext2"]); | 360 EXPECT_TRUE([file_handler_1_extensions containsObject:@"ext2"]); |
| 355 NSArray* file_handler_1_types = | 361 NSArray* file_handler_1_types = |
| 356 [file_handler_1 objectForKey:app_mode::kCFBundleTypeMIMETypesKey]; | 362 [file_handler_1 objectForKey:app_mode::kCFBundleTypeMIMETypesKey]; |
| 357 EXPECT_TRUE([file_handler_1_types containsObject:@"type2"]); | 363 EXPECT_TRUE([file_handler_1_types containsObject:@"type2"]); |
| 358 } | 364 } |
| 359 | 365 |
| 360 } // namespace web_app | 366 } // namespace web_app |
| OLD | NEW |