| Index: chrome/browser/web_applications/web_app_mac.mm
|
| diff --git a/chrome/browser/web_applications/web_app_mac.mm b/chrome/browser/web_applications/web_app_mac.mm
|
| index 5c04775cd1eba2e971ef131c58fe8918d622fecc..6c805909fe288ae26d583cb985c2d36fed6d4106 100644
|
| --- a/chrome/browser/web_applications/web_app_mac.mm
|
| +++ b/chrome/browser/web_applications/web_app_mac.mm
|
| @@ -219,10 +219,10 @@ bool HasSameUserDataDir(const base::FilePath& bundle_path) {
|
| true /* case_sensitive */);
|
| }
|
|
|
| -void LaunchShimOnFileThread(const web_app::ShortcutInfo& shortcut_info,
|
| +void LaunchShimOnFileThread(scoped_ptr<web_app::ShortcutInfo> shortcut_info,
|
| bool launched_after_rebuild) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| - base::FilePath shim_path = web_app::GetAppInstallPath(shortcut_info);
|
| + base::FilePath shim_path = web_app::GetAppInstallPath(*shortcut_info);
|
|
|
| if (shim_path.empty() ||
|
| !base::PathExists(shim_path) ||
|
| @@ -230,7 +230,7 @@ void LaunchShimOnFileThread(const web_app::ShortcutInfo& shortcut_info,
|
| // The user may have deleted the copy in the Applications folder, use the
|
| // one in the web app's |app_data_dir_|.
|
| base::FilePath app_data_dir = web_app::GetWebAppDataDirectory(
|
| - shortcut_info.profile_path, shortcut_info.extension_id, GURL());
|
| + shortcut_info->profile_path, shortcut_info->extension_id, GURL());
|
| shim_path = app_data_dir.Append(shim_path.BaseName());
|
| }
|
|
|
| @@ -253,29 +253,44 @@ base::FilePath GetAppLoaderPath() {
|
| base::mac::NSToCFCast(@"app_mode_loader.app"));
|
| }
|
|
|
| -void UpdateAndLaunchShimOnFileThread(
|
| +void UpdatePlatformShortcutsInternal(
|
| + const base::FilePath& app_data_path,
|
| + const base::string16& old_app_title,
|
| const web_app::ShortcutInfo& shortcut_info,
|
| const extensions::FileHandlersInfo& file_handlers_info) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| + if (AppShimsDisabledForTest() &&
|
| + !g_app_shims_allow_update_and_launch_in_tests) {
|
| + return;
|
| + }
|
| +
|
| + web_app::WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info,
|
| + file_handlers_info);
|
| + shortcut_creator.UpdateShortcuts();
|
| +}
|
| +
|
| +void UpdateAndLaunchShimOnFileThread(
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info,
|
| + const extensions::FileHandlersInfo& file_handlers_info) {
|
| base::FilePath shortcut_data_dir = web_app::GetWebAppDataDirectory(
|
| - shortcut_info.profile_path, shortcut_info.extension_id, GURL());
|
| - web_app::internals::UpdatePlatformShortcuts(
|
| - shortcut_data_dir, base::string16(), shortcut_info, file_handlers_info);
|
| - LaunchShimOnFileThread(shortcut_info, true);
|
| + shortcut_info->profile_path, shortcut_info->extension_id, GURL());
|
| + UpdatePlatformShortcutsInternal(shortcut_data_dir, base::string16(),
|
| + *shortcut_info, file_handlers_info);
|
| + LaunchShimOnFileThread(shortcut_info.Pass(), true);
|
| }
|
|
|
| void UpdateAndLaunchShim(
|
| - const web_app::ShortcutInfo& shortcut_info,
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info,
|
| const extensions::FileHandlersInfo& file_handlers_info) {
|
| content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &UpdateAndLaunchShimOnFileThread, shortcut_info, file_handlers_info));
|
| + content::BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&UpdateAndLaunchShimOnFileThread, base::Passed(&shortcut_info),
|
| + file_handlers_info));
|
| }
|
|
|
| -void RebuildAppAndLaunch(const web_app::ShortcutInfo& shortcut_info) {
|
| +void RebuildAppAndLaunch(scoped_ptr<web_app::ShortcutInfo> shortcut_info) {
|
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| - if (shortcut_info.extension_id == app_mode::kAppListModeId) {
|
| + if (shortcut_info->extension_id == app_mode::kAppListModeId) {
|
| AppListService* app_list_service =
|
| AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE);
|
| app_list_service->CreateShortcut();
|
| @@ -285,14 +300,14 @@ void RebuildAppAndLaunch(const web_app::ShortcutInfo& shortcut_info) {
|
|
|
| ProfileManager* profile_manager = g_browser_process->profile_manager();
|
| Profile* profile =
|
| - profile_manager->GetProfileByPath(shortcut_info.profile_path);
|
| + profile_manager->GetProfileByPath(shortcut_info->profile_path);
|
| if (!profile || !profile_manager->IsValidProfile(profile))
|
| return;
|
|
|
| extensions::ExtensionRegistry* registry =
|
| extensions::ExtensionRegistry::Get(profile);
|
| const extensions::Extension* extension = registry->GetExtensionById(
|
| - shortcut_info.extension_id, extensions::ExtensionRegistry::ENABLED);
|
| + shortcut_info->extension_id, extensions::ExtensionRegistry::ENABLED);
|
| if (!extension || !extension->is_platform_app())
|
| return;
|
|
|
| @@ -468,19 +483,19 @@ std::vector<base::FilePath> GetAllAppBundlesInPath(
|
| return bundle_paths;
|
| }
|
|
|
| -web_app::ShortcutInfo BuildShortcutInfoFromBundle(
|
| +scoped_ptr<web_app::ShortcutInfo> BuildShortcutInfoFromBundle(
|
| const base::FilePath& bundle_path) {
|
| NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path));
|
|
|
| - web_app::ShortcutInfo shortcut_info;
|
| - shortcut_info.extension_id = base::SysNSStringToUTF8(
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info(new web_app::ShortcutInfo);
|
| + shortcut_info->extension_id = base::SysNSStringToUTF8(
|
| [plist valueForKey:app_mode::kCrAppModeShortcutIDKey]);
|
| - shortcut_info.is_platform_app = true;
|
| - shortcut_info.url = GURL(base::SysNSStringToUTF8(
|
| + shortcut_info->is_platform_app = true;
|
| + shortcut_info->url = GURL(base::SysNSStringToUTF8(
|
| [plist valueForKey:app_mode::kCrAppModeShortcutURLKey]));
|
| - shortcut_info.title = base::SysNSStringToUTF16(
|
| + shortcut_info->title = base::SysNSStringToUTF16(
|
| [plist valueForKey:app_mode::kCrAppModeShortcutNameKey]);
|
| - shortcut_info.profile_name = base::SysNSStringToUTF8(
|
| + shortcut_info->profile_name = base::SysNSStringToUTF8(
|
| [plist valueForKey:app_mode::kCrAppModeProfileNameKey]);
|
|
|
| // Figure out the profile_path. Since the user_data_dir could contain the
|
| @@ -490,14 +505,14 @@ web_app::ShortcutInfo BuildShortcutInfoFromBundle(
|
| base::FilePath profile_base_name = base::mac::NSStringToFilePath(
|
| [plist valueForKey:app_mode::kCrAppModeProfileDirKey]);
|
| if (user_data_dir.DirName().DirName().BaseName() == profile_base_name)
|
| - shortcut_info.profile_path = user_data_dir.DirName().DirName();
|
| + shortcut_info->profile_path = user_data_dir.DirName().DirName();
|
| else
|
| - shortcut_info.profile_path = user_data_dir.Append(profile_base_name);
|
| + shortcut_info->profile_path = user_data_dir.Append(profile_base_name);
|
|
|
| return shortcut_info;
|
| }
|
|
|
| -web_app::ShortcutInfo RecordAppShimErrorAndBuildShortcutInfo(
|
| +scoped_ptr<web_app::ShortcutInfo> RecordAppShimErrorAndBuildShortcutInfo(
|
| const base::FilePath& bundle_path) {
|
| NSDictionary* plist = ReadPlist(GetPlistPath(bundle_path));
|
| NSString* version_string = [plist valueForKey:app_mode::kCrBundleVersionKey];
|
| @@ -559,10 +574,10 @@ void UpdateFileTypes(NSMutableDictionary* plist,
|
| }
|
|
|
| void RevealAppShimInFinderForAppOnFileThread(
|
| - const web_app::ShortcutInfo& shortcut_info,
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info,
|
| const base::FilePath& app_path) {
|
| web_app::WebAppShortcutCreator shortcut_creator(
|
| - app_path, shortcut_info, extensions::FileHandlersInfo());
|
| + app_path, shortcut_info.get(), extensions::FileHandlersInfo());
|
| shortcut_creator.RevealAppShimInFinder();
|
| }
|
|
|
| @@ -616,11 +631,13 @@ namespace web_app {
|
|
|
| WebAppShortcutCreator::WebAppShortcutCreator(
|
| const base::FilePath& app_data_dir,
|
| - const ShortcutInfo& shortcut_info,
|
| + const ShortcutInfo* shortcut_info,
|
| const extensions::FileHandlersInfo& file_handlers_info)
|
| : app_data_dir_(app_data_dir),
|
| info_(shortcut_info),
|
| - file_handlers_info_(file_handlers_info) {}
|
| + file_handlers_info_(file_handlers_info) {
|
| + DCHECK(shortcut_info);
|
| +}
|
|
|
| WebAppShortcutCreator::~WebAppShortcutCreator() {}
|
|
|
| @@ -639,11 +656,11 @@ base::FilePath WebAppShortcutCreator::GetShortcutBasename() const {
|
| // Check if there should be a separate shortcut made for different profiles.
|
| // Such shortcuts will have a |profile_name| set on the ShortcutInfo,
|
| // otherwise it will be empty.
|
| - if (!info_.profile_name.empty()) {
|
| - app_name += info_.profile_path.BaseName().value();
|
| + if (!info_->profile_name.empty()) {
|
| + app_name += info_->profile_path.BaseName().value();
|
| app_name += ' ';
|
| }
|
| - app_name += info_.extension_id;
|
| + app_name += info_->extension_id;
|
| return base::FilePath(app_name).ReplaceExtension("app");
|
| }
|
|
|
| @@ -721,7 +738,7 @@ bool WebAppShortcutCreator::CreateShortcuts(
|
| // placed under the profile path. For shims, this copy is used when the
|
| // version under Applications is removed, and not needed for app list because
|
| // setting LSUIElement means there is no Dock "running" status to show.
|
| - const bool is_app_list = info_.extension_id == app_mode::kAppListModeId;
|
| + const bool is_app_list = info_->extension_id == app_mode::kAppListModeId;
|
| if (is_app_list) {
|
| path_to_add_to_dock = base::SysUTF8ToNSString(
|
| applications_dir.Append(GetShortcutBasename()).AsUTF8Unsafe());
|
| @@ -812,9 +829,9 @@ base::FilePath WebAppShortcutCreator::GetApplicationsDirname() const {
|
| }
|
|
|
| bool WebAppShortcutCreator::UpdatePlist(const base::FilePath& app_path) const {
|
| - NSString* extension_id = base::SysUTF8ToNSString(info_.extension_id);
|
| - NSString* extension_title = base::SysUTF16ToNSString(info_.title);
|
| - NSString* extension_url = base::SysUTF8ToNSString(info_.url.spec());
|
| + NSString* extension_id = base::SysUTF8ToNSString(info_->extension_id);
|
| + NSString* extension_title = base::SysUTF16ToNSString(info_->title);
|
| + NSString* extension_url = base::SysUTF8ToNSString(info_->url.spec());
|
| NSString* chrome_bundle_id =
|
| base::SysUTF8ToNSString(base::mac::BaseBundleID());
|
| NSDictionary* replacement_dict =
|
| @@ -847,19 +864,19 @@ bool WebAppShortcutCreator::UpdatePlist(const base::FilePath& app_path) const {
|
| // 2. Fill in other values.
|
| [plist setObject:base::SysUTF8ToNSString(chrome::VersionInfo().Version())
|
| forKey:app_mode::kCrBundleVersionKey];
|
| - [plist setObject:base::SysUTF8ToNSString(info_.version_for_display)
|
| + [plist setObject:base::SysUTF8ToNSString(info_->version_for_display)
|
| forKey:app_mode::kCFBundleShortVersionStringKey];
|
| [plist setObject:base::SysUTF8ToNSString(GetBundleIdentifier())
|
| forKey:base::mac::CFToNSCast(kCFBundleIdentifierKey)];
|
| [plist setObject:base::mac::FilePathToNSString(app_data_dir_)
|
| forKey:app_mode::kCrAppModeUserDataDirKey];
|
| - [plist setObject:base::mac::FilePathToNSString(info_.profile_path.BaseName())
|
| + [plist setObject:base::mac::FilePathToNSString(info_->profile_path.BaseName())
|
| forKey:app_mode::kCrAppModeProfileDirKey];
|
| - [plist setObject:base::SysUTF8ToNSString(info_.profile_name)
|
| + [plist setObject:base::SysUTF8ToNSString(info_->profile_name)
|
| forKey:app_mode::kCrAppModeProfileNameKey];
|
| [plist setObject:[NSNumber numberWithBool:YES]
|
| forKey:app_mode::kLSHasLocalizedDisplayNameKey];
|
| - if (info_.extension_id == app_mode::kAppListModeId) {
|
| + if (info_->extension_id == app_mode::kAppListModeId) {
|
| // Prevent the app list from bouncing in the dock, and getting a run light.
|
| [plist setObject:[NSNumber numberWithBool:YES]
|
| forKey:kLSUIElement];
|
| @@ -886,14 +903,13 @@ bool WebAppShortcutCreator::UpdateDisplayName(
|
| if (!base::CreateDirectory(localized_dir))
|
| return false;
|
|
|
| - NSString* bundle_name = base::SysUTF16ToNSString(info_.title);
|
| - NSString* display_name = base::SysUTF16ToNSString(info_.title);
|
| - if (HasExistingExtensionShim(GetApplicationsDirname(),
|
| - info_.extension_id,
|
| + NSString* bundle_name = base::SysUTF16ToNSString(info_->title);
|
| + NSString* display_name = base::SysUTF16ToNSString(info_->title);
|
| + if (HasExistingExtensionShim(GetApplicationsDirname(), info_->extension_id,
|
| app_path.BaseName())) {
|
| display_name = [bundle_name
|
| stringByAppendingString:base::SysUTF8ToNSString(
|
| - " (" + info_.profile_name + ")")];
|
| + " (" + info_->profile_name + ")")];
|
| }
|
|
|
| NSDictionary* strings_plist = @{
|
| @@ -908,13 +924,13 @@ bool WebAppShortcutCreator::UpdateDisplayName(
|
| }
|
|
|
| bool WebAppShortcutCreator::UpdateIcon(const base::FilePath& app_path) const {
|
| - if (info_.favicon.empty())
|
| + if (info_->favicon.empty())
|
| return true;
|
|
|
| ScopedCarbonHandle icon_family(0);
|
| bool image_added = false;
|
| - for (gfx::ImageFamily::const_iterator it = info_.favicon.begin();
|
| - it != info_.favicon.end(); ++it) {
|
| + for (gfx::ImageFamily::const_iterator it = info_->favicon.begin();
|
| + it != info_->favicon.end(); ++it) {
|
| if (it->IsEmpty())
|
| continue;
|
|
|
| @@ -964,13 +980,12 @@ base::FilePath WebAppShortcutCreator::GetAppBundleById(
|
| std::string WebAppShortcutCreator::GetBundleIdentifier() const {
|
| // Replace spaces in the profile path with hyphen.
|
| std::string normalized_profile_path;
|
| - base::ReplaceChars(info_.profile_path.BaseName().value(),
|
| - " ", "-", &normalized_profile_path);
|
| + base::ReplaceChars(info_->profile_path.BaseName().value(), " ", "-",
|
| + &normalized_profile_path);
|
|
|
| // This matches APP_MODE_APP_BUNDLE_ID in chrome/chrome.gyp.
|
| - std::string bundle_id =
|
| - base::mac::BaseBundleID() + std::string(".app.") +
|
| - normalized_profile_path + "-" + info_.extension_id;
|
| + std::string bundle_id = base::mac::BaseBundleID() + std::string(".app.") +
|
| + normalized_profile_path + "-" + info_->extension_id;
|
|
|
| return bundle_id;
|
| }
|
| @@ -1006,21 +1021,20 @@ void WebAppShortcutCreator::RevealAppShimInFinder() const {
|
| }
|
|
|
| base::FilePath GetAppInstallPath(const ShortcutInfo& shortcut_info) {
|
| - WebAppShortcutCreator shortcut_creator(
|
| - base::FilePath(), shortcut_info, extensions::FileHandlersInfo());
|
| + WebAppShortcutCreator shortcut_creator(base::FilePath(), &shortcut_info,
|
| + extensions::FileHandlersInfo());
|
| return shortcut_creator.GetApplicationsShortcutPath();
|
| }
|
|
|
| -void MaybeLaunchShortcut(const ShortcutInfo& shortcut_info) {
|
| +void MaybeLaunchShortcut(scoped_ptr<ShortcutInfo> shortcut_info) {
|
| if (AppShimsDisabledForTest() &&
|
| !g_app_shims_allow_update_and_launch_in_tests) {
|
| return;
|
| }
|
|
|
| content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&LaunchShimOnFileThread, shortcut_info, false));
|
| + content::BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&LaunchShimOnFileThread, base::Passed(&shortcut_info), false));
|
| }
|
|
|
| bool MaybeRebuildShortcut(const base::CommandLine& command_line) {
|
| @@ -1042,7 +1056,7 @@ void CreateAppShortcutInfoLoaded(
|
| Profile* profile,
|
| const extensions::Extension* app,
|
| const base::Callback<void(bool)>& close_callback,
|
| - const ShortcutInfo& shortcut_info) {
|
| + scoped_ptr<ShortcutInfo> shortcut_info) {
|
| base::scoped_nsobject<NSAlert> alert([[NSAlert alloc] init]);
|
|
|
| NSButton* continue_button = [alert
|
| @@ -1074,7 +1088,7 @@ void CreateAppShortcutInfoLoaded(
|
|
|
| const int kIconPreviewSizePixels = 128;
|
| const int kIconPreviewTargetSize = 64;
|
| - const gfx::Image* icon = shortcut_info.favicon.GetBest(
|
| + const gfx::Image* icon = shortcut_info->favicon.GetBest(
|
| kIconPreviewSizePixels, kIconPreviewSizePixels);
|
|
|
| if (icon && !icon->IsEmpty()) {
|
| @@ -1123,19 +1137,19 @@ void UpdateShortcutsForAllApps(Profile* profile,
|
|
|
| void RevealAppShimInFinderForApp(Profile* profile,
|
| const extensions::Extension* app) {
|
| - const web_app::ShortcutInfo shortcut_info =
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info =
|
| ShortcutInfoForExtensionAndProfile(app, profile);
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&RevealAppShimInFinderForAppOnFileThread, shortcut_info,
|
| - app->path()));
|
| + base::Bind(&RevealAppShimInFinderForAppOnFileThread,
|
| + base::Passed(&shortcut_info), app->path()));
|
| }
|
|
|
| namespace internals {
|
|
|
| bool CreatePlatformShortcuts(
|
| const base::FilePath& app_data_path,
|
| - const ShortcutInfo& shortcut_info,
|
| + scoped_ptr<ShortcutInfo> shortcut_info,
|
| const extensions::FileHandlersInfo& file_handlers_info,
|
| const ShortcutLocations& creation_locations,
|
| ShortcutCreationReason creation_reason) {
|
| @@ -1143,33 +1157,26 @@ bool CreatePlatformShortcuts(
|
| if (AppShimsDisabledForTest())
|
| return true;
|
|
|
| - WebAppShortcutCreator shortcut_creator(
|
| - app_data_path, shortcut_info, file_handlers_info);
|
| + WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get(),
|
| + file_handlers_info);
|
| return shortcut_creator.CreateShortcuts(creation_reason, creation_locations);
|
| }
|
|
|
| void DeletePlatformShortcuts(const base::FilePath& app_data_path,
|
| - const ShortcutInfo& shortcut_info) {
|
| + scoped_ptr<ShortcutInfo> shortcut_info) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| - WebAppShortcutCreator shortcut_creator(
|
| - app_data_path, shortcut_info, extensions::FileHandlersInfo());
|
| + WebAppShortcutCreator shortcut_creator(app_data_path, shortcut_info.get(),
|
| + extensions::FileHandlersInfo());
|
| shortcut_creator.DeleteShortcuts();
|
| }
|
|
|
| void UpdatePlatformShortcuts(
|
| const base::FilePath& app_data_path,
|
| const base::string16& old_app_title,
|
| - const ShortcutInfo& shortcut_info,
|
| + scoped_ptr<ShortcutInfo> shortcut_info,
|
| const extensions::FileHandlersInfo& file_handlers_info) {
|
| - DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
|
| - if (AppShimsDisabledForTest() &&
|
| - !g_app_shims_allow_update_and_launch_in_tests) {
|
| - return;
|
| - }
|
| -
|
| - WebAppShortcutCreator shortcut_creator(
|
| - app_data_path, shortcut_info, file_handlers_info);
|
| - shortcut_creator.UpdateShortcuts();
|
| + UpdatePlatformShortcutsInternal(app_data_path, old_app_title, *shortcut_info,
|
| + file_handlers_info);
|
| }
|
|
|
| void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) {
|
| @@ -1179,10 +1186,10 @@ void DeleteAllShortcutsForProfile(const base::FilePath& profile_path) {
|
|
|
| for (std::vector<base::FilePath>::const_iterator it = bundles.begin();
|
| it != bundles.end(); ++it) {
|
| - web_app::ShortcutInfo shortcut_info =
|
| + scoped_ptr<web_app::ShortcutInfo> shortcut_info =
|
| BuildShortcutInfoFromBundle(*it);
|
| - WebAppShortcutCreator shortcut_creator(
|
| - it->DirName(), shortcut_info, extensions::FileHandlersInfo());
|
| + WebAppShortcutCreator shortcut_creator(it->DirName(), shortcut_info.get(),
|
| + extensions::FileHandlersInfo());
|
| shortcut_creator.DeleteShortcuts();
|
| }
|
| }
|
|
|