blob: 31238054f5f436fc82fbf680749f1dcd2273cd97 [file] [log] [blame]
Hiroki Nakagawad68ad2e2019-04-05 05:17:441// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This file tests that Web Workers (a Content feature) work in the Chromium
6// embedder.
7
8#include "base/bind.h"
9#include "base/callback.h"
10#include "chrome/browser/profiles/profile.h"
11#include "chrome/browser/ui/browser.h"
12#include "chrome/test/base/in_process_browser_test.h"
13#include "chrome/test/base/ui_test_utils.h"
Christian Dullweber80e5f262020-08-25 13:25:2214#include "components/content_settings/core/browser/cookie_settings.h"
Hiroki Nakagawad68ad2e2019-04-05 05:17:4415#include "components/content_settings/core/common/pref_names.h"
16#include "components/prefs/pref_service.h"
17#include "content/public/browser/browser_context.h"
Peter Kasting919ce652020-05-07 10:22:3618#include "content/public/test/browser_test.h"
Hiroki Nakagawad68ad2e2019-04-05 05:17:4419#include "content/public/test/browser_test_utils.h"
20#include "net/test/embedded_test_server/embedded_test_server.h"
21#include "net/test/embedded_test_server/http_request.h"
22#include "net/test/embedded_test_server/http_response.h"
23
Hiroki Nakagawad68ad2e2019-04-05 05:17:4424// A simple fixture used for testing dedicated workers and shared workers. The
25// fixture stashes the HTTP request to the worker script for inspecting the
26// headers.
27//
28// This is in //chrome instead of //content since the tests exercise the
29// |kBlockThirdPartyCookies| preference which is not a //content concept.
30class ChromeWorkerBrowserTest : public InProcessBrowserTest {
31 public:
32 void SetUp() override {
33 embedded_test_server()->RegisterRequestHandler(
34 base::BindRepeating(&ChromeWorkerBrowserTest::CaptureHeaderHandler,
35 base::Unretained(this), "/capture"));
36 ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
37 InProcessBrowserTest::SetUp();
38 }
39
40 void SetUpOnMainThread() override {
41 embedded_test_server()->StartAcceptingConnections();
42 }
43
44 protected:
45 // Tests worker script fetch (always same-origin) is not affected by the
46 // third-party cookie blocking configuration.
47 // This is the regression test for https://crbug.com/933287.
48 void TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:2249 content_settings::CookieControlsMode cookie_controls_mode,
Hiroki Nakagawad68ad2e2019-04-05 05:17:4450 const std::string& test_url) {
51 const std::string kCookie = "foo=bar";
52
53 // Set up third-party cookie blocking.
Christian Dullweber80e5f262020-08-25 13:25:2254 browser()->profile()->GetPrefs()->SetInteger(
55 prefs::kCookieControlsMode, static_cast<int>(cookie_controls_mode));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4456
57 // Make sure cookies are not set.
58 ASSERT_TRUE(
59 GetCookies(browser()->profile(), embedded_test_server()->base_url())
60 .empty());
61
62 // Request for the worker script should not send cookies.
63 {
64 base::RunLoop run_loop;
65 quit_closure_ = run_loop.QuitClosure();
66 ui_test_utils::NavigateToURL(browser(),
67 embedded_test_server()->GetURL(test_url));
68 run_loop.Run();
Jan Wilken Dörriea8cb56302019-06-06 18:59:3669 EXPECT_FALSE(base::Contains(header_map_, "Cookie"));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4470 }
71
72 // Set a cookie.
73 ASSERT_TRUE(SetCookie(browser()->profile(),
74 embedded_test_server()->base_url(), kCookie));
75
76 // Request for the worker script should send the cookie regardless of the
77 // third-party cookie blocking configuration.
78 {
79 base::RunLoop run_loop;
80 quit_closure_ = run_loop.QuitClosure();
81 ui_test_utils::NavigateToURL(browser(),
82 embedded_test_server()->GetURL(test_url));
83 run_loop.Run();
Jan Wilken Dörriea8cb56302019-06-06 18:59:3684 EXPECT_TRUE(base::Contains(header_map_, "Cookie"));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4485 EXPECT_EQ(kCookie, header_map_["Cookie"]);
86 }
87 }
88
89 // TODO(nhiroki): Add tests for creating workers from third-party iframes
90 // while third-party cookie blocking is enabled. This expects that cookies are
91 // not blocked.
92
93 private:
94 std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler(
95 const std::string& path,
96 const net::test_server::HttpRequest& request) {
97 if (request.GetURL().path() != path)
98 return nullptr;
99 // Stash the HTTP request headers.
100 header_map_ = request.headers;
101 std::move(quit_closure_).Run();
102 return std::make_unique<net::test_server::BasicHttpResponse>();
103 }
104
105 net::test_server::HttpRequest::HeaderMap header_map_;
106 base::OnceClosure quit_closure_;
107};
108
109IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
110 DedicatedWorkerScriptFetchWithThirdPartyBlocking) {
111 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22112 content_settings::CookieControlsMode::kBlockThirdParty,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44113 "/workers/create_dedicated_worker.html?worker_url=/capture");
114}
115
116IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
117 DedicatedWorkerScriptFetchWithoutThirdPartyBlocking) {
118 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22119 content_settings::CookieControlsMode::kOff,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44120 "/workers/create_dedicated_worker.html?worker_url=/capture");
121}
122
123IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
124 SharedWorkerScriptFetchWithThirdPartyBlocking) {
125 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22126 content_settings::CookieControlsMode::kBlockThirdParty,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44127 "/workers/create_shared_worker.html?worker_url=/capture");
128}
129
130IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
131 SharedWorkerScriptFetchWithoutThirdPartyBlocking) {
132 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22133 content_settings::CookieControlsMode::kOff,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44134 "/workers/create_shared_worker.html?worker_url=/capture");
135}