blob: 98c7a6340d5d3c789660f42d5518141f0c49b31f [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/path_service.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/policy/policy_test_utils.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/common/features.h"
#include "components/prefs/pref_service.h"
#include "content/public/common/content_paths.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/base/features.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/test_data_directory.h"
namespace {
constexpr char kHostA[] = "a.test";
constexpr char kHostB[] = "b.test";
using testing::Bool;
using testing::HasSubstr;
class NativeUnpartitionedStorageAccessWhen3PCOff
: public policy::PolicyTest,
public testing::WithParamInterface<
/*content_settings::features::
kNativeUnpartitionedStoragePermittedWhen3PCOff*/
bool> {
protected:
NativeUnpartitionedStorageAccessWhen3PCOff() = default;
void SetUp() override {
std::vector<base::test::FeatureRef> enabled_features;
if (NativeUnpartitionedStoragePermittedWhenTpcOff()) {
enabled_features = {
content_settings::features::kTrackingProtection3pcd,
content_settings::features::
kNativeUnpartitionedStoragePermittedWhen3PCOff,
};
} else {
enabled_features = {content_settings::features::kTrackingProtection3pcd};
}
features_.InitWithFeatures(enabled_features,
{net::features::kThirdPartyStoragePartitioning});
InProcessBrowserTest::SetUp();
}
void SetUpOnMainThread() override {
host_resolver()->AddRule("*", "127.0.0.1");
base::FilePath path;
base::PathService::Get(content::DIR_TEST_DATA, &path);
https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
https_server_.ServeFilesFromDirectory(path);
https_server_.AddDefaultHandlers(GetChromeTestDataDir());
ASSERT_TRUE(https_server_.Start());
}
void NavigateToPage(const std::string& host, const std::string& path) {
GURL main_url(https_server_.GetURL(host, path));
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_url));
}
void NavigateFrameTo(const std::string& host, const std::string& path) {
GURL url = https_server_.GetURL(host, path);
content::WebContents* web_contents =
(browser())->tab_strip_model()->GetActiveWebContents();
EXPECT_TRUE(NavigateIframeToURL(web_contents, /*iframe_id*/ "test", url));
}
content::RenderFrameHost* GetPrimaryMainFrame() {
content::WebContents* web_contents =
(browser())->tab_strip_model()->GetActiveWebContents();
return web_contents->GetPrimaryMainFrame();
}
content::RenderFrameHost* GetChildFrame() {
return ChildFrameAt(GetPrimaryMainFrame(), 0);
}
bool NativeUnpartitionedStoragePermittedWhenTpcOff() const {
return GetParam();
}
private:
net::test_server::EmbeddedTestServer https_server_{
net::EmbeddedTestServer::TYPE_HTTPS};
base::test::ScopedFeatureList features_;
};
INSTANTIATE_TEST_SUITE_P(NativeUnpartitionedStorageTest,
NativeUnpartitionedStorageAccessWhen3PCOff,
Bool());
IN_PROC_BROWSER_TEST_P(NativeUnpartitionedStorageAccessWhen3PCOff,
CrossOriginsAccessWithCookieBlocking) {
// Navigate to ORIGIN B and add a value to local storage
NavigateToPage(kHostB, "/browsing_data/site_data.html");
EXPECT_TRUE(ExecJs(GetPrimaryMainFrame(),
"localStorage.setItem('UnpartitionedLocal', 'Hello');"));
// Navigate to ORIGIN A with a child frame pointing to ORIGIN B
NavigateToPage(kHostA, "/iframe.html");
NavigateFrameTo(kHostB, "/browsing_data/site_data.html");
// check unpartitioned storage access when the
// kNativeUnpartitionedStoragePermittedWhen3PCOff feature is enabled.
if (NativeUnpartitionedStoragePermittedWhenTpcOff()) {
EXPECT_EQ(content::EvalJs(GetChildFrame(),
"localStorage.getItem(\"UnpartitionedLocal\")"),
"Hello");
} else {
EXPECT_THAT(
content::EvalJs(GetChildFrame(),
"localStorage.getItem(\"UnpartitionedLocal\")")
.error,
HasSubstr("Error: Failed to read the 'localStorage' property from "
"'Window': Access is denied for this document."));
}
}
} // namespace