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