blob: 7ffaed75d510f9e0125814dba596d22e2703115e [file] [log] [blame]
// Copyright 2021 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_WEB_APPLICATIONS_WEB_APP_INSTALL_PARAMS_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_PARAMS_H_
#include <iosfwd>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "build/build_config.h"
#include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
#include "chrome/browser/web_applications/proto/web_app_install_state.pb.h"
#include "chrome/browser/web_applications/web_app_screenshot_fetcher.h"
#include "components/webapps/browser/install_result_code.h"
#include "components/webapps/common/web_app_id.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "ash/webui/system_apps/public/system_web_app_type.h"
#endif
namespace content {
class WebContents;
} // namespace content
namespace web_app {
struct WebAppInstallInfo;
// |app_id| may be empty on failure.
using OnceInstallCallback =
base::OnceCallback<void(const webapps::AppId& app_id,
webapps::InstallResultCode code)>;
using OnceUninstallCallback =
base::OnceCallback<void(const webapps::AppId& app_id, bool uninstalled)>;
// Callback used to indicate whether a user has accepted the installation of a
// web app.
using WebAppInstallationAcceptanceCallback =
base::OnceCallback<void(bool user_accepted,
std::unique_ptr<WebAppInstallInfo>)>;
// Callback to show the WebApp installation confirmation bubble in UI.
// |web_app_info| is the WebAppInstallInfo to be installed.
// If `screenshot_fetcher` exists, then the detailed install dialog is shown.
using WebAppInstallDialogCallback = base::OnceCallback<void(
base::WeakPtr<WebAppScreenshotFetcher> screenshot_fetcher,
content::WebContents* initiator_web_contents,
std::unique_ptr<WebAppInstallInfo> web_app_info,
WebAppInstallationAcceptanceCallback acceptance_callback)>;
// See related ExternalInstallOptions struct and
// ConvertExternalInstallOptionsToParams function.
struct WebAppInstallParams {
WebAppInstallParams();
~WebAppInstallParams();
WebAppInstallParams(const WebAppInstallParams&);
// Whether the app should be reinstalled even if it is already installed.
bool force_reinstall = false;
// See `WebAppInstallTask::ApplyParamsToWebAppInstallInfo`
std::optional<mojom::UserDisplayMode> user_display_mode = std::nullopt;
// URL to be used as start_url if manifest is unavailable.
GURL fallback_start_url;
// App name to be used if manifest is unavailable.
std::optional<std::u16string> fallback_app_name;
proto::InstallState install_state =
proto::InstallState::INSTALLED_WITH_OS_INTEGRATION;
// These are required to be false if `install_state` is not
// proto::INSTALLED_WITH_OS_INTEGRATION.
bool add_to_applications_menu = true;
bool add_to_desktop = true;
bool add_to_quick_launch_bar = true;
// These have no effect outside of Chrome OS.
bool add_to_search = true;
bool add_to_management = true;
bool is_disabled = false;
bool handles_file_open_intents = true;
bool require_manifest = false;
// Used only by ExternallyManagedInstallCommand, to create DIY web apps where
// only limited values from the manifest are used (like theme color) and all
// extra capabilities are not used (like file handlers).
bool install_as_diy = false;
std::vector<std::string> additional_search_terms;
std::optional<std::string> launch_query_params;
#if BUILDFLAG(IS_CHROMEOS)
std::optional<ash::SystemWebAppType> system_app_type;
#endif
bool oem_installed = false;
// The install URL for the app. This does not always need to be
// populated (especially for user installed or sync installed apps)
// in which case the URL will not be written to the web_app DB.
GURL install_url;
// If true, do not validate origin associations as part of the install even if
// app has valid scope_extensions.
bool skip_origin_association_validation = false;
};
// The different UI flows that exist for creating a web app.
enum class WebAppInstallFlow {
// TODO(crbug.com/40184819): This should be removed by adding all known flows
// to this enum.
kUnknown,
#if BUILDFLAG(IS_CHROMEOS)
// Perform the `Create Shortcut` flow on CrOS that creates a DIY app.
kCreateShortcut,
#endif
// The 'Install Site' flow for installing the current site with an app
// experience determined by the site.
kInstallSite,
};
enum class FallbackBehavior {
// Installation will use the crafted manifest, and error if the manifest is
// not installable.
kCraftedManifestOnly,
// Installation will use whatever is available - if the site is installable
// then crafted app UX will be used, and if not then DIY WebApp UX will be
// used. See go/dpwa-universal-install.
kUseFallbackInfoWhenNotInstallable,
// Installation uses the legacy 'create shortcut' flow, which uses the crafted
// manifest if possible, and otherwise fallback information (which has an
// empty
// 'scope()', so IsShortcut() returns true).
kAllowFallbackDataAlways,
};
std::ostream& operator<<(std::ostream& os, FallbackBehavior state);
} // namespace web_app
#endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_PARAMS_H_