blob: af7fae954c1ea6556eb8edbb048e654c6eb6e964 [file] [log] [blame]
// Copyright 2022 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_COMMANDS_WEB_APP_UNINSTALL_COMMAND_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_WEB_APP_UNINSTALL_COMMAND_H_
#include <memory>
#include "base/callback_forward.h"
#include "base/containers/circular_deque.h"
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/values.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/web_app_id.h"
#include "components/webapps/browser/installable/installable_metrics.h"
#include "components/webapps/browser/uninstall_result_code.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
class Profile;
class PrefService;
namespace webapps {
enum class UninstallResultCode;
enum class WebappUninstallSource;
} // namespace webapps
namespace web_app {
class FullSystemLock;
class FullSystemLockDescription;
class LockDescription;
class WebAppUninstallJob;
// Uninstall the web app.
class WebAppUninstallCommand : public WebAppCommandTemplate<FullSystemLock> {
public:
using UninstallWebAppCallback =
base::OnceCallback<void(webapps::UninstallResultCode)>;
using RemoveManagementTypeCallback =
base::RepeatingCallback<void(const AppId& app_id)>;
WebAppUninstallCommand(
const AppId& app_id,
absl::optional<WebAppManagement::Type> management_type_or_all,
webapps::WebappUninstallSource uninstall_source,
UninstallWebAppCallback callback,
Profile* profile);
~WebAppUninstallCommand() override;
void StartWithLock(std::unique_ptr<FullSystemLock> lock) override;
void OnSyncSourceRemoved() override;
void OnShutdown() override;
LockDescription& lock_description() const override;
base::Value ToDebugValue() const override;
void SetRemoveManagementTypeCallbackForTesting(
RemoveManagementTypeCallback callback);
private:
// Used to store information needed for uninstalling an app with app_id.
struct UninstallInfo {
UninstallInfo(AppId app_id,
absl::optional<WebAppManagement::Type> management_type_or_all,
webapps::WebappUninstallSource uninstall_source);
~UninstallInfo();
UninstallInfo(const UninstallInfo& uninstall_info);
UninstallInfo(UninstallInfo&& uninstall_info);
UninstallInfo& operator=(const UninstallInfo& uninstall_info) = delete;
UninstallInfo& operator=(UninstallInfo&& uninstall_info) = delete;
AppId app_id;
absl::optional<WebAppManagement::Type> management_type_or_all;
webapps::WebappUninstallSource uninstall_source;
};
void AppendUninstallInfoToDebugLog(const UninstallInfo& uninstall_info);
void AppendUninstallResultsToDebugLog(const AppId& app_id);
void Abort(webapps::UninstallResultCode code);
void Uninstall(const AppId& app_id,
const webapps::WebappUninstallSource& uninstall_source);
void QueueSubAppsForUninstallIfAny(const AppId& app_id);
void RemoveManagementTypeAfterOsUninstallRegistration(
const AppId& app_id,
const WebAppManagement::Type& install_source,
const webapps::WebappUninstallSource& uninstall_source,
OsHooksErrors os_hooks_errors);
void OnSingleUninstallComplete(const AppId& app_id,
const webapps::WebappUninstallSource& source,
webapps::UninstallResultCode code);
void MaybeFinishUninstallAndDestruct();
std::unique_ptr<FullSystemLockDescription> lock_description_;
std::unique_ptr<FullSystemLock> lock_;
const AppId app_id_;
base::circular_deque<UninstallInfo> queued_uninstalls_;
base::flat_map<AppId, webapps::UninstallResultCode> uninstall_results_;
base::flat_map<AppId, std::unique_ptr<WebAppUninstallJob>>
apps_pending_uninstall_;
base::Value::Dict debug_log_;
bool all_uninstalled_queued_ = false;
UninstallWebAppCallback callback_;
RemoveManagementTypeCallback management_type_removed_callback_for_testing_;
raw_ptr<PrefService> profile_prefs_;
base::WeakPtrFactory<WebAppUninstallCommand> weak_factory_{this};
};
} // namespace web_app
#endif // CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_WEB_APP_INSTALL_COMMAND_H_