text: // Copyright 2019 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_WEB_APPLICATIONS_COMPONENTS_EXTERNAL_INSTALL_OPTIONS_H_
  #define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_EXTERNAL_INSTALL_OPTIONS_H_
  
  #include <iosfwd>
  #include <string>
  #include <vector>
  
  #include "chrome/browser/web_applications/components/install_manager.h"
  #include "chrome/browser/web_applications/components/web_app_constants.h"
  #include "chrome/browser/web_applications/components/web_app_id.h"
  #include "chrome/common/web_application_info.h"
  #include "url/gurl.h"
  
  namespace web_app {
  
  using WebApplicationInfoFactory =
      base::RepeatingCallback<std::unique_ptr<WebApplicationInfo>()>;
  
  enum class ExternalInstallSource;
  
  struct ExternalInstallOptions {
    ExternalInstallOptions(const GURL& url,
                           DisplayMode user_display_mode,
                           ExternalInstallSource install_source);
    ~ExternalInstallOptions();
    ExternalInstallOptions(const ExternalInstallOptions& other);
    ExternalInstallOptions(ExternalInstallOptions&& other);
    ExternalInstallOptions& operator=(const ExternalInstallOptions& other);
  
    bool operator==(const ExternalInstallOptions& other) const;
  
    GURL url;
    DisplayMode user_display_mode;
    ExternalInstallSource install_source;
  
    // If true, a shortcut is added to the Applications folder on macOS, and Start
    // Menu on Linux and Windows and launcher on Chrome OS. If false, we skip
    // adding a shortcut to desktop as well, regardless of the value of
    // |add_to_desktop|.
    // TODO(ortuno): Make adding a shortcut to the applications menu independent
    // from adding a shortcut to desktop.
    bool add_to_applications_menu = true;
  
    // If true, a shortcut is added to the desktop on Linux and Windows. Has no
    // effect on macOS and Chrome OS.
    bool add_to_desktop = true;
  
    // If true, a shortcut is added to the "quick launch bar" of the OS: the Shelf
    // for Chrome OS, the Dock for macOS, and the Quick Launch Bar or Taskbar on
    // Windows. Currently this only works on Chrome OS.
    bool add_to_quick_launch_bar = true;
  
    // If true, the app can be searched for on Chrome OS. Has no effect on other
    // platforms.
    bool add_to_search = true;
  
    // If true, the app is shown in App Management on Chrome OS. Has no effect on
    // other platforms.
    bool add_to_management = true;
  
    // Whether the app should be registered to run on OS login.
    // Currently this only works on Windows by adding a shortcut to the
    // Startup Folder.
    // TODO(crbug.com/897302): Enable for other platforms.
    bool run_on_os_login = false;
  
    // If true, the app icon is displayed on Chrome OS with a blocked logo on
    // top, and the user cannot launch the app. Has no effect on other platforms.
    bool is_disabled = false;
  
    // Whether the app should be reinstalled even if the user has previously
    // uninstalled it.
    bool override_previous_user_uninstall = false;
  
    // This must only be used by pre-installed default or system apps that are
    // valid PWAs if loading the real service worker is too costly to verify
    // programmatically.
    bool bypass_service_worker_check = false;
  
    // This should be used for installing all default apps so that good metadata
    // is ensured.
    bool require_manifest = false;
  
    // Whether the app should be reinstalled even if it is already installed.
    bool force_reinstall = false;
  
    // Whether we should wait for all app windows being closed before reinstalling
    // the placeholder.
    bool wait_for_windows_closed = false;
  
    // Whether a placeholder app should be installed if we fail to retrieve the
    // metadata for the app. A placeholder app uses:
    //  - The default Chrome App icon for the icon
    //  - |url| as the start_url
    //  - |url| as the app name
    bool install_placeholder = false;
  
    // Whether we should try to reinstall the app if there is a placeholder for
    // it.
    bool reinstall_placeholder = false;
  
    // A list of app_ids that the Web App System should attempt to uninstall and
    // replace with this app (e.g maintain shelf pins, app list positions).
    std::vector<AppId> uninstall_and_replace;
  
    // Additional keywords that will be used by the OS when searching for the app.
    // Only affects Chrome OS.
    std::vector<std::string> additional_search_terms;
  
    // A factory callback that returns a unique_ptr<WebApplicationInfo>. If this
    // is present, the generated WebApplicationInfo is used to install the app
    // instead of loading the url, retrieving the manifest, and installing from
    // that.
    WebApplicationInfoFactory app_info_factory;
  };
  
  std::ostream& operator<<(std::ostream& out,
                           const ExternalInstallOptions& install_options);
  
  InstallManager::InstallParams ConvertExternalInstallOptionsToParams(
      const ExternalInstallOptions& install_options);
  
  }  // namespace web_app
  
  #endif  // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_EXTERNAL_INSTALL_OPTIONS_H_
  