Commit 4c1ce9e5 authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

S13nSW: Set client id for shared workers

Store client_id supplied via ServiceWorkerContainer::SetController()
in ServiceWorkerProviderContext::ProviderStateForClient so that
we can pass the client_id to WorkerFetchContextImpl. This enables
us to set FetchEvent#clientId accordingly in shared workers.

Bug: 840668
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo
Change-Id: Ie03290b9d70c3fd0d2a74e83d7881057ec3e1b51
Reviewed-on: https://chromium-review.googlesource.com/1049210
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#557802}
parent 38f2cd8b
...@@ -3355,6 +3355,9 @@ RenderFrameImpl::CreateWorkerFetchContext() { ...@@ -3355,6 +3355,9 @@ RenderFrameImpl::CreateWorkerFetchContext() {
provider->IsControlledByServiceWorker()); provider->IsControlledByServiceWorker());
worker_fetch_context->set_origin_url( worker_fetch_context->set_origin_url(
GURL(frame_->GetDocument().Url()).GetOrigin()); GURL(frame_->GetDocument().Url()).GetOrigin());
if (provider_context)
worker_fetch_context->set_client_id(provider_context->client_id());
for (auto& observer : observers_) for (auto& observer : observers_)
observer.WillCreateWorkerFetchContext(worker_fetch_context.get()); observer.WillCreateWorkerFetchContext(worker_fetch_context.get());
return std::move(worker_fetch_context); return std::move(worker_fetch_context);
......
...@@ -10,32 +10,27 @@ ...@@ -10,32 +10,27 @@
namespace content { namespace content {
ControllerServiceWorkerConnector::ControllerServiceWorkerConnector(
mojom::ServiceWorkerContainerHost* container_host)
: container_host_(container_host) {}
ControllerServiceWorkerConnector::ControllerServiceWorkerConnector( ControllerServiceWorkerConnector::ControllerServiceWorkerConnector(
mojom::ServiceWorkerContainerHost* container_host, mojom::ServiceWorkerContainerHost* container_host,
mojom::ControllerServiceWorkerPtr controller_ptr, mojom::ControllerServiceWorkerPtr controller_ptr,
const std::string& client_id) const std::string& client_id)
: container_host_(container_host) { : container_host_(container_host), client_id_(client_id) {
ResetControllerConnection(std::move(controller_ptr), client_id); SetControllerServiceWorkerPtr(std::move(controller_ptr));
} }
mojom::ControllerServiceWorker* mojom::ControllerServiceWorker*
ControllerServiceWorkerConnector::GetControllerServiceWorker( ControllerServiceWorkerConnector::GetControllerServiceWorker(
mojom::ControllerServiceWorkerPurpose purpose) { mojom::ControllerServiceWorkerPurpose purpose) {
switch (state_) { switch (state_) {
case State::kDisconnected: case State::kDisconnected: {
DCHECK(!controller_service_worker_); DCHECK(!controller_service_worker_);
DCHECK(container_host_); DCHECK(container_host_);
mojom::ControllerServiceWorkerPtr controller_ptr;
container_host_->EnsureControllerServiceWorker( container_host_->EnsureControllerServiceWorker(
mojo::MakeRequest(&controller_service_worker_), purpose); mojo::MakeRequest(&controller_ptr), purpose);
controller_service_worker_.set_connection_error_handler(base::BindOnce( SetControllerServiceWorkerPtr(std::move(controller_ptr));
&ControllerServiceWorkerConnector::OnControllerConnectionClosed,
base::Unretained(this)));
state_ = State::kConnected;
return controller_service_worker_.get(); return controller_service_worker_.get();
}
case State::kConnected: case State::kConnected:
DCHECK(controller_service_worker_.is_bound()); DCHECK(controller_service_worker_.is_bound());
return controller_service_worker_.get(); return controller_service_worker_.get();
...@@ -74,20 +69,22 @@ void ControllerServiceWorkerConnector::OnControllerConnectionClosed() { ...@@ -74,20 +69,22 @@ void ControllerServiceWorkerConnector::OnControllerConnectionClosed() {
} }
void ControllerServiceWorkerConnector::ResetControllerConnection( void ControllerServiceWorkerConnector::ResetControllerConnection(
mojom::ControllerServiceWorkerPtr controller_ptr, mojom::ControllerServiceWorkerPtr controller_ptr) {
const std::string& client_id) {
if (state_ == State::kNoContainerHost) if (state_ == State::kNoContainerHost)
return; return;
SetControllerServiceWorkerPtr(std::move(controller_ptr));
if (!controller_service_worker_)
state_ = State::kNoController;
}
void ControllerServiceWorkerConnector::SetControllerServiceWorkerPtr(
mojom::ControllerServiceWorkerPtr controller_ptr) {
controller_service_worker_ = std::move(controller_ptr); controller_service_worker_ = std::move(controller_ptr);
if (controller_service_worker_) { if (controller_service_worker_) {
DCHECK(client_id_.empty() || client_id_ == client_id);
client_id_ = client_id;
state_ = State::kConnected;
controller_service_worker_.set_connection_error_handler(base::BindOnce( controller_service_worker_.set_connection_error_handler(base::BindOnce(
&ControllerServiceWorkerConnector::OnControllerConnectionClosed, &ControllerServiceWorkerConnector::OnControllerConnectionClosed,
base::Unretained(this))); base::Unretained(this)));
} else { state_ = State::kConnected;
state_ = State::kNoController;
} }
} }
......
...@@ -51,15 +51,10 @@ class CONTENT_EXPORT ControllerServiceWorkerConnector ...@@ -51,15 +51,10 @@ class CONTENT_EXPORT ControllerServiceWorkerConnector
kNoContainerHost, kNoContainerHost,
}; };
// Use this ctor when no |controller_ptr| is available at creation time. // This class should only be created if a controller exists for the client.
// |state_| is set to kDisconnected. // |controller_ptr| may be nullptr if the caller does not yet have a Mojo
// TODO(bashi): Remove this one constructor. We need to update // connection to the controller. |state_| is set to kDisconnected in that
// WorkerFetchContextImpl to remove this constructor. // case.
explicit ControllerServiceWorkerConnector(
mojom::ServiceWorkerContainerHost* container_host);
// Use this ctor when |controller_ptr| is given by the browser at the
// creation time. |state_| is set to either kConnected or kNoController.
ControllerServiceWorkerConnector( ControllerServiceWorkerConnector(
mojom::ServiceWorkerContainerHost* container_host, mojom::ServiceWorkerContainerHost* container_host,
mojom::ControllerServiceWorkerPtr controller_ptr, mojom::ControllerServiceWorkerPtr controller_ptr,
...@@ -79,14 +74,16 @@ class CONTENT_EXPORT ControllerServiceWorkerConnector ...@@ -79,14 +74,16 @@ class CONTENT_EXPORT ControllerServiceWorkerConnector
// Resets the controller connection with the given |controller_ptr|, this // Resets the controller connection with the given |controller_ptr|, this
// can be called when a new controller is given, e.g. due to claim(). // can be called when a new controller is given, e.g. due to claim().
void ResetControllerConnection( void ResetControllerConnection(
mojom::ControllerServiceWorkerPtr controller_ptr, mojom::ControllerServiceWorkerPtr controller_ptr);
const std::string& client_id);
State state() const { return state_; } State state() const { return state_; }
const std::string& client_id() const { return client_id_; } const std::string& client_id() const { return client_id_; }
private: private:
void SetControllerServiceWorkerPtr(
mojom::ControllerServiceWorkerPtr controller_ptr);
State state_ = State::kDisconnected; State state_ = State::kDisconnected;
friend class base::RefCounted<ControllerServiceWorkerConnector>; friend class base::RefCounted<ControllerServiceWorkerConnector>;
......
...@@ -54,6 +54,10 @@ struct ServiceWorkerProviderContext::ProviderStateForClient { ...@@ -54,6 +54,10 @@ struct ServiceWorkerProviderContext::ProviderStateForClient {
// Used when we create |subresource_loader_factory|. // Used when we create |subresource_loader_factory|.
scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory; scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory;
// S13nServiceWorker:
// The Client#id value of the client.
std::string client_id;
// Tracks feature usage for UseCounter. // Tracks feature usage for UseCounter.
std::set<blink::mojom::WebFeature> used_features; std::set<blink::mojom::WebFeature> used_features;
...@@ -209,6 +213,11 @@ ServiceWorkerProviderContext::used_features() const { ...@@ -209,6 +213,11 @@ ServiceWorkerProviderContext::used_features() const {
return state_for_client_->used_features; return state_for_client_->used_features;
} }
const std::string& ServiceWorkerProviderContext::client_id() const {
DCHECK(state_for_client_);
return state_for_client_->client_id;
}
void ServiceWorkerProviderContext::SetWebServiceWorkerProvider( void ServiceWorkerProviderContext::SetWebServiceWorkerProvider(
base::WeakPtr<WebServiceWorkerProviderImpl> provider) { base::WeakPtr<WebServiceWorkerProviderImpl> provider) {
DCHECK(state_for_client_); DCHECK(state_for_client_);
...@@ -298,6 +307,10 @@ void ServiceWorkerProviderContext::SetController( ...@@ -298,6 +307,10 @@ void ServiceWorkerProviderContext::SetController(
state->controller_version_id = state->controller_version_id =
state->controller ? state->controller->version_id state->controller ? state->controller->version_id
: blink::mojom::kInvalidServiceWorkerVersionId; : blink::mojom::kInvalidServiceWorkerVersionId;
// The client id should never change once set.
DCHECK(state->client_id.empty() ||
state->client_id == controller_info->client_id);
state->client_id = controller_info->client_id;
// Propagate the controller to workers related to this provider. // Propagate the controller to workers related to this provider.
if (state->controller) { if (state->controller) {
...@@ -334,8 +347,7 @@ void ServiceWorkerProviderContext::SetController( ...@@ -334,8 +347,7 @@ void ServiceWorkerProviderContext::SetController(
// factory (this part is inherently racy). // factory (this part is inherently racy).
state->controller_connector->ResetControllerConnection( state->controller_connector->ResetControllerConnection(
mojom::ControllerServiceWorkerPtr( mojom::ControllerServiceWorkerPtr(
std::move(controller_info->endpoint)), std::move(controller_info->endpoint)));
controller_info->client_id);
} else if (state->controller) { } else if (state->controller) {
// Case (C): never had a controller, but got a new one now. // Case (C): never had a controller, but got a new one now.
// Set a new |state->controller_connector| so that subsequent resource // Set a new |state->controller_connector| so that subsequent resource
......
...@@ -127,6 +127,10 @@ class CONTENT_EXPORT ServiceWorkerProviderContext ...@@ -127,6 +127,10 @@ class CONTENT_EXPORT ServiceWorkerProviderContext
// For service worker clients. Returns the feature usage of its controller. // For service worker clients. Returns the feature usage of its controller.
const std::set<blink::mojom::WebFeature>& used_features() const; const std::set<blink::mojom::WebFeature>& used_features() const;
// S13nServiceWorker:
// The Client#id value of the client.
const std::string& client_id() const;
// For service worker clients. Sets a weak pointer back to the // For service worker clients. Sets a weak pointer back to the
// WebServiceWorkerProviderImpl (which corresponds to ServiceWorkerContainer // WebServiceWorkerProviderImpl (which corresponds to ServiceWorkerContainer
// in JavaScript) which has a strong reference to |this|. This allows us to // in JavaScript) which has a strong reference to |this|. This allows us to
......
...@@ -362,7 +362,7 @@ class ServiceWorkerSubresourceLoaderTest : public ::testing::Test { ...@@ -362,7 +362,7 @@ class ServiceWorkerSubresourceLoaderTest : public ::testing::Test {
network::mojom::URLLoaderFactoryPtr CreateSubresourceLoaderFactory() { network::mojom::URLLoaderFactoryPtr CreateSubresourceLoaderFactory() {
if (!connector_) { if (!connector_) {
connector_ = base::MakeRefCounted<ControllerServiceWorkerConnector>( connector_ = base::MakeRefCounted<ControllerServiceWorkerConnector>(
&fake_container_host_); &fake_container_host_, nullptr /*controller_ptr*/, "" /*client_id*/);
} }
network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory; network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory;
ServiceWorkerSubresourceLoaderFactory::Create( ServiceWorkerSubresourceLoaderFactory::Create(
...@@ -570,7 +570,7 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, NoController) { ...@@ -570,7 +570,7 @@ TEST_F(ServiceWorkerSubresourceLoaderTest, NoController) {
} }
// Make the connector have no controller. // Make the connector have no controller.
connector_->ResetControllerConnection(nullptr, "" /*client_id*/); connector_->ResetControllerConnection(nullptr);
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
{ {
......
...@@ -313,6 +313,10 @@ void WorkerFetchContextImpl::set_origin_url(const GURL& origin_url) { ...@@ -313,6 +313,10 @@ void WorkerFetchContextImpl::set_origin_url(const GURL& origin_url) {
origin_url_ = origin_url; origin_url_ = origin_url;
} }
void WorkerFetchContextImpl::set_client_id(const std::string& client_id) {
client_id_ = client_id;
}
void WorkerFetchContextImpl::SetApplicationCacheHostID(int id) { void WorkerFetchContextImpl::SetApplicationCacheHostID(int id) {
appcache_host_id_ = id; appcache_host_id_ = id;
} }
...@@ -344,7 +348,8 @@ void WorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() { ...@@ -344,7 +348,8 @@ void WorkerFetchContextImpl::ResetServiceWorkerURLLoaderFactory() {
network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory; network::mojom::URLLoaderFactoryPtr service_worker_url_loader_factory;
ServiceWorkerSubresourceLoaderFactory::Create( ServiceWorkerSubresourceLoaderFactory::Create(
base::MakeRefCounted<ControllerServiceWorkerConnector>( base::MakeRefCounted<ControllerServiceWorkerConnector>(
service_worker_container_host_.get()), service_worker_container_host_.get(), nullptr /*controller_ptr*/,
client_id_),
fallback_factory_, mojo::MakeRequest(&service_worker_url_loader_factory)); fallback_factory_, mojo::MakeRequest(&service_worker_url_loader_factory));
url_loader_factory_->SetServiceWorkerURLLoaderFactory( url_loader_factory_->SetServiceWorkerURLLoaderFactory(
std::move(service_worker_url_loader_factory)); std::move(service_worker_url_loader_factory));
......
...@@ -102,6 +102,7 @@ class CONTENT_EXPORT WorkerFetchContextImpl ...@@ -102,6 +102,7 @@ class CONTENT_EXPORT WorkerFetchContextImpl
// https://w3c.github.io/webappsec-secure-contexts/ // https://w3c.github.io/webappsec-secure-contexts/
void set_is_secure_context(bool flag); void set_is_secure_context(bool flag);
void set_origin_url(const GURL& origin_url); void set_origin_url(const GURL& origin_url);
void set_client_id(const std::string& client_id);
using RewriteURLFunction = blink::WebURL (*)(const std::string&, bool); using RewriteURLFunction = blink::WebURL (*)(const std::string&, bool);
static void InstallRewriteURLFunction(RewriteURLFunction rewrite_url); static void InstallRewriteURLFunction(RewriteURLFunction rewrite_url);
...@@ -137,6 +138,12 @@ class CONTENT_EXPORT WorkerFetchContextImpl ...@@ -137,6 +138,12 @@ class CONTENT_EXPORT WorkerFetchContextImpl
// Initialized on the worker thread when InitializeOnWorkerThread() is called. // Initialized on the worker thread when InitializeOnWorkerThread() is called.
mojom::ServiceWorkerContainerHostPtr service_worker_container_host_; mojom::ServiceWorkerContainerHostPtr service_worker_container_host_;
// S13nServiceWorker:
// The Client#id value of the shared worker or dedicated worker (since
// dedicated workers are not yet service worker clients, it is the parent
// document's id in that case). Passed to ControllerServiceWorkerConnector.
std::string client_id_;
// Initialized on the worker thread when InitializeOnWorkerThread() is called. // Initialized on the worker thread when InitializeOnWorkerThread() is called.
std::unique_ptr<ResourceDispatcher> resource_dispatcher_; std::unique_ptr<ResourceDispatcher> resource_dispatcher_;
......
...@@ -358,6 +358,7 @@ EmbeddedSharedWorkerStub::CreateWorkerFetchContext( ...@@ -358,6 +358,7 @@ EmbeddedSharedWorkerStub::CreateWorkerFetchContext(
worker_fetch_context->set_is_controlled_by_service_worker( worker_fetch_context->set_is_controlled_by_service_worker(
web_network_provider->HasControllerServiceWorker()); web_network_provider->HasControllerServiceWorker());
} }
worker_fetch_context->set_client_id(context->client_id());
return std::move(worker_fetch_context); return std::move(worker_fetch_context);
} }
......
...@@ -8,7 +8,6 @@ Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-script.ht ...@@ -8,7 +8,6 @@ Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-script.ht
Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-inheritance.html [ Failure ] Bug(none) external/wpt/content-security-policy/inside-worker/dedicated-inheritance.html [ Failure ]
Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ] Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ]
crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Timeout ] crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Timeout ]
Bug(none) external/wpt/service-workers/service-worker/clients-get-client-types.https.html [ Failure ]
Bug(none) external/wpt/service-workers/service-worker/fetch-request-xhr-sync-on-worker.https.html [ Timeout ] Bug(none) external/wpt/service-workers/service-worker/fetch-request-xhr-sync-on-worker.https.html [ Timeout ]
crbug.com/771118 external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] crbug.com/771118 external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ]
Bug(none) http/tests/appcache/top-frame-3.html [ Pass Timeout ] Bug(none) http/tests/appcache/top-frame-3.html [ Pass Timeout ]
......
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