blob: 0b0d62877f097c628e8840ebf0b76adf87e2eef6 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/web_app_profile_deletion_manager.h"
#include "base/scoped_observation.h"
#include "base/types/pass_key.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
#include "chrome/browser/web_applications/web_app_command_manager.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "components/webapps/common/web_app_id.h"
namespace web_app {
WebAppProfileDeletionManager::WebAppProfileDeletionManager(Profile* profile)
: profile_(profile) {}
WebAppProfileDeletionManager::~WebAppProfileDeletionManager() = default;
void WebAppProfileDeletionManager::SetProvider(base::PassKey<WebAppProvider>,
WebAppProvider& provider) {
provider_ = &provider;
}
void WebAppProfileDeletionManager::Start() {
// `ProfileManager` can be null in unit-tests.
if (ProfileManager* profile_manager = g_browser_process->profile_manager()) {
profile_manager_observation_.Observe(profile_manager);
}
}
void WebAppProfileDeletionManager::Shutdown() {
profile_manager_observation_.Reset();
}
void WebAppProfileDeletionManager::OnProfileMarkedForPermanentDeletion(
Profile* profile_to_be_deleted) {
if (profile_ != profile_to_be_deleted) {
return;
}
RemoveDataForProfileDeletion();
}
void WebAppProfileDeletionManager::OnProfileManagerDestroying() {
// Shut down the command system, aborting all running commands synchronously.
// This helps destroy the `WebContents` instance that might be created by the
// `command_manager()` before profile destruction has started.
// This serves as a crash fix for crbug.com/415776884.
provider_->command_manager().Shutdown();
profile_manager_observation_.Reset();
}
void WebAppProfileDeletionManager::RemoveDataForProfileDeletion() {
// First shut down the command system, aborting all running commands
// synchronously.
provider_->command_manager().Shutdown();
// Second, remove all OS integration for the profile.
WebAppRegistrar& registrar = provider_->registrar_unsafe();
for (const webapps::AppId& app_id : registrar.GetAppIds()) {
provider_->os_integration_manager()
.UnregisterOsIntegrationOnProfileMarkedForDeletion(
base::PassKey<WebAppProfileDeletionManager>(), app_id);
}
}
} // namespace web_app