Index: chrome/browser/web_applications/web_app.cc |
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc |
index cd8a39f9552fa0ae4d43a2d7e62e452277adbf09..6cc13c4660180ca37702980480e51e885d221183 100644 |
--- a/chrome/browser/web_applications/web_app.cc |
+++ b/chrome/browser/web_applications/web_app.cc |
@@ -8,6 +8,7 @@ |
#include <shlobj.h> |
#endif // defined(OS_WIN) |
+#include "base/bind.h" |
#include "base/command_line.h" |
#include "base/file_util.h" |
#include "base/i18n/file_util_icu.h" |
@@ -148,79 +149,9 @@ bool ShouldUpdateIcon(const FilePath& icon_file, const SkBitmap& image) { |
#endif // defined(OS_WIN) |
-// Represents a task that creates web application shortcut. This runs on |
-// file thread and schedules the callback (if any) on the calling thread |
-// when finished (either success or failure). |
-class CreateShortcutTask : public Task { |
- public: |
- CreateShortcutTask(const FilePath& profile_path, |
- const ShellIntegration::ShortcutInfo& shortcut_info, |
- web_app::CreateShortcutCallback* callback); |
- |
- private: |
- class CreateShortcutCallbackTask : public Task { |
- public: |
- CreateShortcutCallbackTask(web_app::CreateShortcutCallback* callback, |
- bool success) |
- : callback_(callback), |
- success_(success) { |
- } |
- |
- // Overridden from Task: |
- virtual void Run() { |
- callback_->Run(success_); |
- } |
- |
- private: |
- web_app::CreateShortcutCallback* callback_; |
- bool success_; |
- }; |
- |
- // Overridden from Task: |
- virtual void Run(); |
- |
- // Returns true if shortcut is created successfully. |
- bool CreateShortcut(); |
- |
- // Path to store persisted data for web app. |
- FilePath web_app_path_; |
- |
- // Out copy of profile path. |
- FilePath profile_path_; |
- |
- // Our copy of short cut data. |
- ShellIntegration::ShortcutInfo shortcut_info_; |
- |
- // Callback when task is finished. |
- web_app::CreateShortcutCallback* callback_; |
- MessageLoop* message_loop_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CreateShortcutTask); |
-}; |
- |
-CreateShortcutTask::CreateShortcutTask( |
- const FilePath& profile_path, |
- const ShellIntegration::ShortcutInfo& shortcut_info, |
- web_app::CreateShortcutCallback* callback) |
- : web_app_path_(web_app::internals::GetWebAppDataDirectory( |
- web_app::GetDataDir(profile_path), |
- shortcut_info)), |
- profile_path_(profile_path), |
- shortcut_info_(shortcut_info), |
- callback_(callback), |
- message_loop_(MessageLoop::current()) { |
- DCHECK(message_loop_ != NULL); |
-} |
- |
-void CreateShortcutTask::Run() { |
- bool success = CreateShortcut(); |
- |
- if (callback_ != NULL) |
- message_loop_->PostTask(FROM_HERE, |
- new CreateShortcutCallbackTask(callback_, success)); |
-} |
- |
-bool CreateShortcutTask::CreateShortcut() { |
+void CreateShortcutTask(const FilePath& web_app_path, |
+ const FilePath& profile_path, |
+ const ShellIntegration::ShortcutInfo& shortcut_info) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
#if defined(OS_POSIX) && !defined(OS_MACOSX) |
@@ -229,10 +160,10 @@ bool CreateShortcutTask::CreateShortcut() { |
std::string shortcut_template; |
if (!ShellIntegration::GetDesktopShortcutTemplate(env.get(), |
&shortcut_template)) { |
- return false; |
+ return; |
} |
- ShellIntegration::CreateDesktopShortcut(shortcut_info_, shortcut_template); |
- return true; // assuming always success. |
+ ShellIntegration::CreateDesktopShortcut(shortcut_info, shortcut_template); |
+ return; // assuming always success. |
#elif defined(OS_WIN) |
// Shortcut paths under which to create shortcuts. |
std::vector<FilePath> shortcut_paths; |
@@ -244,15 +175,15 @@ bool CreateShortcutTask::CreateShortcut() { |
const wchar_t* sub_dir; |
} locations[] = { |
{ |
- shortcut_info_.create_on_desktop, |
+ shortcut_info.create_on_desktop, |
chrome::DIR_USER_DESKTOP, |
NULL |
}, { |
- shortcut_info_.create_in_applications_menu, |
+ shortcut_info.create_in_applications_menu, |
base::DIR_START_MENU, |
NULL |
}, { |
- shortcut_info_.create_in_quick_launch_bar, |
+ shortcut_info.create_in_quick_launch_bar, |
// For Win7, create_in_quick_launch_bar means pinning to taskbar. Use |
// base::PATH_START as a flag for this case. |
(base::win::GetVersion() >= base::win::VERSION_WIN7) ? |
@@ -272,8 +203,7 @@ bool CreateShortcutTask::CreateShortcut() { |
continue; |
if (!PathService::Get(locations[i].location_id, &path)) { |
- NOTREACHED(); |
- return false; |
+ return; |
} |
if (locations[i].sub_dir != NULL) |
@@ -284,69 +214,66 @@ bool CreateShortcutTask::CreateShortcut() { |
} |
bool pin_to_taskbar = |
- shortcut_info_.create_in_quick_launch_bar && |
+ shortcut_info.create_in_quick_launch_bar && |
(base::win::GetVersion() >= base::win::VERSION_WIN7); |
// For Win7's pinning support, any shortcut could be used. So we only create |
// the shortcut file when there is no shortcut file will be created. That is, |
// user only selects "Pin to taskbar". |
if (pin_to_taskbar && shortcut_paths.empty()) { |
- // Creates the shortcut in web_app_path_ in this case. |
- shortcut_paths.push_back(web_app_path_); |
+ // Creates the shortcut in web_app_path in this case. |
+ shortcut_paths.push_back(web_app_path); |
} |
if (shortcut_paths.empty()) { |
- NOTREACHED(); |
- return false; |
+ return; |
} |
- // Ensure web_app_path_ exists. |
- if (!file_util::PathExists(web_app_path_) && |
- !file_util::CreateDirectory(web_app_path_)) { |
- NOTREACHED(); |
- return false; |
+ // Ensure web_app_path exists. |
+ if (!file_util::PathExists(web_app_path) && |
+ !file_util::CreateDirectory(web_app_path)) { |
+ return; |
} |
// Generates file name to use with persisted ico and shortcut file. |
FilePath file_name = |
- web_app::internals::GetSanitizedFileName(shortcut_info_.title); |
+ web_app::internals::GetSanitizedFileName(shortcut_info.title); |
// Creates an ico file to use with shortcut. |
- FilePath icon_file = web_app_path_.Append(file_name).ReplaceExtension( |
+ FilePath icon_file = web_app_path.Append(file_name).ReplaceExtension( |
FILE_PATH_LITERAL(".ico")); |
if (!web_app::internals::CheckAndSaveIcon(icon_file, |
- shortcut_info_.favicon)) { |
- NOTREACHED(); |
- return false; |
+ shortcut_info.favicon)) { |
+ return; |
} |
FilePath chrome_exe; |
if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { |
- NOTREACHED(); |
- return false; |
+ return; |
} |
// Working directory. |
FilePath chrome_folder = chrome_exe.DirName(); |
CommandLine cmd_line = |
- ShellIntegration::CommandLineArgsForLauncher(shortcut_info_.url, |
- shortcut_info_.extension_id); |
+ ShellIntegration::CommandLineArgsForLauncher(shortcut_info.url, |
+ shortcut_info.extension_id); |
// TODO(evan): we rely on the fact that command_line_string() is |
// properly quoted for a Windows command line. The method on |
// CommandLine should probably be renamed to better reflect that |
// fact. |
- std::wstring wide_switches(cmd_line.GetCommandLineString()); |
+ string16 wide_switches(cmd_line.GetCommandLineString()); |
// Sanitize description |
- if (shortcut_info_.description.length() >= MAX_PATH) |
- shortcut_info_.description.resize(MAX_PATH - 1); |
+ string16 description = shortcut_info.description; |
+ if (description.length() >= MAX_PATH) |
+ description.resize(MAX_PATH - 1); |
// Generates app id from web app url and profile path. |
std::string app_name = |
- web_app::GenerateApplicationNameFromInfo(shortcut_info_); |
+ web_app::GenerateApplicationNameFromInfo(shortcut_info); |
std::wstring app_id = ShellIntegration::GetAppId( |
- UTF8ToWide(app_name), profile_path_); |
+ UTF8ToWide(app_name), profile_path); |
FilePath shortcut_to_pin; |
@@ -367,7 +294,7 @@ bool CreateShortcutTask::CreateShortcut() { |
shortcut_file.value().c_str(), |
chrome_folder.value().c_str(), |
wide_switches.c_str(), |
- shortcut_info_.description.c_str(), |
+ description.c_str(), |
icon_file.value().c_str(), |
0, |
app_id.c_str()); |
@@ -382,15 +309,11 @@ bool CreateShortcutTask::CreateShortcut() { |
success &= file_util::TaskbarPinShortcutLink( |
shortcut_to_pin.value().c_str()); |
} else { |
- NOTREACHED(); |
success = false; |
} |
} |
- |
- return success; |
#else |
NOTIMPLEMENTED(); |
- return false; |
#endif |
} |
@@ -486,10 +409,16 @@ std::string GetExtensionIdFromApplicationName(const std::string& app_name) { |
void CreateShortcut( |
const FilePath& data_dir, |
- const ShellIntegration::ShortcutInfo& shortcut_info, |
- CreateShortcutCallback* callback) { |
- BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
- new CreateShortcutTask(data_dir, shortcut_info, callback)); |
+ const ShellIntegration::ShortcutInfo& shortcut_info) { |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&CreateShortcutTask, |
+ web_app::internals::GetWebAppDataDirectory( |
+ web_app::GetDataDir(data_dir), |
+ shortcut_info), |
+ data_dir, |
+ shortcut_info)); |
} |
bool IsValidUrl(const GURL& url) { |