| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| #include "base/feature_list.h" |
| #include "base/macros.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "components/network_session_configurator/common/network_switches.h" |
| #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/content_features.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/test/browser_test.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "net/dns/mock_host_resolver.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "net/test/embedded_test_server/http_request.h" |
| #include "net/test/embedded_test_server/http_response.h" |
| #include "url/gurl.h" |
| |
| // General browsertests for the origin isolation feature can be found in |
| // content/browser/isolated_origin_browsertest.cc. However testing use counters |
| // is best done from chrome/; thus, this file exists. |
| |
| class OriginIsolationBrowserTest : public InProcessBrowserTest { |
| public: |
| OriginIsolationBrowserTest() |
| : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} |
| ~OriginIsolationBrowserTest() override = default; |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); |
| |
| command_line->AppendSwitch(switches::kIgnoreCertificateErrors); |
| |
| feature_list_.InitAndEnableFeature(features::kOriginIsolationHeader); |
| } |
| |
| void SetUpOnMainThread() override { |
| https_server()->AddDefaultHandlers(GetChromeTestDataDir()); |
| https_server()->RegisterRequestHandler(base::BindRepeating( |
| &OriginIsolationBrowserTest::HandleResponse, base::Unretained(this))); |
| |
| ASSERT_TRUE(https_server()->Start()); |
| |
| host_resolver()->AddRule("*", "127.0.0.1"); |
| embedded_test_server()->StartAcceptingConnections(); |
| } |
| |
| void TearDownOnMainThread() override { |
| ASSERT_TRUE(https_server()->ShutdownAndWaitUntilComplete()); |
| } |
| |
| net::EmbeddedTestServer* https_server() { return &https_server_; } |
| |
| private: |
| std::unique_ptr<net::test_server::HttpResponse> HandleResponse( |
| const net::test_server::HttpRequest& request) { |
| if (request.relative_url == "/isolate_origin") { |
| auto response = std::make_unique<net::test_server::BasicHttpResponse>(); |
| response->set_code(net::HTTP_OK); |
| response->set_content_type("text/html"); |
| response->AddCustomHeader("Origin-Isolation", "?1"); |
| response->set_content("isolate me!"); |
| return std::move(response); |
| } |
| |
| return nullptr; |
| } |
| |
| net::EmbeddedTestServer https_server_; |
| base::test::ScopedFeatureList feature_list_; |
| |
| DISALLOW_COPY_AND_ASSIGN(OriginIsolationBrowserTest); |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(OriginIsolationBrowserTest, Navigations) { |
| GURL start_url(https_server()->GetURL("foo.com", "/iframe.html")); |
| GURL isolated_url( |
| https_server()->GetURL("isolated.foo.com", "/isolate_origin")); |
| |
| content::WebContents* web_contents = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| auto web_feature_waiter = |
| std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( |
| web_contents); |
| web_feature_waiter->AddWebFeatureExpectation( |
| blink::mojom::WebFeature::kOriginIsolationHeader); |
| |
| ui_test_utils::NavigateToURL(browser(), start_url); |
| |
| EXPECT_FALSE(web_feature_waiter->DidObserveWebFeature( |
| blink::mojom::WebFeature::kOriginIsolationHeader)); |
| |
| EXPECT_TRUE(NavigateIframeToURL(web_contents, "test", isolated_url)); |
| |
| web_feature_waiter->Wait(); |
| } |