blob: 5dadfa594dd1f89baab392daf176fa37df42ff70 [file] [log] [blame]
Alexey Baskakovd05bb012019-03-27 07:06:171// Copyright 2019 The Chromium Authors. All rights reserved.
2// 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
Giovanni Ortuño Urquidi88971892020-04-17 06:51:298#include <string>
9#include <vector>
Alexey Baskakovd05bb012019-03-27 07:06:1710
Alan Cutter919b4592021-07-08 05:50:4411#include "base/values.h"
Dom Schulz5cecec022021-03-25 01:13:1312#include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h"
Song Fangzhencda4af62021-09-09 05:24:0213#include "chrome/browser/web_applications/web_app_constants.h"
14#include "chrome/browser/web_applications/web_app_id.h"
Song Fangzhenafaf6922021-08-12 05:18:0215#include "chrome/browser/web_applications/web_app_install_params.h"
Song Fangzhencda4af62021-09-09 05:24:0216#include "chrome/browser/web_applications/web_application_info.h"
Anton Bikineev46bbb972021-05-15 17:53:5317#include "third_party/abseil-cpp/absl/types/optional.h"
Alexey Baskakovd05bb012019-03-27 07:06:1718#include "url/gurl.h"
19
20namespace web_app {
21
Dominic Schulz38238af2020-07-22 02:06:4722using WebApplicationInfoFactory =
23 base::RepeatingCallback<std::unique_ptr<WebApplicationInfo>()>;
24
Alexey Baskakov031895272019-07-18 08:19:3325enum class ExternalInstallSource;
Alexey Baskakovd05bb012019-03-27 07:06:1726
Alexey Baskakov0b9a2ee2019-07-22 01:21:2427struct ExternalInstallOptions {
Alan Cutter0cc83732020-09-02 02:26:3628 ExternalInstallOptions(const GURL& install_url,
Eric Willigersd32986ad2019-11-04 00:40:0429 DisplayMode user_display_mode,
Alexey Baskakov0b9a2ee2019-07-22 01:21:2430 ExternalInstallSource install_source);
31 ~ExternalInstallOptions();
32 ExternalInstallOptions(const ExternalInstallOptions& other);
33 ExternalInstallOptions(ExternalInstallOptions&& other);
34 ExternalInstallOptions& operator=(const ExternalInstallOptions& other);
Alexey Baskakovd05bb012019-03-27 07:06:1735
Alexey Baskakov0b9a2ee2019-07-22 01:21:2436 bool operator==(const ExternalInstallOptions& other) const;
Alexey Baskakovd05bb012019-03-27 07:06:1737
Alan Cutter919b4592021-07-08 05:50:4438 base::Value AsDebugValue() const;
39
Alan Cutter0cc83732020-09-02 02:26:3640 GURL install_url;
Eric Willigersd32986ad2019-11-04 00:40:0441 DisplayMode user_display_mode;
Alexey Baskakov031895272019-07-18 08:19:3342 ExternalInstallSource install_source;
Alexey Baskakovd05bb012019-03-27 07:06:1743
Howard Woloskydeaf4d5f2021-02-11 01:20:5944 // App name to use for placeholder apps or web apps that have no name in
45 // their manifest.
Anton Bikineev46bbb972021-05-15 17:53:5346 absl::optional<std::string> fallback_app_name;
Howard Woloskydeaf4d5f2021-02-11 01:20:5947
Giovanni Ortuño Urquidie22f2e12019-04-01 02:43:5148 // If true, a shortcut is added to the Applications folder on macOS, and Start
Giovanni Ortuño Urquidi88971892020-04-17 06:51:2949 // Menu on Linux and Windows and launcher on Chrome OS. If false, we skip
Giovanni Ortuño Urquidie22f2e12019-04-01 02:43:5150 // adding a shortcut to desktop as well, regardless of the value of
51 // |add_to_desktop|.
52 // TODO(ortuno): Make adding a shortcut to the applications menu independent
53 // from adding a shortcut to desktop.
54 bool add_to_applications_menu = true;
55
56 // If true, a shortcut is added to the desktop on Linux and Windows. Has no
57 // effect on macOS and Chrome OS.
58 bool add_to_desktop = true;
59
60 // If true, a shortcut is added to the "quick launch bar" of the OS: the Shelf
61 // for Chrome OS, the Dock for macOS, and the Quick Launch Bar or Taskbar on
62 // Windows. Currently this only works on Chrome OS.
63 bool add_to_quick_launch_bar = true;
Alexey Baskakovd05bb012019-03-27 07:06:1764
Giovanni Ortuño Urquidi88971892020-04-17 06:51:2965 // If true, the app can be searched for on Chrome OS. Has no effect on other
66 // platforms.
67 bool add_to_search = true;
68
69 // If true, the app is shown in App Management on Chrome OS. Has no effect on
70 // other platforms.
71 bool add_to_management = true;
72
Carlos Frias5ddded62020-05-27 23:38:1873 // Whether the app should be registered to run on OS login.
74 // Currently this only works on Windows by adding a shortcut to the
75 // Startup Folder.
76 // TODO(crbug.com/897302): Enable for other platforms.
77 bool run_on_os_login = false;
78
Aya ElAttar14d72a252020-04-21 10:59:1979 // If true, the app icon is displayed on Chrome OS with a blocked logo on
80 // top, and the user cannot launch the app. Has no effect on other platforms.
81 bool is_disabled = false;
82
Alexey Baskakovd05bb012019-03-27 07:06:1783 // Whether the app should be reinstalled even if the user has previously
84 // uninstalled it.
85 bool override_previous_user_uninstall = false;
86
Alan Cutterf30aa0ef2020-11-03 09:24:4087 // Whether the app should only be installed if the user is using Chrome for
88 // the first time.
89 bool only_for_new_users = false;
90
Alexey Baskakovdc0abf1e2021-05-20 04:06:3791 // Whether the app should be omitted for new preinstalls. This is the opposite
92 // of |only_for_new_users| option. It can be used for partial deprecation of
93 // a preinstalled app: do not preinstall the app for new users but leave
94 // existing users unaffected.
95 bool only_if_previously_preinstalled = false;
96
Alan Cutter167ca8042020-11-09 06:27:0797 // Which user types this app should be installed for.
98 // See apps::DetermineUserType() for relevant string constants.
99 std::vector<std::string> user_type_allowlist;
100
101 // Which feature flag should be enabled to install this app. See
Song Fangzhencda4af62021-09-09 05:24:02102 // chrome/browser/web_applications/preinstalled_app_install_features.h
Alan Cutter167ca8042020-11-09 06:27:07103 // for available features to gate on.
Anton Bikineev46bbb972021-05-15 17:53:53104 absl::optional<std::string> gate_on_feature;
Alan Cutter167ca8042020-11-09 06:27:07105
106 // Whether this should not be installed for devices that support ARC.
107 bool disable_if_arc_supported = false;
108
109 // Whether this should not be installed for tablet devices.
110 bool disable_if_tablet_form_factor = false;
111
Alexey Baskakovd05bb012019-03-27 07:06:17112 // This must only be used by pre-installed default or system apps that are
113 // valid PWAs if loading the real service worker is too costly to verify
114 // programmatically.
115 bool bypass_service_worker_check = false;
116
Alan Cuttera8f043e2021-05-07 07:52:37117 // When set to true this will fail installation with
118 // |kNotValidManifestForWebApp| if the |install_url| doesn't have a manifest
119 // that passes basic validity checks. This is ignored when |app_info_factory|
120 // is used.
Alexey Baskakovd05bb012019-03-27 07:06:17121 bool require_manifest = false;
122
123 // Whether the app should be reinstalled even if it is already installed.
Christopher Lama04e05922019-06-27 06:06:11124 bool force_reinstall = false;
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30125
Alexey Baskakovef2601fc2021-01-12 07:05:41126 // Whether we should update the app if the browser's binary milestone number
127 // goes from less the milestone specified to greater or equal than the
128 // milestone specified. For example, if this value is 89 then we update the
129 // app on all browser upgrades from <89 to >=89. The update happens only once.
Anton Bikineev46bbb972021-05-15 17:53:53130 absl::optional<int> force_reinstall_for_milestone;
Alexey Baskakovef2601fc2021-01-12 07:05:41131
Giovanni Ortuño Urquidi68bd2a52019-04-18 12:15:24132 // Whether we should wait for all app windows being closed before reinstalling
133 // the placeholder.
134 bool wait_for_windows_closed = false;
Giovanni Ortuño Urquidib6f4c5e02019-04-16 04:57:56135
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30136 // Whether a placeholder app should be installed if we fail to retrieve the
137 // metadata for the app. A placeholder app uses:
138 // - The default Chrome App icon for the icon
139 // - |url| as the start_url
Howard Woloskydeaf4d5f2021-02-11 01:20:59140 // - |url| as the app name (unless fallback_app_name has been specified)
Giovanni Ortuño Urquidic7e719b2019-04-03 01:33:30141 bool install_placeholder = false;
Giovanni Ortuño Urquidib6f4c5e02019-04-16 04:57:56142
143 // Whether we should try to reinstall the app if there is a placeholder for
144 // it.
145 bool reinstall_placeholder = false;
Christopher Lam8cd21342019-08-20 03:57:34146
Alan Cutter35be21052020-09-29 11:37:05147 // Optional query parameters to add to the start_url when launching the app.
Anton Bikineev46bbb972021-05-15 17:53:53148 absl::optional<std::string> launch_query_params;
Alan Cutter35be21052020-09-29 11:37:05149
Alan Cutter464b32c62020-09-16 06:41:37150 // Whether we should load |service_worker_registration_url| after successful
151 // installation to allow the site to install its service worker and set up
152 // offline caching.
153 bool load_and_await_service_worker_registration = true;
154
155 // The URL to use for service worker registration. This is
156 // configurable by sites that wish to be able to track install metrics of the
157 // install_url separate from the service worker registration step. Defaults to
158 // install_url if unset.
Anton Bikineev46bbb972021-05-15 17:53:53159 absl::optional<GURL> service_worker_registration_url;
Alan Cutter464b32c62020-09-16 06:41:37160
Christopher Lam8cd21342019-08-20 03:57:34161 // A list of app_ids that the Web App System should attempt to uninstall and
162 // replace with this app (e.g maintain shelf pins, app list positions).
163 std::vector<AppId> uninstall_and_replace;
Giovanni Ortuño Urquidib73eb2c502020-03-26 23:05:11164
165 // Additional keywords that will be used by the OS when searching for the app.
166 // Only affects Chrome OS.
167 std::vector<std::string> additional_search_terms;
Dominic Schulz38238af2020-07-22 02:06:47168
Alan Cutter2c70a7f2020-09-18 06:50:13169 // Determines whether |app_info_factory| is used as a fallback or the primary
170 // source of app metadata. If true the |install_url| and
171 // |service_worker_registration_url| will not be loaded.
172 bool only_use_app_info_factory = false;
173
174 // A factory callback that returns a unique_ptr<WebApplicationInfo> to be used
175 // as the app's installation metadata.
Dominic Schulz38238af2020-07-22 02:06:47176 WebApplicationInfoFactory app_info_factory;
Dom Schulz7b4bd512021-01-06 23:39:22177
178 // The type of SystemWebApp, if this app is a System Web App.
Anton Bikineev46bbb972021-05-15 17:53:53179 absl::optional<SystemAppType> system_app_type = absl::nullopt;
Tim Sergeant47b94312021-03-17 03:59:50180
181 // Whether the app was installed by an OEM and should be placed in a special
182 // OEM folder in the app launcher. Only used on Chrome OS.
183 bool oem_installed = false;
Jeevan Shikaramab50d8392021-06-01 23:55:10184
185 // Whether this should be installed on devices without a touch screen with
186 // stylus support.
187 bool disable_if_touchscreen_with_stylus_not_supported = false;
Alexey Baskakovd05bb012019-03-27 07:06:17188};
189
Song Fangzhenafaf6922021-08-12 05:18:02190WebAppInstallParams ConvertExternalInstallOptionsToParams(
Alexey Baskakovc3fa6382019-08-01 01:47:08191 const ExternalInstallOptions& install_options);
192
Alexey Baskakovd05bb012019-03-27 07:06:17193} // namespace web_app
194
Song Fangzhencda4af62021-09-09 05:24:02195#endif // CHROME_BROWSER_WEB_APPLICATIONS_EXTERNAL_INSTALL_OPTIONS_H_