| 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 "apps/app_shim/app_shim_mac.h" | 10 #include "apps/app_shim/app_shim_mac.h" |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); | 196 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); |
| 197 DCHECK(!user_data_dir.empty()); | 197 DCHECK(!user_data_dir.empty()); |
| 198 return StartsWithASCII( | 198 return StartsWithASCII( |
| 199 base::SysNSStringToUTF8( | 199 base::SysNSStringToUTF8( |
| 200 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]), | 200 [plist valueForKey:app_mode::kCrAppModeUserDataDirKey]), |
| 201 user_data_dir.value(), | 201 user_data_dir.value(), |
| 202 true /* case_sensitive */); | 202 true /* case_sensitive */); |
| 203 } | 203 } |
| 204 | 204 |
| 205 void LaunchShimOnFileThread( | 205 void LaunchShimOnFileThread( |
| 206 const ShellIntegration::ShortcutInfo& shortcut_info) { | 206 const web_app::ShortcutInfo& shortcut_info) { |
| 207 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 207 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
| 208 base::FilePath shim_path = web_app::GetAppInstallPath(shortcut_info); | 208 base::FilePath shim_path = web_app::GetAppInstallPath(shortcut_info); |
| 209 | 209 |
| 210 if (shim_path.empty() || | 210 if (shim_path.empty() || |
| 211 !base::PathExists(shim_path) || | 211 !base::PathExists(shim_path) || |
| 212 !HasSameUserDataDir(shim_path)) { | 212 !HasSameUserDataDir(shim_path)) { |
| 213 // The user may have deleted the copy in the Applications folder, use the | 213 // The user may have deleted the copy in the Applications folder, use the |
| 214 // one in the web app's |app_data_dir_|. | 214 // one in the web app's |app_data_dir_|. |
| 215 base::FilePath app_data_dir = web_app::GetWebAppDataDirectory( | 215 base::FilePath app_data_dir = web_app::GetWebAppDataDirectory( |
| 216 shortcut_info.profile_path, shortcut_info.extension_id, GURL()); | 216 shortcut_info.profile_path, shortcut_info.extension_id, GURL()); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 base::FileEnumerator::DIRECTORIES); | 381 base::FileEnumerator::DIRECTORIES); |
| 382 for (base::FilePath bundle_path = enumerator.Next(); | 382 for (base::FilePath bundle_path = enumerator.Next(); |
| 383 !bundle_path.empty(); bundle_path = enumerator.Next()) { | 383 !bundle_path.empty(); bundle_path = enumerator.Next()) { |
| 384 if (IsShimForProfile(bundle_path.BaseName(), profile_base_name)) | 384 if (IsShimForProfile(bundle_path.BaseName(), profile_base_name)) |
| 385 bundle_paths.push_back(bundle_path); | 385 bundle_paths.push_back(bundle_path); |
| 386 } | 386 } |
| 387 | 387 |
| 388 return bundle_paths; | 388 return bundle_paths; |
| 389 } | 389 } |
| 390 | 390 |
| 391 ShellIntegration::ShortcutInfo BuildShortcutInfoFromBundle( | 391 web_app::ShortcutInfo BuildShortcutInfoFromBundle( |
| 392 const base::FilePath& bundle_path) { | 392 const base::FilePath& bundle_path) { |
| 393 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); | 393 NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path)); |
| 394 | 394 |
| 395 ShellIntegration::ShortcutInfo shortcut_info; | 395 web_app::ShortcutInfo shortcut_info; |
| 396 shortcut_info.extension_id = base::SysNSStringToUTF8( | 396 shortcut_info.extension_id = base::SysNSStringToUTF8( |
| 397 [plist valueForKey:app_mode::kCrAppModeShortcutIDKey]); | 397 [plist valueForKey:app_mode::kCrAppModeShortcutIDKey]); |
| 398 shortcut_info.is_platform_app = true; | 398 shortcut_info.is_platform_app = true; |
| 399 shortcut_info.url = GURL(base::SysNSStringToUTF8( | 399 shortcut_info.url = GURL(base::SysNSStringToUTF8( |
| 400 [plist valueForKey:app_mode::kCrAppModeShortcutURLKey])); | 400 [plist valueForKey:app_mode::kCrAppModeShortcutURLKey])); |
| 401 shortcut_info.title = base::SysNSStringToUTF16( | 401 shortcut_info.title = base::SysNSStringToUTF16( |
| 402 [plist valueForKey:app_mode::kCrAppModeShortcutNameKey]); | 402 [plist valueForKey:app_mode::kCrAppModeShortcutNameKey]); |
| 403 shortcut_info.profile_name = base::SysNSStringToUTF8( | 403 shortcut_info.profile_name = base::SysNSStringToUTF8( |
| 404 [plist valueForKey:app_mode::kCrAppModeProfileNameKey]); | 404 [plist valueForKey:app_mode::kCrAppModeProfileNameKey]); |
| 405 | 405 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 421 | 421 |
| 422 namespace chrome { | 422 namespace chrome { |
| 423 | 423 |
| 424 void ShowCreateChromeAppShortcutsDialog(gfx::NativeWindow /*parent_window*/, | 424 void ShowCreateChromeAppShortcutsDialog(gfx::NativeWindow /*parent_window*/, |
| 425 Profile* profile, | 425 Profile* profile, |
| 426 const extensions::Extension* app, | 426 const extensions::Extension* app, |
| 427 const base::Closure& close_callback) { | 427 const base::Closure& close_callback) { |
| 428 // Normally we would show a dialog, but since we always create the app | 428 // Normally we would show a dialog, but since we always create the app |
| 429 // shortcut in ~/Applications there are no options for the user to choose. | 429 // shortcut in ~/Applications there are no options for the user to choose. |
| 430 web_app::CreateShortcuts(web_app::SHORTCUT_CREATION_BY_USER, | 430 web_app::CreateShortcuts(web_app::SHORTCUT_CREATION_BY_USER, |
| 431 ShellIntegration::ShortcutLocations(), | 431 web_app::ShortcutLocations(), |
| 432 profile, | 432 profile, |
| 433 app); | 433 app); |
| 434 if (!close_callback.is_null()) | 434 if (!close_callback.is_null()) |
| 435 close_callback.Run(); | 435 close_callback.Run(); |
| 436 } | 436 } |
| 437 | 437 |
| 438 } // namespace chrome | 438 } // namespace chrome |
| 439 | 439 |
| 440 namespace web_app { | 440 namespace web_app { |
| 441 | 441 |
| 442 WebAppShortcutCreator::WebAppShortcutCreator( | 442 WebAppShortcutCreator::WebAppShortcutCreator( |
| 443 const base::FilePath& app_data_dir, | 443 const base::FilePath& app_data_dir, |
| 444 const ShellIntegration::ShortcutInfo& shortcut_info) | 444 const web_app::ShortcutInfo& shortcut_info) |
| 445 : app_data_dir_(app_data_dir), | 445 : app_data_dir_(app_data_dir), |
| 446 info_(shortcut_info) {} | 446 info_(shortcut_info) {} |
| 447 | 447 |
| 448 WebAppShortcutCreator::~WebAppShortcutCreator() {} | 448 WebAppShortcutCreator::~WebAppShortcutCreator() {} |
| 449 | 449 |
| 450 base::FilePath WebAppShortcutCreator::GetApplicationsShortcutPath() const { | 450 base::FilePath WebAppShortcutCreator::GetApplicationsShortcutPath() const { |
| 451 base::FilePath applications_dir = GetApplicationsDirname(); | 451 base::FilePath applications_dir = GetApplicationsDirname(); |
| 452 return applications_dir.empty() ? | 452 return applications_dir.empty() ? |
| 453 base::FilePath() : applications_dir.Append(GetShortcutBasename()); | 453 base::FilePath() : applications_dir.Append(GetShortcutBasename()); |
| 454 } | 454 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 | 514 |
| 515 base::mac::RemoveQuarantineAttribute(dst_path.Append(app_name)); | 515 base::mac::RemoveQuarantineAttribute(dst_path.Append(app_name)); |
| 516 ++succeeded; | 516 ++succeeded; |
| 517 } | 517 } |
| 518 | 518 |
| 519 return succeeded; | 519 return succeeded; |
| 520 } | 520 } |
| 521 | 521 |
| 522 bool WebAppShortcutCreator::CreateShortcuts( | 522 bool WebAppShortcutCreator::CreateShortcuts( |
| 523 ShortcutCreationReason creation_reason, | 523 ShortcutCreationReason creation_reason, |
| 524 ShellIntegration::ShortcutLocations creation_locations) { | 524 web_app::ShortcutLocations creation_locations) { |
| 525 const base::FilePath applications_dir = GetApplicationsDirname(); | 525 const base::FilePath applications_dir = GetApplicationsDirname(); |
| 526 if (applications_dir.empty() || | 526 if (applications_dir.empty() || |
| 527 !base::DirectoryExists(applications_dir.DirName())) { | 527 !base::DirectoryExists(applications_dir.DirName())) { |
| 528 LOG(ERROR) << "Couldn't find an Applications directory to copy app to."; | 528 LOG(ERROR) << "Couldn't find an Applications directory to copy app to."; |
| 529 return false; | 529 return false; |
| 530 } | 530 } |
| 531 | 531 |
| 532 UpdateAppShortcutsSubdirLocalizedName(applications_dir); | 532 UpdateAppShortcutsSubdirLocalizedName(applications_dir); |
| 533 | 533 |
| 534 // If non-nil, this path is added to the OSX Dock after creating shortcuts. | 534 // If non-nil, this path is added to the OSX Dock after creating shortcuts. |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 base::FilePath app_path = GetApplicationsShortcutPath(); | 787 base::FilePath app_path = GetApplicationsShortcutPath(); |
| 788 if (app_path.empty()) | 788 if (app_path.empty()) |
| 789 return; | 789 return; |
| 790 | 790 |
| 791 [[NSWorkspace sharedWorkspace] | 791 [[NSWorkspace sharedWorkspace] |
| 792 selectFile:base::mac::FilePathToNSString(app_path) | 792 selectFile:base::mac::FilePathToNSString(app_path) |
| 793 inFileViewerRootedAtPath:nil]; | 793 inFileViewerRootedAtPath:nil]; |
| 794 } | 794 } |
| 795 | 795 |
| 796 base::FilePath GetAppInstallPath( | 796 base::FilePath GetAppInstallPath( |
| 797 const ShellIntegration::ShortcutInfo& shortcut_info) { | 797 const web_app::ShortcutInfo& shortcut_info) { |
| 798 WebAppShortcutCreator shortcut_creator(base::FilePath(), shortcut_info); | 798 WebAppShortcutCreator shortcut_creator(base::FilePath(), shortcut_info); |
| 799 return shortcut_creator.GetApplicationsShortcutPath(); | 799 return shortcut_creator.GetApplicationsShortcutPath(); |
| 800 } | 800 } |
| 801 | 801 |
| 802 void MaybeLaunchShortcut(const ShellIntegration::ShortcutInfo& shortcut_info) { | 802 void MaybeLaunchShortcut(const web_app::ShortcutInfo& shortcut_info) { |
| 803 if (!apps::IsAppShimsEnabled()) | 803 if (!apps::IsAppShimsEnabled()) |
| 804 return; | 804 return; |
| 805 | 805 |
| 806 content::BrowserThread::PostTask( | 806 content::BrowserThread::PostTask( |
| 807 content::BrowserThread::FILE, FROM_HERE, | 807 content::BrowserThread::FILE, FROM_HERE, |
| 808 base::Bind(&LaunchShimOnFileThread, shortcut_info)); | 808 base::Bind(&LaunchShimOnFileThread, shortcut_info)); |
| 809 } | 809 } |
| 810 | 810 |
| 811 namespace internals { | 811 namespace internals { |
| 812 | 812 |
| 813 bool CreatePlatformShortcuts( | 813 bool CreatePlatformShortcuts( |
| 814 const base::FilePath& app_data_path, | 814 const base::FilePath& app_data_path, |
| 815 const ShellIntegration::ShortcutInfo& shortcut_info, | 815 const web_app::ShortcutInfo& shortcut_info, |
| 816 const ShellIntegration::ShortcutLocations& creation_locations, | 816 const web_app::ShortcutLocations& creation_locations, |
| 817 ShortcutCreationReason creation_reason) { | 817 ShortcutCreationReason creation_reason) { |
| 818 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 818 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
| 819 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); | 819 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); |
| 820 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); | 820 return shortcut_creator.CreateShortcuts(creation_reason, creation_locations); |
| 821 } | 821 } |
| 822 | 822 |
| 823 void DeletePlatformShortcuts( | 823 void DeletePlatformShortcuts( |
| 824 const base::FilePath& app_data_path, | 824 const base::FilePath& app_data_path, |
| 825 const ShellIntegration::ShortcutInfo& shortcut_info) { | 825 const web_app::ShortcutInfo& shortcut_info) { |
| 826 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 826 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
| 827 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); | 827 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); |
| 828 shortcut_creator.DeleteShortcuts(); | 828 shortcut_creator.DeleteShortcuts(); |
| 829 } | 829 } |
| 830 | 830 |
| 831 void UpdatePlatformShortcuts( | 831 void UpdatePlatformShortcuts( |
| 832 const base::FilePath& app_data_path, | 832 const base::FilePath& app_data_path, |
| 833 const base::string16& old_app_title, | 833 const base::string16& old_app_title, |
| 834 const ShellIntegration::ShortcutInfo& shortcut_info) { | 834 const web_app::ShortcutInfo& shortcut_info) { |
| 835 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); | 835 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
| 836 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); | 836 WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info); |
| 837 shortcut_creator.UpdateShortcuts(); | 837 shortcut_creator.UpdateShortcuts(); |
| 838 } | 838 } |
| 839 | 839 |
| 840 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { | 840 void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) { |
| 841 const std::string profile_base_name = profile_path.BaseName().value(); | 841 const std::string profile_base_name = profile_path.BaseName().value(); |
| 842 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( | 842 std::vector<base::FilePath> bundles = GetAllAppBundlesInPath( |
| 843 profile_path.Append(chrome::kWebAppDirname), profile_base_name); | 843 profile_path.Append(chrome::kWebAppDirname), profile_base_name); |
| 844 | 844 |
| 845 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); | 845 for (std::vector<base::FilePath>::const_iterator it = bundles.begin(); |
| 846 it != bundles.end(); ++it) { | 846 it != bundles.end(); ++it) { |
| 847 ShellIntegration::ShortcutInfo shortcut_info = | 847 web_app::ShortcutInfo shortcut_info = |
| 848 BuildShortcutInfoFromBundle(*it); | 848 BuildShortcutInfoFromBundle(*it); |
| 849 WebAppShortcutCreator shortcut_creator(it->DirName(), shortcut_info); | 849 WebAppShortcutCreator shortcut_creator(it->DirName(), shortcut_info); |
| 850 shortcut_creator.DeleteShortcuts(); | 850 shortcut_creator.DeleteShortcuts(); |
| 851 } | 851 } |
| 852 } | 852 } |
| 853 | 853 |
| 854 } // namespace internals | 854 } // namespace internals |
| 855 | 855 |
| 856 } // namespace web_app | 856 } // namespace web_app |
| OLD | NEW |