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" |
(...skipping 27 matching lines...) Expand all Loading... |
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_, *info_); |
116 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 116 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
117 .WillRepeatedly(Return(destination_dir_)); | 117 .WillRepeatedly(Return(destination_dir_)); |
118 | 118 |
119 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 119 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
120 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 120 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
121 EXPECT_TRUE(base::PathExists(shim_path_)); | 121 EXPECT_TRUE(base::PathExists(shim_path_)); |
122 EXPECT_TRUE(base::PathExists(destination_dir_)); | 122 EXPECT_TRUE(base::PathExists(destination_dir_)); |
123 EXPECT_EQ(shim_base_name_, shortcut_creator.GetShortcutBasename()); | 123 EXPECT_EQ(shim_base_name_, shortcut_creator.GetShortcutBasename()); |
124 | 124 |
125 base::FilePath plist_path = | 125 base::FilePath plist_path = |
126 shim_path_.Append("Contents").Append("Info.plist"); | 126 shim_path_.Append("Contents").Append("Info.plist"); |
127 NSDictionary* plist = [NSDictionary dictionaryWithContentsOfFile: | 127 NSDictionary* plist = [NSDictionary dictionaryWithContentsOfFile: |
128 base::mac::FilePathToNSString(plist_path)]; | 128 base::mac::FilePathToNSString(plist_path)]; |
129 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.extension_id), | 129 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->extension_id), |
130 [plist objectForKey:app_mode::kCrAppModeShortcutIDKey]); | 130 [plist objectForKey:app_mode::kCrAppModeShortcutIDKey]); |
131 EXPECT_NSEQ(base::SysUTF16ToNSString(info_.title), | 131 EXPECT_NSEQ(base::SysUTF16ToNSString(info_->title), |
132 [plist objectForKey:app_mode::kCrAppModeShortcutNameKey]); | 132 [plist objectForKey:app_mode::kCrAppModeShortcutNameKey]); |
133 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.url.spec()), | 133 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->url.spec()), |
134 [plist objectForKey:app_mode::kCrAppModeShortcutURLKey]); | 134 [plist objectForKey:app_mode::kCrAppModeShortcutURLKey]); |
135 | 135 |
136 EXPECT_NSEQ(base::SysUTF8ToNSString(chrome::VersionInfo().Version()), | 136 EXPECT_NSEQ(base::SysUTF8ToNSString(chrome::VersionInfo().Version()), |
137 [plist objectForKey:app_mode::kCrBundleVersionKey]); | 137 [plist objectForKey:app_mode::kCrBundleVersionKey]); |
138 EXPECT_NSEQ(base::SysUTF8ToNSString(info_.version_for_display), | 138 EXPECT_NSEQ(base::SysUTF8ToNSString(info_->version_for_display), |
139 [plist objectForKey:app_mode::kCFBundleShortVersionStringKey]); | 139 [plist objectForKey:app_mode::kCFBundleShortVersionStringKey]); |
140 | 140 |
141 // Make sure all values in the plist are actually filled in. | 141 // Make sure all values in the plist are actually filled in. |
142 for (id key in plist) { | 142 for (id key in plist) { |
143 id value = [plist valueForKey:key]; | 143 id value = [plist valueForKey:key]; |
144 if (!base::mac::ObjCCast<NSString>(value)) | 144 if (!base::mac::ObjCCast<NSString>(value)) |
145 continue; | 145 continue; |
146 | 146 |
147 EXPECT_EQ([value rangeOfString:@"@APP_"].location, NSNotFound) | 147 EXPECT_EQ([value rangeOfString:@"@APP_"].location, NSNotFound) |
148 << [key UTF8String] << ":" << [value UTF8String]; | 148 << [key UTF8String] << ":" << [value UTF8String]; |
149 } | 149 } |
150 } | 150 } |
151 | 151 |
152 TEST_F(WebAppShortcutCreatorTest, UpdateShortcuts) { | 152 TEST_F(WebAppShortcutCreatorTest, UpdateShortcuts) { |
153 base::ScopedTempDir other_folder_temp_dir; | 153 base::ScopedTempDir other_folder_temp_dir; |
154 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); | 154 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); |
155 base::FilePath other_folder = other_folder_temp_dir.path(); | 155 base::FilePath other_folder = other_folder_temp_dir.path(); |
156 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); | 156 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); |
157 | 157 |
158 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 158 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, *info_); |
159 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 159 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
160 .WillRepeatedly(Return(destination_dir_)); | 160 .WillRepeatedly(Return(destination_dir_)); |
161 | 161 |
162 std::string expected_bundle_id = kFakeChromeBundleId; | 162 std::string expected_bundle_id = kFakeChromeBundleId; |
163 expected_bundle_id += ".app.Profile-1-" + info_.extension_id; | 163 expected_bundle_id += ".app.Profile-1-" + info_->extension_id; |
164 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) | 164 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) |
165 .WillOnce(Return(other_shim_path)); | 165 .WillOnce(Return(other_shim_path)); |
166 | 166 |
167 EXPECT_TRUE(shortcut_creator.BuildShortcut(other_shim_path)); | 167 EXPECT_TRUE(shortcut_creator.BuildShortcut(other_shim_path)); |
168 | 168 |
169 EXPECT_TRUE(base::DeleteFile(other_shim_path.Append("Contents"), true)); | 169 EXPECT_TRUE(base::DeleteFile(other_shim_path.Append("Contents"), true)); |
170 | 170 |
171 EXPECT_TRUE(shortcut_creator.UpdateShortcuts()); | 171 EXPECT_TRUE(shortcut_creator.UpdateShortcuts()); |
172 EXPECT_FALSE(base::PathExists(shim_path_)); | 172 EXPECT_FALSE(base::PathExists(shim_path_)); |
173 EXPECT_TRUE(base::PathExists(other_shim_path.Append("Contents"))); | 173 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. | 189 // When using PathService::Override, it calls base::MakeAbsoluteFilePath. |
190 // On Mac this prepends "/private" to the path, but points to the same | 190 // On Mac this prepends "/private" to the path, but points to the same |
191 // directory in the file system. | 191 // directory in the file system. |
192 app_data_dir_ = base::MakeAbsoluteFilePath(app_data_dir_); | 192 app_data_dir_ = base::MakeAbsoluteFilePath(app_data_dir_); |
193 | 193 |
194 base::ScopedTempDir other_folder_temp_dir; | 194 base::ScopedTempDir other_folder_temp_dir; |
195 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); | 195 EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir()); |
196 base::FilePath other_folder = other_folder_temp_dir.path(); | 196 base::FilePath other_folder = other_folder_temp_dir.path(); |
197 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); | 197 base::FilePath other_shim_path = other_folder.Append(shim_base_name_); |
198 | 198 |
199 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 199 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, *info_); |
200 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 200 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
201 .WillRepeatedly(Return(destination_dir_)); | 201 .WillRepeatedly(Return(destination_dir_)); |
202 | 202 |
203 std::string expected_bundle_id = kFakeChromeBundleId; | 203 std::string expected_bundle_id = kFakeChromeBundleId; |
204 expected_bundle_id += ".app.Profile-1-" + info_.extension_id; | 204 expected_bundle_id += ".app.Profile-1-" + info_->extension_id; |
205 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) | 205 EXPECT_CALL(shortcut_creator, GetAppBundleById(expected_bundle_id)) |
206 .WillOnce(Return(other_shim_path)); | 206 .WillOnce(Return(other_shim_path)); |
207 | 207 |
208 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 208 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
209 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 209 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
210 EXPECT_TRUE(base::PathExists(internal_shim_path_)); | 210 EXPECT_TRUE(base::PathExists(internal_shim_path_)); |
211 EXPECT_TRUE(base::PathExists(shim_path_)); | 211 EXPECT_TRUE(base::PathExists(shim_path_)); |
212 | 212 |
213 // Create an extra shim in another folder. It should be deleted since its | 213 // Create an extra shim in another folder. It should be deleted since its |
214 // bundle id matches. | 214 // bundle id matches. |
(...skipping 14 matching lines...) Expand all Loading... |
229 EXPECT_TRUE(PathService::Override(chrome::DIR_USER_DATA, app_data_dir_)); | 229 EXPECT_TRUE(PathService::Override(chrome::DIR_USER_DATA, app_data_dir_)); |
230 shortcut_creator.DeleteShortcuts(); | 230 shortcut_creator.DeleteShortcuts(); |
231 EXPECT_FALSE(base::PathExists(internal_shim_path_)); | 231 EXPECT_FALSE(base::PathExists(internal_shim_path_)); |
232 EXPECT_TRUE(base::PathExists(shim_path_)); | 232 EXPECT_TRUE(base::PathExists(shim_path_)); |
233 EXPECT_FALSE(base::PathExists(other_shim_path)); | 233 EXPECT_FALSE(base::PathExists(other_shim_path)); |
234 } | 234 } |
235 | 235 |
236 TEST_F(WebAppShortcutCreatorTest, CreateAppListShortcut) { | 236 TEST_F(WebAppShortcutCreatorTest, CreateAppListShortcut) { |
237 // With an empty |profile_name|, the shortcut path should not have the profile | 237 // 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. | 238 // directory prepended to the extension id on the app bundle name. |
239 info_.profile_name.clear(); | 239 info_->profile_name.clear(); |
240 base::FilePath dst_path = | 240 base::FilePath dst_path = |
241 destination_dir_.Append(info_.extension_id + ".app"); | 241 destination_dir_.Append(info_->extension_id + ".app"); |
242 | 242 |
243 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(base::FilePath(), info_); | 243 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(base::FilePath(), |
| 244 *info_); |
244 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 245 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
245 .WillRepeatedly(Return(destination_dir_)); | 246 .WillRepeatedly(Return(destination_dir_)); |
246 EXPECT_EQ(dst_path.BaseName(), shortcut_creator.GetShortcutBasename()); | 247 EXPECT_EQ(dst_path.BaseName(), shortcut_creator.GetShortcutBasename()); |
247 } | 248 } |
248 | 249 |
249 TEST_F(WebAppShortcutCreatorTest, RunShortcut) { | 250 TEST_F(WebAppShortcutCreatorTest, RunShortcut) { |
250 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 251 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, *info_); |
251 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 252 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
252 .WillRepeatedly(Return(destination_dir_)); | 253 .WillRepeatedly(Return(destination_dir_)); |
253 | 254 |
254 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 255 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
255 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 256 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
256 EXPECT_TRUE(base::PathExists(shim_path_)); | 257 EXPECT_TRUE(base::PathExists(shim_path_)); |
257 | 258 |
258 ssize_t status = getxattr( | 259 ssize_t status = getxattr( |
259 shim_path_.value().c_str(), "com.apple.quarantine", NULL, 0, 0, 0); | 260 shim_path_.value().c_str(), "com.apple.quarantine", NULL, 0, 0, 0); |
260 EXPECT_EQ(-1, status); | 261 EXPECT_EQ(-1, status); |
261 EXPECT_EQ(ENOATTR, errno); | 262 EXPECT_EQ(ENOATTR, errno); |
262 } | 263 } |
263 | 264 |
264 TEST_F(WebAppShortcutCreatorTest, CreateFailure) { | 265 TEST_F(WebAppShortcutCreatorTest, CreateFailure) { |
265 base::FilePath non_existent_path = | 266 base::FilePath non_existent_path = |
266 destination_dir_.Append("not-existent").Append("name.app"); | 267 destination_dir_.Append("not-existent").Append("name.app"); |
267 | 268 |
268 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, info_); | 269 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, *info_); |
269 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 270 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
270 .WillRepeatedly(Return(non_existent_path)); | 271 .WillRepeatedly(Return(non_existent_path)); |
271 EXPECT_FALSE(shortcut_creator.CreateShortcuts( | 272 EXPECT_FALSE(shortcut_creator.CreateShortcuts( |
272 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 273 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
273 } | 274 } |
274 | 275 |
275 TEST_F(WebAppShortcutCreatorTest, UpdateIcon) { | 276 TEST_F(WebAppShortcutCreatorTest, UpdateIcon) { |
276 gfx::Image product_logo = | 277 gfx::Image product_logo = |
277 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | 278 ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
278 IDR_PRODUCT_LOGO_32); | 279 IDR_PRODUCT_LOGO_32); |
279 info_.favicon.Add(product_logo); | 280 info_->favicon.Add(product_logo); |
280 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_); | 281 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, *info_); |
281 | 282 |
282 ASSERT_TRUE(shortcut_creator.UpdateIcon(shim_path_)); | 283 ASSERT_TRUE(shortcut_creator.UpdateIcon(shim_path_)); |
283 base::FilePath icon_path = | 284 base::FilePath icon_path = |
284 shim_path_.Append("Contents").Append("Resources").Append("app.icns"); | 285 shim_path_.Append("Contents").Append("Resources").Append("app.icns"); |
285 | 286 |
286 base::scoped_nsobject<NSImage> image([[NSImage alloc] | 287 base::scoped_nsobject<NSImage> image([[NSImage alloc] |
287 initWithContentsOfFile:base::mac::FilePathToNSString(icon_path)]); | 288 initWithContentsOfFile:base::mac::FilePathToNSString(icon_path)]); |
288 EXPECT_TRUE(image); | 289 EXPECT_TRUE(image); |
289 EXPECT_EQ(product_logo.Width(), [image size].width); | 290 EXPECT_EQ(product_logo.Width(), [image size].width); |
290 EXPECT_EQ(product_logo.Height(), [image size].height); | 291 EXPECT_EQ(product_logo.Height(), [image size].height); |
291 } | 292 } |
292 | 293 |
293 TEST_F(WebAppShortcutCreatorTest, RevealAppShimInFinder) { | 294 TEST_F(WebAppShortcutCreatorTest, RevealAppShimInFinder) { |
294 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, info_); | 295 WebAppShortcutCreatorMock shortcut_creator(app_data_dir_, *info_); |
295 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 296 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
296 .WillRepeatedly(Return(destination_dir_)); | 297 .WillRepeatedly(Return(destination_dir_)); |
297 | 298 |
298 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()) | 299 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()) |
299 .Times(0); | 300 .Times(0); |
300 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 301 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
301 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 302 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
302 | 303 |
303 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()); | 304 EXPECT_CALL(shortcut_creator, RevealAppShimInFinder()); |
304 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 305 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
305 SHORTCUT_CREATION_BY_USER, web_app::ShortcutLocations())); | 306 SHORTCUT_CREATION_BY_USER, web_app::ShortcutLocations())); |
306 } | 307 } |
307 | 308 |
308 TEST_F(WebAppShortcutCreatorTest, FileHandlers) { | 309 TEST_F(WebAppShortcutCreatorTest, FileHandlers) { |
309 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 310 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
310 switches::kEnableAppsFileAssociations); | 311 switches::kEnableAppsFileAssociations); |
311 extensions::FileHandlersInfo file_handlers_info; | 312 extensions::FileHandlersInfo file_handlers_info; |
312 extensions::FileHandlerInfo handler_0; | 313 extensions::FileHandlerInfo handler_0; |
313 handler_0.extensions.insert("ext0"); | 314 handler_0.extensions.insert("ext0"); |
314 handler_0.extensions.insert("ext1"); | 315 handler_0.extensions.insert("ext1"); |
315 handler_0.types.insert("type0"); | 316 handler_0.types.insert("type0"); |
316 handler_0.types.insert("type1"); | 317 handler_0.types.insert("type1"); |
317 file_handlers_info.push_back(handler_0); | 318 file_handlers_info.push_back(handler_0); |
318 extensions::FileHandlerInfo handler_1; | 319 extensions::FileHandlerInfo handler_1; |
319 handler_1.extensions.insert("ext2"); | 320 handler_1.extensions.insert("ext2"); |
320 handler_1.types.insert("type2"); | 321 handler_1.types.insert("type2"); |
321 file_handlers_info.push_back(handler_1); | 322 file_handlers_info.push_back(handler_1); |
322 | 323 |
323 NiceMock<WebAppShortcutCreatorMock> shortcut_creator( | 324 NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_, *info_, |
324 app_data_dir_, info_, file_handlers_info); | 325 file_handlers_info); |
325 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) | 326 EXPECT_CALL(shortcut_creator, GetApplicationsDirname()) |
326 .WillRepeatedly(Return(destination_dir_)); | 327 .WillRepeatedly(Return(destination_dir_)); |
327 EXPECT_TRUE(shortcut_creator.CreateShortcuts( | 328 EXPECT_TRUE(shortcut_creator.CreateShortcuts( |
328 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); | 329 SHORTCUT_CREATION_AUTOMATED, web_app::ShortcutLocations())); |
329 | 330 |
330 base::FilePath plist_path = | 331 base::FilePath plist_path = |
331 shim_path_.Append("Contents").Append("Info.plist"); | 332 shim_path_.Append("Contents").Append("Info.plist"); |
332 NSDictionary* plist = [NSDictionary | 333 NSDictionary* plist = [NSDictionary |
333 dictionaryWithContentsOfFile:base::mac::FilePathToNSString(plist_path)]; | 334 dictionaryWithContentsOfFile:base::mac::FilePathToNSString(plist_path)]; |
334 NSArray* file_handlers = | 335 NSArray* file_handlers = |
(...skipping 16 matching lines...) Expand all Loading... |
351 [file_handler_1 objectForKey:app_mode::kCFBundleTypeRoleKey]); | 352 [file_handler_1 objectForKey:app_mode::kCFBundleTypeRoleKey]); |
352 NSArray* file_handler_1_extensions = | 353 NSArray* file_handler_1_extensions = |
353 [file_handler_1 objectForKey:app_mode::kCFBundleTypeExtensionsKey]; | 354 [file_handler_1 objectForKey:app_mode::kCFBundleTypeExtensionsKey]; |
354 EXPECT_TRUE([file_handler_1_extensions containsObject:@"ext2"]); | 355 EXPECT_TRUE([file_handler_1_extensions containsObject:@"ext2"]); |
355 NSArray* file_handler_1_types = | 356 NSArray* file_handler_1_types = |
356 [file_handler_1 objectForKey:app_mode::kCFBundleTypeMIMETypesKey]; | 357 [file_handler_1 objectForKey:app_mode::kCFBundleTypeMIMETypesKey]; |
357 EXPECT_TRUE([file_handler_1_types containsObject:@"type2"]); | 358 EXPECT_TRUE([file_handler_1_types containsObject:@"type2"]); |
358 } | 359 } |
359 | 360 |
360 } // namespace web_app | 361 } // namespace web_app |
OLD | NEW |