Commit d1d43314 authored by Matt Falkenhagen's avatar Matt Falkenhagen Committed by Commit Bot

service worker: Eagerly provide CacheStoragePtr at worker startup.

Most service workers will need CacheStoragePtr in a performance
sensitive way. We discovered there is slowness using InterfaceProvider
to get the ptr on first use after worker startup.

Bug: 854905
Change-Id: Iefcd8910d1b8b6ba1cfcc4df79c213abde0f9e3a
Reviewed-on: https://chromium-review.googlesource.com/1124130
Commit-Queue: Matt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#572544}
parent 1e89eb17
...@@ -218,6 +218,8 @@ class CONTENT_EXPORT RenderProcessHostImpl ...@@ -218,6 +218,8 @@ class CONTENT_EXPORT RenderProcessHostImpl
bool HostHasNotBeenUsed() override; bool HostHasNotBeenUsed() override;
void LockToOrigin(const GURL& lock_url) override; void LockToOrigin(const GURL& lock_url) override;
void BindCacheStorage(blink::mojom::CacheStorageRequest request,
const url::Origin& origin) override;
mojom::RouteProvider* GetRemoteRouteProvider(); mojom::RouteProvider* GetRemoteRouteProvider();
...@@ -405,11 +407,6 @@ class CONTENT_EXPORT RenderProcessHostImpl ...@@ -405,11 +407,6 @@ class CONTENT_EXPORT RenderProcessHostImpl
bool is_initialized() const { return is_initialized_; } bool is_initialized() const { return is_initialized_; }
// Binds Mojo request to Mojo implementation CacheStorageDispatcherHost
// instance, binding is sent to IO thread.
void BindCacheStorage(blink::mojom::CacheStorageRequest request,
const url::Origin& origin);
// Ensures that this process is kept alive for the specified amount of time. // Ensures that this process is kept alive for the specified amount of time.
// This is used to ensure that unload handlers have a chance to execute // This is used to ensure that unload handlers have a chance to execute
// before the process shuts down. // before the process shuts down.
......
...@@ -81,7 +81,8 @@ using SetupProcessCallback = base::OnceCallback<void( ...@@ -81,7 +81,8 @@ using SetupProcessCallback = base::OnceCallback<void(
mojom::EmbeddedWorkerStartParamsPtr, mojom::EmbeddedWorkerStartParamsPtr,
std::unique_ptr<ServiceWorkerProcessManager::AllocatedProcessInfo>, std::unique_ptr<ServiceWorkerProcessManager::AllocatedProcessInfo>,
std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy>, std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy>,
std::unique_ptr<URLLoaderFactoryBundleInfo>)>; std::unique_ptr<URLLoaderFactoryBundleInfo>,
blink::mojom::CacheStoragePtrInfo)>;
// Allocates a renderer process for starting a worker and does setup like // Allocates a renderer process for starting a worker and does setup like
// registering with DevTools. Called on the UI thread. Calls |callback| on the // registering with DevTools. Called on the UI thread. Calls |callback| on the
...@@ -106,7 +107,8 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager, ...@@ -106,7 +107,8 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager,
base::BindOnce(std::move(callback), base::BindOnce(std::move(callback),
blink::ServiceWorkerStatusCode::kErrorAbort, blink::ServiceWorkerStatusCode::kErrorAbort,
std::move(params), std::move(process_info), std::move(params), std::move(process_info),
std::move(devtools_proxy), std::move(factory_bundle))); std::move(devtools_proxy), std::move(factory_bundle),
nullptr /* cache_storage */));
return; return;
} }
...@@ -120,7 +122,7 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager, ...@@ -120,7 +122,7 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager,
BrowserThread::IO, FROM_HERE, BrowserThread::IO, FROM_HERE,
base::BindOnce(std::move(callback), status, std::move(params), base::BindOnce(std::move(callback), status, std::move(params),
std::move(process_info), std::move(devtools_proxy), std::move(process_info), std::move(devtools_proxy),
std::move(factory_bundle))); std::move(factory_bundle), nullptr /* cache_storage */));
return; return;
} }
const int process_id = process_info->process_id; const int process_id = process_info->process_id;
...@@ -130,6 +132,17 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager, ...@@ -130,6 +132,17 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager,
// rph->IsInitializedAndNotDead(). // rph->IsInitializedAndNotDead().
CHECK(rph); CHECK(rph);
// Create cache storage now as an optimization, so the service worker can use
// the Cache Storage API immediately on startup. Don't do this when
// byte-to-byte check will be performed on the worker (|pause_after_download|)
// as most of those workers will have byte-to-byte equality and abort instead
// of running.
blink::mojom::CacheStoragePtr cache_storage;
if (!params->pause_after_download) {
rph->BindCacheStorage(mojo::MakeRequest(&cache_storage),
url::Origin::Create(params->script_url));
}
// Bind |request|, which is attached to |EmbeddedWorkerInstance::client_|, to // Bind |request|, which is attached to |EmbeddedWorkerInstance::client_|, to
// the process. If the process dies, |client_|'s connection error callback // the process. If the process dies, |client_|'s connection error callback
// will be called on the IO thread. // will be called on the IO thread.
...@@ -209,7 +222,7 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager, ...@@ -209,7 +222,7 @@ void SetupOnUIThread(base::WeakPtr<ServiceWorkerProcessManager> process_manager,
BrowserThread::IO, FROM_HERE, BrowserThread::IO, FROM_HERE,
base::BindOnce(std::move(callback), status, std::move(params), base::BindOnce(std::move(callback), status, std::move(params),
std::move(process_info), std::move(devtools_proxy), std::move(process_info), std::move(devtools_proxy),
std::move(factory_bundle))); std::move(factory_bundle), cache_storage.PassInterface()));
} }
bool HasSentStartWorker(EmbeddedWorkerInstance::StartingPhase phase) { bool HasSentStartWorker(EmbeddedWorkerInstance::StartingPhase phase) {
...@@ -457,7 +470,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -457,7 +470,8 @@ class EmbeddedWorkerInstance::StartTask {
std::unique_ptr<ServiceWorkerProcessManager::AllocatedProcessInfo> std::unique_ptr<ServiceWorkerProcessManager::AllocatedProcessInfo>
process_info, process_info,
std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy> devtools_proxy, std::unique_ptr<EmbeddedWorkerInstance::DevToolsProxy> devtools_proxy,
std::unique_ptr<URLLoaderFactoryBundleInfo> factory_bundle) { std::unique_ptr<URLLoaderFactoryBundleInfo> factory_bundle,
blink::mojom::CacheStoragePtrInfo cache_storage) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
std::unique_ptr<WorkerProcessHandle> process_handle; std::unique_ptr<WorkerProcessHandle> process_handle;
...@@ -513,7 +527,8 @@ class EmbeddedWorkerInstance::StartTask { ...@@ -513,7 +527,8 @@ class EmbeddedWorkerInstance::StartTask {
} }
instance_->SendStartWorker(std::move(params), instance_->SendStartWorker(std::move(params),
std::move(factory_for_new_scripts)); std::move(factory_for_new_scripts),
std::move(cache_storage));
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker", TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ServiceWorker",
"INITIALIZING_ON_RENDERER", this); "INITIALIZING_ON_RENDERER", this);
...@@ -684,7 +699,8 @@ void EmbeddedWorkerInstance::OnRegisteredToDevToolsManager( ...@@ -684,7 +699,8 @@ void EmbeddedWorkerInstance::OnRegisteredToDevToolsManager(
void EmbeddedWorkerInstance::SendStartWorker( void EmbeddedWorkerInstance::SendStartWorker(
mojom::EmbeddedWorkerStartParamsPtr params, mojom::EmbeddedWorkerStartParamsPtr params,
scoped_refptr<network::SharedURLLoaderFactory> factory) { scoped_refptr<network::SharedURLLoaderFactory> factory,
blink::mojom::CacheStoragePtrInfo cache_storage) {
DCHECK(context_); DCHECK(context_);
DCHECK(params->dispatcher_request.is_pending()); DCHECK(params->dispatcher_request.is_pending());
DCHECK(params->controller_request.is_pending()); DCHECK(params->controller_request.is_pending());
...@@ -700,6 +716,7 @@ void EmbeddedWorkerInstance::SendStartWorker( ...@@ -700,6 +716,7 @@ void EmbeddedWorkerInstance::SendStartWorker(
inflight_start_task_->set_start_worker_sent_time(base::TimeTicks::Now()); inflight_start_task_->set_start_worker_sent_time(base::TimeTicks::Now());
params->provider_info = params->provider_info =
std::move(provider_info_getter_).Run(process_id(), std::move(factory)); std::move(provider_info_getter_).Run(process_id(), std::move(factory));
params->provider_info->cache_storage = std::move(cache_storage);
client_->StartWorker(std::move(params)); client_->StartWorker(std::move(params));
registry_->BindWorkerToProcess(process_id(), embedded_worker_id()); registry_->BindWorkerToProcess(process_id(), embedded_worker_id());
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace content { namespace content {
...@@ -239,12 +240,16 @@ class CONTENT_EXPORT EmbeddedWorkerInstance ...@@ -239,12 +240,16 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
// Sends the StartWorker message to the renderer. // Sends the StartWorker message to the renderer.
// //
// |cache_storage| is an optional optimization so the service worker can
// use the Cache Storage API immediately upon startup.
//
// S13nServiceWorker: // S13nServiceWorker:
// |factory| is used for loading non-installed scripts. It can internally be a // |factory| is used for loading non-installed scripts. It can internally be a
// bundle of factories instead of just the direct network factory to support // bundle of factories instead of just the direct network factory to support
// non-NetworkService schemes like chrome-extension:// URLs. // non-NetworkService schemes like chrome-extension:// URLs.
void SendStartWorker(mojom::EmbeddedWorkerStartParamsPtr params, void SendStartWorker(mojom::EmbeddedWorkerStartParamsPtr params,
scoped_refptr<network::SharedURLLoaderFactory> factory); scoped_refptr<network::SharedURLLoaderFactory> factory,
blink::mojom::CacheStoragePtrInfo cache_storage);
// Implements mojom::EmbeddedWorkerInstanceHost. // Implements mojom::EmbeddedWorkerInstanceHost.
// These functions all run on the IO thread. // These functions all run on the IO thread.
......
...@@ -948,4 +948,99 @@ TEST_F(EmbeddedWorkerInstanceTest, AddMessageToConsole) { ...@@ -948,4 +948,99 @@ TEST_F(EmbeddedWorkerInstanceTest, AddMessageToConsole) {
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status()); EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
} }
// Records whether a CacheStoragePtr was sent as part of StartWorker.
class RecordCacheStorageHelper : public EmbeddedWorkerTestHelper {
public:
RecordCacheStorageHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {}
~RecordCacheStorageHelper() override {}
void OnStartWorker(
int embedded_worker_id,
int64_t service_worker_version_id,
const GURL& scope,
const GURL& script_url,
bool pause_after_download,
mojom::ServiceWorkerEventDispatcherRequest dispatcher_request,
mojom::ControllerServiceWorkerRequest controller_request,
mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
override {
had_cache_storage_ = !!provider_info->cache_storage;
EmbeddedWorkerTestHelper::OnStartWorker(
embedded_worker_id, service_worker_version_id, scope, script_url,
pause_after_download, std::move(dispatcher_request),
std::move(controller_request), std::move(instance_host),
std::move(provider_info), std::move(installed_scripts_info));
}
bool had_cache_storage() const { return had_cache_storage_; }
private:
bool had_cache_storage_ = false;
};
// Test that the worker is given a CacheStoragePtr during startup, when
// |pause_after_download| is false.
TEST_F(EmbeddedWorkerInstanceTest, CacheStorageOptimization) {
const GURL scope("http://example.com/");
const GURL url("http://example.com/worker.js");
auto helper = std::make_unique<RecordCacheStorageHelper>();
auto* helper_rawptr = helper.get();
helper_ = std::move(helper);
RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
const int64_t version_id = pair.second->version_id();
std::unique_ptr<EmbeddedWorkerInstance> worker =
embedded_worker_registry()->CreateWorker(pair.second.get());
// First, test a worker without pause after download.
{
// Start the worker.
blink::ServiceWorkerStatusCode status =
blink::ServiceWorkerStatusCode::kMax;
base::RunLoop run_loop;
mojom::EmbeddedWorkerStartParamsPtr params =
CreateStartParams(version_id, scope, url);
worker->Start(
std::move(params), CreateProviderInfoGetter(),
base::BindOnce(&SaveStatusAndCall, &status, run_loop.QuitClosure()));
run_loop.Run();
EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status);
// Cache storage should have been sent.
EXPECT_TRUE(helper_rawptr->had_cache_storage());
// Stop the worker.
worker->Stop();
base::RunLoop().RunUntilIdle();
}
// Second, test a worker with pause after download.
{
// Start the worker until paused.
blink::ServiceWorkerStatusCode status =
blink::ServiceWorkerStatusCode::kMax;
mojom::EmbeddedWorkerStartParamsPtr params =
CreateStartParams(version_id, scope, url);
params->pause_after_download = true;
worker->Start(
std::move(params), CreateProviderInfoGetter(),
base::BindOnce(&SaveStatusAndCall, &status, base::DoNothing::Once<>()));
base::RunLoop().RunUntilIdle();
// Finish starting.
worker->ResumeAfterDownload();
base::RunLoop().RunUntilIdle();
EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status);
// Cache storage should not have been sent.
EXPECT_FALSE(helper_rawptr->had_cache_storage());
// Stop the worker.
worker->Stop();
base::RunLoop().RunUntilIdle();
}
}
} // namespace content } // namespace content
...@@ -10,6 +10,7 @@ import "services/service_manager/public/mojom/interface_provider.mojom"; ...@@ -10,6 +10,7 @@ import "services/service_manager/public/mojom/interface_provider.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
import "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom";
// The name of the InterfaceProviderSpec in service manifests used by the // The name of the InterfaceProviderSpec in service manifests used by the
// frame tree to expose service-worker-specific interfaces between renderer // frame tree to expose service-worker-specific interfaces between renderer
...@@ -40,6 +41,13 @@ struct ServiceWorkerProviderInfoForStartWorker { ...@@ -40,6 +41,13 @@ struct ServiceWorkerProviderInfoForStartWorker {
// importScripts(). // importScripts().
associated network.mojom.URLLoaderFactory? script_loader_factory_ptr_info; associated network.mojom.URLLoaderFactory? script_loader_factory_ptr_info;
// |cache_storage| is an optional optimization so the service worker can use
// the Cache Storage API immediately without using InterfaceProvider. May be
// null for service workers created for update checks, as the optimization
// would be wasteful because these workers usually are aborted after the
// byte-to-byte update check before running.
blink.mojom.CacheStorage? cache_storage;
service_manager.mojom.InterfaceProvider interface_provider; service_manager.mojom.InterfaceProvider interface_provider;
}; };
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "ipc/ipc_sender.h" #include "ipc/ipc_sender.h"
#include "media/media_buildflags.h" #include "media/media_buildflags.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
...@@ -435,6 +436,12 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Sender, ...@@ -435,6 +436,12 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Sender,
// https://crbug.com/846155. // https://crbug.com/846155.
virtual void LockToOrigin(const GURL& lock_url) = 0; virtual void LockToOrigin(const GURL& lock_url) = 0;
// Binds |request| to the CacheStorageDispatcherHost instance. The binding is
// sent to the IO thread. This is for internal use only, and is only exposed
// here to support MockRenderProcessHost usage in tests.
virtual void BindCacheStorage(blink::mojom::CacheStorageRequest request,
const url::Origin& origin) = 0;
// Returns the current number of active views in this process. Excludes // Returns the current number of active views in this process. Excludes
// any RenderViewHosts that are swapped out. // any RenderViewHosts that are swapped out.
size_t GetActiveViewCount(); size_t GetActiveViewCount();
......
...@@ -424,6 +424,12 @@ void MockRenderProcessHost::LockToOrigin(const GURL& lock_url) { ...@@ -424,6 +424,12 @@ void MockRenderProcessHost::LockToOrigin(const GURL& lock_url) {
is_renderer_locked_to_site_ = true; is_renderer_locked_to_site_ = true;
} }
void MockRenderProcessHost::BindCacheStorage(
blink::mojom::CacheStorageRequest request,
const url::Origin& origin) {
cache_storage_request_ = std::move(request);
}
void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) { void MockRenderProcessHost::FilterURL(bool empty_allowed, GURL* url) {
RenderProcessHostImpl::FilterURL(this, empty_allowed, url); RenderProcessHostImpl::FilterURL(this, empty_allowed, url);
} }
......
...@@ -144,6 +144,8 @@ class MockRenderProcessHost : public RenderProcessHost { ...@@ -144,6 +144,8 @@ class MockRenderProcessHost : public RenderProcessHost {
bool HostHasNotBeenUsed() override; bool HostHasNotBeenUsed() override;
void LockToOrigin(const GURL& lock_url) override; void LockToOrigin(const GURL& lock_url) override;
void BindCacheStorage(blink::mojom::CacheStorageRequest request,
const url::Origin& origin) override;
// IPC::Sender via RenderProcessHost. // IPC::Sender via RenderProcessHost.
bool Send(IPC::Message* msg) override; bool Send(IPC::Message* msg) override;
...@@ -212,6 +214,7 @@ class MockRenderProcessHost : public RenderProcessHost { ...@@ -212,6 +214,7 @@ class MockRenderProcessHost : public RenderProcessHost {
service_manager::Identity child_identity_; service_manager::Identity child_identity_;
bool is_renderer_locked_to_site_ = false; bool is_renderer_locked_to_site_ = false;
network::mojom::URLLoaderFactory* url_loader_factory_; network::mojom::URLLoaderFactory* url_loader_factory_;
blink::mojom::CacheStorageRequest cache_storage_request_;
base::WeakPtrFactory<MockRenderProcessHost> weak_ptr_factory_; base::WeakPtrFactory<MockRenderProcessHost> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(MockRenderProcessHost); DISALLOW_COPY_AND_ASSIGN(MockRenderProcessHost);
......
...@@ -55,8 +55,10 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker( ...@@ -55,8 +55,10 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker(
"EmbeddedWorkerInstanceClientImpl::StartWorker"); "EmbeddedWorkerInstanceClientImpl::StartWorker");
auto start_timing = mojom::EmbeddedWorkerStartTiming::New(); auto start_timing = mojom::EmbeddedWorkerStartTiming::New();
start_timing->start_worker_received_time = base::TimeTicks::Now(); start_timing->start_worker_received_time = base::TimeTicks::Now();
service_manager::mojom::InterfaceProviderPtr interface_provider( blink::mojom::CacheStoragePtrInfo cache_storage =
std::move(params->provider_info->interface_provider)); std::move(params->provider_info->cache_storage);
service_manager::mojom::InterfaceProviderPtrInfo interface_provider =
std::move(params->provider_info->interface_provider);
auto client = std::make_unique<ServiceWorkerContextClient>( auto client = std::make_unique<ServiceWorkerContextClient>(
params->embedded_worker_id, params->service_worker_version_id, params->embedded_worker_id, params->service_worker_version_id,
...@@ -77,6 +79,7 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker( ...@@ -77,6 +79,7 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker(
"ServiceWorker.EmbeddedWorkerInstanceClient.StartWorker", metric, "ServiceWorker.EmbeddedWorkerInstanceClient.StartWorker", metric,
StartWorkerHistogramEnum::NUM_TYPES); StartWorkerHistogramEnum::NUM_TYPES);
wrapper_ = StartWorkerContext(std::move(params), std::move(client), wrapper_ = StartWorkerContext(std::move(params), std::move(client),
std::move(cache_storage),
std::move(interface_provider)); std::move(interface_provider));
} }
...@@ -133,7 +136,8 @@ std::unique_ptr<EmbeddedWorkerInstanceClientImpl::WorkerWrapper> ...@@ -133,7 +136,8 @@ std::unique_ptr<EmbeddedWorkerInstanceClientImpl::WorkerWrapper>
EmbeddedWorkerInstanceClientImpl::StartWorkerContext( EmbeddedWorkerInstanceClientImpl::StartWorkerContext(
mojom::EmbeddedWorkerStartParamsPtr params, mojom::EmbeddedWorkerStartParamsPtr params,
std::unique_ptr<ServiceWorkerContextClient> context_client, std::unique_ptr<ServiceWorkerContextClient> context_client,
service_manager::mojom::InterfaceProviderPtr interface_provider) { blink::mojom::CacheStoragePtrInfo cache_storage,
service_manager::mojom::InterfaceProviderPtrInfo interface_provider) {
std::unique_ptr<blink::WebServiceWorkerInstalledScriptsManager> manager; std::unique_ptr<blink::WebServiceWorkerInstalledScriptsManager> manager;
// |installed_scripts_info| is null if scripts should be served by net layer, // |installed_scripts_info| is null if scripts should be served by net layer,
// when the worker is not installed, or the worker is launched for checking // when the worker is not installed, or the worker is launched for checking
...@@ -147,7 +151,7 @@ EmbeddedWorkerInstanceClientImpl::StartWorkerContext( ...@@ -147,7 +151,7 @@ EmbeddedWorkerInstanceClientImpl::StartWorkerContext(
std::make_unique<WorkerWrapper>(blink::WebEmbeddedWorker::Create( std::make_unique<WorkerWrapper>(blink::WebEmbeddedWorker::Create(
std::move(context_client), std::move(manager), std::move(context_client), std::move(manager),
params->content_settings_proxy.PassHandle(), params->content_settings_proxy.PassHandle(),
interface_provider.PassInterface().PassHandle())); cache_storage.PassHandle(), interface_provider.PassHandle()));
blink::WebEmbeddedWorkerStartData start_data; blink::WebEmbeddedWorkerStartData start_data;
start_data.script_url = params->script_url; start_data.script_url = params->script_url;
......
...@@ -101,7 +101,8 @@ class EmbeddedWorkerInstanceClientImpl ...@@ -101,7 +101,8 @@ class EmbeddedWorkerInstanceClientImpl
std::unique_ptr<WorkerWrapper> StartWorkerContext( std::unique_ptr<WorkerWrapper> StartWorkerContext(
mojom::EmbeddedWorkerStartParamsPtr params, mojom::EmbeddedWorkerStartParamsPtr params,
std::unique_ptr<ServiceWorkerContextClient> context_client, std::unique_ptr<ServiceWorkerContextClient> context_client,
service_manager::mojom::InterfaceProviderPtr interface_provider); blink::mojom::CacheStoragePtrInfo cache_storage,
service_manager::mojom::InterfaceProviderPtrInfo interface_provider);
mojo::Binding<mojom::EmbeddedWorkerInstanceClient> binding_; mojo::Binding<mojom::EmbeddedWorkerInstanceClient> binding_;
......
...@@ -57,6 +57,7 @@ class BLINK_EXPORT WebEmbeddedWorker { ...@@ -57,6 +57,7 @@ class BLINK_EXPORT WebEmbeddedWorker {
std::unique_ptr<WebServiceWorkerContextClient>, std::unique_ptr<WebServiceWorkerContextClient>,
std::unique_ptr<WebServiceWorkerInstalledScriptsManager>, std::unique_ptr<WebServiceWorkerInstalledScriptsManager>,
mojo::ScopedMessagePipeHandle content_settings_handle, mojo::ScopedMessagePipeHandle content_settings_handle,
mojo::ScopedMessagePipeHandle cache_storage,
mojo::ScopedMessagePipeHandle interface_provider); mojo::ScopedMessagePipeHandle interface_provider);
virtual ~WebEmbeddedWorker() = default; virtual ~WebEmbeddedWorker() = default;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "third_party/blink/renderer/core/fetch/response.h" #include "third_party/blink/renderer/core/fetch/response.h"
#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/console_message.h"
#include "third_party/blink/renderer/modules/cache_storage/cache_storage_error.h" #include "third_party/blink/renderer/modules/cache_storage/cache_storage_error.h"
#include "third_party/blink/renderer/modules/serviceworkers/service_worker_global_scope.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/network/http_names.h" #include "third_party/blink/renderer/platform/network/http_names.h"
...@@ -210,6 +211,18 @@ ScriptPromise CacheStorage::MatchImpl(ScriptState* script_state, ...@@ -210,6 +211,18 @@ ScriptPromise CacheStorage::MatchImpl(ScriptState* script_state,
CacheStorage::CacheStorage(ExecutionContext* context, CacheStorage::CacheStorage(ExecutionContext* context,
GlobalFetch::ScopedFetcher* fetcher) GlobalFetch::ScopedFetcher* fetcher)
: scoped_fetcher_(fetcher) { : scoped_fetcher_(fetcher) {
// Service workers may already have a CacheStoragePtr provided as an
// optimization.
if (context->IsServiceWorkerGlobalScope()) {
auto* service_worker = ToServiceWorkerGlobalScope(context);
mojom::blink::CacheStoragePtrInfo info = service_worker->TakeCacheStorage();
if (info) {
cache_storage_ptr_ = RevocableInterfacePtr<mojom::blink::CacheStorage>(
std::move(info), context->GetInterfaceInvalidator());
return;
}
}
context->GetInterfaceProvider()->GetInterface( context->GetInterfaceProvider()->GetInterface(
MakeRequest(&cache_storage_ptr_, context->GetInterfaceInvalidator())); MakeRequest(&cache_storage_ptr_, context->GetInterfaceInvalidator()));
} }
......
...@@ -77,13 +77,17 @@ std::unique_ptr<WebEmbeddedWorker> WebEmbeddedWorker::Create( ...@@ -77,13 +77,17 @@ std::unique_ptr<WebEmbeddedWorker> WebEmbeddedWorker::Create(
std::unique_ptr<WebServiceWorkerInstalledScriptsManager> std::unique_ptr<WebServiceWorkerInstalledScriptsManager>
installed_scripts_manager, installed_scripts_manager,
mojo::ScopedMessagePipeHandle content_settings_handle, mojo::ScopedMessagePipeHandle content_settings_handle,
mojo::ScopedMessagePipeHandle cache_storage,
mojo::ScopedMessagePipeHandle interface_provider) { mojo::ScopedMessagePipeHandle interface_provider) {
return std::make_unique<WebEmbeddedWorkerImpl>( return std::make_unique<WebEmbeddedWorkerImpl>(
std::move(client), std::move(installed_scripts_manager), std::move(client), std::move(installed_scripts_manager),
std::make_unique<ServiceWorkerContentSettingsProxy>( std::make_unique<ServiceWorkerContentSettingsProxy>(
// Chrome doesn't use interface versioning. // Chrome doesn't use interface versioning.
// TODO(falken): Is that comment about versioning correct?
mojom::blink::WorkerContentSettingsProxyPtrInfo( mojom::blink::WorkerContentSettingsProxyPtrInfo(
std::move(content_settings_handle), 0u)), std::move(content_settings_handle), 0u)),
mojom::blink::CacheStoragePtrInfo(std::move(cache_storage),
mojom::blink::CacheStorage::Version_),
service_manager::mojom::blink::InterfaceProviderPtrInfo( service_manager::mojom::blink::InterfaceProviderPtrInfo(
std::move(interface_provider), std::move(interface_provider),
service_manager::mojom::blink::InterfaceProvider::Version_)); service_manager::mojom::blink::InterfaceProvider::Version_));
...@@ -94,6 +98,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl( ...@@ -94,6 +98,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(
std::unique_ptr<WebServiceWorkerInstalledScriptsManager> std::unique_ptr<WebServiceWorkerInstalledScriptsManager>
installed_scripts_manager, installed_scripts_manager,
std::unique_ptr<ServiceWorkerContentSettingsProxy> content_settings_client, std::unique_ptr<ServiceWorkerContentSettingsProxy> content_settings_client,
mojom::blink::CacheStoragePtrInfo cache_storage_info,
service_manager::mojom::blink::InterfaceProviderPtrInfo service_manager::mojom::blink::InterfaceProviderPtrInfo
interface_provider_info) interface_provider_info)
: worker_context_client_(std::move(client)), : worker_context_client_(std::move(client)),
...@@ -101,6 +106,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl( ...@@ -101,6 +106,7 @@ WebEmbeddedWorkerImpl::WebEmbeddedWorkerImpl(
worker_inspector_proxy_(WorkerInspectorProxy::Create()), worker_inspector_proxy_(WorkerInspectorProxy::Create()),
pause_after_download_state_(kDontPauseAfterDownload), pause_after_download_state_(kDontPauseAfterDownload),
waiting_for_debugger_state_(kNotWaitingForDebugger), waiting_for_debugger_state_(kNotWaitingForDebugger),
cache_storage_info_(std::move(cache_storage_info)),
interface_provider_info_(std::move(interface_provider_info)) { interface_provider_info_(std::move(interface_provider_info)) {
if (installed_scripts_manager) { if (installed_scripts_manager) {
installed_scripts_manager_ = installed_scripts_manager_ =
...@@ -408,7 +414,7 @@ void WebEmbeddedWorkerImpl::StartWorkerThread() { ...@@ -408,7 +414,7 @@ void WebEmbeddedWorkerImpl::StartWorkerThread() {
worker_thread_ = std::make_unique<ServiceWorkerThread>( worker_thread_ = std::make_unique<ServiceWorkerThread>(
ThreadableLoadingContext::Create(*document), ThreadableLoadingContext::Create(*document),
ServiceWorkerGlobalScopeProxy::Create(*this, *worker_context_client_), ServiceWorkerGlobalScopeProxy::Create(*this, *worker_context_client_),
std::move(installed_scripts_manager_)); std::move(installed_scripts_manager_), std::move(cache_storage_info_));
// We have a dummy document here for loading but it doesn't really represent // We have a dummy document here for loading but it doesn't really represent
// the document/frame of associated document(s) for this worker. Here we // the document/frame of associated document(s) for this worker. Here we
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <memory> #include <memory>
#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_provider.h"
#include "services/service_manager/public/mojom/interface_provider.mojom-blink.h" #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
#include "third_party/blink/public/web/web_embedded_worker.h" #include "third_party/blink/public/web/web_embedded_worker.h"
#include "third_party/blink/public/web/web_embedded_worker_start_data.h" #include "third_party/blink/public/web/web_embedded_worker_start_data.h"
#include "third_party/blink/renderer/core/exported/worker_shadow_page.h" #include "third_party/blink/renderer/core/exported/worker_shadow_page.h"
...@@ -61,6 +62,7 @@ class MODULES_EXPORT WebEmbeddedWorkerImpl final ...@@ -61,6 +62,7 @@ class MODULES_EXPORT WebEmbeddedWorkerImpl final
std::unique_ptr<WebServiceWorkerContextClient>, std::unique_ptr<WebServiceWorkerContextClient>,
std::unique_ptr<WebServiceWorkerInstalledScriptsManager>, std::unique_ptr<WebServiceWorkerInstalledScriptsManager>,
std::unique_ptr<ServiceWorkerContentSettingsProxy>, std::unique_ptr<ServiceWorkerContentSettingsProxy>,
mojom::blink::CacheStoragePtrInfo,
service_manager::mojom::blink::InterfaceProviderPtrInfo); service_manager::mojom::blink::InterfaceProviderPtrInfo);
~WebEmbeddedWorkerImpl() override; ~WebEmbeddedWorkerImpl() override;
...@@ -129,6 +131,8 @@ class MODULES_EXPORT WebEmbeddedWorkerImpl final ...@@ -129,6 +131,8 @@ class MODULES_EXPORT WebEmbeddedWorkerImpl final
// to the same worker. // to the same worker.
base::UnguessableToken devtools_worker_token_; base::UnguessableToken devtools_worker_token_;
mojom::blink::CacheStoragePtrInfo cache_storage_info_;
service_manager::mojom::blink::InterfaceProviderPtrInfo service_manager::mojom::blink::InterfaceProviderPtrInfo
interface_provider_info_; interface_provider_info_;
}; };
......
...@@ -75,6 +75,7 @@ namespace blink { ...@@ -75,6 +75,7 @@ namespace blink {
ServiceWorkerGlobalScope* ServiceWorkerGlobalScope::Create( ServiceWorkerGlobalScope* ServiceWorkerGlobalScope::Create(
ServiceWorkerThread* thread, ServiceWorkerThread* thread,
std::unique_ptr<GlobalScopeCreationParams> creation_params, std::unique_ptr<GlobalScopeCreationParams> creation_params,
mojom::blink::CacheStoragePtrInfo cache_storage_info,
base::TimeTicks time_origin) { base::TimeTicks time_origin) {
// If the script is being loaded via script streaming, the script is not yet // If the script is being loaded via script streaming, the script is not yet
// loaded. // loaded.
...@@ -88,14 +89,17 @@ ServiceWorkerGlobalScope* ServiceWorkerGlobalScope::Create( ...@@ -88,14 +89,17 @@ ServiceWorkerGlobalScope* ServiceWorkerGlobalScope::Create(
DCHECK(creation_params->origin_trial_tokens->IsEmpty()); DCHECK(creation_params->origin_trial_tokens->IsEmpty());
} }
return new ServiceWorkerGlobalScope(std::move(creation_params), thread, return new ServiceWorkerGlobalScope(std::move(creation_params), thread,
std::move(cache_storage_info),
time_origin); time_origin);
} }
ServiceWorkerGlobalScope::ServiceWorkerGlobalScope( ServiceWorkerGlobalScope::ServiceWorkerGlobalScope(
std::unique_ptr<GlobalScopeCreationParams> creation_params, std::unique_ptr<GlobalScopeCreationParams> creation_params,
ServiceWorkerThread* thread, ServiceWorkerThread* thread,
mojom::blink::CacheStoragePtrInfo cache_storage_info,
base::TimeTicks time_origin) base::TimeTicks time_origin)
: WorkerGlobalScope(std::move(creation_params), thread, time_origin) {} : WorkerGlobalScope(std::move(creation_params), thread, time_origin),
cache_storage_info_(std::move(cache_storage_info)) {}
ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope() = default; ServiceWorkerGlobalScope::~ServiceWorkerGlobalScope() = default;
...@@ -388,4 +392,8 @@ void ServiceWorkerGlobalScope::SetIsInstalling(bool is_installing) { ...@@ -388,4 +392,8 @@ void ServiceWorkerGlobalScope::SetIsInstalling(bool is_installing) {
} }
} }
mojom::blink::CacheStoragePtrInfo ServiceWorkerGlobalScope::TakeCacheStorage() {
return std::move(cache_storage_info_);
}
} // namespace blink } // namespace blink
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICEWORKERS_SERVICE_WORKER_GLOBAL_SCOPE_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICEWORKERS_SERVICE_WORKER_GLOBAL_SCOPE_H_
#include <memory> #include <memory>
#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
#include "third_party/blink/public/platform/modules/serviceworker/web_service_worker_registration.h" #include "third_party/blink/public/platform/modules/serviceworker/web_service_worker_registration.h"
#include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h" #include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h"
#include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
...@@ -60,6 +61,7 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -60,6 +61,7 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
static ServiceWorkerGlobalScope* Create( static ServiceWorkerGlobalScope* Create(
ServiceWorkerThread*, ServiceWorkerThread*,
std::unique_ptr<GlobalScopeCreationParams>, std::unique_ptr<GlobalScopeCreationParams>,
mojom::blink::CacheStoragePtrInfo,
base::TimeTicks time_origin); base::TimeTicks time_origin);
~ServiceWorkerGlobalScope() override; ~ServiceWorkerGlobalScope() override;
...@@ -117,6 +119,8 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -117,6 +119,8 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
void CountCacheStorageInstalledScript(uint64_t script_size, void CountCacheStorageInstalledScript(uint64_t script_size,
uint64_t script_metadata_size); uint64_t script_metadata_size);
mojom::blink::CacheStoragePtrInfo TakeCacheStorage();
DEFINE_ATTRIBUTE_EVENT_LISTENER(install); DEFINE_ATTRIBUTE_EVENT_LISTENER(install);
DEFINE_ATTRIBUTE_EVENT_LISTENER(activate); DEFINE_ATTRIBUTE_EVENT_LISTENER(activate);
DEFINE_ATTRIBUTE_EVENT_LISTENER(fetch); DEFINE_ATTRIBUTE_EVENT_LISTENER(fetch);
...@@ -134,6 +138,7 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -134,6 +138,7 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
private: private:
ServiceWorkerGlobalScope(std::unique_ptr<GlobalScopeCreationParams>, ServiceWorkerGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
ServiceWorkerThread*, ServiceWorkerThread*,
mojom::blink::CacheStoragePtrInfo,
base::TimeTicks time_origin); base::TimeTicks time_origin);
void importScripts(const Vector<String>& urls, ExceptionState&) override; void importScripts(const Vector<String>& urls, ExceptionState&) override;
SingleCachedMetadataHandler* CreateWorkerScriptCachedMetadataHandler( SingleCachedMetadataHandler* CreateWorkerScriptCachedMetadataHandler(
...@@ -158,6 +163,11 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -158,6 +163,11 @@ class MODULES_EXPORT ServiceWorkerGlobalScope final : public WorkerGlobalScope {
bool evaluate_script_ready_ = false; bool evaluate_script_ready_ = false;
base::OnceClosure evaluate_script_; base::OnceClosure evaluate_script_;
// May be provided in the constructor as an optimization so InterfaceProvider
// doesn't need to be used. Taken at the initial call to
// ServiceWorkerGlobalScope#caches.
mojom::blink::CacheStoragePtrInfo cache_storage_info_;
}; };
DEFINE_TYPE_CASTS(ServiceWorkerGlobalScope, DEFINE_TYPE_CASTS(ServiceWorkerGlobalScope,
......
...@@ -44,12 +44,14 @@ ServiceWorkerThread::ServiceWorkerThread( ...@@ -44,12 +44,14 @@ ServiceWorkerThread::ServiceWorkerThread(
ThreadableLoadingContext* loading_context, ThreadableLoadingContext* loading_context,
ServiceWorkerGlobalScopeProxy* global_scope_proxy, ServiceWorkerGlobalScopeProxy* global_scope_proxy,
std::unique_ptr<ServiceWorkerInstalledScriptsManager> std::unique_ptr<ServiceWorkerInstalledScriptsManager>
installed_scripts_manager) installed_scripts_manager,
mojom::blink::CacheStoragePtrInfo cache_storage_info)
: WorkerThread(loading_context, *global_scope_proxy), : WorkerThread(loading_context, *global_scope_proxy),
global_scope_proxy_(global_scope_proxy), global_scope_proxy_(global_scope_proxy),
worker_backing_thread_(WorkerBackingThread::Create( worker_backing_thread_(WorkerBackingThread::Create(
WebThreadCreationParams(GetThreadType()))), WebThreadCreationParams(GetThreadType()))),
installed_scripts_manager_(std::move(installed_scripts_manager)) {} installed_scripts_manager_(std::move(installed_scripts_manager)),
cache_storage_info_(std::move(cache_storage_info)) {}
ServiceWorkerThread::~ServiceWorkerThread() { ServiceWorkerThread::~ServiceWorkerThread() {
global_scope_proxy_->Detach(); global_scope_proxy_->Detach();
...@@ -71,6 +73,7 @@ void ServiceWorkerThread::TerminateForTesting() { ...@@ -71,6 +73,7 @@ void ServiceWorkerThread::TerminateForTesting() {
WorkerOrWorkletGlobalScope* ServiceWorkerThread::CreateWorkerGlobalScope( WorkerOrWorkletGlobalScope* ServiceWorkerThread::CreateWorkerGlobalScope(
std::unique_ptr<GlobalScopeCreationParams> creation_params) { std::unique_ptr<GlobalScopeCreationParams> creation_params) {
return ServiceWorkerGlobalScope::Create(this, std::move(creation_params), return ServiceWorkerGlobalScope::Create(this, std::move(creation_params),
std::move(cache_storage_info_),
time_origin_); time_origin_);
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICEWORKERS_SERVICE_WORKER_THREAD_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICEWORKERS_SERVICE_WORKER_THREAD_H_
#include <memory> #include <memory>
#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
#include "third_party/blink/renderer/core/workers/worker_thread.h" #include "third_party/blink/renderer/core/workers/worker_thread.h"
#include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/modules_export.h"
...@@ -49,7 +50,8 @@ class MODULES_EXPORT ServiceWorkerThread final : public WorkerThread { ...@@ -49,7 +50,8 @@ class MODULES_EXPORT ServiceWorkerThread final : public WorkerThread {
// Persistent. // Persistent.
ServiceWorkerThread(ThreadableLoadingContext*, ServiceWorkerThread(ThreadableLoadingContext*,
ServiceWorkerGlobalScopeProxy*, ServiceWorkerGlobalScopeProxy*,
std::unique_ptr<ServiceWorkerInstalledScriptsManager>); std::unique_ptr<ServiceWorkerInstalledScriptsManager>,
mojom::blink::CacheStoragePtrInfo cache_storage_info);
~ServiceWorkerThread() override; ~ServiceWorkerThread() override;
WorkerBackingThread& GetWorkerBackingThread() override { WorkerBackingThread& GetWorkerBackingThread() override {
...@@ -71,6 +73,7 @@ class MODULES_EXPORT ServiceWorkerThread final : public WorkerThread { ...@@ -71,6 +73,7 @@ class MODULES_EXPORT ServiceWorkerThread final : public WorkerThread {
std::unique_ptr<WorkerBackingThread> worker_backing_thread_; std::unique_ptr<WorkerBackingThread> worker_backing_thread_;
std::unique_ptr<ServiceWorkerInstalledScriptsManager> std::unique_ptr<ServiceWorkerInstalledScriptsManager>
installed_scripts_manager_; installed_scripts_manager_;
mojom::blink::CacheStoragePtrInfo cache_storage_info_;
}; };
} // namespace blink } // namespace blink
......
...@@ -126,7 +126,8 @@ class WebEmbeddedWorkerImplTest : public testing::Test { ...@@ -126,7 +126,8 @@ class WebEmbeddedWorkerImplTest : public testing::Test {
mock_installed_scripts_manager_ = installed_scripts_manager.get(); mock_installed_scripts_manager_ = installed_scripts_manager.get();
worker_ = WebEmbeddedWorker::Create( worker_ = WebEmbeddedWorker::Create(
std::move(client), std::move(installed_scripts_manager), std::move(client), std::move(installed_scripts_manager),
mojo::ScopedMessagePipeHandle(), mojo::ScopedMessagePipeHandle()); mojo::ScopedMessagePipeHandle(), mojo::ScopedMessagePipeHandle(),
mojo::ScopedMessagePipeHandle());
WebURL script_url = URLTestHelpers::ToKURL("https://www.example.com/sw.js"); WebURL script_url = URLTestHelpers::ToKURL("https://www.example.com/sw.js");
WebURLResponse response; WebURLResponse response;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment