blob: 8f65ce48cd99ae13041e0ed1e0f75e4ac2f7c0c3 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2020 The Chromium Authors
Brandon Maslen6134c852020-05-18 21:45:212// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/net/storage_test_utils.h"
6
7#include "content/public/test/browser_test_utils.h"
8
Chris Fredrickson82a7a05d2022-08-01 22:27:599namespace storage::test {
Brandon Maslen6134c852020-05-18 21:45:2110
Chris Fredrickson61269f52022-08-11 18:27:3511const std::vector<std::string> kCookiesTypesForFrame{"Cookie", "CookieStore"};
12
Asami Doibcbe9af2021-03-24 04:50:5213const std::vector<std::string> kStorageTypesForFrame{
Austin Sullivan5b88a172023-01-04 23:10:5914 "LocalStorage", "FileSystem", "FileSystemAccess", "SessionStorage",
Ayu Ishii1b714a92024-04-24 16:41:0415 "IndexedDb", "CacheStorage", "ServiceWorker",
16#if BUILDFLAG(IS_ANDROID)
17 // TODO(crbug.com/333756088): WebSQL is disabled everywhere by default as of
18 // M119 (crbug/695592) except on Android WebView. This is enabled for
19 // Android only to indirectly cover WebSQL deletions on WebView.
20 "WebSql",
21#endif
22};
Asami Doibcbe9af2021-03-24 04:50:5223
24const std::vector<std::string> kStorageTypesForWorker{
Austin Sullivan5b88a172023-01-04 23:10:5925 "WorkerFileSystemAccess", "WorkerCacheStorage", "WorkerIndexedDb"};
Brandon Maslen6134c852020-05-18 21:45:2126
27const std::vector<std::string> kCrossTabCommunicationTypes{
28 "SharedWorker",
29 "WebLock",
30};
31
32constexpr char kRequestStorageAccess[] =
Chris Fredricksone90c7a3c2023-03-09 19:40:1833 "document.requestStorageAccess()"
Chris Fredrickson9bb78a02023-06-08 18:06:5934 " .then(() => document.hasStorageAccess())";
Brandon Maslen6134c852020-05-18 21:45:2135
Matt Reichhoffa0a390d2023-03-16 11:50:3036constexpr char kRequestStorageAccessFor[] =
Chris Fredricksonba4b0ac2023-06-07 15:26:3337 "document.requestStorageAccessFor($1)";
Matt Reichhoff70f539f52022-08-19 21:35:0138
Chris Fredricksonba4b0ac2023-06-07 15:26:3339constexpr char kHasStorageAccess[] = "document.hasStorageAccess()";
Brandon Maslen6134c852020-05-18 21:45:2140
Chris Fredrickson61269f52022-08-11 18:27:3541std::vector<std::string> GetStorageTypesForFrame(bool include_cookies) {
42 std::vector<std::string> types(kStorageTypesForFrame);
43 if (include_cookies) {
44 types.insert(types.end(), kCookiesTypesForFrame.begin(),
45 kCookiesTypesForFrame.end());
46 }
47 return types;
48}
49
Chris Fredricksonf39f87b2022-07-11 11:34:0450std::string GetFrameContent(content::RenderFrameHost* frame) {
Chris Fredricksonbd1a5a82023-09-09 20:58:3251 return content::EvalJs(frame, "document.body.textContent",
52 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
53 .ExtractString();
Brandon Maslen6134c852020-05-18 21:45:2154}
55
Chris Fredrickson7cc8c392023-07-31 14:57:4256void SetStorageForFrame(content::RenderFrameHost* frame,
57 bool include_cookies,
Jonathan Njeunjea63e3832023-10-03 11:58:0458 bool expected_to_be_set,
Chris Fredrickson7cc8c392023-07-31 14:57:4259 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5960 base::flat_map<std::string, bool> actual;
61 base::flat_map<std::string, bool> expected;
Chris Fredrickson61269f52022-08-11 18:27:3562 for (const auto& data_type : GetStorageTypesForFrame(include_cookies)) {
Chris Fredricksonba3d9d52024-01-12 20:05:3163 actual[data_type] = content::EvalJs(frame, "set" + data_type + "()",
64 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
65 .ExtractBool();
Ari Chivukula8e111da2021-10-08 23:57:0066 if (frame->GetLastCommittedOrigin() !=
67 frame->GetMainFrame()->GetLastCommittedOrigin() &&
68 data_type == "WebSql") {
69 // Third-party context WebSQL is disabled as of M97.
Chris Fredrickson82a7a05d2022-08-01 22:27:5970 expected[data_type] = false;
Ari Chivukula8e111da2021-10-08 23:57:0071 } else {
Jonathan Njeunjea63e3832023-10-03 11:58:0472 expected[data_type] = expected_to_be_set;
Ari Chivukula8e111da2021-10-08 23:57:0073 }
Brandon Maslen6134c852020-05-18 21:45:2174 }
Chris Fredrickson7cc8c392023-07-31 14:57:4275 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected))
76 << "(expected at " << location.ToString() << ")";
Brandon Maslen6134c852020-05-18 21:45:2177}
78
Chris Fredrickson7cc8c392023-07-31 14:57:4279void SetStorageForWorker(content::RenderFrameHost* frame,
80 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5981 base::flat_map<std::string, bool> actual;
82 base::flat_map<std::string, bool> expected;
Asami Doibcbe9af2021-03-24 04:50:5283 for (const auto& data_type : kStorageTypesForWorker) {
Chris Fredricksonba3d9d52024-01-12 20:05:3184 actual[data_type] = content::EvalJs(frame, "set" + data_type + "()",
85 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
86 .ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:5987 expected[data_type] = true;
Asami Doibcbe9af2021-03-24 04:50:5288 }
Chris Fredrickson7cc8c392023-07-31 14:57:4289 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected))
90 << "(expected at " << location.ToString() << ")";
Asami Doibcbe9af2021-03-24 04:50:5291}
92
Chris Fredrickson7cc8c392023-07-31 14:57:4293void ExpectStorageForFrame(content::RenderFrameHost* frame,
94 bool expected,
95 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5996 base::flat_map<std::string, bool> actual;
97 base::flat_map<std::string, bool> expected_elts;
Chris Fredrickson2a3bb26c2023-07-28 14:14:0098 for (const auto& data_type : GetStorageTypesForFrame(false)) {
Chris Fredricksonba3d9d52024-01-12 20:05:3199 actual[data_type] = content::EvalJs(frame, "has" + data_type + "();",
100 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
101 .ExtractBool();
Ari Chivukula8e111da2021-10-08 23:57:00102 if (frame->GetLastCommittedOrigin() !=
103 frame->GetMainFrame()->GetLastCommittedOrigin() &&
104 data_type == "WebSql") {
105 // Third-party context WebSQL is disabled as of M97.
Chris Fredrickson82a7a05d2022-08-01 22:27:59106 expected_elts[data_type] = false;
Ari Chivukula8e111da2021-10-08 23:57:00107 } else {
Chris Fredrickson82a7a05d2022-08-01 22:27:59108 expected_elts[data_type] = expected;
Ari Chivukula8e111da2021-10-08 23:57:00109 }
Brandon Maslen6134c852020-05-18 21:45:21110 }
Chris Fredrickson7cc8c392023-07-31 14:57:42111 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts))
112 << "(expected at " << location.ToString() << ")";
Brandon Maslen6134c852020-05-18 21:45:21113}
114
Chris Fredrickson7cc8c392023-07-31 14:57:42115void ExpectStorageForWorker(content::RenderFrameHost* frame,
116 bool expected,
117 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59118 base::flat_map<std::string, bool> actual;
119 base::flat_map<std::string, bool> expected_elts;
Asami Doibcbe9af2021-03-24 04:50:52120 for (const auto& data_type : kStorageTypesForWorker) {
Chris Fredricksonba3d9d52024-01-12 20:05:31121 actual[data_type] = content::EvalJs(frame, "has" + data_type + "();",
122 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
123 .ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59124 expected_elts[data_type] = expected;
Asami Doibcbe9af2021-03-24 04:50:52125 }
Chris Fredrickson7cc8c392023-07-31 14:57:42126 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts))
127 << "(expected at " << location.ToString() << ")";
Asami Doibcbe9af2021-03-24 04:50:52128}
129
Chris Fredrickson7cc8c392023-07-31 14:57:42130void SetCrossTabInfoForFrame(content::RenderFrameHost* frame,
131 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59132 base::flat_map<std::string, bool> actual;
133 base::flat_map<std::string, bool> expected;
Brandon Maslen6134c852020-05-18 21:45:21134 for (const auto& data_type : kCrossTabCommunicationTypes) {
Chris Fredricksonba3d9d52024-01-12 20:05:31135 actual[data_type] = content::EvalJs(frame, "set" + data_type + "()",
136 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
137 .ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59138 expected[data_type] = true;
Brandon Maslen6134c852020-05-18 21:45:21139 }
Chris Fredrickson7cc8c392023-07-31 14:57:42140 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected))
141 << "(expected at " << location.ToString() << ")";
Brandon Maslen6134c852020-05-18 21:45:21142}
143
144void ExpectCrossTabInfoForFrame(content::RenderFrameHost* frame,
Chris Fredrickson7cc8c392023-07-31 14:57:42145 bool expected,
146 const base::Location& location) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59147 base::flat_map<std::string, bool> actual;
148 base::flat_map<std::string, bool> expected_elts;
Brandon Maslen6134c852020-05-18 21:45:21149 for (const auto& data_type : kCrossTabCommunicationTypes) {
Chris Fredricksonba3d9d52024-01-12 20:05:31150 actual[data_type] = content::EvalJs(frame, "has" + data_type + "();",
151 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
152 .ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59153 expected_elts[data_type] = expected;
Brandon Maslen6134c852020-05-18 21:45:21154 }
Chris Fredrickson7cc8c392023-07-31 14:57:42155 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts))
156 << "(expected at " << location.ToString() << ")";
Brandon Maslen6134c852020-05-18 21:45:21157}
158
Chris Fredricksonb374a932024-01-30 19:33:20159bool RequestAndCheckStorageAccessForFrame(content::RenderFrameHost* frame,
160 bool omit_user_gesture) {
161 int options = content::EXECUTE_SCRIPT_DEFAULT_OPTIONS;
162 if (omit_user_gesture) {
163 options |= content::EXECUTE_SCRIPT_NO_USER_GESTURE;
164 }
165 return content::EvalJs(frame, kRequestStorageAccess, options).ExtractBool();
Brandon Maslen6134c852020-05-18 21:45:21166}
167
Matt Reichhoffae4453f2022-09-26 22:39:31168bool RequestStorageAccessForOrigin(content::RenderFrameHost* frame,
Chris Fredricksoneed81172024-01-12 18:31:00169 const std::string& origin,
170 bool omit_user_gesture) {
171 int options = content::EXECUTE_SCRIPT_DEFAULT_OPTIONS;
172 if (omit_user_gesture) {
173 options |= content::EXECUTE_SCRIPT_NO_USER_GESTURE;
174 }
175 return content::ExecJs(
176 frame, content::JsReplace(kRequestStorageAccessFor, origin), options);
Matt Reichhoff70f539f52022-08-19 21:35:01177}
178
Chris Fredricksonf39f87b2022-07-11 11:34:04179bool HasStorageAccessForFrame(content::RenderFrameHost* frame) {
Chris Fredricksonbd1a5a82023-09-09 20:58:32180 return content::EvalJs(frame, kHasStorageAccess,
181 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
182 .ExtractBool();
Brandon Maslen6134c852020-05-18 21:45:21183}
184
Shuran Huangae8c32822023-01-25 21:01:10185std::string FetchWithCredentials(content::RenderFrameHost* frame,
186 const GURL& url,
187 const bool cors_enabled) {
188 constexpr char script[] = R"(
Shuran Huang4d807982023-02-01 15:39:07189 fetch($1, {method: 'GET', mode: $2, credentials: 'include'})
Shuran Huangae8c32822023-01-25 21:01:10190 .then((result) => result.text());
191 )";
192 const std::string mode = cors_enabled ? "cors" : "no-cors";
Chris Fredricksonbd1a5a82023-09-09 20:58:32193 return content::EvalJs(frame, content::JsReplace(script, url, mode),
194 content::EXECUTE_SCRIPT_NO_USER_GESTURE)
Shuran Huangae8c32822023-01-25 21:01:10195 .ExtractString();
196}
197
Chris Fredrickson82a7a05d2022-08-01 22:27:59198} // namespace storage::test