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 <Carbon/Carbon.h> | 7 #import <Carbon/Carbon.h> |
8 #import <Cocoa/Cocoa.h> | 8 #import <Cocoa/Cocoa.h> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 base::FilePath user_data_dir; | 212 base::FilePath user_data_dir; |
213 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | 213 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
214 DCHECK(!user_data_dir.empty()); | 214 DCHECK(!user_data_dir.empty()); |
215 return StartsWithASCII( | 215 return StartsWithASCII( |
216 base::SysNSStringToUTF8( | 216 base::SysNSStringToUTF8( |
217 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]), | 217 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]), |
218 user_data_dir.value(), | 218 user_data_dir.value(), |
219 true /* case_sensitive */); | 219 true /* case_sensitive */); |
220 } | 220 } |
221 | 221 |
222 void LaunchShimOnFileThread(const web_app::ShortcutInfo& shortcut_info, | 222 void LaunchShimOnFileThread(scoped_ptr<web_app::ShortcutInfo> shortcut_info, |
223 bool launched_after_rebuild) { | 223 bool launched_after_rebuild) { |
224 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 224 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
225 base::FilePath shim_path = web_app::GetAppInstallPath(shortcut_info); | 225 base::FilePath shim_path = web_app::GetAppInstallPath(*shortcut_info); |
226 | 226 |
227 if (shim_path.empty() || | 227 if (shim_path.empty() || |
228 !base::PathExists(shim_path) || | 228 !base::PathExists(shim_path) || |
229 !HasSameUserDataDir(shim_path)) { | 229 !HasSameUserDataDir(shim_path)) { |
230 // The user may have deleted the copy in the Applications folder, use the | 230 // The user may have deleted the copy in the Applications folder, use the |
231 // one in the web app's |app_data_dir_|. | 231 // one in the web app's |app_data_dir_|. |
232 base::FilePath app_data_dir = web_app::GetWebAppDataDirectory( | 232 base::FilePath app_data_dir = web_app::GetWebAppDataDirectory( |
233 shortcut_info.profile_path, shortcut_info.extension_id, GURL()); | 233 shortcut_info->profile_path, shortcut_info->extension_id, GURL()); |
234 shim_path = app_data_dir.Append(shim_path.BaseName()); | 234 shim_path = app_data_dir.Append(shim_path.BaseName()); |
235 } | 235 } |
236 | 236 |
237 if (!base::PathExists(shim_path)) | 237 if (!base::PathExists(shim_path)) |
238 return; | 238 return; |
239 | 239 |
240 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); | 240 base::CommandLine command_line(base::CommandLine::NO_PROGRAM); |
241 command_line.AppendSwitchASCII( | 241 command_line.AppendSwitchASCII( |
242 app_mode::kLaunchedByChromeProcessId, | 242 app_mode::kLaunchedByChromeProcessId, |
243 base::IntToString(base::GetCurrentProcId())); | 243 base::IntToString(base::GetCurrentProcId())); |
244 if (launched_after_rebuild) | 244 if (launched_after_rebuild) |
245 command_line.AppendSwitch(app_mode::kLaunchedAfterRebuild); | 245 command_line.AppendSwitch(app_mode::kLaunchedAfterRebuild); |
246 // Launch without activating (kLSLaunchDontSwitch). | 246 // Launch without activating (kLSLaunchDontSwitch). |
247 base::mac::OpenApplicationWithPath( | 247 base::mac::OpenApplicationWithPath( |
248 shim_path, command_line, kLSLaunchDefaults | kLSLaunchDontSwitch, NULL); | 248 shim_path, command_line, kLSLaunchDefaults | kLSLaunchDontSwitch, NULL); |
249 } | 249 } |
250 | 250 |
251 base::FilePath GetAppLoaderPath() { | 251 base::FilePath GetAppLoaderPath() { |
252 return base::mac::PathForFrameworkBundleResource( | 252 return base::mac::PathForFrameworkBundleResource( |
253 base::mac::NSToCFCast(@"app_mode_loader.app")); | 253 base::mac::NSToCFCast(@"app_mode_loader.app")); |
254 } | 254 } |
255 | 255 |
256 void UpdateAndLaunchShimOnFileThread( | 256 void UpdatePlatformShortcutsInternal( |
| 257 const base::FilePath& app_data_path, |
| 258 const base::string16& old_app_title, |
257 const web_app::ShortcutInfo& shortcut_info, | 259 const web_app::ShortcutInfo& shortcut_info, |
258 const extensions::FileHandlersInfo& file_handlers_info) { | 260 const extensions::FileHandlersInfo& file_handlers_info) { |
| 261 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
| 262 if (AppShimsDisabledForTest() && |
| 263 !g_app_shims_allow_update_and_launch_in_tests) { |
| 264 return; |
| 265 } |
| 266 |
| 267 web_app::WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info, |
| 268 file_handlers_info); |
| 269 shortcut_creator.UpdateShortcuts(); |
| 270 } |
| 271 |
| 272 void UpdateAndLaunchShimOnFileThread( |
| 273 scoped_ptr<web_app::ShortcutInfo> shortcut_info, |
| 274 const extensions::FileHandlersInfo& file_handlers_info) { |
259 base::FilePath shortcut_data_dir = web_app::GetWebAppDataDirectory( | 275 base::FilePath shortcut_data_dir = web_app::GetWebAppDataDirectory( |
260 shortcut_info.profile_path, shortcut_info.extension_id, GURL()); | 276 shortcut_info->profile_path, shortcut_info->extension_id, GURL()); |
261 web_app::internals::UpdatePlatformShortcuts( | 277 UpdatePlatformShortcutsInternal(shortcut_data_dir, base::string16(), |
262 shortcut_data_dir, base::string16(), shortcut_info, file_handlers_info); | 278 *shortcut_info, file_handlers_info); |
263 LaunchShimOnFileThread(shortcut_info, true); | 279 LaunchShimOnFileThread(shortcut_info.Pass(), true); |
264 } | 280 } |
265 | 281 |
266 void UpdateAndLaunchShim( | 282 void UpdateAndLaunchShim( |
267 const web_app::ShortcutInfo& shortcut_info, | 283 scoped_ptr<web_app::ShortcutInfo> shortcut_info, |
268 const extensions::FileHandlersInfo& file_handlers_info) { | 284 const extensions::FileHandlersInfo& file_handlers_info) { |
269 content::BrowserThread::PostTask( | 285 content::BrowserThread::PostTask( |
270 content::BrowserThread::FILE, | 286 content::BrowserThread::FILE, FROM_HERE, |
271 FROM_HERE, | 287 base::Bind(&UpdateAndLaunchShimOnFileThread, base::Passed(&shortcut_info), |
272 base::Bind( | 288 file_handlers_info)); |
273 &UpdateAndLaunchShimOnFileThread, shortcut_info, file_handlers_info)); | |
274 } | 289 } |
275 | 290 |
276 void RebuildAppAndLaunch(const web_app::ShortcutInfo& shortcut_info) { | 291 void RebuildAppAndLaunch(scoped_ptr<web_app::ShortcutInfo> shortcut_info) { |
277 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 292 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
278 if (shortcut_info.extension_id == app_mode::kAppListModeId) { | 293 if (shortcut_info->extension_id == app_mode::kAppListModeId) { |
279 AppListService* app_list_service = | 294 AppListService* app_list_service = |
280 AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE); | 295 AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE); |
281 app_list_service->CreateShortcut(); | 296 app_list_service->CreateShortcut(); |
282 app_list_service->Show(); | 297 app_list_service->Show(); |
283 return; | 298 return; |
284 } | 299 } |
285 | 300 |
286 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 301 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
287 Profile* profile = | 302 Profile* profile = |
288 profile_manager->GetProfileByPath(shortcut_info.profile_path); | 303 profile_manager->GetProfileByPath(shortcut_info->profile_path); |
289 if (!profile || !profile_manager->IsValidProfile(profile)) | 304 if (!profile || !profile_manager->IsValidProfile(profile)) |
290 return; | 305 return; |
291 | 306 |
292 extensions::ExtensionRegistry* registry = | 307 extensions::ExtensionRegistry* registry = |
293 extensions::ExtensionRegistry::Get(profile); | 308 extensions::ExtensionRegistry::Get(profile); |
294 const extensions::Extension* extension = registry->GetExtensionById( | 309 const extensions::Extension* extension = registry->GetExtensionById( |
295 shortcut_info.extension_id, extensions::ExtensionRegistry::ENABLED); | 310 shortcut_info->extension_id, extensions::ExtensionRegistry::ENABLED); |
296 if (!extension || !extension->is_platform_app()) | 311 if (!extension || !extension->is_platform_app()) |
297 return; | 312 return; |
298 | 313 |
299 web_app::GetInfoForApp(extension, profile, base::Bind(&UpdateAndLaunchShim)); | 314 web_app::GetInfoForApp(extension, profile, base::Bind(&UpdateAndLaunchShim)); |
300 } | 315 } |
301 | 316 |
302 base::FilePath GetLocalizableAppShortcutsSubdirName() { | 317 base::FilePath GetLocalizableAppShortcutsSubdirName() { |
303 static const char kChromiumAppDirName[] = "Chromium Apps.localized"; | 318 static const char kChromiumAppDirName[] = "Chromium Apps.localized"; |
304 static const char kChromeAppDirName[] = "Chrome Apps.localized"; | 319 static const char kChromeAppDirName[] = "Chrome Apps.localized"; |
305 static const char kChromeCanaryAppDirName[] = "Chrome Canary Apps.localized"; | 320 static const char kChromeCanaryAppDirName[] = "Chrome Canary Apps.localized"; |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 base::FileEnumerator::DIRECTORIES); | 476 base::FileEnumerator::DIRECTORIES); |
462 for (base::FilePath bundle_path = enumerator.Next(); | 477 for (base::FilePath bundle_path = enumerator.Next(); |
463 !bundle_path.empty(); bundle_path = enumerator.Next()) { | 478 !bundle_path.empty(); bundle_path = enumerator.Next()) { |
464 if (IsShimForProfile(bundle_path.BaseName(), profile_base_name)) | 479 if (IsShimForProfile(bundle_path.BaseName(), profile_base_name)) |
465 bundle_paths.push_back(bundle_path); | 480 bundle_paths.push_back(bundle_path); |
466 } | 481 } |
467 | 482 |
468 return bundle_paths; | 483 return bundle_paths; |
469 } | 484 } |
470 | 485 |
471 web_app::ShortcutInfo BuildShortcutInfoFromBundle( | 486 scoped_ptr<web_app::ShortcutInfo> BuildShortcutInfoFromBundle( |
472 const base::FilePath& bundle_path) { | 487 const base::FilePath& bundle_path) { |
473 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); | 488 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); |
474 | 489 |
475 web_app::ShortcutInfo shortcut_info; | 490 scoped_ptr<web_app::ShortcutInfo> shortcut_info(new web_app::ShortcutInfo); |
476 shortcut_info.extension_id = base::SysNSStringToUTF8( | 491 shortcut_info->extension_id = base::SysNSStringToUTF8( |
477 [plist valueForKey:app_mode::kCrAppModeShortcutIDKey]); | 492 [plist valueForKey:app_mode::kCrAppModeShortcutIDKey]); |
478 shortcut_info.is_platform_app = true; | 493 shortcut_info->is_platform_app = true; |
479 shortcut_info.url = GURL(base::SysNSStringToUTF8( | 494 shortcut_info->url = GURL(base::SysNSStringToUTF8( |
480 [plist valueForKey:app_mode::kCrAppModeShortcutURLKey])); | 495 [plist valueForKey:app_mode::kCrAppModeShortcutURLKey])); |
481 shortcut_info.title = base::SysNSStringToUTF16( | 496 shortcut_info->title = base::SysNSStringToUTF16( |
482 [plist valueForKey:app_mode::kCrAppModeShortcutNameKey]); | 497 [plist valueForKey:app_mode::kCrAppModeShortcutNameKey]); |
483 shortcut_info.profile_name = base::SysNSStringToUTF8( | 498 shortcut_info->profile_name = base::SysNSStringToUTF8( |
484 [plist valueForKey:app_mode::kCrAppModeProfileNameKey]); | 499 [plist valueForKey:app_mode::kCrAppModeProfileNameKey]); |
485 | 500 |
486 // Figure out the profile_path. Since the user_data_dir could contain the | 501 // Figure out the profile_path. Since the user_data_dir could contain the |
487 // path to the web app data dir. | 502 // path to the web app data dir. |
488 base::FilePath user_data_dir = base::mac::NSStringToFilePath( | 503 base::FilePath user_data_dir = base::mac::NSStringToFilePath( |
489 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]); | 504 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]); |
490 base::FilePath profile_base_name = base::mac::NSStringToFilePath( | 505 base::FilePath profile_base_name = base::mac::NSStringToFilePath( |
491 [plist valueForKey:app_mode::kCrAppModeProfileDirKey]); | 506 [plist valueForKey:app_mode::kCrAppModeProfileDirKey]); |
492 if (user_data_dir.DirName().DirName().BaseName() == profile_base_name) | 507 if (user_data_dir.DirName().DirName().BaseName() == profile_base_name) |
493 shortcut_info.profile_path = user_data_dir.DirName().DirName(); | 508 shortcut_info->profile_path = user_data_dir.DirName().DirName(); |
494 else | 509 else |
495 shortcut_info.profile_path = user_data_dir.Append(profile_base_name); | 510 shortcut_info->profile_path = user_data_dir.Append(profile_base_name); |
496 | 511 |
497 return shortcut_info; | 512 return shortcut_info; |
498 } | 513 } |
499 | 514 |
500 web_app::ShortcutInfo RecordAppShimErrorAndBuildShortcutInfo( | 515 scoped_ptr<web_app::ShortcutInfo> RecordAppShimErrorAndBuildShortcutInfo( |
501 const base::FilePath& bundle_path) { | 516 const base::FilePath& bundle_path) { |
502 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); | 517 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); |
503 NSString* version_string = [plist valueForKey:app_mode::kCrBundleVersionKey]; | 518 NSString* version_string = [plist valueForKey:app_mode::kCrBundleVersionKey]; |
504 if (!version_string) { | 519 if (!version_string) { |
505 // Older bundles have the Chrome version in the following key. | 520 // Older bundles have the Chrome version in the following key. |
506 version_string = | 521 version_string = |
507 [plist valueForKey:app_mode::kCFBundleShortVersionStringKey]; | 522 [plist valueForKey:app_mode::kCFBundleShortVersionStringKey]; |
508 } | 523 } |
509 base::Version full_version(base::SysNSStringToUTF8(version_string)); | 524 base::Version full_version(base::SysNSStringToUTF8(version_string)); |
510 uint32_t major_version = 0; | 525 uint32_t major_version = 0; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 app_mode::kCFBundleTypeRoleKey : app_mode::kBundleTypeRoleViewer | 567 app_mode::kCFBundleTypeRoleKey : app_mode::kBundleTypeRoleViewer |
553 }; | 568 }; |
554 [document_types addObject:type_dictionary]; | 569 [document_types addObject:type_dictionary]; |
555 } | 570 } |
556 | 571 |
557 [plist setObject:document_types | 572 [plist setObject:document_types |
558 forKey:app_mode::kCFBundleDocumentTypesKey]; | 573 forKey:app_mode::kCFBundleDocumentTypesKey]; |
559 } | 574 } |
560 | 575 |
561 void RevealAppShimInFinderForAppOnFileThread( | 576 void RevealAppShimInFinderForAppOnFileThread( |
562 const web_app::ShortcutInfo& shortcut_info, | 577 scoped_ptr<web_app::ShortcutInfo> shortcut_info, |
563 const base::FilePath& app_path) { | 578 const base::FilePath& app_path) { |
564 web_app::WebAppShortcutCreator shortcut_creator( | 579 web_app::WebAppShortcutCreator shortcut_creator( |
565 app_path, shortcut_info, extensions::FileHandlersInfo()); | 580 app_path, *shortcut_info, extensions::FileHandlersInfo()); |
566 shortcut_creator.RevealAppShimInFinder(); | 581 shortcut_creator.RevealAppShimInFinder(); |
567 } | 582 } |
568 | 583 |
569 } // namespace | 584 } // namespace |
570 | 585 |
571 @interface CrCreateAppShortcutCheckboxObserver : NSObject { | 586 @interface CrCreateAppShortcutCheckboxObserver : NSObject { |
572 @private | 587 @private |
573 NSButton* checkbox_; | 588 NSButton* checkbox_; |
574 NSButton* continueButton_; | 589 NSButton* continueButton_; |
575 } | 590 } |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 [[NSWorkspace sharedWorkspace] | 1019 [[NSWorkspace sharedWorkspace] |
1005 openFile:base::mac::FilePathToNSString(app_path)]; | 1020 openFile:base::mac::FilePathToNSString(app_path)]; |
1006 } | 1021 } |
1007 | 1022 |
1008 base::FilePath GetAppInstallPath(const ShortcutInfo& shortcut_info) { | 1023 base::FilePath GetAppInstallPath(const ShortcutInfo& shortcut_info) { |
1009 WebAppShortcutCreator shortcut_creator( | 1024 WebAppShortcutCreator shortcut_creator( |
1010 base::FilePath(), shortcut_info, extensions::FileHandlersInfo()); | 1025 base::FilePath(), shortcut_info, extensions::FileHandlersInfo()); |
1011 return shortcut_creator.GetApplicationsShortcutPath(); | 1026 return shortcut_creator.GetApplicationsShortcutPath(); |
1012 } | 1027 } |
1013 | 1028 |
1014 void MaybeLaunchShortcut(const ShortcutInfo& shortcut_info) { | 1029 void MaybeLaunchShortcut(scoped_ptr<ShortcutInfo> shortcut_info) { |
1015 if (AppShimsDisabledForTest() && | 1030 if (AppShimsDisabledForTest() && |
1016 !g_app_shims_allow_update_and_launch_in_tests) { | 1031 !g_app_shims_allow_update_and_launch_in_tests) { |
1017 return; | 1032 return; |
1018 } | 1033 } |
1019 | 1034 |
1020 content::BrowserThread::PostTask( | 1035 content::BrowserThread::PostTask( |
1021 content::BrowserThread::FILE, | 1036 content::BrowserThread::FILE, FROM_HERE, |
1022 FROM_HERE, | 1037 base::Bind(&LaunchShimOnFileThread, base::Passed(&shortcut_info), false)); |
1023 base::Bind(&LaunchShimOnFileThread, shortcut_info, false)); | |
1024 } | 1038 } |
1025 | 1039 |
1026 bool MaybeRebuildShortcut(const base::CommandLine& command_line) { | 1040 bool MaybeRebuildShortcut(const base::CommandLine& command_line) { |
1027 if (!command_line.HasSwitch(app_mode::kAppShimError)) | 1041 if (!command_line.HasSwitch(app_mode::kAppShimError)) |
1028 return false; | 1042 return false; |
1029 | 1043 |
1030 base::PostTaskAndReplyWithResult( | 1044 base::PostTaskAndReplyWithResult( |
1031 content::BrowserThread::GetBlockingPool(), | 1045 content::BrowserThread::GetBlockingPool(), |
1032 FROM_HERE, | 1046 FROM_HERE, |
1033 base::Bind(&RecordAppShimErrorAndBuildShortcutInfo, | 1047 base::Bind(&RecordAppShimErrorAndBuildShortcutInfo, |
1034 command_line.GetSwitchValuePath(app_mode::kAppShimError)), | 1048 command_line.GetSwitchValuePath(app_mode::kAppShimError)), |
1035 base::Bind(&RebuildAppAndLaunch)); | 1049 base::Bind(&RebuildAppAndLaunch)); |
1036 return true; | 1050 return true; |
1037 } | 1051 } |
1038 | 1052 |
1039 // Called when the app's ShortcutInfo (with icon) is loaded when creating app | 1053 // Called when the app's ShortcutInfo (with icon) is loaded when creating app |
1040 // shortcuts. | 1054 // shortcuts. |
1041 void CreateAppShortcutInfoLoaded( | 1055 void CreateAppShortcutInfoLoaded( |
1042 Profile* profile, | 1056 Profile* profile, |
1043 const extensions::Extension* app, | 1057 const extensions::Extension* app, |
1044 const base::Callback<void(bool)>& close_callback, | 1058 const base::Callback<void(bool)>& close_callback, |
1045 const ShortcutInfo& shortcut_info) { | 1059 scoped_ptr<ShortcutInfo> shortcut_info) { |
1046 base::scoped_nsobject<NSAlert> alert([[NSAlert alloc] init]); | 1060 base::scoped_nsobject<NSAlert> alert([[NSAlert alloc] init]); |
1047 | 1061 |
1048 NSButton* continue_button = [alert | 1062 NSButton* continue_button = [alert |
1049 addButtonWithTitle:l10n_util::GetNSString(IDS_CREATE_SHORTCUTS_COMMIT)]; | 1063 addButtonWithTitle:l10n_util::GetNSString(IDS_CREATE_SHORTCUTS_COMMIT)]; |
1050 [continue_button setKeyEquivalent:kKeyEquivalentReturn]; | 1064 [continue_button setKeyEquivalent:kKeyEquivalentReturn]; |
1051 | 1065 |
1052 NSButton* cancel_button = | 1066 NSButton* cancel_button = |
1053 [alert addButtonWithTitle:l10n_util::GetNSString(IDS_CANCEL)]; | 1067 [alert addButtonWithTitle:l10n_util::GetNSString(IDS_CANCEL)]; |
1054 [cancel_button setKeyEquivalent:kKeyEquivalentEscape]; | 1068 [cancel_button setKeyEquivalent:kKeyEquivalentEscape]; |
1055 | 1069 |
(...skipping 11 matching lines...) Expand all Loading... |
1067 base::scoped_nsobject<CrCreateAppShortcutCheckboxObserver> checkbox_observer( | 1081 base::scoped_nsobject<CrCreateAppShortcutCheckboxObserver> checkbox_observer( |
1068 [[CrCreateAppShortcutCheckboxObserver alloc] | 1082 [[CrCreateAppShortcutCheckboxObserver alloc] |
1069 initWithCheckbox:application_folder_checkbox | 1083 initWithCheckbox:application_folder_checkbox |
1070 continueButton:continue_button]); | 1084 continueButton:continue_button]); |
1071 [checkbox_observer startObserving]; | 1085 [checkbox_observer startObserving]; |
1072 | 1086 |
1073 [alert setAccessoryView:application_folder_checkbox]; | 1087 [alert setAccessoryView:application_folder_checkbox]; |
1074 | 1088 |
1075 const int kIconPreviewSizePixels = 128; | 1089 const int kIconPreviewSizePixels = 128; |
1076 const int kIconPreviewTargetSize = 64; | 1090 const int kIconPreviewTargetSize = 64; |
1077 const gfx::Image* icon = shortcut_info.favicon.GetBest( | 1091 const gfx::Image* icon = shortcut_info->favicon.GetBest( |
1078 kIconPreviewSizePixels, kIconPreviewSizePixels); | 1092 kIconPreviewSizePixels, kIconPreviewSizePixels); |
1079 | 1093 |
1080 if (icon && !icon->IsEmpty()) { | 1094 if (icon && !icon->IsEmpty()) { |
1081 NSImage* icon_image = icon->ToNSImage(); | 1095 NSImage* icon_image = icon->ToNSImage(); |
1082 [icon_image | 1096 [icon_image |
1083 setSize:NSMakeSize(kIconPreviewTargetSize, kIconPreviewTargetSize)]; | 1097 setSize:NSMakeSize(kIconPreviewTargetSize, kIconPreviewTargetSize)]; |
1084 [alert setIcon:icon_image]; | 1098 [alert setIcon:icon_image]; |
1085 } | 1099 } |
1086 | 1100 |
1087 bool dialog_accepted = false; | 1101 bool dialog_accepted = false; |
(...skipping 28 matching lines...) Expand all Loading... |
1116 it->get())) { | 1130 it->get())) { |
1117 web_app::UpdateAllShortcuts(base::string16(), profile, it->get()); | 1131 web_app::UpdateAllShortcuts(base::string16(), profile, it->get()); |
1118 } | 1132 } |
1119 } | 1133 } |
1120 | 1134 |
1121 callback.Run(); | 1135 callback.Run(); |
1122 } | 1136 } |
1123 | 1137 |
1124 void RevealAppShimInFinderForApp(Profile* profile, | 1138 void RevealAppShimInFinderForApp(Profile* profile, |
1125 const extensions::Extension* app) { | 1139 const extensions::Extension* app) { |
1126 const web_app::ShortcutInfo shortcut_info = | 1140 scoped_ptr<web_app::ShortcutInfo> shortcut_info = |
1127 ShortcutInfoForExtensionAndProfile(app, profile); | 1141 ShortcutInfoForExtensionAndProfile(app, profile); |
1128 content::BrowserThread::PostTask( | 1142 content::BrowserThread::PostTask( |
1129 content::BrowserThread::FILE, FROM_HERE, | 1143 content::BrowserThread::FILE, FROM_HERE, |
1130 base::Bind(&RevealAppShimInFinderForAppOnFileThread, shortcut_info, | 1144 base::Bind(&RevealAppShimInFinderForAppOnFileThread, |
1131 app->path())); | 1145 base::Passed(&shortcut_info), app->path())); |
1132 } | 1146 } |
1133 | 1147 |
1134 namespace internals { | 1148 namespace internals { |
1135 | 1149 |
1136 bool CreatePlatformShortcuts( | 1150 bool CreatePlatformShortcuts( |
1137 const base::FilePath& app_data_path, | 1151 const base::FilePath& app_data_path, |
1138 const ShortcutInfo& shortcut_info, | 1152 scoped_ptr<ShortcutInfo> shortcut_info, |
1139 const extensions::FileHandlersInfo& file_handlers_info, | 1153 const extensions::FileHandlersInfo& file_handlers_info, |
1140 const ShortcutLocations& creation_locations, | 1154 const ShortcutLocations& creation_locations, |
1141 ShortcutCreationReason creation_reason) { | 1155 ShortcutCreationReason creation_reason) { |
1142 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 1156 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
1143 if (AppShimsDisabledForTest()) | 1157 if (AppShimsDisabledForTest()) |
1144 return true; | 1158 return true; |
1145 | 1159 |
1146 WebAppShortcutCreator shortcut_creator( | 1160 WebAppShortcutCreator shortcut_creator(app_data_path, *shortcut_info, |
1147 app_data_path, shortcut_info, file_handlers_info); | 1161 file_handlers_info); |
1148 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); | 1162 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); |
1149 } | 1163 } |
1150 | 1164 |
1151 void DeletePlatformShortcuts(const base::FilePath& app_data_path, | 1165 void DeletePlatformShortcuts(const base::FilePath& app_data_path, |
1152 const ShortcutInfo& shortcut_info) { | 1166 scoped_ptr<ShortcutInfo> shortcut_info) { |
1153 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 1167 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
1154 WebAppShortcutCreator shortcut_creator( | 1168 WebAppShortcutCreator shortcut_creator(app_data_path, *shortcut_info, |
1155 app_data_path, shortcut_info, extensions::FileHandlersInfo()); | 1169 extensions::FileHandlersInfo()); |
1156 shortcut_creator.DeleteShortcuts(); | 1170 shortcut_creator.DeleteShortcuts(); |
1157 } | 1171 } |
1158 | 1172 |
1159 void UpdatePlatformShortcuts( | 1173 void UpdatePlatformShortcuts( |
1160 const base::FilePath& app_data_path, | 1174 const base::FilePath& app_data_path, |
1161 const base::string16& old_app_title, | 1175 const base::string16& old_app_title, |
1162 const ShortcutInfo& shortcut_info, | 1176 scoped_ptr<ShortcutInfo> shortcut_info, |
1163 const extensions::FileHandlersInfo& file_handlers_info) { | 1177 const extensions::FileHandlersInfo& file_handlers_info) { |
1164 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 1178 UpdatePlatformShortcutsInternal(app_data_path, old_app_title, *shortcut_info, |
1165 if (AppShimsDisabledForTest() && | 1179 file_handlers_info); |
1166 !g_app_shims_allow_update_and_launch_in_tests) { | |
1167 return; | |
1168 } | |
1169 | |
1170 WebAppShortcutCreator shortcut_creator( | |
1171 app_data_path, shortcut_info, file_handlers_info); | |
1172 shortcut_creator.UpdateShortcuts(); | |
1173 } | 1180 } |
1174 | 1181 |
1175 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { | 1182 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { |
1176 const std::string profile_base_name = profile_path.BaseName().value(); | 1183 const std::string profile_base_name = profile_path.BaseName().value(); |
1177 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( | 1184 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( |
1178 profile_path.Append(chrome::kWebAppDirname), profile_base_name); | 1185 profile_path.Append(chrome::kWebAppDirname), profile_base_name); |
1179 | 1186 |
1180 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); | 1187 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); |
1181 it != bundles.end(); ++it) { | 1188 it != bundles.end(); ++it) { |
1182 web_app::ShortcutInfo shortcut_info = | 1189 scoped_ptr<web_app::ShortcutInfo> shortcut_info = |
1183 BuildShortcutInfoFromBundle(*it); | 1190 BuildShortcutInfoFromBundle(*it); |
1184 WebAppShortcutCreator shortcut_creator( | 1191 WebAppShortcutCreator shortcut_creator(it->DirName(), *shortcut_info, |
1185 it->DirName(), shortcut_info, extensions::FileHandlersInfo()); | 1192 extensions::FileHandlersInfo()); |
1186 shortcut_creator.DeleteShortcuts(); | 1193 shortcut_creator.DeleteShortcuts(); |
1187 } | 1194 } |
1188 } | 1195 } |
1189 | 1196 |
1190 } // namespace internals | 1197 } // namespace internals |
1191 | 1198 |
1192 } // namespace web_app | 1199 } // namespace web_app |
1193 | 1200 |
1194 namespace chrome { | 1201 namespace chrome { |
1195 | 1202 |
1196 void ShowCreateChromeAppShortcutsDialog( | 1203 void ShowCreateChromeAppShortcutsDialog( |
1197 gfx::NativeWindow /*parent_window*/, | 1204 gfx::NativeWindow /*parent_window*/, |
1198 Profile* profile, | 1205 Profile* profile, |
1199 const extensions::Extension* app, | 1206 const extensions::Extension* app, |
1200 const base::Callback<void(bool)>& close_callback) { | 1207 const base::Callback<void(bool)>& close_callback) { |
1201 web_app::GetShortcutInfoForApp( | 1208 web_app::GetShortcutInfoForApp( |
1202 app, | 1209 app, |
1203 profile, | 1210 profile, |
1204 base::Bind(&web_app::CreateAppShortcutInfoLoaded, | 1211 base::Bind(&web_app::CreateAppShortcutInfoLoaded, |
1205 profile, | 1212 profile, |
1206 app, | 1213 app, |
1207 close_callback)); | 1214 close_callback)); |
1208 } | 1215 } |
1209 | 1216 |
1210 } // namespace chrome | 1217 } // namespace chrome |
OLD | NEW |