blob: 25f37bf83f8e9ad43e6cee9a44d5f9908ac22c3c [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_UNINSTALL_DIALOG_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_UNINSTALL_DIALOG_VIEW_H_
#include <map>
#include <memory>
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/threading/thread_checker.h"
#include "chrome/browser/ui/web_applications/web_app_uninstall_dialog.h"
#include "chrome/browser/web_applications/components/app_registrar.h"
#include "chrome/browser/web_applications/components/app_registrar_observer.h"
#include "chrome/browser/web_applications/components/web_app_id.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/window/dialog_delegate.h"
#include "url/gurl.h"
class NativeWindowTracker;
class Profile;
class WebAppUninstallDialogViews;
namespace webapps {
enum class WebappUninstallSource;
}
namespace views {
class Checkbox;
}
// The dialog's view, owned by the views framework.
class WebAppUninstallDialogDelegateView : public views::DialogDelegateView {
public:
METADATA_HEADER(WebAppUninstallDialogDelegateView);
// Constructor for view component of dialog.
WebAppUninstallDialogDelegateView(
Profile* profile,
WebAppUninstallDialogViews* dialog_view,
web_app::AppId app_id,
bool show_data_clearing_confirmation,
webapps::WebappUninstallSource uninstall_source,
std::map<SquareSizePx, SkBitmap> icon_bitmaps);
WebAppUninstallDialogDelegateView(const WebAppUninstallDialogDelegateView&) =
delete;
WebAppUninstallDialogDelegateView& operator=(
const WebAppUninstallDialogDelegateView&) = delete;
~WebAppUninstallDialogDelegateView() override;
void ProcessAutoConfirmValue();
private:
// views::DialogDelegateView:
ui::ImageModel GetWindowIcon() override;
// Uninstalls the web app.
void Uninstall();
void ClearWebAppSiteData();
void OnDialogAccepted();
void OnDialogCanceled();
WebAppUninstallDialogViews* dialog_;
views::Checkbox* checkbox_ = nullptr;
gfx::ImageSkia image_;
// The web app we are showing the dialog for.
const web_app::AppId app_id_;
// The dialog needs start_url copy even if app gets uninstalled.
GURL app_start_url_;
// Whether to show the 'Also clear data for this site' checkbox.
bool show_data_clearing_confirmation_ = true;
Profile* const profile_;
webapps::WebappUninstallSource uninstall_source_;
};
// The implementation of the uninstall dialog for web apps.
class WebAppUninstallDialogViews : public web_app::WebAppUninstallDialog,
public web_app::AppRegistrarObserver {
public:
// Implement this callback to handle checking for the dialog's header message.
using OnWillShowCallback =
base::RepeatingCallback<void(WebAppUninstallDialogViews*)>;
WebAppUninstallDialogViews(Profile* profile, gfx::NativeWindow parent);
WebAppUninstallDialogViews(const WebAppUninstallDialogViews&) = delete;
WebAppUninstallDialogViews& operator=(const WebAppUninstallDialogViews&) =
delete;
~WebAppUninstallDialogViews() override;
// Whether to show the 'Also clear data for this site' checkbox. Defaults to
// |true|, but when set to |false| implies deletion of data for the site will
// occur.
void show_data_clearing_confirmation(bool value) {
show_data_clearing_confirmation_ = value;
}
// web_app::WebAppUninstallDialog:
void ConfirmUninstall(const web_app::AppId& app_id,
webapps::WebappUninstallSource uninstall_source,
OnWebAppUninstallDialogClosed closed_callback) override;
void SetDialogShownCallbackForTesting(base::OnceClosure callback) override;
// The following methods are used by WebAppUninstallDialogDelegateView to
// report the uninstallation request status. After calling one of these
// methods, it is invalid to call any of them again.
// Called when the view is triggering an uninstallation with the
// WebAppProvider system. Returns a callback to be passed to this system.
base::OnceCallback<void(bool uninstalled)> UninstallStarted();
// Called to signify that the uninstall has been cancelled.
void UninstallCancelled();
private:
// web_app::AppRegistrarObserver:
void OnWebAppWillBeUninstalled(const web_app::AppId& app_id) override;
void OnAppRegistrarDestroyed() override;
void OnIconsRead(webapps::WebappUninstallSource uninstall_source,
std::map<SquareSizePx, SkBitmap> icon_bitmaps);
// The dialog's parent window.
const gfx::NativeWindow parent_;
// The callback we will call Accepted/Canceled on after confirmation dialog.
OnWebAppUninstallDialogClosed closed_callback_;
base::OnceClosure dialog_shown_callback_for_testing_;
// Tracks whether |parent_| got destroyed.
std::unique_ptr<NativeWindowTracker> parent_window_tracker_;
base::ScopedObservation<web_app::AppRegistrar, web_app::AppRegistrarObserver>
registrar_observation_{this};
WebAppUninstallDialogDelegateView* view_ = nullptr;
// The web app we are showing the dialog for.
web_app::AppId app_id_;
Profile* const profile_;
// Whether to show the 'Also clear data for this site' checkbox.
bool show_data_clearing_confirmation_ = true;
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<WebAppUninstallDialogViews> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_WEB_APP_UNINSTALL_DIALOG_VIEW_H_