blob: 7b69cacfd83a01ddb178d77367ae48715029fd50 [file] [log] [blame]
// Copyright 2019 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/renderer/worker/dedicated_worker_host_factory_client.h"
#include <utility>
#include "content/renderer/loader/child_url_loader_factory_bundle.h"
#include "content/renderer/loader/navigation_response_override_parameters.h"
#include "content/renderer/loader/web_worker_fetch_context_impl.h"
#include "content/renderer/service_worker/service_worker_provider_context.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/blob/blob_url_store.mojom.h"
#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
#include "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom.h"
#include "third_party/blink/public/platform/web_dedicated_worker.h"
namespace content {
DedicatedWorkerHostFactoryClient::DedicatedWorkerHostFactoryClient(
blink::WebDedicatedWorker* worker,
service_manager::InterfaceProvider* interface_provider)
: worker_(worker), binding_(this) {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
DCHECK(interface_provider);
interface_provider->GetInterface(mojo::MakeRequest(&factory_));
}
DedicatedWorkerHostFactoryClient::~DedicatedWorkerHostFactoryClient() = default;
void DedicatedWorkerHostFactoryClient::CreateWorkerHost(
const blink::WebURL& script_url,
const blink::WebSecurityOrigin& script_origin,
mojo::ScopedMessagePipeHandle blob_url_token) {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
blink::mojom::DedicatedWorkerHostFactoryClientPtr client_ptr;
binding_.Bind(mojo::MakeRequest(&client_ptr));
factory_->CreateWorkerHostAndStartScriptLoad(
script_url, script_origin,
blink::mojom::BlobURLTokenPtr(blink::mojom::BlobURLTokenPtrInfo(
std::move(blob_url_token), blink::mojom::BlobURLToken::Version_)),
std::move(client_ptr));
}
scoped_refptr<WebWorkerFetchContextImpl>
DedicatedWorkerHostFactoryClient::CreateWorkerFetchContext(
blink::mojom::RendererPreferences renderer_preference,
blink::mojom::RendererPreferenceWatcherRequest watcher_request) {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
DCHECK(subresource_loader_factory_bundle_);
scoped_refptr<WebWorkerFetchContextImpl> worker_fetch_context =
WebWorkerFetchContextImpl::Create(
service_worker_provider_context_.get(),
std::move(renderer_preference), std::move(watcher_request),
subresource_loader_factory_bundle_->Clone(),
subresource_loader_factory_bundle_->CloneWithoutAppCacheFactory());
worker_fetch_context->SetResponseOverrideForMainScript(
std::move(response_override_for_main_script_));
return worker_fetch_context;
}
void DedicatedWorkerHostFactoryClient::OnWorkerHostCreated(
service_manager::mojom::InterfaceProviderPtr interface_provider) {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
worker_->OnWorkerHostCreated(interface_provider.PassInterface().PassHandle());
}
void DedicatedWorkerHostFactoryClient::OnScriptLoadStarted(
blink::mojom::ServiceWorkerProviderInfoForWorkerPtr
service_worker_provider_info,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factory_bundle_info,
blink::mojom::ControllerServiceWorkerInfoPtr controller_info) {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
DCHECK(service_worker_provider_info);
DCHECK(main_script_load_params);
DCHECK(subresource_loader_factory_bundle_info);
// Initialize the loader factory bundle passed by the browser process.
DCHECK(!subresource_loader_factory_bundle_);
subresource_loader_factory_bundle_ =
base::MakeRefCounted<ChildURLLoaderFactoryBundle>(
std::make_unique<ChildURLLoaderFactoryBundleInfo>(
std::move(subresource_loader_factory_bundle_info)));
// TODO(nhiroki): Support ServiceWorkerProviderType::kForDedicatedWorker.
DCHECK(!service_worker_provider_context_);
service_worker_provider_context_ =
base::MakeRefCounted<ServiceWorkerProviderContext>(
service_worker_provider_info->provider_id,
blink::mojom::ServiceWorkerProviderType::kForSharedWorker,
std::move(service_worker_provider_info->client_request),
std::move(service_worker_provider_info->host_ptr_info),
std::move(controller_info), subresource_loader_factory_bundle_);
// Initialize the response override for the main worker script loaded by the
// browser process.
DCHECK(!response_override_for_main_script_);
response_override_for_main_script_ =
std::make_unique<NavigationResponseOverrideParameters>();
response_override_for_main_script_->url_loader_client_endpoints =
std::move(main_script_load_params->url_loader_client_endpoints);
response_override_for_main_script_->response =
main_script_load_params->response_head;
response_override_for_main_script_->redirect_responses =
main_script_load_params->redirect_response_heads;
response_override_for_main_script_->redirect_infos =
main_script_load_params->redirect_infos;
worker_->OnScriptLoadStarted();
}
void DedicatedWorkerHostFactoryClient::OnScriptLoadStartFailed() {
DCHECK(blink::features::IsPlzDedicatedWorkerEnabled());
worker_->OnScriptLoadStartFailed();
// |this| may be destroyed at this point.
}
} // namespace content