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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_MANAGER_H_
#define CONTENT_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_MANAGER_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/memory/raw_ref.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/push_messaging_service.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom.h"
#include "url/gurl.h"
namespace blink {
namespace mojom {
enum class PushRegistrationStatus;
enum class PushUnregistrationStatus;
} // namespace mojom
} // namespace blink
namespace url {
class Origin;
} // namespace url
namespace content {
class PushMessagingService;
class RenderProcessHost;
class ServiceWorkerContextWrapper;
// Documented at definition.
extern const char kPushSenderIdServiceWorkerKey[];
extern const char kPushRegistrationIdServiceWorkerKey[];
// Owned by RenderFrameHostImpl (if `this` handles requests from a document) or
// RenderProcessHostImpl (if `this` handles requests from a service worker).
// Lives on the UI thread.
class PushMessagingManager : public blink::mojom::PushMessaging {
public:
PushMessagingManager(
RenderProcessHost& render_process_host,
int render_frame_id,
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context);
PushMessagingManager(const PushMessagingManager&) = delete;
PushMessagingManager& operator=(const PushMessagingManager&) = delete;
~PushMessagingManager() override;
void AddPushMessagingReceiver(
mojo::PendingReceiver<blink::mojom::PushMessaging> receiver);
base::WeakPtr<PushMessagingManager> AsWeakPtr() {
return weak_factory_.GetWeakPtr();
}
// blink::mojom::PushMessaging impl.
void Subscribe(int64_t service_worker_registration_id,
blink::mojom::PushSubscriptionOptionsPtr options,
bool user_gesture,
SubscribeCallback callback) override;
void Unsubscribe(int64_t service_worker_registration_id,
UnsubscribeCallback callback) override;
void GetSubscription(int64_t service_worker_registration_id,
GetSubscriptionCallback callback) override;
private:
struct RegisterData;
void Register(RegisterData data);
void DidRegister(RegisterData data,
const std::string& push_subscription_id,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth,
blink::mojom::PushRegistrationStatus status);
void DidRequestPermissionInIncognito(RegisterData data,
blink::mojom::PermissionStatus status);
void DidCheckForExistingRegistration(
RegisterData data,
const std::vector<std::string>& subscription_id_and_sender_id,
blink::ServiceWorkerStatusCode service_worker_status);
void DidGetSenderIdFromStorage(
RegisterData data,
const std::vector<std::string>& sender_id,
blink::ServiceWorkerStatusCode service_worker_status);
void PersistRegistration(RegisterData data,
const std::string& push_subscription_id,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth,
blink::mojom::PushRegistrationStatus status);
void DidPersistRegistration(
RegisterData data,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth,
blink::mojom::PushRegistrationStatus push_registration_status,
blink::ServiceWorkerStatusCode service_worker_status);
void SendSubscriptionError(RegisterData data,
blink::mojom::PushRegistrationStatus status);
void SendSubscriptionSuccess(RegisterData data,
blink::mojom::PushRegistrationStatus status,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth);
void GetSubscriptionDidUnsubscribe(
GetSubscriptionCallback callback,
blink::mojom::PushGetRegistrationStatus get_status,
blink::mojom::PushUnregistrationStatus unsubscribe_status);
void GetSubscriptionDidGetInfo(
GetSubscriptionCallback callback,
const url::Origin& origin,
int64_t service_worker_registration_id,
const std::string& application_server_key,
bool is_valid,
const GURL& endpoint,
const std::optional<base::Time>& expiration_time,
const std::vector<uint8_t>& p256dh,
const std::vector<uint8_t>& auth);
void GetSubscriptionInfo(
const url::Origin& origin,
int64_t service_worker_registration_id,
const std::string& sender_id,
const std::string& push_subscription_id,
PushMessagingService::SubscriptionInfoCallback callback);
void UnsubscribeHavingGottenSenderId(
UnsubscribeCallback callback,
int64_t service_worker_registration_id,
const url::Origin& requesting_origin,
const std::vector<std::string>& sender_id,
blink::ServiceWorkerStatusCode service_worker_status);
void DidUnregister(
UnsubscribeCallback callback,
blink::mojom::PushUnregistrationStatus unregistration_status);
void DidGetSubscription(
GetSubscriptionCallback callback,
int64_t service_worker_registration_id,
const std::vector<std::string>& push_subscription_id_and_sender_info,
blink::ServiceWorkerStatusCode service_worker_status);
PushMessagingService* GetService();
const raw_ref<RenderProcessHost> render_process_host_;
// Will be ChildProcessHost::kInvalidUniqueID in requests from Service Worker.
const int render_frame_id_;
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
const bool is_incognito_;
// Whether the PushMessagingService was available when constructed.
const bool service_available_;
mojo::ReceiverSet<blink::mojom::PushMessaging> receivers_;
base::WeakPtrFactory<PushMessagingManager> weak_factory_{this};
};
} // namespace content
#endif // CONTENT_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_MANAGER_H_
|