1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
|
// Copyright 2019 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_UI_MANAGER_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_UI_MANAGER_H_
#include <memory>
#include <vector>
#include "base/auto_reset.h"
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chrome/browser/apps/app_service/app_launch_params.h"
#include "chrome/browser/web_applications/commands/web_app_command.h"
#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h"
#include "chrome/browser/web_applications/web_app_callback_app_identity.h"
#include "components/services/app_service/public/cpp/app_launch_util.h"
#include "components/webapps/browser/install_result_code.h"
#include "components/webapps/browser/uninstall_result_code.h"
#include "components/webapps/common/web_app_id.h"
#include "ui/gfx/native_widget_types.h"
class Browser;
class BrowserWindow;
class Profile;
namespace base {
class FilePath;
} // namespace base
namespace content {
class WebContents;
class NavigationHandle;
} // namespace content
namespace webapps {
class MlInstallOperationTracker;
}
namespace web_app {
class WithAppResources;
// WebAppUiManagerImpl can be used only in UI code.
class WebAppUiManagerImpl;
enum class AppRelaunchState {
kAppClosingForRelaunch,
kAppAboutToRelaunch,
kAppRelaunched
};
using UninstallScheduledCallback = base::OnceCallback<void(bool)>;
using UninstallCompleteCallback =
base::OnceCallback<void(webapps::UninstallResultCode code)>;
using WebAppLaunchAcceptanceCallback =
base::OnceCallback<void(bool allowed, bool remember_user_choice)>;
using FirstRunServiceCompletedCallback = base::OnceCallback<void(bool success)>;
// Overrides the app identity update dialog's behavior for testing, allowing the
// test to auto-accept or auto-skip the dialog.
base::AutoReset<std::optional<AppIdentityUpdate>>
SetIdentityUpdateDialogActionForTesting(
std::optional<AppIdentityUpdate> auto_accept_action);
std::optional<AppIdentityUpdate> GetIdentityUpdateDialogActionForTesting();
class WebAppUiManagerObserver : public base::CheckedObserver {
public:
// Notifies on `content::WebContentsObserver::ReadyToCommitNavigation` when a
// navigation is about to commit in a web app identified by `app_id`
// (including navigations in sub frames).
virtual void OnReadyToCommitNavigation(
const webapps::AppId& app_id,
content::NavigationHandle* navigation_handle) {}
// Called when the WebAppUiManager is about to be destroyed.
virtual void OnWebAppUiManagerDestroyed() {}
};
using LaunchWebAppCallback =
base::OnceCallback<void(base::WeakPtr<Browser> browser,
base::WeakPtr<content::WebContents> web_contents,
apps::LaunchContainer container)>;
using LaunchWebAppDebugValueCallback =
base::OnceCallback<void(base::WeakPtr<Browser> browser,
base::WeakPtr<content::WebContents> web_contents,
apps::LaunchContainer container,
base::Value debug_value)>;
enum class LaunchWebAppWindowSetting {
// The window container and disposition from the launch params are used,
// despite the configuration of the web app.
kUseLaunchParams,
// The container and disposition of the launch are overridden with the
// configuration of the web app, which include the user preference as well as
// configuration in the web app's manifest.
kOverrideWithWebAppConfig,
};
// A chrome/browser/ representation of the chrome/browser/ui/ UI manager to
// perform Web App UI operations or listen to Web App UI events, including
// events from WebAppTabHelpers.
class WebAppUiManager {
public:
using ShowIntentPickerBubbleCallback = base::OnceCallback<void(bool)>;
struct RoolNotificationBehavior {
bool is_rool_enabled = false;
bool is_prevent_close_enabled = false;
};
static std::unique_ptr<WebAppUiManager> Create(Profile* profile);
// The returned params are populated except for the disposition and container,
// which is expected to be populated later when using `LaunchWebApp`
// with `kOverrideWithWebAppConfig`.
static apps::AppLaunchParams CreateAppLaunchParamsWithoutWindowConfig(
const webapps::AppId& app_id,
const base::CommandLine& command_line,
const base::FilePath& current_directory,
const std::optional<GURL>& url_handler_launch_url,
const std::optional<GURL>& protocol_handler_launch_url,
const std::optional<GURL>& file_launch_url,
const std::vector<base::FilePath>& launch_files);
WebAppUiManager();
virtual ~WebAppUiManager();
base::WeakPtr<WebAppUiManager> GetWeakPtr();
virtual void Start() = 0;
virtual void Shutdown() = 0;
// A safe downcast.
virtual WebAppUiManagerImpl* AsImpl() = 0;
virtual size_t GetNumWindowsForApp(const webapps::AppId& app_id) = 0;
// Close app windows. Does not affect tabs in a non-app browser.
virtual void CloseAppWindows(const webapps::AppId& app_id) = 0;
virtual void NotifyOnAllAppWindowsClosed(const webapps::AppId& app_id,
base::OnceClosure callback) = 0;
void AddObserver(WebAppUiManagerObserver* observer);
void RemoveObserver(WebAppUiManagerObserver* observer);
void NotifyReadyToCommitNavigation(
const webapps::AppId& app_id,
content::NavigationHandle* navigation_handle);
virtual bool CanAddAppToQuickLaunchBar() const = 0;
virtual void AddAppToQuickLaunchBar(const webapps::AppId& app_id) = 0;
virtual bool IsAppInQuickLaunchBar(const webapps::AppId& app_id) const = 0;
virtual bool CanReparentAppTabToWindow(
const webapps::AppId& app_id,
bool shortcut_created,
content::WebContents* web_contents) const = 0;
// Reparents the |contents| to a new browser window, returns a nullptr if the
// operation failed.
virtual Browser* ReparentAppTabToWindow(content::WebContents* contents,
const webapps::AppId& app_id,
bool shortcut_created) = 0;
// Reparents the `contents` to a new browser window, returns a nullptr if the
// operation failed. Runs `completion_callback` with the web contents of the
// newly reparented app window.
virtual Browser* ReparentAppTabToWindow(
content::WebContents* contents,
const webapps::AppId& app_id,
base::OnceCallback<void(content::WebContents*)> completion_callback) = 0;
// Shows the pre-launch dialog for a file handling web app launch. The user
// can allow or block the launch.
virtual void ShowWebAppFileLaunchDialog(
const std::vector<base::FilePath>& file_paths,
const webapps::AppId& app_id,
WebAppLaunchAcceptanceCallback launch_callback) = 0;
// Shows the pre-launch dialog for a protocol web app launch. The user can
// allow or block the launch.
virtual void ShowWebAppProtocolLaunchDialog(
const GURL& protocol_url,
const webapps::AppId& app_id,
WebAppLaunchAcceptanceCallback launch_callback) = 0;
virtual void ShowWebAppIdentityUpdateDialog(
const std::string& app_id,
bool title_change,
bool icon_change,
const std::u16string& old_title,
const std::u16string& new_title,
const SkBitmap& old_icon,
const SkBitmap& new_icon,
content::WebContents* web_contents,
AppIdentityDialogCallback callback) = 0;
// Show the settings UI for the given app.
virtual void ShowWebAppSettings(const webapps::AppId& app_id) = 0;
// This launches the web app in the appropriate configuration, the behavior of
// which depends on the given configuration here and the configuration of the
// web app. E.g. attaching file handles to the launch queue, focusing existing
// windows if configured by the launch handlers, etc. See
// `web_app::LaunchWebApp` and `WebAppLaunchProcess` for more info.
// If the app_id is invalid, an empty browser window is opened.
// Note: this function should typically be run after the completion of the
// `WebAppUiManager::WaitForFirstRunService` function.
// Any lock that locks apps will extend the `WithAppResources` mixin.
virtual void LaunchWebApp(apps::AppLaunchParams params,
LaunchWebAppWindowSetting launch_setting,
Profile& profile,
LaunchWebAppDebugValueCallback callback,
WithAppResources& app_resources) = 0;
// This function calls the callback as soon as first run service is completed.
// Note: The callback will be called synchronously on platforms that do not
// have a first-run service.
virtual void WaitForFirstRunService(
Profile& profile,
FirstRunServiceCompletedCallback callback) = 0;
#if BUILDFLAG(IS_CHROMEOS)
// Migrates launcher state, such as parent folder id, position in App Launcher
// and pin position on the shelf from one app to another app.
// Avoids migrating if the to_app_id is already pinned.
virtual void MigrateLauncherState(const webapps::AppId& from_app_id,
const webapps::AppId& to_app_id,
base::OnceClosure callback) = 0;
// Displays a notification for web apps launched on login via the RunOnOsLogin
// feature on the provided |profile|.
virtual void DisplayRunOnOsLoginNotification(
const base::flat_map<webapps::AppId, RoolNotificationBehavior>& apps,
base::WeakPtr<Profile> profile) = 0;
#endif
// Displays the user about the status of a force app relaunch. This happens
// when a placeholder with `placeholder_app_id` is installed and running, and
// then is updated with an app with `final_app_id`.
virtual void NotifyAppRelaunchState(const webapps::AppId& placeholder_app_id,
const webapps::AppId& final_app_id,
const std::u16string& final_app_name,
base::WeakPtr<Profile> profile,
AppRelaunchState relaunch_state) = 0;
// Creates a new Browser tab on the "about:blank" URL. Creates a new browser
// if there isn't one that is already open.
virtual content::WebContents* CreateNewTab() = 0;
// Check if a tab is the currently active tab in the browser.
virtual bool IsWebContentsActiveTabInBrowser(
content::WebContents* web_contents) = 0;
// Triggers the web app install dialog on the specified |web_contents| if
// there is an installable web app. This will show the dialog even if the app
// is already installed.
using InstallCallback =
base::OnceCallback<void(const webapps::AppId& app_id,
webapps::InstallResultCode code)>;
virtual void TriggerInstallDialog(content::WebContents* web_contents,
webapps::WebappInstallSource source,
InstallCallback callback) = 0;
// Triggers the web app install dialog for a background install of the
// contents at `install_url`, with the optional `manifest_id`. The dialog will
// be anchored to `initiating_web_contents`. This assumes the app is not
// already installed. Used for the Web Install API.
virtual void TriggerInstallDialogForBackgroundInstall(
content::WebContents* initiating_web_contents,
std::unique_ptr<webapps::MlInstallOperationTracker> tracker,
const GURL& install_url,
const std::optional<GURL>& manifest_id,
InstallCallback callback) = 0;
using WebInstallAppLaunchAcceptanceCallback =
base::OnceCallback<void(bool accepted)>;
// Triggers the web app launch dialog anchored to `initiating_web_contents`
// to launch the app given by `app_id`. Used for the Web Install API.
virtual void TriggerLaunchDialogForBackgroundInstall(
content::WebContents* initiating_web_contents,
const webapps::AppId& app_id,
Profile* profile,
const std::string& app_name,
WebInstallAppLaunchAcceptanceCallback callback) = 0;
// The uninstall dialog will be modal to |parent_window|, or a non-modal if
// |parent_window| is nullptr. Use this API if a Browser window needs to be
// passed in along with an UninstallCompleteCallback.
virtual void PresentUserUninstallDialog(
const webapps::AppId& app_id,
webapps::WebappUninstallSource uninstall_source,
BrowserWindow* parent_window,
UninstallCompleteCallback callback) = 0;
// Use this API if a gfx::NativeWindow needs to be passed in along with an
// UninstallCompleteCallback.
virtual void PresentUserUninstallDialog(
const webapps::AppId& app_id,
webapps::WebappUninstallSource uninstall_source,
gfx::NativeWindow parent_window,
UninstallCompleteCallback callback) = 0;
// Use this API if a gfx::NativeWindow needs to be passed in along with a
// UninstallCompleteCallback and an UninstallScheduledCallback.
virtual void PresentUserUninstallDialog(
const webapps::AppId& app_id,
webapps::WebappUninstallSource uninstall_source,
gfx::NativeWindow parent_window,
UninstallCompleteCallback callback,
UninstallScheduledCallback scheduled_callback) = 0;
// This assumes the app is already installed. The callback is called with
// true when the user chooses to open the app, otherwise, false is called.
virtual void ShowIntentPicker(const GURL& url,
content::WebContents* web_contents,
ShowIntentPickerBubbleCallback callback) = 0;
// Launches the Isolated Web App installer for a bundle with the given path.
// If an installer with the given path already exists, brings it to front and
// focuses it instead.
virtual void LaunchOrFocusIsolatedWebAppInstaller(
const base::FilePath& bundle_path) = 0;
// Creates the EnableSupportedLinksInfobar in an app window when the app is
// launched via link capturing from a link.
virtual void MaybeCreateEnableSupportedLinksInfobar(
content::WebContents* web_contents,
const std::string& launch_name) = 0;
// Creates the IPH bubble for apps that are launched via link capturing being
// enabled.
virtual void MaybeShowIPHPromoForAppsLaunchedViaLinkCapturing(
Browser* browser,
Profile* profile,
const std::string& app_id) = 0;
private:
base::ObserverList<WebAppUiManagerObserver, /*check_empty=*/true> observers_;
base::WeakPtrFactory<WebAppUiManager> weak_ptr_factory_{this};
};
} // namespace web_app
#endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_UI_MANAGER_H_
|