Commit 6cd4d80c authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

S13nSW: Skip service worker when no fetch handler

When a controller doesn't have fetch event handlers we should not route
requests to ServiceWorkerSubresourceLoader for no fetch optimization.
Bypass ServiceWorkerSubresourceLoader when there is no ControllerServiceWorker.
This works because ControllerServiceWorker is set only when the controller
has fetch event handlers.

Bug: 847322
Change-Id: I6e76a415b5b3c9156bce8676a79312c09307595c
Reviewed-on: https://chromium-review.googlesource.com/1096584
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@{#567090}
parent 9570d33e
...@@ -57,6 +57,11 @@ struct ServiceWorkerProviderContext::ProviderStateForClient { ...@@ -57,6 +57,11 @@ struct ServiceWorkerProviderContext::ProviderStateForClient {
// The Client#id value of the client. // The Client#id value of the client.
std::string client_id; std::string client_id;
// S13nServiceWorker:
// True when the controller has a fetch event handler. If false,
// ServiceWorkerSubresourceLoader will be bypassed.
bool controller_has_fetch_event_handler = false;
// Tracks feature usage for UseCounter. // Tracks feature usage for UseCounter.
std::set<blink::mojom::WebFeature> used_features; std::set<blink::mojom::WebFeature> used_features;
...@@ -155,6 +160,8 @@ ServiceWorkerProviderContext::GetSubresourceLoaderFactory() { ...@@ -155,6 +160,8 @@ ServiceWorkerProviderContext::GetSubresourceLoaderFactory() {
// No controller is attached. // No controller is attached.
return nullptr; return nullptr;
} }
if (!state->controller_has_fetch_event_handler)
return nullptr;
DCHECK(ServiceWorkerUtils::IsServicificationEnabled()); DCHECK(ServiceWorkerUtils::IsServicificationEnabled());
if (!state->subresource_loader_factory) { if (!state->subresource_loader_factory) {
ServiceWorkerSubresourceLoaderFactory::Create( ServiceWorkerSubresourceLoaderFactory::Create(
...@@ -285,6 +292,8 @@ void ServiceWorkerProviderContext::SetController( ...@@ -285,6 +292,8 @@ void ServiceWorkerProviderContext::SetController(
DCHECK(state->client_id.empty() || DCHECK(state->client_id.empty() ||
state->client_id == controller_info->client_id); state->client_id == controller_info->client_id);
state->client_id = controller_info->client_id; state->client_id = controller_info->client_id;
// |endpoint| is set only when the controller has a fetch event handler.
state->controller_has_fetch_event_handler = !!controller_info->endpoint;
// Propagate the controller to workers related to this provider. // Propagate the controller to workers related to this provider.
if (state->controller) { if (state->controller) {
......
...@@ -550,6 +550,33 @@ TEST_F(ServiceWorkerProviderContextTest, SetControllerServiceWorker) { ...@@ -550,6 +550,33 @@ TEST_F(ServiceWorkerProviderContextTest, SetControllerServiceWorker) {
EXPECT_EQ(1UL, fake_loader_factory_.clients_count()); EXPECT_EQ(1UL, fake_loader_factory_.clients_count());
} }
TEST_F(ServiceWorkerProviderContextTest, ControllerWithoutFetchHandler) {
EnableS13nServiceWorker();
const int kProviderId = 10;
auto object_host =
std::make_unique<MockServiceWorkerObjectHost>(200 /* version_id */);
// Set a controller without ControllerServiceWorker ptr to emulate no
// fetch event handler.
blink::mojom::ServiceWorkerObjectInfoPtr object_info =
object_host->CreateObjectInfo();
auto controller_info = mojom::ControllerServiceWorkerInfo::New();
mojom::ControllerServiceWorkerPtr controller_ptr;
controller_info->object_info = std::move(object_info);
mojom::ServiceWorkerContainerAssociatedPtr container_ptr;
mojom::ServiceWorkerContainerAssociatedRequest container_request =
mojo::MakeRequestAssociatedWithDedicatedPipe(&container_ptr);
auto provider_context = base::MakeRefCounted<ServiceWorkerProviderContext>(
kProviderId, blink::mojom::ServiceWorkerProviderType::kForWindow,
std::move(container_request), nullptr /* host_ptr_info */,
std::move(controller_info), loader_factory_);
base::RunLoop().RunUntilIdle();
// Subresource loader factory must not be available.
EXPECT_EQ(nullptr, provider_context->GetSubresourceLoaderFactory());
}
TEST_F(ServiceWorkerProviderContextTest, PostMessageToClient) { TEST_F(ServiceWorkerProviderContextTest, PostMessageToClient) {
const int kProviderId = 10; const int kProviderId = 10;
......
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