blob: 4d95cf0f5a8356b12b1d3138aac37e0020a0226f [file] [log] [blame]
// Copyright 2025 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_UI_EXTENSIONS_RELOAD_PAGE_DIALOG_CONTROLLER_H_
#define CHROME_BROWSER_UI_EXTENSIONS_RELOAD_PAGE_DIALOG_CONTROLLER_H_
#include <vector>
#include "base/auto_reset.h"
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "extensions/common/extension_id.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/native_widget_types.h"
namespace content {
class BrowserContext;
class WebContents;
} // namespace content
namespace extensions {
class Extension;
DECLARE_ELEMENT_IDENTIFIER_VALUE(kReloadPageDialogCancelButtonElementId);
DECLARE_ELEMENT_IDENTIFIER_VALUE(kReloadPageDialogOkButtonElementId);
// A controller for a dialog that prompts the user to reload the active page so
// that a given list of extensions can run.
class ReloadPageDialogController {
public:
// Information for an extension that should be included in the dialog.
struct ExtensionInfo {
ExtensionId id;
std::string name;
gfx::Image icon;
};
ReloadPageDialogController(content::WebContents* web_contents,
content::BrowserContext* browser_context);
~ReloadPageDialogController();
ReloadPageDialogController(const ReloadPageDialogController&) = delete;
const ReloadPageDialogController& operator=(
const ReloadPageDialogController&) = delete;
// Starts the process of showing the dialog for the given `extensions`.
void TriggerShow(const std::vector<const Extension*>& extensions);
// For testing:
[[nodiscard]] static base::AutoReset<std::optional<bool>>
AcceptDialogForTesting(bool accept_dialog);
private:
// Shows the reload page dialog with the extensions information gathered in
// `extensions_info_`.
void Show();
// Called when an extension's icon has finished loading. `done_callback` is
// used to track when all extensions icons have been loaded.
void OnExtensionIconLoaded(const ExtensionId& extension_id,
const std::string& extension_name,
base::OnceClosure done_callback,
const gfx::Image& icon);
// Reloads the active page once the dialog is accepted.
void OnAcceptSelected();
raw_ptr<content::WebContents> web_contents_;
raw_ptr<content::BrowserContext> browser_context_;
// Information for the extensions to be displayed in the dialog.
std::vector<ExtensionInfo> extensions_info_;
base::WeakPtrFactory<ReloadPageDialogController> weak_ptr_factory_{this};
};
} // namespace extensions
#endif // CHROME_BROWSER_UI_EXTENSIONS_RELOAD_PAGE_DIALOG_CONTROLLER_H_