blob: 2b7802f4765afda39f4f6f724882512f10dbaeeb [file] [log] [blame]
// Copyright 2015 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 "content/public/browser/push_messaging_service.h"
#include "base/bind.h"
#include "base/callback.h"
#include "content/browser/push_messaging/push_messaging_manager.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
namespace content {
namespace {
void CallStringCallback(
PushMessagingService::RegistrationUserDataCallback callback,
const std::vector<std::string>& data,
blink::ServiceWorkerStatusCode service_worker_status) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
bool success = service_worker_status == blink::ServiceWorkerStatusCode::kOk;
std::move(callback).Run(success ? data : std::vector<std::string>());
}
void CallClosure(base::OnceClosure callback,
blink::ServiceWorkerStatusCode status) {
std::move(callback).Run();
}
scoped_refptr<ServiceWorkerContextWrapper> GetServiceWorkerContext(
BrowserContext* browser_context, const GURL& origin) {
StoragePartition* partition =
browser_context->GetStoragePartitionForUrl(origin);
return base::WrapRefCounted(static_cast<ServiceWorkerContextWrapper*>(
partition->GetServiceWorkerContext()));
}
void GetSWDataCallback(PushMessagingService::SWDataCallback callback,
const std::vector<std::string>& result) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::string sender_id;
std::string subscription_id;
if (!result.empty()) {
DCHECK_EQ(2u, result.size());
sender_id = result[0];
subscription_id = result[1];
}
std::move(callback).Run(sender_id, subscription_id);
}
void GetSenderIdCallback(PushMessagingService::SenderIdCallback callback,
const std::vector<std::string>& result) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
std::string sender_id;
if (!result.empty()) {
DCHECK_EQ(1u, result.size());
sender_id = result[0];
}
std::move(callback).Run(sender_id);
}
} // anonymous namespace
// static
void PushMessagingService::GetSenderId(BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
SenderIdCallback callback) {
PushMessagingService::RegistrationUserDataCallback service_callback =
base::BindOnce(&GetSenderIdCallback, std::move(callback));
ServiceWorkerContextWrapper::GetUserDataCallback wrapper_callback =
base::BindOnce(&CallStringCallback, std::move(service_callback));
DCHECK_CURRENTLY_ON(BrowserThread::UI);
GetServiceWorkerContext(browser_context, origin)
->GetRegistrationUserData(
service_worker_registration_id,
std::vector<std::string>{kPushSenderIdServiceWorkerKey},
std::move(wrapper_callback));
}
// static
void PushMessagingService::GetSWData(BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
SWDataCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
PushMessagingService::RegistrationUserDataCallback service_callback =
base::BindOnce(&GetSWDataCallback, std::move(callback));
ServiceWorkerContextWrapper::GetUserDataCallback wrapper_callback =
base::BindOnce(&CallStringCallback, std::move(service_callback));
GetServiceWorkerContext(browser_context, origin)
->GetRegistrationUserData(
service_worker_registration_id,
std::vector<std::string>{kPushSenderIdServiceWorkerKey,
kPushRegistrationIdServiceWorkerKey},
std::move(wrapper_callback));
}
// static
void PushMessagingService::ClearPushSubscriptionId(
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
base::OnceClosure callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
GetServiceWorkerContext(browser_context, origin)
->ClearRegistrationUserData(
service_worker_registration_id, {kPushRegistrationIdServiceWorkerKey},
base::BindOnce(&CallClosure, std::move(callback)));
}
// static
void PushMessagingService::UpdatePushSubscriptionId(
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
const std::string& subscription_id,
base::OnceClosure callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
GetServiceWorkerContext(browser_context, origin)
->StoreRegistrationUserData(
service_worker_registration_id,
blink::StorageKey(url::Origin::Create(origin)),
{{kPushRegistrationIdServiceWorkerKey, subscription_id}},
base::BindOnce(&CallClosure, std::move(callback)));
}
// static
void PushMessagingService::StorePushSubscriptionForTesting(
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
const std::string& subscription_id,
const std::string& sender_id,
base::OnceClosure callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
GetServiceWorkerContext(browser_context, origin)
->StoreRegistrationUserData(
service_worker_registration_id,
blink::StorageKey(url::Origin::Create(origin)),
{{kPushRegistrationIdServiceWorkerKey, subscription_id},
{kPushSenderIdServiceWorkerKey, sender_id}},
base::BindOnce(&CallClosure, std::move(callback)));
}
} // namespace content