shell_integration_linux.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Environment;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ShellIntegrationLinux {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Get the path to write user-specific application data files to, as specified
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// in the XDG Base Directory Specification:
232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// http://standards.freedesktop.org/basedir-spec/latest/
242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Returns true on success, or false if no such path could be found.
252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Called on the FILE thread.
262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool GetDataWriteLocation(base::Environment* env, base::FilePath* search_path);
272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Get the list of paths to search for application data files, in order of
292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// preference, as specified in the XDG Base Directory Specification:
302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// http://standards.freedesktop.org/basedir-spec/latest/
312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Called on the FILE thread.
322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochstd::vector<base::FilePath> GetDataSearchLocations(base::Environment* env);
332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Gets the name for use as the res_class (and possibly res_name) of the
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// window's WM_CLASS property. This is the program name from argv[0], with the
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// first letter capitalized. Equivalent to GDK's gdk_get_program_class().
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string GetProgramClassName();
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns filename of the desktop shortcut used to launch the browser.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetDesktopName(base::Environment* env);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns name of the browser icon (without a path or file extension).
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GetIconName();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the set of locations in which shortcuts are installed for the
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// extension with |extension_id| in |profile_path|.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This searches the file system for .desktop files in appropriate locations. A
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// shortcut with NoDisplay=true causes hidden to become true, instead of
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// creating at APP_MENU_LOCATIONS_SUBDIR_CHROMEAPPS.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellIntegration::ShortcutLocations GetExistingShortcutLocations(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Environment* env,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& profile_path,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Version of GetExistingShortcutLocations which takes an explicit path
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the user's desktop directory. Useful for testing.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If |desktop_path| is empty, the desktop is not searched.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShellIntegration::ShortcutLocations GetExistingShortcutLocations(
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Environment* env,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& profile_path,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& desktop_path);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the contents of an existing .desktop file installed in the system.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Searches the "applications" subdirectory of each XDG data directory for a
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// file named |desktop_filename|. If the file is found, populates |output| with
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// its contents and returns true. Else, returns false.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetExistingShortcutContents(base::Environment* env,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const base::FilePath& desktop_filename,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 std::string* output);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns filename for .desktop file based on |url|, sanitized for security.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetWebShortcutFilename(const GURL& url);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns filename for .desktop file based on |profile_path| and
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |extension_id|, sanitized for security.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetExtensionShortcutFilename(const base::FilePath& profile_path,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            const std::string& extension_id);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Returns a list of filenames for all existing .desktop files corresponding to
812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// on |profile_path| in a given |directory|.
822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochstd::vector<base::FilePath> GetExistingProfileShortcutFilenames(
832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const base::FilePath& profile_path,
842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    const base::FilePath& directory);
852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns contents for .desktop file based on |url| and |title|. If
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |no_display| is true, the shortcut will not be visible to the user in menus.
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GetDesktopFileContents(const base::FilePath& chrome_exe_path,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& app_name,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const GURL& url,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& extension_id,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const base::FilePath& extension_path,
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   const base::string16& title,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& icon_name,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   const base::FilePath& profile_path,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool no_display);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns contents for .directory file named |title| with icon |icon_name|. If
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |icon_name| is empty, will use the Chrome icon.
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)std::string GetDirectoryFileContents(const base::string16& title,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     const std::string& icon_name);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create shortcuts on the desktop or in the application menu (as specified by
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |shortcut_info|), for the web page or extension in |shortcut_info|.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For extensions, duplicate shortcuts are avoided, so if a requested shortcut
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already exists it is deleted first.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool CreateDesktopShortcut(
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ShellIntegration::ShortcutInfo& shortcut_info,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ShellIntegration::ShortcutLocations& creation_locations);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delete any desktop shortcuts on desktop or in the application menu that have
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// been added for the extension with |extension_id| in |profile_path|.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeleteDesktopShortcuts(const base::FilePath& profile_path,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& extension_id);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Delete any desktop shortcuts on desktop or in the application menu that have
1172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// for the profile in |profile_path|.
1182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeleteAllDesktopShortcuts(const base::FilePath& profile_path);
1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ShellIntegrationLinux
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_
123