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

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

Issue 2506263005: Prevent a service worker from keeping itself alive by self postMessage. (Closed)
Patch Set: fix unit test Created 4 years, 1 month 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 6011d1ac2fc9e44ee4df0b4865f358a63c720e60..23b63849312bf03f9e88ff5d9c8f849f644779bd 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -22,6 +22,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/test/simple_test_tick_clock.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "build/build_config.h"
@@ -1255,6 +1256,72 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerVersionBrowserTest, FetchWithoutSaveData) {
SetBrowserClientForTesting(old_client);
}
+IN_PROC_BROWSER_TEST_P(ServiceWorkerVersionBrowserTest, MessageSelf) {
+ const base::string16 activateMsg = base::ASCIIToUTF16("ACTIVATE");
+ const base::string16 messageMsg = base::ASCIIToUTF16("MESSAGE");
falken 2016/11/21 08:01:48 nit: activateMsg isn't used, and naming style shou
+
+ RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker_message_to_self.js"));
+ base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock();
+ tick_clock->SetNowTicks(base::TimeTicks::Now());
+ version_->SetTickClockForTesting(base::WrapUnique(tick_clock));
+
+ ConsoleListener console_listener;
+ RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
+
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
+ base::RunLoop run_loop;
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&self::ActivateOnIOThread, base::Unretained(this),
+ run_loop.QuitClosure(), &status));
+ run_loop.Run();
+ ASSERT_EQ(SERVICE_WORKER_OK, status);
+
+ base::TimeDelta request_timeout = base::TimeDelta::FromMinutes(
+ ServiceWorkerVersion::kRequestTimeoutMinutes);
+ base::TimeDelta remaining = base::TimeDelta::FromSeconds(10);
+
+ console_listener.WaitForConsoleMessages(1);
+ EXPECT_EQ(messageMsg, console_listener.messages()[0]);
+ EXPECT_EQ(request_timeout, version_->remaining_timeout());
+
+ // Advance clock some, but not enough to trigger the timeout.
+ tick_clock->Advance(request_timeout - remaining);
+ EXPECT_EQ(remaining, version_->remaining_timeout());
+
+ // Wait for another onmessage event.
+ console_listener.WaitForConsoleMessages(2);
+ EXPECT_EQ(messageMsg, console_listener.messages()[1]);
+ // Timeout should not have changed.
+ EXPECT_EQ(remaining, version_->remaining_timeout());
+
+ // Advance clock enough to trigger the timeout.
+ tick_clock->Advance(remaining * 2);
+ EXPECT_LT(version_->remaining_timeout(), base::TimeDelta());
+ RunOnIOThread(base::Bind(&ServiceWorkerVersion::OnTimeoutTimer, version_));
+
+ // Advance clock more to trigger idle timeout.
+ tick_clock->Advance(base::TimeDelta::FromSeconds(
+ ServiceWorkerVersion::kIdleWorkerTimeoutSeconds));
+ RunOnIOThread(base::Bind(&ServiceWorkerVersion::OnTimeoutTimer, version_));
+
+ // Worker should be stopping.
+ EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status());
+
+ // One more message event might already have been queued before advancing the
+ // time, but no other message events should have triggered while stopping
+ // worker.
+ EXPECT_LE(console_listener.messages().size(), 3u);
+
falken 2016/11/21 08:01:48 It'd be slightly nicer if this could verify that t
Marijn Kruisselbrink 2016/12/01 19:54:29 Unfortunately I couldn't even figure out how to ma
+ RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
+}
+
IN_PROC_BROWSER_TEST_P(ServiceWorkerBrowserTest, FetchPageWithSaveData) {
const char kPageUrl[] = "/service_worker/handle_fetch.html";
const char kWorkerUrl[] = "/service_worker/add_save_data_to_title.js";

Powered by Google App Engine
This is Rietveld 408576698