Commit c2e67e4e authored by Wei Wang's avatar Wei Wang Committed by Commit Bot

Make service worker check for fetch handle existence at the end of

initial script evaluation.

This patch makes service worker check for fetch handle existence at the
end of initial script evaluation, which is more consistent with spec
(https://w3c.github.io/ServiceWorker/#should-skip-event).

Bug: 1005060
Change-Id: I3e389e5a641971398857fc40e6e5fcc79e074cb4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1995062Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Commit-Queue: Wei4 Wang <wei4.wang@intel.com>
Cr-Commit-Position: refs/heads/master@{#748508}
parent de0ac456
...@@ -928,6 +928,7 @@ void EmbeddedWorkerInstance::OnScriptEvaluationStart() { ...@@ -928,6 +928,7 @@ void EmbeddedWorkerInstance::OnScriptEvaluationStart() {
void EmbeddedWorkerInstance::OnStarted( void EmbeddedWorkerInstance::OnStarted(
blink::mojom::ServiceWorkerStartStatus start_status, blink::mojom::ServiceWorkerStartStatus start_status,
bool has_fetch_handler,
int thread_id, int thread_id,
blink::mojom::EmbeddedWorkerStartTimingPtr start_timing) { blink::mojom::EmbeddedWorkerStartTimingPtr start_timing) {
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnStarted"); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstance::OnStarted");
...@@ -971,7 +972,7 @@ void EmbeddedWorkerInstance::OnStarted( ...@@ -971,7 +972,7 @@ void EmbeddedWorkerInstance::OnStarted(
thread_id_ = thread_id; thread_id_ = thread_id;
inflight_start_task_.reset(); inflight_start_task_.reset();
for (auto& observer : listener_list_) { for (auto& observer : listener_list_) {
observer.OnStarted(start_status); observer.OnStarted(start_status, has_fetch_handler);
// |this| may be destroyed here. Fortunately we know there is only one // |this| may be destroyed here. Fortunately we know there is only one
// observer in production code. // observer in production code.
} }
......
...@@ -92,7 +92,8 @@ class CONTENT_EXPORT EmbeddedWorkerInstance ...@@ -92,7 +92,8 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
virtual void OnRegisteredToDevToolsManager() {} virtual void OnRegisteredToDevToolsManager() {}
virtual void OnStartWorkerMessageSent() {} virtual void OnStartWorkerMessageSent() {}
virtual void OnScriptEvaluationStart() {} virtual void OnScriptEvaluationStart() {}
virtual void OnStarted(blink::mojom::ServiceWorkerStartStatus status) {} virtual void OnStarted(blink::mojom::ServiceWorkerStartStatus status,
bool has_fetch_handler) {}
// Called when status changed to STOPPING. The renderer has been sent a Stop // Called when status changed to STOPPING. The renderer has been sent a Stop
// IPC message and OnStopped() will be called upon successful completion. // IPC message and OnStopped() will be called upon successful completion.
...@@ -269,6 +270,7 @@ class CONTENT_EXPORT EmbeddedWorkerInstance ...@@ -269,6 +270,7 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
// Changes the internal worker status from STARTING to RUNNING. // Changes the internal worker status from STARTING to RUNNING.
void OnStarted( void OnStarted(
blink::mojom::ServiceWorkerStartStatus status, blink::mojom::ServiceWorkerStartStatus status,
bool has_fetch_handler,
int thread_id, int thread_id,
blink::mojom::EmbeddedWorkerStartTimingPtr start_timing) override; blink::mojom::EmbeddedWorkerStartTimingPtr start_timing) override;
// Resets the embedded worker instance to the initial state. Changes // Resets the embedded worker instance to the initial state. Changes
......
...@@ -90,7 +90,9 @@ class EmbeddedWorkerInstanceTest : public testing::Test, ...@@ -90,7 +90,9 @@ class EmbeddedWorkerInstanceTest : public testing::Test,
void OnStartWorkerMessageSent() override { void OnStartWorkerMessageSent() override {
RecordEvent(START_WORKER_MESSAGE_SENT); RecordEvent(START_WORKER_MESSAGE_SENT);
} }
void OnStarted(blink::mojom::ServiceWorkerStartStatus status) override { void OnStarted(blink::mojom::ServiceWorkerStartStatus status,
bool has_fetch_handler) override {
has_fetch_handler_ = has_fetch_handler;
RecordEvent(STARTED, base::nullopt, status); RecordEvent(STARTED, base::nullopt, status);
} }
void OnStopped(EmbeddedWorkerStatus old_status) override { void OnStopped(EmbeddedWorkerStatus old_status) override {
...@@ -219,6 +221,7 @@ class EmbeddedWorkerInstanceTest : public testing::Test, ...@@ -219,6 +221,7 @@ class EmbeddedWorkerInstanceTest : public testing::Test,
std::unique_ptr<EmbeddedWorkerTestHelper> helper_; std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
std::vector<EventLog> events_; std::vector<EventLog> events_;
base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedFeatureList scoped_feature_list_;
bool has_fetch_handler_;
private: private:
DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest); DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest);
...@@ -651,7 +654,7 @@ class AbruptCompletionInstanceClient : public FakeEmbeddedWorkerInstanceClient { ...@@ -651,7 +654,7 @@ class AbruptCompletionInstanceClient : public FakeEmbeddedWorkerInstanceClient {
void EvaluateScript() override { void EvaluateScript() override {
host()->OnScriptEvaluationStart(); host()->OnScriptEvaluationStart();
host()->OnStarted(blink::mojom::ServiceWorkerStartStatus::kAbruptCompletion, host()->OnStarted(blink::mojom::ServiceWorkerStartStatus::kAbruptCompletion,
helper()->GetNextThreadId(), /*has_fetch_handler=*/false, helper()->GetNextThreadId(),
blink::mojom::EmbeddedWorkerStartTiming::New()); blink::mojom::EmbeddedWorkerStartTiming::New());
} }
}; };
...@@ -679,6 +682,62 @@ TEST_F(EmbeddedWorkerInstanceTest, AbruptCompletion) { ...@@ -679,6 +682,62 @@ TEST_F(EmbeddedWorkerInstanceTest, AbruptCompletion) {
worker->Stop(); worker->Stop();
} }
// A fake instance client for toggling whether a fetch event handler exists.
class FetchHandlerInstanceClient : public FakeEmbeddedWorkerInstanceClient {
public:
explicit FetchHandlerInstanceClient(EmbeddedWorkerTestHelper* helper)
: FakeEmbeddedWorkerInstanceClient(helper) {}
~FetchHandlerInstanceClient() override = default;
void set_has_fetch_handler(bool has_fetch_handler) {
has_fetch_handler_ = has_fetch_handler;
}
protected:
void EvaluateScript() override {
host()->OnScriptEvaluationStart();
host()->OnStarted(blink::mojom::ServiceWorkerStartStatus::kNormalCompletion,
has_fetch_handler_, helper()->GetNextThreadId(),
blink::mojom::EmbeddedWorkerStartTiming::New());
}
private:
bool has_fetch_handler_ = false;
};
// Tests that whether a fetch event handler exists.
TEST_F(EmbeddedWorkerInstanceTest, HasFetchHandler) {
const GURL scope("http://example.com/");
const GURL url("http://example.com/worker.js");
RegistrationAndVersionPair pair1 = PrepareRegistrationAndVersion(scope, url);
auto worker1 = std::make_unique<EmbeddedWorkerInstance>(pair1.second.get());
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker1->status());
worker1->AddObserver(this);
auto* fetch_handler_worker =
helper_->AddNewPendingInstanceClient<FetchHandlerInstanceClient>(
helper_.get());
fetch_handler_worker->set_has_fetch_handler(true);
StartWorker(worker1.get(), CreateStartParams(pair1.second));
EXPECT_TRUE(has_fetch_handler_);
worker1->Stop();
RegistrationAndVersionPair pair2 = PrepareRegistrationAndVersion(scope, url);
auto worker2 = std::make_unique<EmbeddedWorkerInstance>(pair2.second.get());
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker2->status());
worker2->AddObserver(this);
auto* no_fetch_handler_worker =
helper_->AddNewPendingInstanceClient<FetchHandlerInstanceClient>(
helper_.get());
no_fetch_handler_worker->set_has_fetch_handler(false);
StartWorker(worker2.get(), CreateStartParams(pair2.second));
EXPECT_FALSE(has_fetch_handler_);
worker2->Stop();
}
// Tests recording the lifetime UMA. // Tests recording the lifetime UMA.
TEST_F(EmbeddedWorkerInstanceTest, Lifetime) { TEST_F(EmbeddedWorkerInstanceTest, Lifetime) {
const GURL scope("http://example.com/"); const GURL scope("http://example.com/");
......
...@@ -126,7 +126,7 @@ void FakeEmbeddedWorkerInstanceClient::CallOnConnectionError() { ...@@ -126,7 +126,7 @@ void FakeEmbeddedWorkerInstanceClient::CallOnConnectionError() {
void FakeEmbeddedWorkerInstanceClient::EvaluateScript() { void FakeEmbeddedWorkerInstanceClient::EvaluateScript() {
host_->OnScriptEvaluationStart(); host_->OnScriptEvaluationStart();
host_->OnStarted(blink::mojom::ServiceWorkerStartStatus::kNormalCompletion, host_->OnStarted(blink::mojom::ServiceWorkerStartStatus::kNormalCompletion,
helper_->GetNextThreadId(), true /* has_fetch_handler */, helper_->GetNextThreadId(),
blink::mojom::EmbeddedWorkerStartTiming::New()); blink::mojom::EmbeddedWorkerStartTiming::New());
} }
......
...@@ -77,8 +77,7 @@ void FakeServiceWorker::InitializeGlobalScope( ...@@ -77,8 +77,7 @@ void FakeServiceWorker::InitializeGlobalScope(
void FakeServiceWorker::DispatchInstallEvent( void FakeServiceWorker::DispatchInstallEvent(
DispatchInstallEventCallback callback) { DispatchInstallEventCallback callback) {
std::move(callback).Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED, std::move(callback).Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED);
true /* has_fetch_handler */);
} }
void FakeServiceWorker::DispatchActivateEvent( void FakeServiceWorker::DispatchActivateEvent(
......
...@@ -117,8 +117,7 @@ class InstallActivateWorker : public FakeServiceWorker { ...@@ -117,8 +117,7 @@ class InstallActivateWorker : public FakeServiceWorker {
events_.emplace_back(ServiceWorkerMetrics::EventType::INSTALL); events_.emplace_back(ServiceWorkerMetrics::EventType::INSTALL);
std::move(callback).Run( std::move(callback).Run(
reject_install_ ? blink::mojom::ServiceWorkerEventStatus::REJECTED reject_install_ ? blink::mojom::ServiceWorkerEventStatus::REJECTED
: blink::mojom::ServiceWorkerEventStatus::COMPLETED, : blink::mojom::ServiceWorkerEventStatus::COMPLETED);
true /* has_fetch_handler */);
} }
void DispatchActivateEvent( void DispatchActivateEvent(
......
...@@ -816,8 +816,8 @@ TEST_F(ServiceWorkerJobTest, UnregisterWaitingSetsRedundant) { ...@@ -816,8 +816,8 @@ TEST_F(ServiceWorkerJobTest, UnregisterWaitingSetsRedundant) {
ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk,
StartServiceWorker(version.get())); StartServiceWorker(version.get()));
version->set_fetch_handler_existence( EXPECT_EQ(version->fetch_handler_existence(),
ServiceWorkerVersion::FetchHandlerExistence::EXISTS); ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
version->SetStatus(ServiceWorkerVersion::INSTALLED); version->SetStatus(ServiceWorkerVersion::INSTALLED);
registration->SetWaitingVersion(version); registration->SetWaitingVersion(version);
EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version->running_status()); EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version->running_status());
...@@ -1065,22 +1065,23 @@ TEST_F(ServiceWorkerJobTest, RegisterSameScriptMultipleTimesWhileUninstalling) { ...@@ -1065,22 +1065,23 @@ TEST_F(ServiceWorkerJobTest, RegisterSameScriptMultipleTimesWhileUninstalling) {
EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, new_version->status()); EXPECT_EQ(ServiceWorkerVersion::ACTIVATED, new_version->status());
} }
// A fake service worker for toggling whether a fetch event handler exists. // A fake instance client for toggling whether a fetch event handler exists.
class FetchHandlerWorker : public FakeServiceWorker { class FetchHandlerInstanceClient : public FakeEmbeddedWorkerInstanceClient {
public: public:
FetchHandlerWorker(EmbeddedWorkerTestHelper* helper) explicit FetchHandlerInstanceClient(EmbeddedWorkerTestHelper* helper)
: FakeServiceWorker(helper) {} : FakeEmbeddedWorkerInstanceClient(helper) {}
~FetchHandlerWorker() override = default; ~FetchHandlerInstanceClient() override = default;
void set_has_fetch_handler(bool has_fetch_handler) { void set_has_fetch_handler(bool has_fetch_handler) {
has_fetch_handler_ = has_fetch_handler; has_fetch_handler_ = has_fetch_handler;
} }
void DispatchInstallEvent( protected:
blink::mojom::ServiceWorker::DispatchInstallEventCallback callback) void EvaluateScript() override {
override { host()->OnScriptEvaluationStart();
std::move(callback).Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED, host()->OnStarted(blink::mojom::ServiceWorkerStartStatus::kNormalCompletion,
has_fetch_handler_); has_fetch_handler_, helper()->GetNextThreadId(),
blink::mojom::EmbeddedWorkerStartTiming::New());
} }
private: private:
...@@ -1094,7 +1095,8 @@ TEST_F(ServiceWorkerJobTest, HasFetchHandler) { ...@@ -1094,7 +1095,8 @@ TEST_F(ServiceWorkerJobTest, HasFetchHandler) {
scoped_refptr<ServiceWorkerRegistration> registration; scoped_refptr<ServiceWorkerRegistration> registration;
auto* fetch_handler_worker = auto* fetch_handler_worker =
helper_->AddNewPendingServiceWorker<FetchHandlerWorker>(helper_.get()); helper_->AddNewPendingInstanceClient<FetchHandlerInstanceClient>(
helper_.get());
fetch_handler_worker->set_has_fetch_handler(true); fetch_handler_worker->set_has_fetch_handler(true);
RunRegisterJob(script, options); RunRegisterJob(script, options);
// Wait until the worker becomes active. // Wait until the worker becomes active.
...@@ -1105,7 +1107,8 @@ TEST_F(ServiceWorkerJobTest, HasFetchHandler) { ...@@ -1105,7 +1107,8 @@ TEST_F(ServiceWorkerJobTest, HasFetchHandler) {
RunUnregisterJob(options.scope); RunUnregisterJob(options.scope);
auto* no_fetch_handler_worker = auto* no_fetch_handler_worker =
helper_->AddNewPendingServiceWorker<FetchHandlerWorker>(helper_.get()); helper_->AddNewPendingInstanceClient<FetchHandlerInstanceClient>(
helper_.get());
no_fetch_handler_worker->set_has_fetch_handler(false); no_fetch_handler_worker->set_has_fetch_handler(false);
RunRegisterJob(script, options); RunRegisterJob(script, options);
// Wait until the worker becomes active. // Wait until the worker becomes active.
...@@ -1258,7 +1261,7 @@ class UpdateJobTestHelper : public EmbeddedWorkerTestHelper, ...@@ -1258,7 +1261,7 @@ class UpdateJobTestHelper : public EmbeddedWorkerTestHelper,
host()->OnScriptEvaluationStart(); host()->OnScriptEvaluationStart();
host()->OnStarted( host()->OnStarted(
blink::mojom::ServiceWorkerStartStatus::kAbruptCompletion, blink::mojom::ServiceWorkerStartStatus::kAbruptCompletion,
helper()->GetNextThreadId(), /*has_fetch_handler=*/false, helper()->GetNextThreadId(),
blink::mojom::EmbeddedWorkerStartTiming::New()); blink::mojom::EmbeddedWorkerStartTiming::New());
} }
......
...@@ -612,8 +612,7 @@ void ServiceWorkerRegisterJob::DispatchInstallEvent( ...@@ -612,8 +612,7 @@ void ServiceWorkerRegisterJob::DispatchInstallEvent(
void ServiceWorkerRegisterJob::OnInstallFinished( void ServiceWorkerRegisterJob::OnInstallFinished(
int request_id, int request_id,
blink::mojom::ServiceWorkerEventStatus event_status, blink::mojom::ServiceWorkerEventStatus event_status) {
bool has_fetch_handler) {
bool succeeded = bool succeeded =
event_status == blink::mojom::ServiceWorkerEventStatus::COMPLETED; event_status == blink::mojom::ServiceWorkerEventStatus::COMPLETED;
new_version()->FinishRequest(request_id, succeeded); new_version()->FinishRequest(request_id, succeeded);
...@@ -629,10 +628,6 @@ void ServiceWorkerRegisterJob::OnInstallFinished( ...@@ -629,10 +628,6 @@ void ServiceWorkerRegisterJob::OnInstallFinished(
SetPhase(STORE); SetPhase(STORE);
DCHECK(!registration()->last_update_check().is_null()); DCHECK(!registration()->last_update_check().is_null());
new_version()->set_fetch_handler_existence(
has_fetch_handler
? ServiceWorkerVersion::FetchHandlerExistence::EXISTS
: ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
context_->registry()->StoreRegistration( context_->registry()->StoreRegistration(
registration(), new_version(), registration(), new_version(),
base::BindOnce(&ServiceWorkerRegisterJob::OnStoreRegistrationComplete, base::BindOnce(&ServiceWorkerRegisterJob::OnStoreRegistrationComplete,
......
...@@ -146,8 +146,7 @@ class ServiceWorkerRegisterJob : public ServiceWorkerRegisterJobBase { ...@@ -146,8 +146,7 @@ class ServiceWorkerRegisterJob : public ServiceWorkerRegisterJobBase {
void InstallAndContinue(); void InstallAndContinue();
void DispatchInstallEvent(blink::ServiceWorkerStatusCode start_worker_status); void DispatchInstallEvent(blink::ServiceWorkerStatusCode start_worker_status);
void OnInstallFinished(int request_id, void OnInstallFinished(int request_id,
blink::mojom::ServiceWorkerEventStatus event_status, blink::mojom::ServiceWorkerEventStatus event_status);
bool has_fetch_handler);
void OnInstallFailed(blink::ServiceWorkerStatusCode status); void OnInstallFailed(blink::ServiceWorkerStatusCode status);
void Complete(blink::ServiceWorkerStatusCode status); void Complete(blink::ServiceWorkerStatusCode status);
void Complete(blink::ServiceWorkerStatusCode status, void Complete(blink::ServiceWorkerStatusCode status,
......
...@@ -1172,7 +1172,8 @@ void ServiceWorkerVersion::OnStarting() { ...@@ -1172,7 +1172,8 @@ void ServiceWorkerVersion::OnStarting() {
} }
void ServiceWorkerVersion::OnStarted( void ServiceWorkerVersion::OnStarted(
blink::mojom::ServiceWorkerStartStatus start_status) { blink::mojom::ServiceWorkerStartStatus start_status,
bool has_fetch_handler) {
DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()); DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status());
// TODO(falken): This maps kAbruptCompletion to kErrorScriptEvaluated, which // TODO(falken): This maps kAbruptCompletion to kErrorScriptEvaluated, which
...@@ -1183,6 +1184,12 @@ void ServiceWorkerVersion::OnStarted( ...@@ -1183,6 +1184,12 @@ void ServiceWorkerVersion::OnStarted(
blink::ServiceWorkerStatusCode status = blink::ServiceWorkerStatusCode status =
mojo::ConvertTo<blink::ServiceWorkerStatusCode>(start_status); mojo::ConvertTo<blink::ServiceWorkerStatusCode>(start_status);
if (status == blink::ServiceWorkerStatusCode::kOk &&
fetch_handler_existence_ == FetchHandlerExistence::UNKNOWN)
set_fetch_handler_existence(has_fetch_handler
? FetchHandlerExistence::EXISTS
: FetchHandlerExistence::DOES_NOT_EXIST);
// Fire all start callbacks. // Fire all start callbacks.
scoped_refptr<ServiceWorkerVersion> protect(this); scoped_refptr<ServiceWorkerVersion> protect(this);
FinishStartWorker(status); FinishStartWorker(status);
......
...@@ -731,7 +731,8 @@ class CONTENT_EXPORT ServiceWorkerVersion ...@@ -731,7 +731,8 @@ class CONTENT_EXPORT ServiceWorkerVersion
// EmbeddedWorkerInstance::Listener overrides: // EmbeddedWorkerInstance::Listener overrides:
void OnScriptEvaluationStart() override; void OnScriptEvaluationStart() override;
void OnStarting() override; void OnStarting() override;
void OnStarted(blink::mojom::ServiceWorkerStartStatus status) override; void OnStarted(blink::mojom::ServiceWorkerStartStatus status,
bool has_fetch_handler) override;
void OnStopping() override; void OnStopping() override;
void OnStopped(EmbeddedWorkerStatus old_status) override; void OnStopped(EmbeddedWorkerStatus old_status) override;
void OnDetached(EmbeddedWorkerStatus old_status) override; void OnDetached(EmbeddedWorkerStatus old_status) override;
......
...@@ -628,15 +628,10 @@ class ServiceWorkerVersionBrowserTest : public ContentBrowserTest { ...@@ -628,15 +628,10 @@ class ServiceWorkerVersionBrowserTest : public ContentBrowserTest {
base::OnceClosure done, base::OnceClosure done,
base::Optional<blink::ServiceWorkerStatusCode>* out_result, base::Optional<blink::ServiceWorkerStatusCode>* out_result,
int request_id, int request_id,
blink::mojom::ServiceWorkerEventStatus status, blink::mojom::ServiceWorkerEventStatus status) {
bool has_fetch_handler) {
version_->FinishRequest( version_->FinishRequest(
request_id, request_id,
status == blink::mojom::ServiceWorkerEventStatus::COMPLETED); status == blink::mojom::ServiceWorkerEventStatus::COMPLETED);
version_->set_fetch_handler_existence(
has_fetch_handler
? ServiceWorkerVersion::FetchHandlerExistence::EXISTS
: ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
*out_result = mojo::ConvertTo<blink::ServiceWorkerStatusCode>(status); *out_result = mojo::ConvertTo<blink::ServiceWorkerStatusCode>(status);
if (!done.is_null()) if (!done.is_null())
...@@ -1091,6 +1086,17 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, ...@@ -1091,6 +1086,17 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
version_->fetch_handler_existence()); version_->fetch_handler_existence());
} }
// Check that fetch event handler added in the install event should result in a
// service worker that doesn't count as having a fetch event handler.
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
FetchHandlerSetInInstallEvent) {
StartServerAndNavigateToSetup();
InstallTestHelper("/service_worker/fetch_event_set_in_install_event.js",
blink::ServiceWorkerStatusCode::kOk);
EXPECT_EQ(ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST,
version_->fetch_handler_existence());
}
// Check that ServiceWorker script requests set a "Service-Worker: script" // Check that ServiceWorker script requests set a "Service-Worker: script"
// header. // header.
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
......
...@@ -466,7 +466,8 @@ void ServiceWorkerContextClient::SendWorkerStarted( ...@@ -466,7 +466,8 @@ void ServiceWorkerContextClient::SendWorkerStarted(
CHECK_LE(start_timing_->script_evaluation_start_time, CHECK_LE(start_timing_->script_evaluation_start_time,
start_timing_->script_evaluation_end_time); start_timing_->script_evaluation_end_time);
instance_host_->OnStarted(status, WorkerThread::GetCurrentId(), instance_host_->OnStarted(status, proxy_->HasFetchHandler(),
WorkerThread::GetCurrentId(),
std::move(start_timing_)); std::move(start_timing_));
TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "ServiceWorkerContextClient", TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "ServiceWorkerContextClient",
......
// Copyright 2020 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.
this.oninstall = function(event){
this.onfetch = function(fetchevent) {
var headers = new Headers;
headers.set('Content-Language', 'fi');
headers.set('Content-Type', 'text/html; charset=UTF-8');
var blob = new Blob(["This resource is gone. Gone, gone, gone."]);
var response = new Response(blob, {
status: 301,
statusText: 'Moved Permanently',
headers: headers
});
fetchevent.respondWith(response);
};
};
...@@ -186,8 +186,10 @@ interface EmbeddedWorkerInstanceHost { ...@@ -186,8 +186,10 @@ interface EmbeddedWorkerInstanceHost {
// for the browser process to start enforcing timeouts on script execution. // for the browser process to start enforcing timeouts on script execution.
OnScriptEvaluationStart(); OnScriptEvaluationStart();
// Indicates that the worker has started. |thread_id| is the platform // Indicates that the worker has started. |thread_id| is the platform
// thread id the worker runs on. // thread id the worker runs on. |has_fetch_handler| is true when the fetch
// event handler exists after initial script evaluation.
OnStarted(ServiceWorkerStartStatus status, OnStarted(ServiceWorkerStartStatus status,
bool has_fetch_handler,
int32 thread_id, int32 thread_id,
EmbeddedWorkerStartTiming start_timing); EmbeddedWorkerStartTiming start_timing);
......
...@@ -187,8 +187,10 @@ interface ServiceWorker { ...@@ -187,8 +187,10 @@ interface ServiceWorker {
FetchHandlerExistence fetch_handler_existence, FetchHandlerExistence fetch_handler_existence,
URLLoaderFactoryBundle? subresource_loader_factories); URLLoaderFactoryBundle? subresource_loader_factories);
// These methods dispatch InstallEvent and ActivateEvent to the
// ServiceWorkerGlobalScope.
DispatchInstallEvent() DispatchInstallEvent()
=> (ServiceWorkerEventStatus status, bool has_fetch_handler); => (ServiceWorkerEventStatus status);
DispatchActivateEvent() DispatchActivateEvent()
=> (ServiceWorkerEventStatus status); => (ServiceWorkerEventStatus status);
......
...@@ -71,6 +71,7 @@ class WebServiceWorkerContextProxy { ...@@ -71,6 +71,7 @@ class WebServiceWorkerContextProxy {
virtual bool IsWindowInteractionAllowed() = 0; virtual bool IsWindowInteractionAllowed() = 0;
virtual void PauseEvaluation() = 0; virtual void PauseEvaluation() = 0;
virtual void ResumeEvaluation() = 0; virtual void ResumeEvaluation() = 0;
virtual bool HasFetchHandler() = 0;
}; };
} // namespace blink } // namespace blink
......
...@@ -858,8 +858,7 @@ void ServiceWorkerGlobalScope::DidHandleInstallEvent( ...@@ -858,8 +858,7 @@ void ServiceWorkerGlobalScope::DidHandleInstallEvent(
TRACE_ID_LOCAL(install_event_id)), TRACE_ID_LOCAL(install_event_id)),
TRACE_EVENT_FLAG_FLOW_IN, "status", MojoEnumToString(status)); TRACE_EVENT_FLAG_FLOW_IN, "status", MojoEnumToString(status));
RunEventCallback(&install_event_callbacks_, event_queue_.get(), RunEventCallback(&install_event_callbacks_, event_queue_.get(),
install_event_id, status, install_event_id, status);
HasEventListeners(event_type_names::kFetch));
} }
void ServiceWorkerGlobalScope::DidHandleActivateEvent( void ServiceWorkerGlobalScope::DidHandleActivateEvent(
...@@ -1583,9 +1582,7 @@ void ServiceWorkerGlobalScope::DispatchInstallEvent( ...@@ -1583,9 +1582,7 @@ void ServiceWorkerGlobalScope::DispatchInstallEvent(
event_queue_->EnqueueNormal( event_queue_->EnqueueNormal(
WTF::Bind(&ServiceWorkerGlobalScope::StartInstallEvent, WTF::Bind(&ServiceWorkerGlobalScope::StartInstallEvent,
WrapWeakPersistent(this), std::move(callback)), WrapWeakPersistent(this), std::move(callback)),
CreateAbortCallback(&install_event_callbacks_, CreateAbortCallback(&install_event_callbacks_), base::nullopt);
false /* has_fetch_handler */),
base::nullopt);
} }
void ServiceWorkerGlobalScope::StartInstallEvent( void ServiceWorkerGlobalScope::StartInstallEvent(
......
...@@ -324,6 +324,10 @@ void ServiceWorkerGlobalScopeProxy::ResumeEvaluation() { ...@@ -324,6 +324,10 @@ void ServiceWorkerGlobalScopeProxy::ResumeEvaluation() {
WorkerGlobalScope()->ResumeEvaluation(); WorkerGlobalScope()->ResumeEvaluation();
} }
bool ServiceWorkerGlobalScopeProxy::HasFetchHandler() {
return WorkerGlobalScope()->HasEventListeners(event_type_names::kFetch);
}
WebServiceWorkerContextClient& ServiceWorkerGlobalScopeProxy::Client() const { WebServiceWorkerContextClient& ServiceWorkerGlobalScopeProxy::Client() const {
DCHECK(client_); DCHECK(client_);
return *client_; return *client_;
......
...@@ -93,6 +93,7 @@ class ServiceWorkerGlobalScopeProxy final : public WebServiceWorkerContextProxy, ...@@ -93,6 +93,7 @@ class ServiceWorkerGlobalScopeProxy final : public WebServiceWorkerContextProxy,
bool IsWindowInteractionAllowed() override; bool IsWindowInteractionAllowed() override;
void PauseEvaluation() override; void PauseEvaluation() override;
void ResumeEvaluation() override; void ResumeEvaluation() override;
bool HasFetchHandler() override;
// WorkerReportingProxy overrides: // WorkerReportingProxy overrides:
void CountFeature(WebFeature) override; void CountFeature(WebFeature) override;
......
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