blob: 725f90af4c5232c22d76a0921b21440f4538f057 [file]
// Copyright 2026 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/default_browser/default_browser_changed_notification_handler.h"
#include "base/functional/callback_helpers.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/default_browser/default_browser_controller.h"
#include "chrome/browser/default_browser/default_browser_manager.h"
#include "chrome/browser/notifications/notification_display_service.h"
#include "chrome/browser/notifications/notification_display_service_factory.h"
namespace default_browser {
DefaultBrowserChangedNotificationHandler::
DefaultBrowserChangedNotificationHandler() = default;
DefaultBrowserChangedNotificationHandler::
~DefaultBrowserChangedNotificationHandler() = default;
void DefaultBrowserChangedNotificationHandler::OnShow(
Profile* profile,
const std::string& notification_id) {
if (notification_id != DefaultBrowserManager::kNotificationId) {
return;
}
// Create a new controller for this interaction.
controller_ =
DefaultBrowserManager::From(g_browser_process)
->CreateControllerFor(
DefaultBrowserEntrypointType::kChangeDetectedNotification);
CHECK(controller_);
controller_->OnShown();
}
void DefaultBrowserChangedNotificationHandler::OnClose(
Profile* profile,
const GURL& origin,
const std::string& notification_id,
bool by_user,
base::OnceClosure completed_closure) {
base::ScopedClosureRunner completion_runner(std::move(completed_closure));
if (notification_id != DefaultBrowserManager::kNotificationId) {
return;
}
if (auto controller = std::exchange(controller_, nullptr)) {
// If the notification closes without a click action (e.g. user-initiated
// close or system timeout), record the outcome as ignored or dismissed.
if (by_user) {
controller->OnDismissed();
} else {
controller->OnIgnored();
}
}
}
void DefaultBrowserChangedNotificationHandler::OnClick(
Profile* profile,
const GURL& origin,
const std::string& notification_id,
const std::optional<int>& action_index,
const std::optional<std::u16string>& reply,
base::OnceClosure completed_closure) {
base::ScopedClosureRunner completion_runner(std::move(completed_closure));
if (notification_id != DefaultBrowserManager::kNotificationId) {
return;
}
auto controller = std::exchange(controller_, nullptr);
if (!controller) {
return;
}
if (!action_index.has_value() || action_index.value() == 0) {
auto* controller_ptr = controller.get();
controller_ptr->OnAccepted(
base::DoNothingWithBoundArgs(std::move(controller)));
} else if (action_index.value() == 1) {
controller->OnDismissed();
} else {
NOTREACHED();
}
NotificationDisplayServiceFactory::GetForProfile(profile)->Close(
NotificationHandler::Type::DEFAULT_BROWSER_CHANGED, notification_id);
}
} // namespace default_browser