| Index: content/browser/service_worker/service_worker_provider_host.cc
|
| diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
|
| index 5de525ed8bfb4792d6524130978924009f09fb2a..34be8dd0c8f7916e44abfbc074dc82f235056dd3 100644
|
| --- a/content/browser/service_worker/service_worker_provider_host.cc
|
| +++ b/content/browser/service_worker/service_worker_provider_host.cc
|
| @@ -36,13 +36,10 @@ namespace content {
|
|
|
| namespace {
|
|
|
| -// Provider host for navigation with PlzNavigate or when service worker's
|
| -// context is created on the browser side. This function provides the next
|
| -// ServiceWorkerProviderHost ID for them, starts at -2 and keeps going down.
|
| -int NextBrowserProvidedProviderId() {
|
| - static int g_next_browser_provided_provider_id = -2;
|
| - return g_next_browser_provided_provider_id--;
|
| -}
|
| +// PlzNavigate
|
| +// Next ServiceWorkerProviderHost ID for navigations, starts at -2 and keeps
|
| +// going down.
|
| +int g_next_navigation_provider_id = -2;
|
|
|
| // A request handler derivative used to handle navigation requests when
|
| // skip_service_worker flag is set. It tracks the document URL and sets the url
|
| @@ -62,9 +59,10 @@ class ServiceWorkerURLTrackingRequestHandler
|
| ~ServiceWorkerURLTrackingRequestHandler() override {}
|
|
|
| // Called via custom URLRequestJobFactory.
|
| - net::URLRequestJob* MaybeCreateJob(net::URLRequest* request,
|
| - net::NetworkDelegate*,
|
| - ResourceContext*) override {
|
| + net::URLRequestJob* MaybeCreateJob(
|
| + net::URLRequest* request,
|
| + net::NetworkDelegate* /* network_delegate */,
|
| + ResourceContext* /* resource_context */) override {
|
| // |provider_host_| may have been deleted when the request is resumed.
|
| if (!provider_host_)
|
| return nullptr;
|
| @@ -116,30 +114,18 @@ ServiceWorkerProviderHost::PreCreateNavigationHost(
|
| bool are_ancestors_secure,
|
| const WebContentsGetter& web_contents_getter) {
|
| CHECK(IsBrowserSideNavigationEnabled());
|
| + // Generate a new browser-assigned id for the host.
|
| + int provider_id = g_next_navigation_provider_id--;
|
| auto host = base::WrapUnique(new ServiceWorkerProviderHost(
|
| ChildProcessHost::kInvalidUniqueID,
|
| - ServiceWorkerProviderHostInfo(
|
| - NextBrowserProvidedProviderId(), MSG_ROUTING_NONE,
|
| - SERVICE_WORKER_PROVIDER_FOR_WINDOW, are_ancestors_secure),
|
| + ServiceWorkerProviderHostInfo(provider_id, MSG_ROUTING_NONE,
|
| + SERVICE_WORKER_PROVIDER_FOR_WINDOW,
|
| + are_ancestors_secure),
|
| context, nullptr));
|
| host->web_contents_getter_ = web_contents_getter;
|
| return host;
|
| }
|
|
|
| -// static
|
| -std::unique_ptr<ServiceWorkerProviderHost>
|
| -ServiceWorkerProviderHost::PreCreateForController(
|
| - base::WeakPtr<ServiceWorkerContextCore> context) {
|
| - auto host = base::WrapUnique(new ServiceWorkerProviderHost(
|
| - ChildProcessHost::kInvalidUniqueID,
|
| - ServiceWorkerProviderHostInfo(NextBrowserProvidedProviderId(),
|
| - MSG_ROUTING_NONE,
|
| - SERVICE_WORKER_PROVIDER_FOR_CONTROLLER,
|
| - true /* is_parent_frame_secure */),
|
| - std::move(context), nullptr));
|
| - return host;
|
| -}
|
| -
|
| // static
|
| std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create(
|
| int process_id,
|
| @@ -191,27 +177,20 @@ ServiceWorkerProviderHost::ServiceWorkerProviderHost(
|
| binding_(this) {
|
| DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, info_.type);
|
|
|
| + // PlzNavigate
|
| + CHECK(render_process_id != ChildProcessHost::kInvalidUniqueID ||
|
| + IsBrowserSideNavigationEnabled());
|
|
|
| if (info_.type == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) {
|
| - // Actual |render_process_id| will be set after choosing a process for the
|
| - // controller, and |render_thread id| will be set when the service worker
|
| - // context gets started.
|
| - DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id);
|
| + // Actual thread id is set when the service worker context gets started.
|
| render_thread_id_ = kInvalidEmbeddedWorkerThreadId;
|
| - } else {
|
| - // PlzNavigate
|
| - DCHECK(render_process_id != ChildProcessHost::kInvalidUniqueID ||
|
| - IsBrowserSideNavigationEnabled());
|
| }
|
| -
|
| context_->RegisterProviderHostByClientID(client_uuid_, this);
|
|
|
| - // |client_| and |binding_| will be bound on CompleteNavigationInitialized
|
| - // (PlzNavigate) or on CompleteStartWorkerPreparation (providers for
|
| - // controller).
|
| - if (!info_.client_ptr_info.is_valid() && !info_.host_request.is_pending()) {
|
| - DCHECK(IsBrowserSideNavigationEnabled() ||
|
| - info_.type == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER);
|
| + // PlzNavigate
|
| + // |provider_| and |binding_| will be bound on CompleteNavigationInitialized.
|
| + if (IsBrowserSideNavigationEnabled()) {
|
| + DCHECK(!info.client_ptr_info.is_valid() && !info.host_request.is_pending());
|
| return;
|
| }
|
|
|
| @@ -345,6 +324,14 @@ void ServiceWorkerProviderHost::SetControllerVersionAttribute(
|
| version ? version->used_features() : std::set<uint32_t>()));
|
| }
|
|
|
| +void ServiceWorkerProviderHost::SetHostedVersion(
|
| + ServiceWorkerVersion* version) {
|
| + DCHECK(!IsProviderForClient());
|
| + DCHECK_EQ(EmbeddedWorkerStatus::STARTING, version->running_status());
|
| + DCHECK_EQ(render_process_id_, version->embedded_worker()->process_id());
|
| + running_hosted_version_ = version;
|
| +}
|
| +
|
| bool ServiceWorkerProviderHost::IsProviderForClient() const {
|
| switch (info_.type) {
|
| case SERVICE_WORKER_PROVIDER_FOR_WINDOW:
|
| @@ -672,54 +659,6 @@ void ServiceWorkerProviderHost::CompleteNavigationInitialized(
|
| NotifyControllerToAssociatedProvider();
|
| }
|
|
|
| -mojom::ServiceWorkerProviderInfoForStartWorkerPtr
|
| -ServiceWorkerProviderHost::CompleteStartWorkerPreparation(
|
| - int process_id,
|
| - scoped_refptr<ServiceWorkerVersion> hosted_version) {
|
| - DCHECK(context_);
|
| - DCHECK_EQ(kInvalidEmbeddedWorkerThreadId, render_thread_id_);
|
| - DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_);
|
| - DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, provider_type());
|
| - DCHECK(!running_hosted_version_);
|
| -
|
| - DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id);
|
| -
|
| - running_hosted_version_ = std::move(hosted_version);
|
| -
|
| - ServiceWorkerDispatcherHost* dispatcher_host =
|
| - context_->GetDispatcherHost(process_id);
|
| - DCHECK(dispatcher_host);
|
| - render_process_id_ = process_id;
|
| - dispatcher_host_ = dispatcher_host;
|
| -
|
| - // Retrieve the registration associated with |version|. The registration
|
| - // must be alive because the version keeps it during starting worker.
|
| - ServiceWorkerRegistration* registration = context_->GetLiveRegistration(
|
| - running_hosted_version()->registration_id());
|
| - DCHECK(registration);
|
| - ServiceWorkerRegistrationObjectInfo info;
|
| - ServiceWorkerVersionAttributes attrs;
|
| - dispatcher_host->GetRegistrationObjectInfoAndVersionAttributes(
|
| - AsWeakPtr(), registration, &info, &attrs);
|
| -
|
| - // Initialize provider_info.
|
| - mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info =
|
| - mojom::ServiceWorkerProviderInfoForStartWorker::New();
|
| - provider_info->provider_id = provider_id();
|
| - provider_info->attributes = std::move(attrs);
|
| - provider_info->registration = std::move(info);
|
| - provider_info->client_request = mojo::MakeRequest(&provider_);
|
| - binding_.Bind(mojo::MakeRequest(&provider_info->host_ptr_info));
|
| - binding_.set_connection_error_handler(
|
| - base::Bind(&RemoveProviderHost, context_, process_id, provider_id()));
|
| -
|
| - // Set the document URL to the script url in order to allow
|
| - // register/unregister/getRegistration on ServiceWorkerGlobalScope.
|
| - SetDocumentUrl(running_hosted_version()->script_url());
|
| -
|
| - return provider_info;
|
| -}
|
| -
|
| void ServiceWorkerProviderHost::SendUpdateFoundMessage(
|
| int registration_handle_id) {
|
| if (!dispatcher_host_)
|
|
|