blob: c379c3a4ffc50f55205a6d8465e3d93be292a378 [file] [log] [blame]
// 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 "content/browser/service_worker/embedded_worker_test_helper.h"
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/memory/ptr_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_status.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_dispatcher_host.h"
#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/embedded_worker_start_params.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/common/push_event_payload.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_context.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "services/service_manager/public/cpp/interface_registry.h"
#include "services/service_manager/public/interfaces/interface_provider.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
namespace {
class MockServiceWorkerDispatcherHost : public ServiceWorkerDispatcherHost {
public:
MockServiceWorkerDispatcherHost(int process_id,
ResourceContext* resource_context,
IPC::Sender* sender)
: ServiceWorkerDispatcherHost(process_id, resource_context),
sender_(sender) {}
bool Send(IPC::Message* message) override { return sender_->Send(message); }
protected:
~MockServiceWorkerDispatcherHost() override {}
private:
IPC::Sender* sender_;
DISALLOW_COPY_AND_ASSIGN(MockServiceWorkerDispatcherHost);
};
} // namespace
EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
MockEmbeddedWorkerInstanceClient(
base::WeakPtr<EmbeddedWorkerTestHelper> helper)
: helper_(helper), binding_(this) {}
EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
~MockEmbeddedWorkerInstanceClient() {}
void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker(
const EmbeddedWorkerStartParams& params,
mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) {
if (!helper_)
return;
embedded_worker_id_ = params.embedded_worker_id;
EmbeddedWorkerInstance* worker =
helper_->registry()->GetWorker(params.embedded_worker_id);
ASSERT_TRUE(worker);
EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
helper_->OnStartWorkerStub(params, std::move(dispatcher_request));
}
void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StopWorker(
const StopWorkerCallback& callback) {
if (!helper_)
return;
ASSERT_TRUE(embedded_worker_id_);
EmbeddedWorkerInstance* worker =
helper_->registry()->GetWorker(embedded_worker_id_.value());
// |worker| is possible to be null when corresponding EmbeddedWorkerInstance
// is removed right after sending StopWorker.
if (worker)
EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status());
helper_->OnStopWorkerStub(callback);
}
void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
ResumeAfterDownload() {
helper_->OnResumeAfterDownloadStub(embedded_worker_id_.value());
}
void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
AddMessageToConsole(blink::WebConsoleMessage::Level level,
const std::string& message) {
// TODO(shimazu): Pass these arguments to the test helper when a test is
// necessary to check them individually.
}
// static
void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::Bind(
const base::WeakPtr<EmbeddedWorkerTestHelper>& helper,
mojom::EmbeddedWorkerInstanceClientRequest request) {
std::vector<std::unique_ptr<MockEmbeddedWorkerInstanceClient>>* clients =
helper->mock_instance_clients();
size_t next_client_index = helper->mock_instance_clients_next_index_;
ASSERT_GE(clients->size(), next_client_index);
if (clients->size() == next_client_index) {
clients->push_back(
base::MakeUnique<MockEmbeddedWorkerInstanceClient>(helper));
}
std::unique_ptr<MockEmbeddedWorkerInstanceClient>& client =
clients->at(next_client_index);
helper->mock_instance_clients_next_index_ = next_client_index + 1;
if (client)
client->binding_.Bind(std::move(request));
}
class EmbeddedWorkerTestHelper::MockServiceWorkerEventDispatcher
: public NON_EXPORTED_BASE(mojom::ServiceWorkerEventDispatcher) {
public:
static void Create(const base::WeakPtr<EmbeddedWorkerTestHelper>& helper,
int thread_id,
mojom::ServiceWorkerEventDispatcherRequest request) {
mojo::MakeStrongBinding(
base::MakeUnique<MockServiceWorkerEventDispatcher>(helper, thread_id),
std::move(request));
}
MockServiceWorkerEventDispatcher(
const base::WeakPtr<EmbeddedWorkerTestHelper>& helper,
int thread_id)
: helper_(helper), thread_id_(thread_id) {}
~MockServiceWorkerEventDispatcher() override {}
void DispatchActivateEvent(
const DispatchActivateEventCallback& callback) override {
if (!helper_)
return;
helper_->OnActivateEventStub(callback);
}
void DispatchFetchEvent(int fetch_event_id,
const ServiceWorkerFetchRequest& request,
mojom::FetchEventPreloadHandlePtr preload_handle,
const DispatchFetchEventCallback& callback) override {
if (!helper_)
return;
helper_->OnFetchEventStub(thread_id_, fetch_event_id, request,
std::move(preload_handle), callback);
}
void DispatchNotificationClickEvent(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
int action_index,
const base::Optional<base::string16>& reply,
const DispatchNotificationClickEventCallback& callback) override {
if (!helper_)
return;
helper_->OnNotificationClickEventStub(notification_id, notification_data,
action_index, reply, callback);
}
void DispatchNotificationCloseEvent(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
const DispatchNotificationCloseEventCallback& callback) override {
if (!helper_)
return;
helper_->OnNotificationCloseEventStub(notification_id, notification_data,
callback);
}
void DispatchPushEvent(const PushEventPayload& payload,
const DispatchPushEventCallback& callback) override {
if (!helper_)
return;
helper_->OnPushEventStub(payload, callback);
}
void DispatchSyncEvent(
const std::string& tag,
blink::mojom::BackgroundSyncEventLastChance last_chance,
const DispatchSyncEventCallback& callback) override {
NOTIMPLEMENTED();
}
void DispatchPaymentRequestEvent(
payments::mojom::PaymentAppRequestPtr app_request,
const DispatchPaymentRequestEventCallback& callback) override {
if (!helper_)
return;
helper_->OnPaymentRequestEventStub(std::move(app_request), callback);
}
void DispatchExtendableMessageEvent(
mojom::ExtendableMessageEventPtr event,
const DispatchExtendableMessageEventCallback& callback) override {
if (!helper_)
return;
helper_->OnExtendableMessageEventStub(std::move(event), callback);
}
private:
base::WeakPtr<EmbeddedWorkerTestHelper> helper_;
const int thread_id_;
};
EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
const base::FilePath& user_data_directory)
: browser_context_(new TestBrowserContext),
render_process_host_(new MockRenderProcessHost(browser_context_.get())),
new_render_process_host_(
new MockRenderProcessHost(browser_context_.get())),
wrapper_(new ServiceWorkerContextWrapper(browser_context_.get())),
mock_instance_clients_next_index_(0),
next_thread_id_(0),
mock_render_process_id_(render_process_host_->GetID()),
new_mock_render_process_id_(new_render_process_host_->GetID()),
weak_factory_(this) {
std::unique_ptr<MockServiceWorkerDatabaseTaskManager> database_task_manager(
new MockServiceWorkerDatabaseTaskManager(
base::ThreadTaskRunnerHandle::Get()));
wrapper_->InitInternal(user_data_directory, std::move(database_task_manager),
base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr);
wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id());
wrapper_->process_manager()->SetNewProcessIdForTest(new_render_process_id());
scoped_refptr<ServiceWorkerDispatcherHost> dispatcher_host(
new MockServiceWorkerDispatcherHost(
mock_render_process_id_, browser_context_->GetResourceContext(),
this));
wrapper_->context()->AddDispatcherHost(mock_render_process_id_,
dispatcher_host.get());
dispatcher_hosts_[mock_render_process_id_] = std::move(dispatcher_host);
// Setup process level interface registry.
render_process_interface_registry_ =
CreateInterfaceRegistry(render_process_host_.get());
new_render_process_interface_registry_ =
CreateInterfaceRegistry(new_render_process_host_.get());
}
EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
if (wrapper_.get())
wrapper_->Shutdown();
}
void EmbeddedWorkerTestHelper::SimulateAddProcessToPattern(const GURL& pattern,
int process_id) {
if (!context()->GetDispatcherHost(process_id)) {
scoped_refptr<ServiceWorkerDispatcherHost> dispatcher_host(
new MockServiceWorkerDispatcherHost(
process_id, browser_context_->GetResourceContext(), this));
wrapper_->context()->AddDispatcherHost(process_id, dispatcher_host.get());
dispatcher_hosts_[process_id] = std::move(dispatcher_host);
}
wrapper_->process_manager()->AddProcessReferenceToPattern(pattern,
process_id);
}
bool EmbeddedWorkerTestHelper::Send(IPC::Message* message) {
OnMessageReceived(*message);
delete message;
return true;
}
bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
IPC_MESSAGE_HANDLER(EmbeddedWorkerContextMsg_MessageToWorker,
OnMessageToWorkerStub)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
// IPC::TestSink only records messages that are not handled by filters,
// so we just forward all messages to the separate sink.
sink_.OnMessageReceived(message);
return handled;
}
void EmbeddedWorkerTestHelper::RegisterMockInstanceClient(
std::unique_ptr<MockEmbeddedWorkerInstanceClient> client) {
mock_instance_clients_.push_back(std::move(client));
}
ServiceWorkerContextCore* EmbeddedWorkerTestHelper::context() {
return wrapper_->context();
}
void EmbeddedWorkerTestHelper::ShutdownContext() {
wrapper_->Shutdown();
wrapper_ = NULL;
}
// static
net::HttpResponseInfo EmbeddedWorkerTestHelper::CreateHttpResponseInfo() {
net::HttpResponseInfo info;
const char data[] =
"HTTP/1.1 200 OK\0"
"Content-Type: application/javascript\0"
"\0";
info.headers =
new net::HttpResponseHeaders(std::string(data, arraysize(data)));
return info;
}
void EmbeddedWorkerTestHelper::OnStartWorker(
int embedded_worker_id,
int64_t service_worker_version_id,
const GURL& scope,
const GURL& script_url,
bool pause_after_download,
mojom::ServiceWorkerEventDispatcherRequest request) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
MockServiceWorkerEventDispatcher::Create(AsWeakPtr(), worker->thread_id(),
std::move(request));
embedded_worker_id_service_worker_version_id_map_[embedded_worker_id] =
service_worker_version_id;
SimulateWorkerReadyForInspection(embedded_worker_id);
SimulateWorkerScriptCached(embedded_worker_id);
SimulateWorkerScriptLoaded(embedded_worker_id);
if (!pause_after_download)
OnResumeAfterDownload(embedded_worker_id);
}
void EmbeddedWorkerTestHelper::OnResumeAfterDownload(int embedded_worker_id) {
SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id);
SimulateWorkerScriptEvaluated(embedded_worker_id, true /* success */);
SimulateWorkerStarted(embedded_worker_id);
}
void EmbeddedWorkerTestHelper::OnStopWorker(
const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) {
// By default just notify the sender that the worker is stopped.
callback.Run();
}
bool EmbeddedWorkerTestHelper::OnMessageToWorker(int thread_id,
int embedded_worker_id,
const IPC::Message& message) {
bool handled = true;
current_embedded_worker_id_ = embedded_worker_id;
IPC_BEGIN_MESSAGE_MAP(EmbeddedWorkerTestHelper, message)
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEventStub)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
// Record all messages directed to inner script context.
inner_sink_.OnMessageReceived(message);
return handled;
}
void EmbeddedWorkerTestHelper::OnActivateEvent(
const mojom::ServiceWorkerEventDispatcher::DispatchActivateEventCallback&
callback) {
dispatched_events()->push_back(Event::Activate);
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnExtendableMessageEvent(
mojom::ExtendableMessageEventPtr event,
const mojom::ServiceWorkerEventDispatcher::
DispatchExtendableMessageEventCallback& callback) {
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnInstallEvent(int embedded_worker_id,
int request_id) {
// The installing worker may have been doomed and terminated.
if (!registry()->GetWorker(embedded_worker_id))
return;
SimulateSend(new ServiceWorkerHostMsg_InstallEventFinished(
embedded_worker_id, request_id,
blink::WebServiceWorkerEventResultCompleted, true, base::Time::Now()));
}
void EmbeddedWorkerTestHelper::OnFetchEvent(
int embedded_worker_id,
int fetch_event_id,
const ServiceWorkerFetchRequest& request,
mojom::FetchEventPreloadHandlePtr preload_handle,
const FetchCallback& callback) {
SimulateSend(new ServiceWorkerHostMsg_FetchEventResponse(
embedded_worker_id, fetch_event_id,
SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
ServiceWorkerResponse(
base::MakeUnique<std::vector<GURL>>(), 200, "OK",
blink::WebServiceWorkerResponseTypeDefault,
base::MakeUnique<ServiceWorkerHeaderMap>(), std::string(), 0, GURL(),
blink::WebServiceWorkerResponseErrorUnknown, base::Time(),
false /* is_in_cache_storage */,
std::string() /* cache_storage_cache_name */,
base::MakeUnique<
ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
base::Time::Now()));
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnPushEvent(
const PushEventPayload& payload,
const mojom::ServiceWorkerEventDispatcher::DispatchPushEventCallback&
callback) {
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnNotificationClickEvent(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
int action_index,
const base::Optional<base::string16>& reply,
const mojom::ServiceWorkerEventDispatcher::
DispatchNotificationClickEventCallback& callback) {
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnNotificationCloseEvent(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
const mojom::ServiceWorkerEventDispatcher::
DispatchNotificationCloseEventCallback& callback) {
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::OnPaymentRequestEvent(
payments::mojom::PaymentAppRequestPtr app_request,
const mojom::ServiceWorkerEventDispatcher::
DispatchPaymentRequestEventCallback& callback) {
callback.Run(SERVICE_WORKER_OK, base::Time::Now());
}
void EmbeddedWorkerTestHelper::SimulateWorkerReadyForInspection(
int embedded_worker_id) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
registry()->OnWorkerReadyForInspection(worker->process_id(),
embedded_worker_id);
}
void EmbeddedWorkerTestHelper::SimulateWorkerScriptCached(
int embedded_worker_id) {
int64_t version_id =
embedded_worker_id_service_worker_version_id_map_[embedded_worker_id];
ServiceWorkerVersion* version = context()->GetLiveVersion(version_id);
if (!version || version->script_cache_map()->size())
return;
std::vector<ServiceWorkerDatabase::ResourceRecord> records;
// Add a dummy ResourceRecord for the main script to the script cache map of
// the ServiceWorkerVersion. We use embedded_worker_id for resource_id to
// avoid ID collision.
records.push_back(ServiceWorkerDatabase::ResourceRecord(
embedded_worker_id, version->script_url(), 100));
version->script_cache_map()->SetResources(records);
version->SetMainScriptHttpResponseInfo(CreateHttpResponseInfo());
}
void EmbeddedWorkerTestHelper::SimulateWorkerScriptLoaded(
int embedded_worker_id) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
registry()->OnWorkerScriptLoaded(worker->process_id(), embedded_worker_id);
}
void EmbeddedWorkerTestHelper::SimulateWorkerThreadStarted(
int thread_id,
int embedded_worker_id) {
thread_id_embedded_worker_id_map_[thread_id] = embedded_worker_id;
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
registry()->OnWorkerThreadStarted(worker->process_id(), thread_id,
embedded_worker_id);
}
void EmbeddedWorkerTestHelper::SimulateWorkerScriptEvaluated(
int embedded_worker_id,
bool success) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
registry()->OnWorkerScriptEvaluated(worker->process_id(), embedded_worker_id,
success);
}
void EmbeddedWorkerTestHelper::SimulateWorkerStarted(int embedded_worker_id) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
registry()->OnWorkerStarted(worker->process_id(), embedded_worker_id);
}
void EmbeddedWorkerTestHelper::SimulateWorkerStopped(int embedded_worker_id) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
if (worker)
registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id);
}
void EmbeddedWorkerTestHelper::SimulateSend(IPC::Message* message) {
registry()->OnMessageReceived(*message, mock_render_process_id_);
delete message;
}
void EmbeddedWorkerTestHelper::OnStartWorkerStub(
const EmbeddedWorkerStartParams& params,
mojom::ServiceWorkerEventDispatcherRequest request) {
EmbeddedWorkerInstance* worker =
registry()->GetWorker(params.embedded_worker_id);
ASSERT_TRUE(worker);
EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, AsWeakPtr(),
params.embedded_worker_id, params.service_worker_version_id,
params.scope, params.script_url, params.pause_after_download,
base::Passed(&request)));
}
void EmbeddedWorkerTestHelper::OnResumeAfterDownloadStub(
int embedded_worker_id) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnResumeAfterDownload,
AsWeakPtr(), embedded_worker_id));
}
void EmbeddedWorkerTestHelper::OnStopWorkerStub(
const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnStopWorker,
AsWeakPtr(), callback));
}
void EmbeddedWorkerTestHelper::OnMessageToWorkerStub(
int thread_id,
int embedded_worker_id,
const IPC::Message& message) {
EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id);
ASSERT_TRUE(worker);
EXPECT_EQ(worker->thread_id(), thread_id);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(
base::IgnoreResult(&EmbeddedWorkerTestHelper::OnMessageToWorker),
AsWeakPtr(), thread_id, embedded_worker_id, message));
}
void EmbeddedWorkerTestHelper::OnActivateEventStub(
const mojom::ServiceWorkerEventDispatcher::DispatchActivateEventCallback&
callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnActivateEvent,
AsWeakPtr(), callback));
}
void EmbeddedWorkerTestHelper::OnExtendableMessageEventStub(
mojom::ExtendableMessageEventPtr event,
const mojom::ServiceWorkerEventDispatcher::
DispatchExtendableMessageEventCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnExtendableMessageEvent,
AsWeakPtr(), base::Passed(&event), callback));
}
void EmbeddedWorkerTestHelper::OnInstallEventStub(int request_id) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&EmbeddedWorkerTestHelper::OnInstallEvent, AsWeakPtr(),
current_embedded_worker_id_, request_id));
}
void EmbeddedWorkerTestHelper::OnFetchEventStub(
int thread_id,
int fetch_event_id,
const ServiceWorkerFetchRequest& request,
mojom::FetchEventPreloadHandlePtr preload_handle,
const FetchCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&EmbeddedWorkerTestHelper::OnFetchEvent, AsWeakPtr(),
thread_id_embedded_worker_id_map_[thread_id], fetch_event_id,
request, base::Passed(&preload_handle), callback));
}
void EmbeddedWorkerTestHelper::OnNotificationClickEventStub(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
int action_index,
const base::Optional<base::string16>& reply,
const mojom::ServiceWorkerEventDispatcher::
DispatchNotificationClickEventCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnNotificationClickEvent,
AsWeakPtr(), notification_id, notification_data,
action_index, reply, callback));
}
void EmbeddedWorkerTestHelper::OnNotificationCloseEventStub(
const std::string& notification_id,
const PlatformNotificationData& notification_data,
const mojom::ServiceWorkerEventDispatcher::
DispatchNotificationCloseEventCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&EmbeddedWorkerTestHelper::OnNotificationCloseEvent,
AsWeakPtr(), notification_id, notification_data, callback));
}
void EmbeddedWorkerTestHelper::OnPushEventStub(
const PushEventPayload& payload,
const mojom::ServiceWorkerEventDispatcher::DispatchPushEventCallback&
callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnPushEvent, AsWeakPtr(),
payload, callback));
}
void EmbeddedWorkerTestHelper::OnPaymentRequestEventStub(
payments::mojom::PaymentAppRequestPtr app_request,
const mojom::ServiceWorkerEventDispatcher::
DispatchPaymentRequestEventCallback& callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(&EmbeddedWorkerTestHelper::OnPaymentRequestEvent, AsWeakPtr(),
base::Passed(std::move(app_request)), callback));
}
EmbeddedWorkerRegistry* EmbeddedWorkerTestHelper::registry() {
DCHECK(context());
return context()->embedded_worker_registry();
}
std::unique_ptr<service_manager::InterfaceRegistry>
EmbeddedWorkerTestHelper::CreateInterfaceRegistry(MockRenderProcessHost* rph) {
auto registry =
base::MakeUnique<service_manager::InterfaceRegistry>(std::string());
registry->AddInterface(
base::Bind(&MockEmbeddedWorkerInstanceClient::Bind, AsWeakPtr()));
service_manager::mojom::InterfaceProviderPtr interfaces;
registry->Bind(mojo::MakeRequest(&interfaces), service_manager::Identity(),
service_manager::InterfaceProviderSpec(),
service_manager::Identity(),
service_manager::InterfaceProviderSpec());
std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces(
new service_manager::InterfaceProvider);
remote_interfaces->Bind(std::move(interfaces));
rph->SetRemoteInterfaces(std::move(remote_interfaces));
return registry;
}
} // namespace content