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

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

Issue 761923004: Keep alive ServiceWorkers when devtools is attached (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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/embedded_worker_instance_unittest.cc
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc
index c5f190eef42375c75139d573dcdd2827548c25b0..c2d753cbaed7087be894b6959c17a449b9c31651 100644
--- a/content/browser/service_worker/embedded_worker_instance_unittest.cc
+++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -17,7 +17,18 @@
namespace content {
-static const int kRenderProcessId = 11;
+namespace {
+
+const int kRenderProcessId = 11;
+
+void SaveStatusAndCall(ServiceWorkerStatusCode* out,
+ const base::Closure& callback,
+ ServiceWorkerStatusCode status) {
+ *out = status;
+ callback.Run();
+}
+
+} // namespace
class EmbeddedWorkerInstanceTest : public testing::Test {
protected:
@@ -30,6 +41,18 @@ class EmbeddedWorkerInstanceTest : public testing::Test {
void TearDown() override { helper_.reset(); }
+ ServiceWorkerStatusCode StartWorker(EmbeddedWorkerInstance* worker,
+ int id, const GURL& pattern,
+ const GURL& url) {
+ ServiceWorkerStatusCode status;
+ base::RunLoop run_loop;
+ worker->Start(id, pattern, url, false,
+ base::Bind(&SaveStatusAndCall, &status,
+ run_loop.QuitClosure()));
+ run_loop.Run();
+ return status;
+ }
+
ServiceWorkerContextCore* context() { return helper_->context(); }
EmbeddedWorkerRegistry* embedded_worker_registry() {
@@ -46,13 +69,6 @@ class EmbeddedWorkerInstanceTest : public testing::Test {
DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest);
};
-static void SaveStatusAndCall(ServiceWorkerStatusCode* out,
- const base::Closure& callback,
- ServiceWorkerStatusCode status) {
- *out = status;
- callback.Run();
-}
-
TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) {
scoped_ptr<EmbeddedWorkerInstance> worker =
embedded_worker_registry()->CreateWorker();
@@ -99,6 +115,50 @@ TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) {
EmbeddedWorkerMsg_StopWorker::ID));
}
+TEST_F(EmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) {
+ scoped_ptr<EmbeddedWorkerInstance> worker =
+ embedded_worker_registry()->CreateWorker();
+ EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker->status());
+
+ const int64 service_worker_version_id = 55L;
+ const GURL pattern("http://example.com/");
+ const GURL url("http://example.com/worker.js");
+
+ // Simulate adding one process to the pattern.
+ helper_->SimulateAddProcessToPattern(pattern, kRenderProcessId);
+
+ // Start the worker and then call StopIfIdle().
+ EXPECT_EQ(SERVICE_WORKER_OK,
+ StartWorker(worker.get(), service_worker_version_id, pattern, url));
+ EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker->status());
+ EXPECT_EQ(kRenderProcessId, worker->process_id());
+ worker->StopIfIdle();
+ EXPECT_EQ(EmbeddedWorkerInstance::STOPPING, worker->status());
+ base::RunLoop().RunUntilIdle();
+
+ // The worker must be stopped now.
+ EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker->status());
+
+ // Set devtools_attached to true, and do the same.
+ worker->set_devtools_attached(true);
+
+ EXPECT_EQ(SERVICE_WORKER_OK,
+ StartWorker(worker.get(), service_worker_version_id, pattern, url));
+ EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker->status());
+ EXPECT_EQ(kRenderProcessId, worker->process_id());
+ worker->StopIfIdle();
+ base::RunLoop().RunUntilIdle();
+
+ // The worker must not be stopped this time.
+ EXPECT_EQ(EmbeddedWorkerInstance::RUNNING, worker->status());
+
+ // Calling Stop() actually stops the worker regardless of whether devtools
+ // is attached or not.
+ EXPECT_EQ(SERVICE_WORKER_OK, worker->Stop());
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(EmbeddedWorkerInstance::STOPPED, worker->status());
+}
+
TEST_F(EmbeddedWorkerInstanceTest, InstanceDestroyedBeforeStartFinishes) {
scoped_ptr<EmbeddedWorkerInstance> worker =
embedded_worker_registry()->CreateWorker();

Powered by Google App Engine
This is Rietveld 408576698