blob: dd03afe7fe3219eddb443e2a8b368662b1a6d870 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2019 The Chromium Authors
Alexey Baskakovd05bb012019-03-27 07:06:172// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Song Fangzhencda4af62021-09-09 05:24:025#ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTERNAL_INSTALL_OPTIONS_H_
6#define CHROME_BROWSER_WEB_APPLICATIONS_EXTERNAL_INSTALL_OPTIONS_H_
Alexey Baskakovd05bb012019-03-27 07:06:177
Arthur Sonzognife132ee2024-01-15 11:01:048#include <optional>
Giovanni Ortuño Urquidi88971892020-04-17 06:51:299#include <string>
10#include <vector>
Alexey Baskakovd05bb012019-03-27 07:06:1711
Ben Reich50d16cd52023-07-12 01:46:1212#include "base/time/time.h"
Alan Cutter919b4592021-07-08 05:50:4413#include "base/values.h"
Georg Neis251cf6f2025-02-19 05:23:1914#include "build/build_config.h"
liqining.keiling5a8e27f22023-01-01 17:55:4715#include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
Song Fangzhencda4af62021-09-09 05:24:0216#include "chrome/browser/web_applications/web_app_constants.h"
Anosua Roy38b833b2022-01-18 15:39:0317#include "chrome/browser/web_applications/web_app_install_info.h"
Song Fangzhenafaf6922021-08-12 05:18:0218#include "chrome/browser/web_applications/web_app_install_params.h"
Glenn Hartmann5f992ed2023-09-25 18:05:3619#include "components/webapps/common/web_app_id.h"
Alexey Baskakovd05bb012019-03-27 07:06:1720#include "url/gurl.h"
21
Georg Neis251cf6f2025-02-19 05:23:1922#if BUILDFLAG(IS_CHROMEOS)
Lei Zhang52db54f2023-02-13 20:27:3623#include "ash/webui/system_apps/public/system_web_app_type.h"
24#endif
25
Alexey Baskakovd05bb012019-03-27 07:06:1726namespace web_app {
27
Anosua Roy18be3752022-01-10 07:16:4528using WebAppInstallInfoFactory =
Alan Cutterd95afd92023-06-26 04:21:4029 base::RepeatingCallback<std::unique_ptr<WebAppInstallInfo>()>;
Dominic Schulz38238af2020-07-22 02:06:4730
Alexey Baskakov031895272019-07-18 08:19:3331enum class ExternalInstallSource;
Alexey Baskakovd05bb012019-03-27 07:06:1732
Simon Hangl4f7fcae62023-11-21 16:00:5333enum class PlaceholderResolutionBehavior {
34 // Waits for all running app instances being closed before the placeholder is
35 // resolved.
36 kWaitForAppWindowsClosed,
37 // Closes all running app instances, resolves the placeholder and relaunches
38 // the app in a separate window.
39 kCloseAndRelaunch,
40 // Closes all running app instances and resolves the placeholder. After the
41 // placeholder is resolved, the app is not relaunched.
42 kClose
43};
44
Alexey Baskakov0b9a2ee2019-07-22 01:21:2445struct ExternalInstallOptions {
liqining.keiling5a8e27f22023-01-01 17:55:4746 ExternalInstallOptions(
47 const GURL& install_url,
Arthur Sonzognife132ee2024-01-15 11:01:0448 std::optional<mojom::UserDisplayMode> user_display_mode,
liqining.keiling5a8e27f22023-01-01 17:55:4749 ExternalInstallSource install_source);
Dmitrii Kuraginfb3929f2022-04-22 14:06:1950
Alexey Baskakov0b9a2ee2019-07-22 01:21:2451 ~ExternalInstallOptions();
52 ExternalInstallOptions(const ExternalInstallOptions& other);
53 ExternalInstallOptions(ExternalInstallOptions&& other);
54 ExternalInstallOptions& operator=(const ExternalInstallOptions& other);
Alexey Baskakovd05bb012019-03-27 07:06:1755
Alexey Baskakov0b9a2ee2019-07-22 01:21:2456 bool operator==(const ExternalInstallOptions& other) const;
Alexey Baskakovd05bb012019-03-27 07:06:1757
Alan Cutter919b4592021-07-08 05:50:4458 base::Value AsDebugValue() const;
59
Alan Cutter0cc83732020-09-02 02:26:3660 GURL install_url;
Dmitrii Kuraginfb3929f2022-04-22 14:06:1961
Arthur Sonzognife132ee2024-01-15 11:01:0462 std::optional<mojom::UserDisplayMode> user_display_mode;
Dmitrii Kuraginfb3929f2022-04-22 14:06:1963
Alexey Baskakov031895272019-07-18 08:19:3364 ExternalInstallSource install_source;
Alexey Baskakovd05bb012019-03-27 07:06:1765
Howard Woloskydeaf4d5f2021-02-11 01:20:5966 // App name to use for placeholder apps or web apps that have no name in
67 // their manifest.
Arthur Sonzognife132ee2024-01-15 11:01:0468 std::optional<std::string> fallback_app_name;
Howard Woloskydeaf4d5f2021-02-11 01:20:5969
phweiss5f191ed2022-01-17 10:27:5370 // App name that replaces the app's real name.
71 // override_name takes precedent over fallback_app_name in case both are
phweissade1f322021-09-30 19:18:3472 // present.
Arthur Sonzognife132ee2024-01-15 11:01:0473 std::optional<std::string> override_name;
phweiss5f191ed2022-01-17 10:27:5374
75 // URL of an icon that replaces the app's real icons.
Arthur Sonzognife132ee2024-01-15 11:01:0476 std::optional<GURL> override_icon_url;
phweissade1f322021-09-30 19:18:3477
Giovanni Ortuño Urquidie22f2e12019-04-01 02:43:5178 // If true, a shortcut is added to the Applications folder on macOS, and Start
Giovanni Ortuño Urquidi88971892020-04-17 06:51:2979 // Menu on Linux and Windows and launcher on Chrome OS. If false, we skip
Giovanni Ortuño Urquidie22f2e12019-04-01 02:43:5180 // adding a shortcut to desktop as well, regardless of the value of
81 // |add_to_desktop|.
82 // TODO(ortuno): Make adding a shortcut to the applications menu independent
83 // from adding a shortcut to desktop.
84 bool add_to_applications_menu = true;
85
86 // If true, a shortcut is added to the desktop on Linux and Windows. Has no
87 // effect on macOS and Chrome OS.
88 bool add_to_desktop = true;
89
90 // If true, a shortcut is added to the "quick launch bar" of the OS: the Shelf
91 // for Chrome OS, the Dock for macOS, and the Quick Launch Bar or Taskbar on
92 // Windows. Currently this only works on Chrome OS.
93 bool add_to_quick_launch_bar = true;
Alexey Baskakovd05bb012019-03-27 07:06:1794
Giovanni Ortuño Urquidi88971892020-04-17 06:51:2995 // If true, the app can be searched for on Chrome OS. Has no effect on other
96 // platforms.
97 bool add_to_search = true;
98
99 // If true, the app is shown in App Management on Chrome OS. Has no effect on
100 // other platforms.
101 bool add_to_management = true;
102
Aya ElAttar14d72a252020-04-21 10:59:19103 // If true, the app icon is displayed on Chrome OS with a blocked logo on
104 // top, and the user cannot launch the app. Has no effect on other platforms.
105 bool is_disabled = false;
106
Alexey Baskakovd05bb012019-03-27 07:06:17107 // Whether the app should be reinstalled even if the user has previously
Dibyajyoti Palb07becd42022-05-16 21:24:31108 // uninstalled it. Only applies to preinstalled apps and/or apps that can be
109 // uninstalled by the user.
Alexey Baskakovd05bb012019-03-27 07:06:17110 bool override_previous_user_uninstall = false;
111
Alan Cutterf30aa0ef2020-11-03 09:24:40112 // Whether the app should only be installed if the user is using Chrome for
113 // the first time.
114 bool only_for_new_users = false;
115
Alexey Baskakovdc0abf1e2021-05-20 04:06:37116 // Whether the app should be omitted for new preinstalls. This is the opposite
117 // of |only_for_new_users| option. It can be used for partial deprecation of
118 // a preinstalled app: do not preinstall the app for new users but leave
119 // existing users unaffected.
120 bool only_if_previously_preinstalled = false;
121
Alan Cutter167ca8042020-11-09 06:27:07122 // Which user types this app should be installed for.
123 // See apps::DetermineUserType() for relevant string constants.
124 std::vector<std::string> user_type_allowlist;
125
Tim Sergeant4c71ee52022-02-01 00:14:25126 // Which feature flag should be enabled to install this app. If the feature
127 // is disabled, existing external installs will be removed.
128 // See chrome/browser/web_applications/preinstalled_app_install_features.h
Alan Cutter167ca8042020-11-09 06:27:07129 // for available features to gate on.
Arthur Sonzognife132ee2024-01-15 11:01:04130 std::optional<std::string> gate_on_feature;
Alan Cutter167ca8042020-11-09 06:27:07131
Tim Sergeant4c71ee52022-02-01 00:14:25132 // Which feature flag should be enabled to install this app. If the feature is
133 // disabled, existing external installs will not be removed.
134 // See chrome/browser/web_applications/preinstalled_app_install_features.h
135 // for available features to gate on.
Arthur Sonzognife132ee2024-01-15 11:01:04136 std::optional<std::string> gate_on_feature_or_installed;
Tim Sergeant4c71ee52022-02-01 00:14:25137
Alan Cutter167ca8042020-11-09 06:27:07138 // Whether this should not be installed for devices that support ARC.
139 bool disable_if_arc_supported = false;
140
141 // Whether this should not be installed for tablet devices.
142 bool disable_if_tablet_form_factor = false;
143
Alan Cuttera8f043e2021-05-07 07:52:37144 // When set to true this will fail installation with
145 // |kNotValidManifestForWebApp| if the |install_url| doesn't have a manifest
146 // that passes basic validity checks. This is ignored when |app_info_factory|
147 // is used.
Alexey Baskakovd05bb012019-03-27 07:06:17148 bool require_manifest = false;
149
msiem12b88632025-01-24 18:51:34150 // The web app should be installed as a DIY, where only limited
Daniel d'Andradae0707612022-09-27 16:53:55151 // values from the manifest are used (like theme color) and all extra
152 // capabilities are not used (like file handlers).
msiem12b88632025-01-24 18:51:34153 bool install_as_diy = false;
Daniel d'Andrada5df2b582022-08-31 09:08:46154
Alexey Baskakovd05bb012019-03-27 07:06:17155 // Whether the app should be reinstalled even if it is already installed.
Christopher Lama04e05922019-06-27 06:06:11156 bool force_reinstall = false;
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30157
Alexey Baskakovef2601fc2021-01-12 07:05:41158 // Whether we should update the app if the browser's binary milestone number
159 // goes from less the milestone specified to greater or equal than the
160 // milestone specified. For example, if this value is 89 then we update the
161 // app on all browser upgrades from <89 to >=89. The update happens only once.
Arthur Sonzognife132ee2024-01-15 11:01:04162 std::optional<int> force_reinstall_for_milestone;
Alexey Baskakovef2601fc2021-01-12 07:05:41163
Simon Hangl4f7fcae62023-11-21 16:00:53164 // Defines how to handle running app instances of a placeholder app when a
165 // placeholder can be resolved. See `PlaceholderResolutionBehavior`
166 // documentation for details.
167 PlaceholderResolutionBehavior placeholder_resolution_behavior =
168 PlaceholderResolutionBehavior::kClose;
Giovanni Ortuño Urquidib6f4c5e02019-04-16 04:57:56169
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30170 // Whether a placeholder app should be installed if we fail to retrieve the
171 // metadata for the app. A placeholder app uses:
172 // - The default Chrome App icon for the icon
173 // - |url| as the start_url
Howard Woloskydeaf4d5f2021-02-11 01:20:59174 // - |url| as the app name (unless fallback_app_name has been specified)
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30175 bool install_placeholder = false;
Giovanni Ortuño Urquidib6f4c5e02019-04-16 04:57:56176
Alan Cutter35be21052020-09-29 11:37:05177 // Optional query parameters to add to the start_url when launching the app.
Arthur Sonzognife132ee2024-01-15 11:01:04178 std::optional<std::string> launch_query_params;
Alan Cutter35be21052020-09-29 11:37:05179
Alan Cutter464b32c62020-09-16 06:41:37180 // Whether we should load |service_worker_registration_url| after successful
181 // installation to allow the site to install its service worker and set up
182 // offline caching.
183 bool load_and_await_service_worker_registration = true;
184
185 // The URL to use for service worker registration. This is
186 // configurable by sites that wish to be able to track install metrics of the
187 // install_url separate from the service worker registration step. Defaults to
188 // install_url if unset.
Arthur Sonzognife132ee2024-01-15 11:01:04189 std::optional<GURL> service_worker_registration_url;
Alan Cutter464b32c62020-09-16 06:41:37190
Ben Reich50d16cd52023-07-12 01:46:12191 // The time to wait for the service worker registration before it times out.
192 // This is currently default at 40 seconds, override this value if more or
193 // less time is required.
194 base::TimeDelta service_worker_registration_timeout = base::Seconds(40);
195
Christopher Lam8cd21342019-08-20 03:57:34196 // A list of app_ids that the Web App System should attempt to uninstall and
197 // replace with this app (e.g maintain shelf pins, app list positions).
Glenn Hartmann5f992ed2023-09-25 18:05:36198 std::vector<webapps::AppId> uninstall_and_replace;
Giovanni Ortuño Urquidib73eb2c502020-03-26 23:05:11199
200 // Additional keywords that will be used by the OS when searching for the app.
201 // Only affects Chrome OS.
202 std::vector<std::string> additional_search_terms;
Dominic Schulz38238af2020-07-22 02:06:47203
Alan Cutter2c70a7f2020-09-18 06:50:13204 // Determines whether |app_info_factory| is used as a fallback or the primary
205 // source of app metadata. If true the |install_url| and
206 // |service_worker_registration_url| will not be loaded.
207 bool only_use_app_info_factory = false;
208
Alan Cutterd95afd92023-06-26 04:21:40209 // A factory callback that returns a unique_ptr<WebAppInstallInfo> to be used
210 // as the app's installation metadata.
Anosua Roy18be3752022-01-10 07:16:45211 WebAppInstallInfoFactory app_info_factory;
Dom Schulz7b4bd512021-01-06 23:39:22212
Georg Neis251cf6f2025-02-19 05:23:19213#if BUILDFLAG(IS_CHROMEOS)
Dom Schulz7b4bd512021-01-06 23:39:22214 // The type of SystemWebApp, if this app is a System Web App.
Arthur Sonzognife132ee2024-01-15 11:01:04215 std::optional<ash::SystemWebAppType> system_app_type = std::nullopt;
Lei Zhang52db54f2023-02-13 20:27:36216#endif
Tim Sergeant47b94312021-03-17 03:59:50217
218 // Whether the app was installed by an OEM and should be placed in a special
219 // OEM folder in the app launcher. Only used on Chrome OS.
220 bool oem_installed = false;
Jeevan Shikaramab50d8392021-06-01 23:55:10221
222 // Whether this should be installed on devices without a touch screen with
223 // stylus support.
224 bool disable_if_touchscreen_with_stylus_not_supported = false;
jungoog@a30047c2022-01-07 07:46:31225
226 // Whether the app should show up in file-open intent and picking surfaces.
227 bool handles_file_open_intents = false;
Alan Cutter0154fa22022-01-28 05:10:33228
229 // The app id that's expected to be installed from `install_url`.
230 // Does not block installation if the actual app id doesn't match the
231 // expectation.
232 // Intended to be used for post-install activities like metrics and migration.
Arthur Sonzognife132ee2024-01-15 11:01:04233 std::optional<webapps::AppId> expected_app_id;
David Black05833c9c2024-03-26 08:29:01234
235 // Whether the app should be set as the preferred app for its supported links
236 // after installation. Note that this has no effect if the app is already
237 // installed as the user may have already updated their preference.
238 bool is_preferred_app_for_supported_links = false;
Daniel Murphy6672a8d2024-06-26 16:39:52239
240 // Whether the app should not be fully installed with os integration
241 // (shortcuts in application menu, etc), and instead only installed within
242 // Chromium. This sets the installation status to
243 // `InstallState::INSTALLED_WITHOUT_OS_INTEGRATION`. This will not
244 // downgrade an existing install.
245 bool install_without_os_integration = false;
246
247 // Note: All new fields must be added to AsDebugValue() and the == operator.
Alexey Baskakovd05bb012019-03-27 07:06:17248};
249
Song Fangzhenafaf6922021-08-12 05:18:02250WebAppInstallParams ConvertExternalInstallOptionsToParams(
Alexey Baskakovc3fa6382019-08-01 01:47:08251 const ExternalInstallOptions& install_options);
252
Alexey Baskakovd05bb012019-03-27 07:06:17253} // namespace web_app
254
Song Fangzhencda4af62021-09-09 05:24:02255#endif // CHROME_BROWSER_WEB_APPLICATIONS_EXTERNAL_INSTALL_OPTIONS_H_