blob: da9c45f715ae5d11ea87691233ec401d76bb60ad [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"
Lei Zhang435755f2021-05-11 20:58:5510#include "base/containers/contains.h"
Hiroki Nakagawad68ad2e2019-04-05 05:17:4411#include "chrome/browser/profiles/profile.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/test/base/in_process_browser_test.h"
14#include "chrome/test/base/ui_test_utils.h"
Christian Dullweber80e5f262020-08-25 13:25:2215#include "components/content_settings/core/browser/cookie_settings.h"
Hiroki Nakagawad68ad2e2019-04-05 05:17:4416#include "components/content_settings/core/common/pref_names.h"
17#include "components/prefs/pref_service.h"
18#include "content/public/browser/browser_context.h"
Peter Kasting919ce652020-05-07 10:22:3619#include "content/public/test/browser_test.h"
Hiroki Nakagawad68ad2e2019-04-05 05:17:4420#include "content/public/test/browser_test_utils.h"
21#include "net/test/embedded_test_server/embedded_test_server.h"
22#include "net/test/embedded_test_server/http_request.h"
23#include "net/test/embedded_test_server/http_response.h"
24
Hiroki Nakagawad68ad2e2019-04-05 05:17:4425// A simple fixture used for testing dedicated workers and shared workers. The
26// fixture stashes the HTTP request to the worker script for inspecting the
27// headers.
28//
29// This is in //chrome instead of //content since the tests exercise the
30// |kBlockThirdPartyCookies| preference which is not a //content concept.
31class ChromeWorkerBrowserTest : public InProcessBrowserTest {
32 public:
33 void SetUp() override {
34 embedded_test_server()->RegisterRequestHandler(
35 base::BindRepeating(&ChromeWorkerBrowserTest::CaptureHeaderHandler,
36 base::Unretained(this), "/capture"));
37 ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
38 InProcessBrowserTest::SetUp();
39 }
40
41 void SetUpOnMainThread() override {
42 embedded_test_server()->StartAcceptingConnections();
43 }
44
45 protected:
46 // Tests worker script fetch (always same-origin) is not affected by the
47 // third-party cookie blocking configuration.
48 // This is the regression test for https://crbug.com/933287.
49 void TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:2250 content_settings::CookieControlsMode cookie_controls_mode,
Hiroki Nakagawad68ad2e2019-04-05 05:17:4451 const std::string& test_url) {
52 const std::string kCookie = "foo=bar";
53
54 // Set up third-party cookie blocking.
Christian Dullweber80e5f262020-08-25 13:25:2255 browser()->profile()->GetPrefs()->SetInteger(
56 prefs::kCookieControlsMode, static_cast<int>(cookie_controls_mode));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4457
58 // Make sure cookies are not set.
59 ASSERT_TRUE(
60 GetCookies(browser()->profile(), embedded_test_server()->base_url())
61 .empty());
62
63 // Request for the worker script should not send cookies.
64 {
65 base::RunLoop run_loop;
66 quit_closure_ = run_loop.QuitClosure();
67 ui_test_utils::NavigateToURL(browser(),
68 embedded_test_server()->GetURL(test_url));
69 run_loop.Run();
Jan Wilken Dörriea8cb56302019-06-06 18:59:3670 EXPECT_FALSE(base::Contains(header_map_, "Cookie"));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4471 }
72
73 // Set a cookie.
74 ASSERT_TRUE(SetCookie(browser()->profile(),
75 embedded_test_server()->base_url(), kCookie));
76
77 // Request for the worker script should send the cookie regardless of the
78 // third-party cookie blocking configuration.
79 {
80 base::RunLoop run_loop;
81 quit_closure_ = run_loop.QuitClosure();
82 ui_test_utils::NavigateToURL(browser(),
83 embedded_test_server()->GetURL(test_url));
84 run_loop.Run();
Jan Wilken Dörriea8cb56302019-06-06 18:59:3685 EXPECT_TRUE(base::Contains(header_map_, "Cookie"));
Hiroki Nakagawad68ad2e2019-04-05 05:17:4486 EXPECT_EQ(kCookie, header_map_["Cookie"]);
87 }
88 }
89
90 // TODO(nhiroki): Add tests for creating workers from third-party iframes
91 // while third-party cookie blocking is enabled. This expects that cookies are
92 // not blocked.
93
94 private:
95 std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler(
96 const std::string& path,
97 const net::test_server::HttpRequest& request) {
98 if (request.GetURL().path() != path)
99 return nullptr;
100 // Stash the HTTP request headers.
101 header_map_ = request.headers;
102 std::move(quit_closure_).Run();
103 return std::make_unique<net::test_server::BasicHttpResponse>();
104 }
105
106 net::test_server::HttpRequest::HeaderMap header_map_;
107 base::OnceClosure quit_closure_;
108};
109
110IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
111 DedicatedWorkerScriptFetchWithThirdPartyBlocking) {
112 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22113 content_settings::CookieControlsMode::kBlockThirdParty,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44114 "/workers/create_dedicated_worker.html?worker_url=/capture");
115}
116
117IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
118 DedicatedWorkerScriptFetchWithoutThirdPartyBlocking) {
119 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22120 content_settings::CookieControlsMode::kOff,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44121 "/workers/create_dedicated_worker.html?worker_url=/capture");
122}
123
124IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
125 SharedWorkerScriptFetchWithThirdPartyBlocking) {
126 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22127 content_settings::CookieControlsMode::kBlockThirdParty,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44128 "/workers/create_shared_worker.html?worker_url=/capture");
129}
130
131IN_PROC_BROWSER_TEST_F(ChromeWorkerBrowserTest,
132 SharedWorkerScriptFetchWithoutThirdPartyBlocking) {
133 TestWorkerScriptFetchWithThirdPartyCookieBlocking(
Christian Dullweber80e5f262020-08-25 13:25:22134 content_settings::CookieControlsMode::kOff,
Hiroki Nakagawad68ad2e2019-04-05 05:17:44135 "/workers/create_shared_worker.html?worker_url=/capture");
136}