| 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 <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 } | 245 } |
| 246 | 246 |
| 247 base::FilePath GetAppLoaderPath() { | 247 base::FilePath GetAppLoaderPath() { |
| 248 return base::mac::PathForFrameworkBundleResource( | 248 return base::mac::PathForFrameworkBundleResource( |
| 249 base::mac::NSToCFCast(@"app_mode_loader.app")); | 249 base::mac::NSToCFCast(@"app_mode_loader.app")); |
| 250 } | 250 } |
| 251 | 251 |
| 252 void UpdatePlatformShortcutsInternal( | 252 void UpdatePlatformShortcutsInternal( |
| 253 const base::FilePath& app_data_path, | 253 const base::FilePath& app_data_path, |
| 254 const base::string16& old_app_title, | 254 const base::string16& old_app_title, |
| 255 const web_app::ShortcutInfo& shortcut_info, | 255 const web_app::ShortcutInfo& shortcut_info) { |
| 256 const extensions::FileHandlersInfo& file_handlers_info) { | |
| 257 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); | 256 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
| 258 if (AppShimsDisabledForTest() && | 257 if (AppShimsDisabledForTest() && |
| 259 !g_app_shims_allow_update_and_launch_in_tests) { | 258 !g_app_shims_allow_update_and_launch_in_tests) { |
| 260 return; | 259 return; |
| 261 } | 260 } |
| 262 | 261 |
| 263 web_app::WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info, | 262 web_app::WebAppShortcutCreator shortcut_creator(app_data_path, |
| 264 file_handlers_info); | 263 &shortcut_info); |
| 265 shortcut_creator.UpdateShortcuts(); | 264 shortcut_creator.UpdateShortcuts(); |
| 266 } | 265 } |
| 267 | 266 |
| 268 void UpdateAndLaunchShimOnFileThread( | 267 void UpdateAndLaunchShimOnFileThread( |
| 269 std::unique_ptr<web_app::ShortcutInfo> shortcut_info, | 268 std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { |
| 270 const extensions::FileHandlersInfo& file_handlers_info) { | |
| 271 base::FilePath shortcut_data_dir = web_app::GetWebAppDataDirectory( | 269 base::FilePath shortcut_data_dir = web_app::GetWebAppDataDirectory( |
| 272 shortcut_info->profile_path, shortcut_info->extension_id, GURL()); | 270 shortcut_info->profile_path, shortcut_info->extension_id, GURL()); |
| 273 UpdatePlatformShortcutsInternal(shortcut_data_dir, base::string16(), | 271 UpdatePlatformShortcutsInternal(shortcut_data_dir, base::string16(), |
| 274 *shortcut_info, file_handlers_info); | 272 *shortcut_info); |
| 275 LaunchShimOnFileThread(std::move(shortcut_info), true); | 273 LaunchShimOnFileThread(std::move(shortcut_info), true); |
| 276 } | 274 } |
| 277 | 275 |
| 278 void UpdateAndLaunchShim( | 276 void UpdateAndLaunchShim(std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { |
| 279 std::unique_ptr<web_app::ShortcutInfo> shortcut_info, | 277 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
| 280 const extensions::FileHandlersInfo& file_handlers_info) { | 278 base::Bind(&UpdateAndLaunchShimOnFileThread, |
| 281 content::BrowserThread::PostTask( | 279 base::Passed(&shortcut_info))); |
| 282 content::BrowserThread::FILE, FROM_HERE, | |
| 283 base::Bind(&UpdateAndLaunchShimOnFileThread, base::Passed(&shortcut_info), | |
| 284 file_handlers_info)); | |
| 285 } | 280 } |
| 286 | 281 |
| 287 void RebuildAppAndLaunch(std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { | 282 void RebuildAppAndLaunch(std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { |
| 288 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 283 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 289 if (shortcut_info->extension_id == app_mode::kAppListModeId) { | 284 if (shortcut_info->extension_id == app_mode::kAppListModeId) { |
| 290 AppListService* app_list_service = AppListService::Get(); | 285 AppListService* app_list_service = AppListService::Get(); |
| 291 app_list_service->CreateShortcut(); | 286 app_list_service->CreateShortcut(); |
| 292 app_list_service->Show(); | 287 app_list_service->Show(); |
| 293 return; | 288 return; |
| 294 } | 289 } |
| 295 | 290 |
| 296 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 291 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 297 Profile* profile = | 292 Profile* profile = |
| 298 profile_manager->GetProfileByPath(shortcut_info->profile_path); | 293 profile_manager->GetProfileByPath(shortcut_info->profile_path); |
| 299 if (!profile || !profile_manager->IsValidProfile(profile)) | 294 if (!profile || !profile_manager->IsValidProfile(profile)) |
| 300 return; | 295 return; |
| 301 | 296 |
| 302 extensions::ExtensionRegistry* registry = | 297 extensions::ExtensionRegistry* registry = |
| 303 extensions::ExtensionRegistry::Get(profile); | 298 extensions::ExtensionRegistry::Get(profile); |
| 304 const extensions::Extension* extension = registry->GetExtensionById( | 299 const extensions::Extension* extension = registry->GetExtensionById( |
| 305 shortcut_info->extension_id, extensions::ExtensionRegistry::ENABLED); | 300 shortcut_info->extension_id, extensions::ExtensionRegistry::ENABLED); |
| 306 if (!extension || !extension->is_platform_app()) | 301 if (!extension || !extension->is_platform_app()) |
| 307 return; | 302 return; |
| 308 | 303 |
| 309 web_app::GetInfoForApp(extension, profile, base::Bind(&UpdateAndLaunchShim)); | 304 web_app::GetShortcutInfoForApp(extension, profile, |
| 305 base::Bind(&UpdateAndLaunchShim)); |
| 310 } | 306 } |
| 311 | 307 |
| 312 base::FilePath GetLocalizableAppShortcutsSubdirName() { | 308 base::FilePath GetLocalizableAppShortcutsSubdirName() { |
| 313 static const char kChromiumAppDirName[] = "Chromium Apps.localized"; | 309 static const char kChromiumAppDirName[] = "Chromium Apps.localized"; |
| 314 static const char kChromeAppDirName[] = "Chrome Apps.localized"; | 310 static const char kChromeAppDirName[] = "Chrome Apps.localized"; |
| 315 static const char kChromeCanaryAppDirName[] = "Chrome Canary Apps.localized"; | 311 static const char kChromeCanaryAppDirName[] = "Chrome Canary Apps.localized"; |
| 316 | 312 |
| 317 switch (chrome::GetChannel()) { | 313 switch (chrome::GetChannel()) { |
| 318 case version_info::Channel::UNKNOWN: | 314 case version_info::Channel::UNKNOWN: |
| 319 return base::FilePath(kChromiumAppDirName); | 315 return base::FilePath(kChromiumAppDirName); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 if (full_version.IsValid()) | 520 if (full_version.IsValid()) |
| 525 major_version = full_version.components()[0]; | 521 major_version = full_version.components()[0]; |
| 526 UMA_HISTOGRAM_SPARSE_SLOWLY("Apps.AppShimErrorVersion", major_version); | 522 UMA_HISTOGRAM_SPARSE_SLOWLY("Apps.AppShimErrorVersion", major_version); |
| 527 | 523 |
| 528 return BuildShortcutInfoFromBundle(bundle_path); | 524 return BuildShortcutInfoFromBundle(bundle_path); |
| 529 } | 525 } |
| 530 | 526 |
| 531 void RevealAppShimInFinderForAppOnFileThread( | 527 void RevealAppShimInFinderForAppOnFileThread( |
| 532 std::unique_ptr<web_app::ShortcutInfo> shortcut_info, | 528 std::unique_ptr<web_app::ShortcutInfo> shortcut_info, |
| 533 const base::FilePath& app_path) { | 529 const base::FilePath& app_path) { |
| 534 web_app::WebAppShortcutCreator shortcut_creator( | 530 web_app::WebAppShortcutCreator shortcut_creator(app_path, |
| 535 app_path, shortcut_info.get(), extensions::FileHandlersInfo()); | 531 shortcut_info.get()); |
| 536 shortcut_creator.RevealAppShimInFinder(); | 532 shortcut_creator.RevealAppShimInFinder(); |
| 537 } | 533 } |
| 538 | 534 |
| 539 // Mac-specific version of web_app::ShouldCreateShortcutFor() used during batch | 535 // Mac-specific version of web_app::ShouldCreateShortcutFor() used during batch |
| 540 // upgrades to ensure all shortcuts a user may still have are repaired when | 536 // upgrades to ensure all shortcuts a user may still have are repaired when |
| 541 // required by a Chrome upgrade. | 537 // required by a Chrome upgrade. |
| 542 bool ShouldUpgradeShortcutFor(Profile* profile, | 538 bool ShouldUpgradeShortcutFor(Profile* profile, |
| 543 const extensions::Extension* extension) { | 539 const extensions::Extension* extension) { |
| 544 if (extension->location() == extensions::Manifest::COMPONENT || | 540 if (extension->location() == extensions::Manifest::COMPONENT || |
| 545 !extensions::ui_util::CanDisplayInAppLauncher(extension, profile)) { | 541 !extensions::ui_util::CanDisplayInAppLauncher(extension, profile)) { |
| 546 return false; | 542 return false; |
| 547 } | 543 } |
| 548 | 544 |
| 549 return extension->is_app(); | 545 return extension->is_app(); |
| 550 } | 546 } |
| 551 | 547 |
| 552 } // namespace | 548 } // namespace |
| 553 | 549 |
| 554 namespace web_app { | 550 namespace web_app { |
| 555 | 551 |
| 556 WebAppShortcutCreator::WebAppShortcutCreator( | 552 WebAppShortcutCreator::WebAppShortcutCreator(const base::FilePath& app_data_dir, |
| 557 const base::FilePath& app_data_dir, | 553 const ShortcutInfo* shortcut_info) |
| 558 const ShortcutInfo* shortcut_info, | 554 : app_data_dir_(app_data_dir), info_(shortcut_info) { |
| 559 const extensions::FileHandlersInfo& file_handlers_info) | |
| 560 : app_data_dir_(app_data_dir), | |
| 561 info_(shortcut_info), | |
| 562 file_handlers_info_(file_handlers_info) { | |
| 563 DCHECK(shortcut_info); | 555 DCHECK(shortcut_info); |
| 564 } | 556 } |
| 565 | 557 |
| 566 WebAppShortcutCreator::~WebAppShortcutCreator() {} | 558 WebAppShortcutCreator::~WebAppShortcutCreator() {} |
| 567 | 559 |
| 568 base::FilePath WebAppShortcutCreator::GetApplicationsShortcutPath() const { | 560 base::FilePath WebAppShortcutCreator::GetApplicationsShortcutPath() const { |
| 569 base::FilePath applications_dir = GetApplicationsDirname(); | 561 base::FilePath applications_dir = GetApplicationsDirname(); |
| 570 return applications_dir.empty() ? | 562 return applications_dir.empty() ? |
| 571 base::FilePath() : applications_dir.Append(GetShortcutBasename()); | 563 base::FilePath() : applications_dir.Append(GetShortcutBasename()); |
| 572 } | 564 } |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 // Check if the Chrome apps folder exists, otherwise go up to ~/Applications. | 959 // Check if the Chrome apps folder exists, otherwise go up to ~/Applications. |
| 968 if (!base::PathExists(app_path)) | 960 if (!base::PathExists(app_path)) |
| 969 app_path = app_path.DirName(); | 961 app_path = app_path.DirName(); |
| 970 // Since |app_path| is a directory, use openFile to show the contents of | 962 // Since |app_path| is a directory, use openFile to show the contents of |
| 971 // that directory in Finder. | 963 // that directory in Finder. |
| 972 [[NSWorkspace sharedWorkspace] | 964 [[NSWorkspace sharedWorkspace] |
| 973 openFile:base::mac::FilePathToNSString(app_path)]; | 965 openFile:base::mac::FilePathToNSString(app_path)]; |
| 974 } | 966 } |
| 975 | 967 |
| 976 base::FilePath GetAppInstallPath(const ShortcutInfo& shortcut_info) { | 968 base::FilePath GetAppInstallPath(const ShortcutInfo& shortcut_info) { |
| 977 WebAppShortcutCreator shortcut_creator(base::FilePath(), &shortcut_info, | 969 WebAppShortcutCreator shortcut_creator(base::FilePath(), &shortcut_info); |
| 978 extensions::FileHandlersInfo()); | |
| 979 return shortcut_creator.GetApplicationsShortcutPath(); | 970 return shortcut_creator.GetApplicationsShortcutPath(); |
| 980 } | 971 } |
| 981 | 972 |
| 982 void MaybeLaunchShortcut(std::unique_ptr<ShortcutInfo> shortcut_info) { | 973 void MaybeLaunchShortcut(std::unique_ptr<ShortcutInfo> shortcut_info) { |
| 983 if (AppShimsDisabledForTest() && | 974 if (AppShimsDisabledForTest() && |
| 984 !g_app_shims_allow_update_and_launch_in_tests) { | 975 !g_app_shims_allow_update_and_launch_in_tests) { |
| 985 return; | 976 return; |
| 986 } | 977 } |
| 987 | 978 |
| 988 content::BrowserThread::PostTask( | 979 content::BrowserThread::PostTask( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 content::BrowserThread::FILE, FROM_HERE, | 1025 content::BrowserThread::FILE, FROM_HERE, |
| 1035 base::Bind(&RevealAppShimInFinderForAppOnFileThread, | 1026 base::Bind(&RevealAppShimInFinderForAppOnFileThread, |
| 1036 base::Passed(&shortcut_info), app->path())); | 1027 base::Passed(&shortcut_info), app->path())); |
| 1037 } | 1028 } |
| 1038 | 1029 |
| 1039 namespace internals { | 1030 namespace internals { |
| 1040 | 1031 |
| 1041 bool CreatePlatformShortcuts( | 1032 bool CreatePlatformShortcuts( |
| 1042 const base::FilePath& app_data_path, | 1033 const base::FilePath& app_data_path, |
| 1043 std::unique_ptr<ShortcutInfo> shortcut_info, | 1034 std::unique_ptr<ShortcutInfo> shortcut_info, |
| 1044 const extensions::FileHandlersInfo& file_handlers_info, | |
| 1045 const ShortcutLocations& creation_locations, | 1035 const ShortcutLocations& creation_locations, |
| 1046 ShortcutCreationReason creation_reason) { | 1036 ShortcutCreationReason creation_reason) { |
| 1047 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); | 1037 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
| 1048 if (AppShimsDisabledForTest()) | 1038 if (AppShimsDisabledForTest()) |
| 1049 return true; | 1039 return true; |
| 1050 | 1040 |
| 1051 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get(), | 1041 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get()); |
| 1052 file_handlers_info); | |
| 1053 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); | 1042 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); |
| 1054 } | 1043 } |
| 1055 | 1044 |
| 1056 void DeletePlatformShortcuts(const base::FilePath& app_data_path, | 1045 void DeletePlatformShortcuts(const base::FilePath& app_data_path, |
| 1057 std::unique_ptr<ShortcutInfo> shortcut_info) { | 1046 std::unique_ptr<ShortcutInfo> shortcut_info) { |
| 1058 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); | 1047 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); |
| 1059 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get(), | 1048 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get()); |
| 1060 extensions::FileHandlersInfo()); | |
| 1061 shortcut_creator.DeleteShortcuts(); | 1049 shortcut_creator.DeleteShortcuts(); |
| 1062 } | 1050 } |
| 1063 | 1051 |
| 1064 void UpdatePlatformShortcuts( | 1052 void UpdatePlatformShortcuts(const base::FilePath& app_data_path, |
| 1065 const base::FilePath& app_data_path, | 1053 const base::string16& old_app_title, |
| 1066 const base::string16& old_app_title, | 1054 std::unique_ptr<ShortcutInfo> shortcut_info) { |
| 1067 std::unique_ptr<ShortcutInfo> shortcut_info, | 1055 UpdatePlatformShortcutsInternal(app_data_path, old_app_title, *shortcut_info); |
| 1068 const extensions::FileHandlersInfo& file_handlers_info) { | |
| 1069 UpdatePlatformShortcutsInternal(app_data_path, old_app_title, *shortcut_info, | |
| 1070 file_handlers_info); | |
| 1071 } | 1056 } |
| 1072 | 1057 |
| 1073 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { | 1058 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { |
| 1074 const std::string profile_base_name = profile_path.BaseName().value(); | 1059 const std::string profile_base_name = profile_path.BaseName().value(); |
| 1075 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( | 1060 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( |
| 1076 profile_path.Append(chrome::kWebAppDirname), profile_base_name); | 1061 profile_path.Append(chrome::kWebAppDirname), profile_base_name); |
| 1077 | 1062 |
| 1078 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); | 1063 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); |
| 1079 it != bundles.end(); ++it) { | 1064 it != bundles.end(); ++it) { |
| 1080 std::unique_ptr<web_app::ShortcutInfo> shortcut_info = | 1065 std::unique_ptr<web_app::ShortcutInfo> shortcut_info = |
| 1081 BuildShortcutInfoFromBundle(*it); | 1066 BuildShortcutInfoFromBundle(*it); |
| 1082 WebAppShortcutCreator shortcut_creator(it->DirName(), shortcut_info.get(), | 1067 WebAppShortcutCreator shortcut_creator(it->DirName(), shortcut_info.get()); |
| 1083 extensions::FileHandlersInfo()); | |
| 1084 shortcut_creator.DeleteShortcuts(); | 1068 shortcut_creator.DeleteShortcuts(); |
| 1085 } | 1069 } |
| 1086 } | 1070 } |
| 1087 | 1071 |
| 1088 } // namespace internals | 1072 } // namespace internals |
| 1089 | 1073 |
| 1090 } // namespace web_app | 1074 } // namespace web_app |
| OLD | NEW |