#include <string>
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/shell/browser/shell.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "services/network/public/cpp/features.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"
namespace content {
class SecFetchBrowserTest : public ContentBrowserTest {
public:
SecFetchBrowserTest()
: https_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
SecFetchBrowserTest(const SecFetchBrowserTest&) = delete;
SecFetchBrowserTest& operator=(const SecFetchBrowserTest&) = delete;
void SetUpOnMainThread() override {
host_resolver()->AddRule("*", "127.0.0.1");
https_test_server_.AddDefaultHandlers(GetTestDataFilePath());
https_test_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
ASSERT_TRUE(https_test_server_.Start());
}
WebContents* web_contents() { return shell()->web_contents(); }
void NavigateForHeader(const std::string& header) {
std::string url = "/echoheader?";
ASSERT_TRUE(
NavigateToURL(shell(), https_test_server_.GetURL(url + header)));
NavigationEntry* entry =
web_contents()->GetController().GetLastCommittedEntry();
ASSERT_TRUE(PageTransitionCoreTypeIs(entry->GetTransitionType(),
ui::PAGE_TRANSITION_TYPED));
}
GURL GetUrl(const std::string& path_and_query) {
return https_test_server_.GetURL(path_and_query);
}
GURL GetSecFetchUrl() { return GetUrl("/echoheader?sec-fetch-site"); }
std::string GetContent() {
return EvalJs(shell(), "document.body.innerText").ExtractString();
}
private:
net::EmbeddedTestServer https_test_server_;
base::test::ScopedFeatureList feature_list_;
};
IN_PROC_BROWSER_TEST_F(SecFetchBrowserTest, TypedNavigation) {
{
NavigateForHeader("Sec-Fetch-Dest");
EXPECT_EQ("document", GetContent());
}
{
NavigateForHeader("Sec-Fetch-Mode");
EXPECT_EQ("navigate", GetContent());
}
{
NavigateForHeader("Sec-Fetch-Site");
EXPECT_EQ("none", GetContent());
}
{
NavigateForHeader("Sec-Fetch-User");
EXPECT_EQ("?1", GetContent());
}
}
IN_PROC_BROWSER_TEST_F(SecFetchBrowserTest, CrossPortNavigation) {
net::EmbeddedTestServer server2(net::EmbeddedTestServer::TYPE_HTTPS);
server2.AddDefaultHandlers(GetTestDataFilePath());
server2.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
ASSERT_TRUE(server2.Start());
GURL initial_url = server2.GetURL("/title1.html");
GURL final_url = GetSecFetchUrl();
EXPECT_EQ(initial_url.scheme(), final_url.scheme());
EXPECT_EQ(initial_url.host(), final_url.host());
EXPECT_NE(initial_url.port(), final_url.port());
ASSERT_TRUE(NavigateToURL(shell(), initial_url));
{
TestNavigationObserver nav_observer(shell()->web_contents());
ASSERT_TRUE(ExecJs(shell(), JsReplace("location = $1", final_url)));
nav_observer.Wait();
}
EXPECT_EQ("same-site", GetContent());
}
IN_PROC_BROWSER_TEST_F(SecFetchBrowserTest, BackNavigation) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL initial_url(GetUrl("/title1.html"));
ASSERT_TRUE(NavigateToURL(shell(), initial_url));
GURL main_url(GetSecFetchUrl());
EXPECT_EQ(url::Origin::Create(initial_url), url::Origin::Create(main_url));
{
TestNavigationObserver nav_observer(shell()->web_contents(), 1);
ASSERT_TRUE(ExecJs(shell(), JsReplace("window.location = $1", main_url)));
nav_observer.Wait();
EXPECT_EQ("same-origin", GetContent());
}
{
GURL cross_origin_url(embedded_test_server()->GetURL("/title1.html"));
EXPECT_NE(url::Origin::Create(main_url),
url::Origin::Create(cross_origin_url));
TestNavigationObserver nav_observer(shell()->web_contents(), 1);
ASSERT_TRUE(
ExecJs(shell(), JsReplace("window.location = $1", cross_origin_url)));
nav_observer.Wait();
}
{
TestNavigationObserver nav_observer(shell()->web_contents(), 1);
shell()->web_contents()->GetController().GoBack();
nav_observer.Wait();
EXPECT_EQ(main_url, shell()->web_contents()->GetLastCommittedURL());
EXPECT_EQ("same-origin", GetContent());
}
}
IN_PROC_BROWSER_TEST_F(SecFetchBrowserTest, ReloadNavigation) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL initial_url(GetUrl("/title1.html"));
ASSERT_TRUE(NavigateToURL(shell(), initial_url));
GURL main_url(GetSecFetchUrl());
EXPECT_EQ(url::Origin::Create(initial_url), url::Origin::Create(main_url));
{
TestNavigationObserver nav_observer(shell()->web_contents(), 1);
ASSERT_TRUE(ExecJs(shell(), JsReplace("window.location = $1", main_url)));
nav_observer.Wait();
EXPECT_EQ("same-origin", GetContent());
}
{
TestNavigationObserver nav_observer(shell()->web_contents(), 1);
shell()->web_contents()->GetController().Reload(ReloadType::BYPASSING_CACHE,
true);
nav_observer.Wait();
EXPECT_EQ(main_url, shell()->web_contents()->GetLastCommittedURL());
EXPECT_EQ("same-origin", GetContent());
}
}
}