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
|
// Copyright 2014 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.
#include "modules/push_messaging/PushSubscription.h"
#include "bindings/core/v8/CallbackPromiseAdapter.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "modules/push_messaging/PushError.h"
#include "modules/push_messaging/PushSubscriptionOptions.h"
#include "modules/serviceworkers/ServiceWorkerRegistration.h"
#include "public/platform/Platform.h"
#include "public/platform/modules/push_messaging/WebPushProvider.h"
#include "public/platform/modules/push_messaging/WebPushSubscription.h"
#include "wtf/Assertions.h"
#include "wtf/text/Base64.h"
#include <memory>
namespace blink {
PushSubscription* PushSubscription::take(
ScriptPromiseResolver*,
std::unique_ptr<WebPushSubscription> pushSubscription,
ServiceWorkerRegistration* serviceWorkerRegistration) {
if (!pushSubscription)
return nullptr;
return new PushSubscription(*pushSubscription, serviceWorkerRegistration);
}
void PushSubscription::dispose(WebPushSubscription* pushSubscription) {
if (pushSubscription)
delete pushSubscription;
}
PushSubscription::PushSubscription(
const WebPushSubscription& subscription,
ServiceWorkerRegistration* serviceWorkerRegistration)
: m_endpoint(subscription.endpoint),
m_options(PushSubscriptionOptions::create(subscription.options)),
m_p256dh(DOMArrayBuffer::create(subscription.p256dh.data(),
subscription.p256dh.size())),
m_auth(DOMArrayBuffer::create(subscription.auth.data(),
subscription.auth.size())),
m_serviceWorkerRegistration(serviceWorkerRegistration) {}
PushSubscription::~PushSubscription() {}
DOMArrayBuffer* PushSubscription::getKey(const AtomicString& name) const {
if (name == "p256dh")
return m_p256dh;
if (name == "auth")
return m_auth;
return nullptr;
}
ScriptPromise PushSubscription::unsubscribe(ScriptState* scriptState) {
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
WebPushProvider* webPushProvider = Platform::current()->pushProvider();
DCHECK(webPushProvider);
webPushProvider->unsubscribe(
m_serviceWorkerRegistration->webRegistration(),
WTF::makeUnique<CallbackPromiseAdapter<bool, PushError>>(resolver));
return promise;
}
ScriptValue PushSubscription::toJSONForBinding(ScriptState* scriptState) {
DCHECK(m_p256dh);
V8ObjectBuilder result(scriptState);
result.addString("endpoint", endpoint());
V8ObjectBuilder keys(scriptState);
keys.add("p256dh",
WTF::base64URLEncode(static_cast<const char*>(m_p256dh->data()),
m_p256dh->byteLength()));
keys.add("auth",
WTF::base64URLEncode(static_cast<const char*>(m_auth->data()),
m_auth->byteLength()));
result.add("keys", keys);
return result.scriptValue();
}
DEFINE_TRACE(PushSubscription) {
visitor->trace(m_options);
visitor->trace(m_p256dh);
visitor->trace(m_auth);
visitor->trace(m_serviceWorkerRegistration);
}
} // namespace blink
|