Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2503)

Unified Diff: content/browser/service_worker/service_worker_browsertest.cc

Issue 1098083003: Evict Service Worker when reading it from disk cache fails. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rm friend Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/service_worker_browsertest.cc
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 3c75a907447f48439ce19a6d3756fd1923f412b8..db8db69dd509e5d0f32ebb8d26f259b5f5193129 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -572,6 +572,32 @@ class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
version_->OnPingTimeout();
}
+ void AddControlleeOnIOThread() {
+ ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ scoped_ptr<ServiceWorkerProviderHost> host(new ServiceWorkerProviderHost(
+ 33 /* dummy render process id */,
+ MSG_ROUTING_NONE /* render_frame_id */, 1 /* dummy provider_id */,
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, wrapper()->context()->AsWeakPtr(),
+ NULL));
+ host->SetDocumentUrl(
+ embedded_test_server()->GetURL("/service_worker/host"));
+ host->AssociateRegistration(registration_.get(),
+ false /* notify_controllerchange */);
+ wrapper()->context()->AddProviderHost(host.Pass());
+ }
+
+ void AddWaitingWorkerOnIOThread(const std::string& worker_url) {
+ ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ scoped_refptr<ServiceWorkerVersion> waiting_version(
+ new ServiceWorkerVersion(
+ registration_.get(), embedded_test_server()->GetURL(worker_url),
+ wrapper()->context()->storage()->NewVersionId(),
+ wrapper()->context()->AsWeakPtr()));
+ waiting_version->SetStatus(ServiceWorkerVersion::INSTALLED);
+ registration_->SetWaitingVersion(waiting_version.get());
+ registration_->ActivateWaitingVersionWhenReady();
+ }
+
void StartWorker(ServiceWorkerStatusCode expected_status) {
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -614,6 +640,7 @@ class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
ServiceWorkerStatusCode* result) {
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
version_->SetStatus(ServiceWorkerVersion::ACTIVATING);
+ registration_->SetActiveVersion(version_.get());
version_->DispatchActivateEvent(
CreateReceiver(BrowserThread::UI, done, result));
}
@@ -730,6 +757,61 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) {
StartWorker(SERVICE_WORKER_ERROR_NETWORK);
}
+IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, ReadResourceFailure) {
+ RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this,
+ "/service_worker/worker.js"));
+ version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+
+ // Add a non-existent resource to the version.
+ std::vector<ServiceWorkerDatabase::ResourceRecord> records;
+ records.push_back(
+ ServiceWorkerDatabase::ResourceRecord(30, version_->script_url(), 100));
+ version_->script_cache_map()->SetResources(records);
+
+ // We'll fail to read from disk and the worker should be doomed.
+ StartWorker(SERVICE_WORKER_ERROR_DISK_CACHE);
+ EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, version_->status());
+
+ // The registration should be deleted since the version was the stored one.
+ EXPECT_TRUE(registration_->is_deleted());
+}
+
+IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
+ ReadResourceFailure_WaitingWorker) {
+ RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread, this,
+ "/service_worker/worker.js"));
+ base::RunLoop acrivate_run_loop;
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::ActivateOnIOThread, this,
+ acrivate_run_loop.QuitClosure(), &status));
+ acrivate_run_loop.Run();
+ ASSERT_TRUE(registration_->active_version());
+
+ // Give the version a controllee.
+ RunOnIOThread(base::Bind(&self::AddControlleeOnIOThread, this));
+
+ // Add a non-existent resource to the version.
+ std::vector<ServiceWorkerDatabase::ResourceRecord> records;
+ records.push_back(
+ ServiceWorkerDatabase::ResourceRecord(30, version_->script_url(), 100));
+ version_->script_cache_map()->SetResources(records);
+
+ // Make a waiting version.
+ RunOnIOThread(base::Bind(&self::AddWaitingWorkerOnIOThread, this,
+ "/service_worker/worker.js"));
+
+ // Start the worker. We'll fail to read from disk and the worker should be
+ // doomed.
+ StopWorker(SERVICE_WORKER_OK); // in case it's already running
+ StartWorker(SERVICE_WORKER_ERROR_DISK_CACHE);
+ EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, version_->status());
+
+ // The registration is still alive since the waiting version was the stored
+ // one.
+ EXPECT_FALSE(registration_->is_deleted());
+}
+
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, Install) {
InstallTestHelper("/service_worker/worker.js", SERVICE_WORKER_OK);
}

Powered by Google App Engine
This is Rietveld 408576698