blob: f80fe479ee914338c6b655bdf0eb12cb06c921f7 [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 "mojo/public/cpp/bindings/pending_remote.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/loader/fetch_client_settings_object.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"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_url.h"
namespace content {
DedicatedWorkerHostFactoryClient::DedicatedWorkerHostFactoryClient(
blink::WebDedicatedWorker* worker,
service_manager::InterfaceProvider* interface_provider)
: worker_(worker) {
DCHECK(interface_provider);
interface_provider->GetInterface(factory_.BindNewPipeAndPassReceiver());
}
DedicatedWorkerHostFactoryClient::~DedicatedWorkerHostFactoryClient() = default;
void DedicatedWorkerHostFactoryClient::CreateWorkerHostDeprecated(
const blink::WebSecurityOrigin& script_origin) {
DCHECK(!base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
service_manager::mojom::InterfaceProviderPtr interface_provider_ptr;
mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
browser_interface_broker;
factory_->CreateWorkerHost(
script_origin, mojo::MakeRequest(&interface_provider_ptr),
browser_interface_broker.InitWithNewPipeAndPassReceiver(),
remote_host_.BindNewPipeAndPassReceiver());
OnWorkerHostCreated(std::move(interface_provider_ptr),
std::move(browser_interface_broker));
}
void DedicatedWorkerHostFactoryClient::CreateWorkerHost(
const blink::WebURL& script_url,
const blink::WebSecurityOrigin& script_origin,
network::mojom::CredentialsMode credentials_mode,
const blink::WebSecurityOrigin& fetch_client_security_origin,
const blink::WebFetchClientSettingsObject& fetch_client_settings_object,
mojo::ScopedMessagePipeHandle blob_url_token) {
DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
// TODO(bashi): Create a helper function that converts
// WebFetchClientSettingsObject to mojom::FetchClientSettingsObject.
auto outside_fetch_client_settings_object =
blink::mojom::FetchClientSettingsObject::New();
outside_fetch_client_settings_object->referrer_policy =
fetch_client_settings_object.referrer_policy;
outside_fetch_client_settings_object->outgoing_referrer =
fetch_client_settings_object.outgoing_referrer;
outside_fetch_client_settings_object->insecure_requests_policy =
fetch_client_settings_object.insecure_requests_policy;
factory_->CreateWorkerHostAndStartScriptLoad(
script_url, script_origin, credentials_mode,
std::move(outside_fetch_client_settings_object),
mojo::PendingRemote<blink::mojom::BlobURLToken>(
std::move(blob_url_token), blink::mojom::BlobURLToken::Version_),
receiver_.BindNewPipeAndPassRemote(),
remote_host_.BindNewPipeAndPassReceiver());
}
scoped_refptr<blink::WebWorkerFetchContext>
DedicatedWorkerHostFactoryClient::CloneWorkerFetchContext(
blink::WebWorkerFetchContext* web_worker_fetch_context,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
scoped_refptr<WebWorkerFetchContextImpl> worker_fetch_context;
if (base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker)) {
worker_fetch_context =
static_cast<WebWorkerFetchContextImpl*>(web_worker_fetch_context)
->CloneForNestedWorker(
service_worker_provider_context_.get(),
subresource_loader_factory_bundle_->Clone(),
subresource_loader_factory_bundle_
->CloneWithoutAppCacheFactory(),
std::move(pending_subresource_loader_updater_),
std::move(task_runner));
worker_fetch_context->SetResponseOverrideForMainScript(
std::move(response_override_for_main_script_));
} else {
worker_fetch_context =
static_cast<WebWorkerFetchContextImpl*>(web_worker_fetch_context)
->CloneForNestedWorkerDeprecated(std::move(task_runner));
}
return worker_fetch_context;
}
void DedicatedWorkerHostFactoryClient::LifecycleStateChanged(
blink::mojom::FrameLifecycleState state) {
if (remote_host_)
remote_host_->LifecycleStateChanged(state);
}
scoped_refptr<WebWorkerFetchContextImpl>
DedicatedWorkerHostFactoryClient::CreateWorkerFetchContext(
blink::mojom::RendererPreferences renderer_preference,
mojo::PendingReceiver<blink::mojom::RendererPreferenceWatcher>
watcher_receiver) {
DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
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_receiver),
subresource_loader_factory_bundle_->Clone(),
subresource_loader_factory_bundle_->CloneWithoutAppCacheFactory(),
std::move(pending_subresource_loader_updater_));
worker_fetch_context->SetResponseOverrideForMainScript(
std::move(response_override_for_main_script_));
return worker_fetch_context;
}
void DedicatedWorkerHostFactoryClient::OnWorkerHostCreated(
service_manager::mojom::InterfaceProviderPtr interface_provider,
mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker>
browser_interface_broker) {
worker_->OnWorkerHostCreated(interface_provider.PassInterface().PassHandle(),
browser_interface_broker.PassPipe());
}
void DedicatedWorkerHostFactoryClient::OnScriptLoadStarted(
blink::mojom::ServiceWorkerProviderInfoForClientPtr
service_worker_provider_info,
blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
std::unique_ptr<blink::URLLoaderFactoryBundleInfo>
subresource_loader_factory_bundle_info,
mojo::PendingReceiver<blink::mojom::SubresourceLoaderUpdater>
subresource_loader_updater,
blink::mojom::ControllerServiceWorkerInfoPtr controller_info) {
DCHECK(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
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)));
DCHECK(!pending_subresource_loader_updater_);
pending_subresource_loader_updater_ = std::move(subresource_loader_updater);
DCHECK(!service_worker_provider_context_);
if (service_worker_provider_info) {
service_worker_provider_context_ =
base::MakeRefCounted<ServiceWorkerProviderContext>(
blink::mojom::ServiceWorkerProviderType::kForDedicatedWorker,
std::move(service_worker_provider_info->client_receiver),
std::move(service_worker_provider_info->host_remote),
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_head =
std::move(main_script_load_params->response_head);
response_override_for_main_script_->response_body =
std::move(main_script_load_params->response_body);
response_override_for_main_script_->redirect_responses =
std::move(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(base::FeatureList::IsEnabled(blink::features::kPlzDedicatedWorker));
worker_->OnScriptLoadStartFailed();
// |this| may be destroyed at this point.
}
} // namespace content