1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef DOM_NOTIFICATION_NOTIFICATIONUTILS_H_
#define DOM_NOTIFICATION_NOTIFICATIONUTILS_H_
#include <cstdint>
#include "mozilla/dom/DOMTypes.h"
#include "nsCOMPtr.h"
#include "nsINotificationStorage.h"
#include "nsStringFwd.h"
enum class nsresult : uint32_t;
class nsIAlertNotification;
class nsIPrincipal;
class nsINotificationStorage;
namespace mozilla::dom {
enum class NotificationPermission : uint8_t;
class Document;
} // namespace mozilla::dom
namespace mozilla::dom::notification {
// The spec defines maxActions to depend on system limitation, but that can be
// used for fingerprinting.
// See also https://github.com/whatwg/notifications/issues/110.
static constexpr uint8_t kMaxActions = 2;
/**
* Retrieves raw notification permission directly from PermissionManager.
*/
NotificationPermission GetRawNotificationPermission(nsIPrincipal* aPrincipal);
enum class PermissionCheckPurpose : uint8_t {
PermissionRequest,
PermissionAttribute,
NotificationShow,
};
/**
* Returns true if the current principal must be given notification
* permission, regardless of the permission status. This one should be dominant
* compared to FobbiddenFor below.
*/
bool IsNotificationAllowedFor(nsIPrincipal* aPrincipal);
/**
* Returns true if the current principal must not be given notification
* permission, regardless of the permission status.
*
* @param aRequestorDoc The Document object from the page requesting permission.
* Pass only when this is for requestNotification().
*/
bool IsNotificationForbiddenFor(nsIPrincipal* aPrincipal,
nsIPrincipal* aEffectiveStoragePrincipal,
bool isSecureContext,
PermissionCheckPurpose aPurpose,
Document* aRequestorDoc = nullptr);
/**
* Retrieves notification permission based on the context.
*/
NotificationPermission GetNotificationPermission(
nsIPrincipal* aPrincipal, nsIPrincipal* aEffectiveStoragePrincipal,
bool isSecureContext, PermissionCheckPurpose aPurpose);
nsCOMPtr<nsINotificationStorage> GetNotificationStorage(bool isPrivate);
using NotificationsPromise =
MozPromise<CopyableTArray<IPCNotification>, nsresult, false>;
already_AddRefed<NotificationsPromise> GetStoredNotificationsForScope(
nsIPrincipal* aPrincipal, const nsACString& aScope, const nsAString& aTag);
nsresult GetOrigin(nsIPrincipal* aPrincipal, nsString& aOrigin);
nsresult PersistNotification(nsIPrincipal* aPrincipal,
const IPCNotification& aNotification,
const nsString& aScope);
nsresult UnpersistNotification(nsIPrincipal* aPrincipal, const nsString& aId);
enum class CloseMode {
CloseMethod,
// Either on global teardown or freeze
InactiveGlobal,
};
void UnregisterNotification(nsIPrincipal* aPrincipal, const nsString& aId);
// Show an alert and clean up any previously stored notifications that
// aren't currently known to the notification backend.
//
// The cleanup happens when this is globally the first call, or always if
// dom.webnotifications.testing.force_storage_cleanup.enabled is set.
nsresult ShowAlertWithCleanup(nsIAlertNotification* aAlert,
nsIObserver* aAlertListener);
nsresult RemovePermission(nsIPrincipal* aPrincipal);
nsresult OpenSettings(nsIPrincipal* aPrincipal);
enum class NotificationStatusChange { Shown, Closed };
nsresult AdjustPushQuota(nsIPrincipal* aPrincipal,
NotificationStatusChange aChange);
class NotificationActionStorageEntry
: public nsINotificationActionStorageEntry {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSINOTIFICATIONACTIONSTORAGEENTRY
explicit NotificationActionStorageEntry(
const IPCNotificationAction& aIPCAction)
: mIPCAction(aIPCAction) {}
static Result<IPCNotificationAction, nsresult> ToIPC(
nsINotificationActionStorageEntry& aEntry);
private:
virtual ~NotificationActionStorageEntry() = default;
IPCNotificationAction mIPCAction;
};
class NotificationStorageEntry : public nsINotificationStorageEntry {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSINOTIFICATIONSTORAGEENTRY
explicit NotificationStorageEntry(const IPCNotification& aIPCNotification)
: mIPCNotification(aIPCNotification) {}
static Result<IPCNotification, nsresult> ToIPC(
nsINotificationStorageEntry& aEntry);
private:
virtual ~NotificationStorageEntry() = default;
IPCNotification mIPCNotification;
};
} // namespace mozilla::dom::notification
#endif // DOM_NOTIFICATION_NOTIFICATIONUTILS_H_
|