text: // Copyright 2016 The Chromium Authors. All rights reserved.
  // 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_WIN_H_
  #define CHROME_BROWSER_SHELL_INTEGRATION_WIN_H_
  
  #include <memory>
  #include <string>
  
  #include "base/callback_forward.h"
  #include "base/files/file_path.h"
  #include "base/strings/string16.h"
  
  namespace shell_integration {
  namespace win {
  
  // Initiates an OS shell flow which (if followed by the user) should set
  // Chrome as the default browser. Returns false if the flow cannot be
  // initialized, if it is not supported (introduced for Windows 8) or if the
  // user cancels the operation. This is a blocking call and requires a FILE
  // thread. If Chrome is already default browser, no interactive dialog will be
  // shown and this method returns true.
  bool SetAsDefaultBrowserUsingIntentPicker();
  
  // Initiates the interaction with the system settings for the default browser.
  // The function takes care of making sure |on_finished_callback| will get called
  // exactly once when the interaction is finished.
  void SetAsDefaultBrowserUsingSystemSettings(
      base::OnceClosure on_finished_callback);
  
  // Initiates an OS shell flow which (if followed by the user) should set
  // Chrome as the default handler for |protocol|. Returns false if the flow
  // cannot be initialized, if it is not supported (introduced for Windows 8)
  // or if the user cancels the operation. This is a blocking call and requires
  // a FILE thread. If Chrome is already default for |protocol|, no interactive
  // dialog will be shown and this method returns true.
  bool SetAsDefaultProtocolClientUsingIntentPicker(const std::string& protocol);
  
  // Initiates the interaction with the system settings for the default handler of
  // |protocol|. The function takes care of making sure |on_finished_callback|
  // will get called exactly once when the interaction is finished.
  void SetAsDefaultProtocolClientUsingSystemSettings(
      const std::string& protocol,
      base::OnceClosure on_finished_callback);
  
  // App windows on Windows have an App User Model Id (AUMI) property. This is set
  // in BrowserWindowPropertyManager::UpdateWindowProperties(), when a window is
  // opened. Windows desktop shortcuts have an app model property, and this should
  // match the open window's AUMI. Windows groups open windows with the same AUMI
  // to a taskbar icon. The two methods below are used  to create AUMI's for
  // shortcuts and open windows. There are two kinds of windows, Chromium windows,
  // i.e., browser windows, and app windows, which include web apps,
  // extensions, i.e., windows opened via --app-id or --app.
  
  // GetAppUserModelIdForBrowser constructs an AUMI for a browser window and
  // GetAppUserModelIdForApp constructs an AUMI for an app window. Each calls
  // ShellUtil::BuildAppUserModelId() to construct the AUMI out of component
  // strings.
  
  // Generates an application user model ID (AppUserModelId) for a given
  // app name and profile path. The returned app id format is
  // "<install_static::GetBaseAppId()>.|app_name|[.<profile_id>]".
  // |profile_id| is only appended when it's not the default profile.
  base::string16 GetAppUserModelIdForApp(const base::string16& app_name,
                                         const base::FilePath& profile_path);
  
  // Generates an application user model ID (AppUserModelId) for Chromium by
  // calling GetAppUserModelIdImpl() with ShellUtil::GetBrowserModelId() as
  // the app_name. The returned app id format is
  // "<install_static::GetBaseAppId()>[browser_suffix][.profile_id]"
  // |profile_id| is only appended when it's not the default profile.
  // browser_suffix is only appended to the BaseAppId if the installer
  // has set the kRegisterChromeBrowserSuffix command line switch, e.g.,
  // on user-level installs.
  base::string16 GetAppUserModelIdForBrowser(const base::FilePath& profile_path);
  
  // Returns the taskbar pin state of Chrome via the IsPinnedToTaskbarCallback.
  // The first bool is true if the state could be calculated, and the second bool
  // is true if Chrome is pinned to the taskbar (without verb check).  The third
  // bool is true if Chrome is pinned to the taskbar (with verb check)
  // The ConnectionErrorCallback is called instead if something wrong happened
  // with the connection to the remote process.
  using ConnectionErrorCallback = base::OnceClosure;
  using IsPinnedToTaskbarCallback = base::OnceCallback<void(bool, bool, bool)>;
  void GetIsPinnedToTaskbarState(ConnectionErrorCallback on_error_callback,
                                 IsPinnedToTaskbarCallback result_callback);
  
  // Migrates existing chrome taskbar pins by tagging them with correct app id.
  // see http://crbug.com/28104. Migrates taskbar pins via a task and runs
  // |completion_callback| on the calling sequence when done.
  void MigrateTaskbarPins(base::OnceClosure completion_callback);
  
  // Callback for MigrateTaskbarPins(). Exposed for testing.
  void MigrateTaskbarPinsCallback(const base::FilePath& pins_path,
                                  const base::FilePath& implicit_apps_path);
  
  // Migrates all shortcuts in |path| which point to |chrome_exe| such that they
  // have the appropriate AppUserModelId. Also clears the legacy dual_mode
  // property from shortcuts with the default chrome app id.
  // Returns the number of shortcuts migrated.
  // This method should not be called prior to Windows 7.
  // This method is only public for the sake of tests and shouldn't be called
  // externally otherwise.
  int MigrateShortcutsInPathInternal(const base::FilePath& chrome_exe,
                                     const base::FilePath& path);
  
  }  // namespace win
  }  // namespace shell_integration
  
  #endif  // CHROME_BROWSER_SHELL_INTEGRATION_WIN_H_
  