blob: 25692a1a37fb9db2c9dfd45e7a04e1b5877eeab8 [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",
15 "IndexedDb", "WebSql", "CacheStorage", "ServiceWorker"};
Asami Doibcbe9af2021-03-24 04:50:5216
17const std::vector<std::string> kStorageTypesForWorker{
Austin Sullivan5b88a172023-01-04 23:10:5918 "WorkerFileSystemAccess", "WorkerCacheStorage", "WorkerIndexedDb"};
Brandon Maslen6134c852020-05-18 21:45:2119
20const std::vector<std::string> kCrossTabCommunicationTypes{
21 "SharedWorker",
22 "WebLock",
23};
24
25constexpr char kRequestStorageAccess[] =
Chris Fredricksone90c7a3c2023-03-09 19:40:1826 "document.requestStorageAccess()"
Chris Fredrickson9bb78a02023-06-08 18:06:5927 " .then(() => document.hasStorageAccess())";
Brandon Maslen6134c852020-05-18 21:45:2128
Matt Reichhoffa0a390d2023-03-16 11:50:3029constexpr char kRequestStorageAccessFor[] =
Chris Fredricksonba4b0ac2023-06-07 15:26:3330 "document.requestStorageAccessFor($1)";
Matt Reichhoff70f539f52022-08-19 21:35:0131
Chris Fredricksonba4b0ac2023-06-07 15:26:3332constexpr char kHasStorageAccess[] = "document.hasStorageAccess()";
Brandon Maslen6134c852020-05-18 21:45:2133
Chris Fredrickson61269f52022-08-11 18:27:3534std::vector<std::string> GetStorageTypesForFrame(bool include_cookies) {
35 std::vector<std::string> types(kStorageTypesForFrame);
36 if (include_cookies) {
37 types.insert(types.end(), kCookiesTypesForFrame.begin(),
38 kCookiesTypesForFrame.end());
39 }
40 return types;
41}
42
Chris Fredricksonf39f87b2022-07-11 11:34:0443std::string GetFrameContent(content::RenderFrameHost* frame) {
44 return content::EvalJs(frame, "document.body.textContent").ExtractString();
Brandon Maslen6134c852020-05-18 21:45:2145}
46
Chris Fredrickson61269f52022-08-11 18:27:3547void SetStorageForFrame(content::RenderFrameHost* frame, bool include_cookies) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5948 base::flat_map<std::string, bool> actual;
49 base::flat_map<std::string, bool> expected;
Chris Fredrickson61269f52022-08-11 18:27:3550 for (const auto& data_type : GetStorageTypesForFrame(include_cookies)) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5951 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:0452 content::EvalJs(frame, "set" + data_type + "()").ExtractBool();
Ari Chivukula8e111da2021-10-08 23:57:0053 if (frame->GetLastCommittedOrigin() !=
54 frame->GetMainFrame()->GetLastCommittedOrigin() &&
55 data_type == "WebSql") {
56 // Third-party context WebSQL is disabled as of M97.
Chris Fredrickson82a7a05d2022-08-01 22:27:5957 expected[data_type] = false;
Ari Chivukula8e111da2021-10-08 23:57:0058 } else {
Chris Fredrickson82a7a05d2022-08-01 22:27:5959 expected[data_type] = true;
Ari Chivukula8e111da2021-10-08 23:57:0060 }
Brandon Maslen6134c852020-05-18 21:45:2161 }
Chris Fredrickson82a7a05d2022-08-01 22:27:5962 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected));
Brandon Maslen6134c852020-05-18 21:45:2163}
64
Asami Doibcbe9af2021-03-24 04:50:5265void SetStorageForWorker(content::RenderFrameHost* frame) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5966 base::flat_map<std::string, bool> actual;
67 base::flat_map<std::string, bool> expected;
Asami Doibcbe9af2021-03-24 04:50:5268 for (const auto& data_type : kStorageTypesForWorker) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5969 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:0470 content::EvalJs(frame, "set" + data_type + "()").ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:5971 expected[data_type] = true;
Asami Doibcbe9af2021-03-24 04:50:5272 }
Chris Fredrickson82a7a05d2022-08-01 22:27:5973 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected));
Asami Doibcbe9af2021-03-24 04:50:5274}
75
Chris Fredrickson2a3bb26c2023-07-28 14:14:0076void ExpectStorageForFrame(content::RenderFrameHost* frame, bool expected) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5977 base::flat_map<std::string, bool> actual;
78 base::flat_map<std::string, bool> expected_elts;
Chris Fredrickson2a3bb26c2023-07-28 14:14:0079 for (const auto& data_type : GetStorageTypesForFrame(false)) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5980 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:0481 content::EvalJs(frame, "has" + data_type + "();").ExtractBool();
Ari Chivukula8e111da2021-10-08 23:57:0082 if (frame->GetLastCommittedOrigin() !=
83 frame->GetMainFrame()->GetLastCommittedOrigin() &&
84 data_type == "WebSql") {
85 // Third-party context WebSQL is disabled as of M97.
Chris Fredrickson82a7a05d2022-08-01 22:27:5986 expected_elts[data_type] = false;
Ari Chivukula8e111da2021-10-08 23:57:0087 } else {
Chris Fredrickson82a7a05d2022-08-01 22:27:5988 expected_elts[data_type] = expected;
Ari Chivukula8e111da2021-10-08 23:57:0089 }
Brandon Maslen6134c852020-05-18 21:45:2190 }
Chris Fredrickson82a7a05d2022-08-01 22:27:5991 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts));
Brandon Maslen6134c852020-05-18 21:45:2192}
93
Asami Doibcbe9af2021-03-24 04:50:5294void ExpectStorageForWorker(content::RenderFrameHost* frame, bool expected) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5995 base::flat_map<std::string, bool> actual;
96 base::flat_map<std::string, bool> expected_elts;
Asami Doibcbe9af2021-03-24 04:50:5297 for (const auto& data_type : kStorageTypesForWorker) {
Chris Fredrickson82a7a05d2022-08-01 22:27:5998 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:0499 content::EvalJs(frame, "has" + data_type + "();").ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59100 expected_elts[data_type] = expected;
Asami Doibcbe9af2021-03-24 04:50:52101 }
Chris Fredrickson82a7a05d2022-08-01 22:27:59102 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts));
Asami Doibcbe9af2021-03-24 04:50:52103}
104
Brandon Maslen6134c852020-05-18 21:45:21105void SetCrossTabInfoForFrame(content::RenderFrameHost* frame) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59106 base::flat_map<std::string, bool> actual;
107 base::flat_map<std::string, bool> expected;
Brandon Maslen6134c852020-05-18 21:45:21108 for (const auto& data_type : kCrossTabCommunicationTypes) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59109 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:04110 content::EvalJs(frame, "set" + data_type + "()").ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59111 expected[data_type] = true;
Brandon Maslen6134c852020-05-18 21:45:21112 }
Chris Fredrickson82a7a05d2022-08-01 22:27:59113 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected));
Brandon Maslen6134c852020-05-18 21:45:21114}
115
116void ExpectCrossTabInfoForFrame(content::RenderFrameHost* frame,
117 bool expected) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59118 base::flat_map<std::string, bool> actual;
119 base::flat_map<std::string, bool> expected_elts;
Brandon Maslen6134c852020-05-18 21:45:21120 for (const auto& data_type : kCrossTabCommunicationTypes) {
Chris Fredrickson82a7a05d2022-08-01 22:27:59121 actual[data_type] =
Chris Fredricksonc9aa7772023-03-09 22:27:04122 content::EvalJs(frame, "has" + data_type + "();").ExtractBool();
Chris Fredrickson82a7a05d2022-08-01 22:27:59123 expected_elts[data_type] = expected;
Brandon Maslen6134c852020-05-18 21:45:21124 }
Chris Fredrickson82a7a05d2022-08-01 22:27:59125 EXPECT_THAT(actual, testing::UnorderedElementsAreArray(expected_elts));
Brandon Maslen6134c852020-05-18 21:45:21126}
127
Chris Fredricksone90c7a3c2023-03-09 19:40:18128bool RequestAndCheckStorageAccessForFrame(content::RenderFrameHost* frame) {
129 return content::EvalJs(frame, kRequestStorageAccess).ExtractBool();
Brandon Maslen6134c852020-05-18 21:45:21130}
131
Matt Reichhoffae4453f2022-09-26 22:39:31132bool RequestStorageAccessForOrigin(content::RenderFrameHost* frame,
133 const std::string& origin) {
Chris Fredricksonba4b0ac2023-06-07 15:26:33134 return content::ExecJs(frame,
135 content::JsReplace(kRequestStorageAccessFor, origin));
Matt Reichhoff70f539f52022-08-19 21:35:01136}
137
Chris Fredricksonf39f87b2022-07-11 11:34:04138bool HasStorageAccessForFrame(content::RenderFrameHost* frame) {
Chris Fredricksone90c7a3c2023-03-09 19:40:18139 return content::EvalJs(frame, kHasStorageAccess).ExtractBool();
Brandon Maslen6134c852020-05-18 21:45:21140}
141
Shuran Huangae8c32822023-01-25 21:01:10142std::string FetchWithCredentials(content::RenderFrameHost* frame,
143 const GURL& url,
144 const bool cors_enabled) {
145 constexpr char script[] = R"(
Shuran Huang4d807982023-02-01 15:39:07146 fetch($1, {method: 'GET', mode: $2, credentials: 'include'})
Shuran Huangae8c32822023-01-25 21:01:10147 .then((result) => result.text());
148 )";
149 const std::string mode = cors_enabled ? "cors" : "no-cors";
150 return content::EvalJs(frame, content::JsReplace(script, url, mode))
151 .ExtractString();
152}
153
Chris Fredrickson82a7a05d2022-08-01 22:27:59154} // namespace storage::test