|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_ | 
|  | #define CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_ | 
|  |  | 
|  | #include <optional> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/files/safe_base_name.h" | 
|  | #include "build/build_config.h" | 
|  | #include "chrome/common/buildflags.h" | 
|  | #include "components/services/app_service/public/cpp/file_handler.h" | 
|  | #include "components/webapps/common/web_app_id.h" | 
|  | #include "url/gurl.h" | 
|  |  | 
|  | #if BUILDFLAG(IS_CHROMEOS) | 
|  | #error shell_integration_linux is for desktop linux only. | 
|  | #endif | 
|  |  | 
|  | namespace base { | 
|  | class CommandLine; | 
|  | class Environment; | 
|  | } | 
|  |  | 
|  | namespace web_app { | 
|  | struct DesktopActionInfo; | 
|  | } | 
|  |  | 
|  | namespace shell_integration_linux { | 
|  |  | 
|  | // Gets the name for use as the res_name of the window's WM_CLASS property. | 
|  | std::string GetProgramClassName(); | 
|  |  | 
|  | // Gets the name for use as the res_class of the window's WM_CLASS property. | 
|  | std::string GetProgramClassClass(); | 
|  |  | 
|  | // Returns name of the browser icon (without a path or file extension). | 
|  | std::string GetIconName(); | 
|  |  | 
|  | // Returns the contents of an existing .desktop file installed in the system. | 
|  | // Searches the "applications" subdirectory of each XDG data directory for a | 
|  | // file named |desktop_filename|. If the file is found, populates |output| with | 
|  | // its contents and returns true. Else, returns false. | 
|  | bool GetExistingShortcutContents(base::Environment* env, | 
|  | const base::FilePath& desktop_filename, | 
|  | std::string* output); | 
|  |  | 
|  | // Returns the base name for .desktop file based on |name|, sanitized for | 
|  | // security with no whitespace, and ensures it will be a unique file in the | 
|  | // directory at base::DIR_USER_DESKTOP. This call is not thread-safe - multiple | 
|  | // callers from different threads with the same argument may get the same base | 
|  | // name. | 
|  | // Returns a std::nullopt if base::DIR_USER_DESKTOP is not defined or a unique | 
|  | // name could not be found. | 
|  | std::optional<base::SafeBaseName> GetUniqueWebShortcutFilename( | 
|  | const std::string& name); | 
|  |  | 
|  | // Returns a list of filenames for all existing .desktop files corresponding to | 
|  | // on |profile_path| in a given |directory|. | 
|  | std::vector<base::FilePath> GetExistingProfileShortcutFilenames( | 
|  | const base::FilePath& profile_path, | 
|  | const base::FilePath& directory); | 
|  |  | 
|  | // Returns contents for .desktop file based on |url| and |title|. If | 
|  | // |no_display| is true, the shortcut will not be visible to the user in menus. | 
|  | std::string GetDesktopFileContents( | 
|  | const base::FilePath& chrome_exe_path, | 
|  | const std::string& app_name, | 
|  | const GURL& url, | 
|  | const std::string& extension_id, | 
|  | const std::u16string& title, | 
|  | const std::string& icon_name, | 
|  | const base::FilePath& profile_path, | 
|  | const std::string& categories, | 
|  | const std::string& mime_type, | 
|  | bool no_display, | 
|  | const std::string& run_on_os_login_mode, | 
|  | std::set<web_app::DesktopActionInfo> action_info); | 
|  |  | 
|  | // Returns contents for .desktop file that executes command_line. This is a more | 
|  | // general form of GetDesktopFileContents. If |no_display| is true, the shortcut | 
|  | // will not be visible to the user in menus. | 
|  | std::string GetDesktopFileContentsForCommand( | 
|  | const base::CommandLine& command_line, | 
|  | const std::string& app_name, | 
|  | const GURL& url, | 
|  | const std::u16string& title, | 
|  | const std::string& icon_name, | 
|  | const std::string& categories, | 
|  | const std::string& mime_type, | 
|  | bool no_display, | 
|  | std::set<web_app::DesktopActionInfo> action_info); | 
|  |  | 
|  | // Returns contents for a .desktop file that launches chrome at the given url | 
|  | // using the given profile, referencing the given icon. The file has the given | 
|  | // title & icon. | 
|  | // This will CHECK-fail if the url is not valid, the profile path is empty, or | 
|  | // the icon path is empty. | 
|  | std::string GetDesktopFileContentsForUrlShortcut( | 
|  | const std::string& title, | 
|  | const GURL& url, | 
|  | const base::FilePath& icon_path, | 
|  | const base::FilePath& profile_path); | 
|  |  | 
|  | // Returns contents for .directory file named |title| with icon |icon_name|. If | 
|  | // |icon_name| is empty, will use the Chrome icon. | 
|  | std::string GetDirectoryFileContents(const std::u16string& title, | 
|  | const std::string& icon_name); | 
|  |  | 
|  | // Returns the filename for a .xml file, corresponding to a given |app_id|, | 
|  | // which is passed to `xdg-mime` to register one or more custom MIME types in | 
|  | // Linux. | 
|  | base::FilePath GetMimeTypesRegistrationFilename( | 
|  | const base::FilePath& profile_path, | 
|  | const webapps::AppId& app_id); | 
|  |  | 
|  | // Returns the contents of a .xml file as specified by |file_handlers|, which is | 
|  | // passed to `xdg-mime` to register one or more custom MIME types in Linux. | 
|  | std::string GetMimeTypesRegistrationFileContents( | 
|  | const apps::FileHandlers& file_handlers); | 
|  |  | 
|  | // Windows that correspond to web apps need to have a deterministic (and | 
|  | // different) WMClass than normal chrome windows so the window manager groups | 
|  | // them as a separate application. | 
|  | std::string GetWMClassFromAppName(std::string app_name); | 
|  |  | 
|  | // Wayland version of GetWMClassFromAppName explained above. | 
|  | // The XDG application ID must match the name of the desktop entry file, where | 
|  | // the latter looks like 'chrome-<web app id>-<profile name>.desktop'. | 
|  | std::string GetXdgAppIdForWebApp(std::string app_name, | 
|  | const base::FilePath& profile_path); | 
|  |  | 
|  | // Helper to launch xdg scripts. We don't want them to ask any questions on the | 
|  | // terminal etc. The function returns true if the utility launches and exits | 
|  | // cleanly, in which case |exit_code| returns the utility's exit code. | 
|  | // thread_restrictions.h assumes it to be in shell_integration namespace. | 
|  | bool LaunchXdgUtility(const std::vector<std::string>& argv, int* exit_code); | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | // Exposed for testing.  Clients should use the corresponding functions in | 
|  | // shell_integration_linux instead. | 
|  | std::string GetProgramClassName(const base::CommandLine& command_line, | 
|  | const std::string& desktop_file_name); | 
|  | std::string GetProgramClassClass(const base::CommandLine& command_line, | 
|  | const std::string& desktop_file_name); | 
|  |  | 
|  | // Get the value of NoDisplay from the [Desktop Entry] section of a .desktop | 
|  | // file, given in |shortcut_contents|. If the key is not found, returns false. | 
|  | bool GetNoDisplayFromDesktopFile(const std::string& shortcut_contents); | 
|  |  | 
|  | // Gets the path to the Chrome executable or wrapper script. | 
|  | // Returns an empty path if the executable path could not be found, which should | 
|  | // never happen. | 
|  | base::FilePath GetChromeExePath(); | 
|  |  | 
|  | // Get the value of |key| from the [Desktop Entry] section of a .desktop file, | 
|  | // given in |shortcut_contents|. If the key is not found, returns an empty | 
|  | // string. | 
|  | std::string GetDesktopEntryStringValueFromFromDesktopFileForTest( | 
|  | const std::string& key, | 
|  | const std::string& shortcut_contents); | 
|  |  | 
|  | }  // namespace internal | 
|  |  | 
|  | }  // namespace shell_integration_linux | 
|  |  | 
|  | #endif  // CHROME_BROWSER_SHELL_INTEGRATION_LINUX_H_ |