Commit cdf490e8 authored by Makoto Shimazu's avatar Makoto Shimazu Committed by Commit Bot

Deflake content_browsertest: DoNotTrackTest using workers

Previously these tests finish before the worker is started, and
TearDownOnMainThread could be called during loading the script. After this CL,
each tests waits until the worker is ready to ensure that no task is running on
TearDownOnMainThread.

Bug: 872742
Change-Id: I5fc33048f852f6c7088f5a971a4a7d4a4ffa410b
Reviewed-on: https://chromium-review.googlesource.com/c/1337146Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Commit-Queue: Makoto Shimazu <shimazu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#608677}
parent 14a30c21
...@@ -88,9 +88,11 @@ class DoNotTrackTest : public ContentBrowserTest { ...@@ -88,9 +88,11 @@ class DoNotTrackTest : public ContentBrowserTest {
MockContentBrowserClient client_; MockContentBrowserClient client_;
}; };
std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler( std::unique_ptr<net::test_server::HttpResponse>
CaptureHeaderHandlerAndReturnScript(
const std::string& path, const std::string& path,
net::test_server::HttpRequest::HeaderMap* header_map, net::test_server::HttpRequest::HeaderMap* header_map,
const std::string& script,
base::OnceClosure done_callback, base::OnceClosure done_callback,
const net::test_server::HttpRequest& request) { const net::test_server::HttpRequest& request) {
GURL request_url = request.GetURL(); GURL request_url = request.GetURL();
...@@ -99,7 +101,10 @@ std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler( ...@@ -99,7 +101,10 @@ std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler(
*header_map = request.headers; *header_map = request.headers;
std::move(done_callback).Run(); std::move(done_callback).Run();
return std::make_unique<net::test_server::BasicHttpResponse>(); auto response = std::make_unique<net::test_server::BasicHttpResponse>();
response->set_content_type("text/javascript");
response->set_content(script);
return response;
} }
// Checks that the DNT header is not sent by default. // Checks that the DNT header is not sent by default.
...@@ -145,10 +150,12 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DOMProperty) { ...@@ -145,10 +150,12 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DOMProperty) {
// Checks that the DNT header is sent in a request for a dedicated worker // Checks that the DNT header is sent in a request for a dedicated worker
// script. // script.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) { IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) {
const std::string kWorkerScript = R"(postMessage('DONE');)";
net::test_server::HttpRequest::HeaderMap header_map; net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop; base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating( embedded_test_server()->RegisterRequestHandler(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure())); base::BindRepeating(&CaptureHeaderHandlerAndReturnScript, "/capture",
&header_map, kWorkerScript, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
if (!EnableDoNotTrack()) if (!EnableDoNotTrack())
return; return;
...@@ -158,6 +165,9 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) { ...@@ -158,6 +165,9 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) {
EXPECT_TRUE(header_map.find("DNT") != header_map.end()); EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]); EXPECT_EQ("1", header_map["DNT"]);
// Wait until the worker script is loaded.
EXPECT_EQ("DONE", EvalJs(shell(), "waitForMessage();"));
} }
// Checks that the DNT header is sent in a request for shared worker script. // Checks that the DNT header is sent in a request for shared worker script.
...@@ -169,10 +179,13 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) { ...@@ -169,10 +179,13 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) {
#define MAYBE_SharedWorker SharedWorker #define MAYBE_SharedWorker SharedWorker
#endif #endif
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, MAYBE_SharedWorker) { IN_PROC_BROWSER_TEST_F(DoNotTrackTest, MAYBE_SharedWorker) {
const std::string kWorkerScript =
R"(self.onconnect = e => { e.ports[0].postMessage('DONE'); };)";
net::test_server::HttpRequest::HeaderMap header_map; net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop; base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating( embedded_test_server()->RegisterRequestHandler(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure())); base::BindRepeating(&CaptureHeaderHandlerAndReturnScript, "/capture",
&header_map, kWorkerScript, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
if (!EnableDoNotTrack()) if (!EnableDoNotTrack())
return; return;
...@@ -183,26 +196,34 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, MAYBE_SharedWorker) { ...@@ -183,26 +196,34 @@ IN_PROC_BROWSER_TEST_F(DoNotTrackTest, MAYBE_SharedWorker) {
EXPECT_TRUE(header_map.find("DNT") != header_map.end()); EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]); EXPECT_EQ("1", header_map["DNT"]);
// Wait until the worker script is loaded.
EXPECT_EQ("DONE", EvalJs(shell(), "waitForMessage();"));
} }
// Checks that the DNT header is sent in a request for a service worker // Checks that the DNT header is sent in a request for a service worker
// script. // script.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, ServiceWorker) { IN_PROC_BROWSER_TEST_F(DoNotTrackTest, ServiceWorker) {
const std::string kWorkerScript = "// empty";
net::test_server::HttpRequest::HeaderMap header_map; net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop; base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating( embedded_test_server()->RegisterRequestHandler(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure())); base::BindRepeating(&CaptureHeaderHandlerAndReturnScript, "/capture",
&header_map, kWorkerScript, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_test_server()->Start());
if (!EnableDoNotTrack()) if (!EnableDoNotTrack())
return; return;
NavigateToURL(shell(), GetURL("/service_worker/create_service_worker.html")); NavigateToURL(shell(), GetURL("/service_worker/create_service_worker.html"));
// We only verify the request for the worker script so we don't check the
// result of register(). EXPECT_EQ("DONE", EvalJs(shell(), "register('/capture');"));
EXPECT_TRUE(ExecJs(shell(), "register('/capture');"));
loop.Run(); loop.Run();
EXPECT_TRUE(header_map.find("DNT") != header_map.end()); EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]); EXPECT_EQ("1", header_map["DNT"]);
// Service worker doesn't have to wait for onmessage event because
// navigator.serviceWorker.ready can ensure that the script load has
// been completed.
} }
// Checks that the DNT header is preserved when fetching from a dedicated // Checks that the DNT header is preserved when fetching from a dedicated
......
<script> <script>
const params = new URLSearchParams(location.search); const params = new URLSearchParams(location.search);
const worker = new SharedWorker(params.get('worker_url')); const worker = new SharedWorker(params.get('worker_url'));
const onmessage_promise = new Promise(r => worker.port.onmessage = r);
worker.port.start();
async function waitForMessage() {
const message = await onmessage_promise;
return message.data;
}
</script> </script>
<script> <script>
const params = new URLSearchParams(location.search); const params = new URLSearchParams(location.search);
const worker = new Worker(params.get('worker_url')); const worker = new Worker(params.get('worker_url'));
const onmessage_promise = new Promise(r => worker.onmessage = r);
async function waitForMessage() {
const message = await onmessage_promise;
return message.data;
}
</script> </script>
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