// 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.
#ifndef CHROME_BROWSER_UI_VIEWS_PERMISSIONS_PERMISSION_PROMPT_NOTIFICATIONS_MAC_H_
#define CHROME_BROWSER_UI_VIEWS_PERMISSIONS_PERMISSION_PROMPT_NOTIFICATIONS_MAC_H_
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
#include "components/permissions/permission_prompt.h"
#include "components/webapps/common/web_app_id.h"
#include "content/public/browser/weak_document_ptr.h"
// PermissionPrompt implementation that delegates the permission request to an
// app shim associated with an (installed) PWA. If showing the OS-native prompt
// in the app shim fails, this will call RecreateView() to fall back to a
// regular chrome permission prompt. Additionally, if the app shim had
// previously been granted OS-level notifications permission, we'll also fall
// back to a regular chrome prompt, rather than automatically granting
// notification permission without showing any prompt.
class PermissionPromptNotificationsMac : public permissions::PermissionPrompt {
public:
PermissionPromptNotificationsMac(content::WebContents* web_contents,
Delegate* delegate);
PermissionPromptNotificationsMac(const PermissionPromptNotificationsMac&) =
delete;
PermissionPromptNotificationsMac& operator=(
const PermissionPromptNotificationsMac&) = delete;
~PermissionPromptNotificationsMac() override;
// Returns true if the current request for `delegate` is a notification
// permission request for a locally installed PWA.
static bool CanHandleRequest(content::WebContents* web_contents,
Delegate* delegate);
// permissions::PermissionPrompt:
bool UpdateAnchor() override;
TabSwitchingBehavior GetTabSwitchingBehavior() override;
permissions::PermissionPromptDisposition GetPromptDisposition()
const override;
bool IsAskPrompt() const override;
std::optional<gfx::Rect> GetViewBoundsInScreen() const override;
bool ShouldFinalizeRequestAfterDecided() const override;
std::vector<permissions::ElementAnchoredBubbleVariant> GetPromptVariants()
const override;
std::optional<permissions::feature_params::PermissionElementPromptPosition>
GetPromptPosition() const override;
private:
void ShowPrompt();
void OnPermissionResult(
mac_notifications::mojom::RequestPermissionResult result);
const webapps::AppId app_id_;
const raw_ptr<permissions::PermissionPrompt::Delegate> delegate_;
base::WeakPtrFactory<PermissionPromptNotificationsMac> weak_factory_{this};
};
#endif // CHROME_BROWSER_UI_VIEWS_PERMISSIONS_PERMISSION_PROMPT_NOTIFICATIONS_MAC_H_