| Index: chrome/browser/shell_integration_linux.cc
|
| diff --git a/chrome/browser/shell_integration_linux.cc b/chrome/browser/shell_integration_linux.cc
|
| index 840f0569c83dbc32ce7f405b5f75687604fd271a..ea05095b793ee2aac3f6ef78dc0e199dd9c30c5c 100644
|
| --- a/chrome/browser/shell_integration_linux.cc
|
| +++ b/chrome/browser/shell_integration_linux.cc
|
| @@ -154,6 +154,12 @@ bool CreateShortcutOnDesktop(const FilePath& shortcut_filename,
|
| return true;
|
| }
|
|
|
| +void DeleteShortcutOnDesktop(const FilePath& shortcut_filename) {
|
| + FilePath desktop_path;
|
| + if (PathService::Get(chrome::DIR_USER_DESKTOP, &desktop_path))
|
| + file_util::Delete(desktop_path.Append(shortcut_filename), false);
|
| +}
|
| +
|
| bool CreateShortcutInApplicationsMenu(const FilePath& shortcut_filename,
|
| const std::string& contents) {
|
| ScopedTempDir temp_dir;
|
| @@ -183,6 +189,22 @@ bool CreateShortcutInApplicationsMenu(const FilePath& shortcut_filename,
|
| return exit_code == 0;
|
| }
|
|
|
| +void DeleteShortcutInApplicationsMenu(const FilePath& shortcut_filename) {
|
| + std::vector<std::string> argv;
|
| + argv.push_back("xdg-desktop-menu");
|
| + argv.push_back("uninstall");
|
| +
|
| + // Uninstall in user mode, to match the install.
|
| + argv.push_back("--mode");
|
| + argv.push_back("user");
|
| +
|
| + // The file does not need to exist anywhere - xdg-desktop-menu will uninstall
|
| + // items from the menu with a matching name.
|
| + argv.push_back(shortcut_filename.value());
|
| + int exit_code;
|
| + LaunchXdgUtility(argv, &exit_code);
|
| +}
|
| +
|
| // Quote a string such that it appears as one verbatim argument for the Exec
|
| // key in a desktop file.
|
| std::string QuoteArgForDesktopFileExec(const std::string& arg) {
|
| @@ -455,7 +477,7 @@ bool GetDesktopShortcutTemplate(base::Environment* env,
|
| return false;
|
| }
|
|
|
| -FilePath GetDesktopShortcutFilename(const GURL& url) {
|
| +FilePath GetWebShortcutFilename(const GURL& url) {
|
| // Use a prefix, because xdg-desktop-menu requires it.
|
| std::string filename =
|
| std::string(chrome::kBrowserProcessExecutableName) + "-" + url.spec();
|
| @@ -479,6 +501,20 @@ FilePath GetDesktopShortcutFilename(const GURL& url) {
|
| return FilePath();
|
| }
|
|
|
| +FilePath GetExtensionShortcutFilename(const FilePath& profile_path,
|
| + const std::string& extension_id) {
|
| + DCHECK(!extension_id.empty());
|
| +
|
| + // Use a prefix, because xdg-desktop-menu requires it.
|
| + std::string filename(chrome::kBrowserProcessExecutableName);
|
| + filename.append("-")
|
| + .append(extension_id)
|
| + .append("-")
|
| + .append(profile_path.BaseName().value());
|
| + file_util::ReplaceIllegalCharactersInPath(&filename, '_');
|
| + return FilePath(filename.append(".desktop"));
|
| +}
|
| +
|
| std::string GetDesktopFileContents(
|
| const std::string& template_contents,
|
| const std::string& app_name,
|
| @@ -597,8 +633,19 @@ bool CreateDesktopShortcut(
|
| const std::string& shortcut_template) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
|
|
| - FilePath shortcut_filename =
|
| - ShellIntegrationLinux::GetDesktopShortcutFilename(shortcut_info.url);
|
| + FilePath shortcut_filename;
|
| + if (!shortcut_info.extension_id.empty()) {
|
| + shortcut_filename = GetExtensionShortcutFilename(
|
| + shortcut_info.profile_path, shortcut_info.extension_id);
|
| + // For extensions we do not want duplicate shortcuts. So, delete any that
|
| + // already exist and replace them.
|
| + if (shortcut_info.create_on_desktop)
|
| + DeleteShortcutOnDesktop(shortcut_filename);
|
| + if (shortcut_info.create_in_applications_menu)
|
| + DeleteShortcutInApplicationsMenu(shortcut_filename);
|
| + } else {
|
| + shortcut_filename = GetWebShortcutFilename(shortcut_info.url);
|
| + }
|
| if (shortcut_filename.empty())
|
| return false;
|
|
|
| @@ -629,4 +676,16 @@ bool CreateDesktopShortcut(
|
| return success;
|
| }
|
|
|
| +void DeleteDesktopShortcuts(const FilePath& profile_path,
|
| + const std::string& extension_id) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| +
|
| + FilePath shortcut_filename = GetExtensionShortcutFilename(
|
| + profile_path, extension_id);
|
| + DCHECK(!shortcut_filename.empty());
|
| +
|
| + DeleteShortcutOnDesktop(shortcut_filename);
|
| + DeleteShortcutInApplicationsMenu(shortcut_filename);
|
| +}
|
| +
|
| } // namespace ShellIntegrationLinux
|
|
|