blob: 63c48bd2e53133277257687a8144ff790473f843 [file] [log] [blame]
// Copyright 2018 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/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/renderer_preferences.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/shell/browser/shell.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"
#if defined(OS_ANDROID)
#include "base/sys_info.h"
#endif
namespace content {
namespace {
class MockContentBrowserClient final : public ContentBrowserClient {
public:
void UpdateRendererPreferencesForWorker(BrowserContext*,
RendererPreferences* prefs) override {
prefs->enable_do_not_track = true;
prefs->enable_referrers = true;
}
};
class DoNotTrackTest : public ContentBrowserTest {
protected:
void EnableDoNotTrack() {
RendererPreferences* prefs =
shell()->web_contents()->GetMutableRendererPrefs();
EXPECT_FALSE(prefs->enable_do_not_track);
prefs->enable_do_not_track = true;
}
void ExpectPageTextEq(const std::string& expected_content) {
std::string text;
ASSERT_TRUE(ExecuteScriptAndExtractString(
shell(),
"window.domAutomationController.send(document.body.innerText);",
&text));
EXPECT_EQ(expected_content, text);
}
std::string GetDOMDoNotTrackProperty() {
std::string value;
EXPECT_TRUE(ExecuteScriptAndExtractString(
shell(),
"window.domAutomationController.send("
" navigator.doNotTrack === null ? '' : navigator.doNotTrack)",
&value));
return value;
}
};
std::unique_ptr<net::test_server::HttpResponse> CaptureHeaderHandler(
const std::string& path,
net::test_server::HttpRequest::HeaderMap* header_map,
base::OnceClosure done_callback,
const net::test_server::HttpRequest& request) {
GURL request_url = request.GetURL();
if (request_url.path() != path)
return nullptr;
*header_map = request.headers;
std::move(done_callback).Run();
return std::make_unique<net::test_server::BasicHttpResponse>();
}
// Checks that the DNT header is not sent by default.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, NotEnabled) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL url = embedded_test_server()->GetURL("/echoheader?DNT");
EXPECT_TRUE(NavigateToURL(shell(), url));
ExpectPageTextEq("None");
// And the DOM property is not set.
EXPECT_EQ("", GetDOMDoNotTrackProperty());
}
// Checks that the DNT header is sent when the corresponding preference is set.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Simple) {
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
GURL url = embedded_test_server()->GetURL("/echoheader?DNT");
EXPECT_TRUE(NavigateToURL(shell(), url));
ExpectPageTextEq("1");
}
// Checks that the DNT header is preserved during redirects.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Redirect) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL final_url = embedded_test_server()->GetURL("/echoheader?DNT");
GURL url = embedded_test_server()->GetURL(std::string("/server-redirect?") +
final_url.spec());
EnableDoNotTrack();
// We don't check the result NavigateToURL as it returns true only if the
// final URL is equal to the passed URL.
NavigateToURL(shell(), url);
ExpectPageTextEq("1");
}
// Checks that the DOM property is set when the corresponding preference is set.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DOMProperty) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL url = embedded_test_server()->GetURL("/echo");
EnableDoNotTrack();
EXPECT_TRUE(NavigateToURL(shell(), url));
EXPECT_EQ("1", GetDOMDoNotTrackProperty());
}
// Checks that the DNT header is sent in a request for a dedicated worker
// script.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, Worker) {
net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL url = embedded_test_server()->GetURL(
std::string("/workers/create_worker.html?worker_url=/capture"));
NavigateToURL(shell(), url);
loop.Run();
EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]);
}
// Checks that the DNT header is sent in a request for a shared worker
// script.
// Disabled due to crbug.com/853085.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DISABLED_SharedWorker) {
net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL url = embedded_test_server()->GetURL(
std::string("/workers/create_shared_worker.html?worker_url=/capture"));
NavigateToURL(shell(), url);
loop.Run();
EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]);
}
// Checks that the DNT header is sent in a request for a service worker
// script.
// Disabled due to crbug.com/853085.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DISABLED_ServiceWorker) {
net::test_server::HttpRequest::HeaderMap header_map;
base::RunLoop loop;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&CaptureHeaderHandler, "/capture", &header_map, loop.QuitClosure()));
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL url = embedded_test_server()->GetURL(std::string(
"/service_worker/create_service_worker.html?worker_url=/capture"));
NavigateToURL(shell(), url);
loop.Run();
EXPECT_TRUE(header_map.find("DNT") != header_map.end());
EXPECT_EQ("1", header_map["DNT"]);
}
// Checks that the DNT header is preserved when fetching from a dedicated
// worker.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, FetchFromWorker) {
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL fetch_url = embedded_test_server()->GetURL("/echoheader?DNT");
const GURL url = embedded_test_server()->GetURL(
std::string("/workers/fetch_from_worker.html?url=") + fetch_url.spec());
NavigateToURL(shell(), url);
const base::string16 title = base::ASCIIToUTF16("DONE");
TitleWatcher watcher(shell()->web_contents(), title);
EXPECT_EQ(title, watcher.WaitAndGetTitle());
ExpectPageTextEq("1");
}
// Checks that the DNT header is preserved when fetching from a shared worker.
// Disabled due to crbug.com/853085.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, DISABLED_FetchFromSharedWorker) {
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL fetch_url = embedded_test_server()->GetURL("/echoheader?DNT");
const GURL url = embedded_test_server()->GetURL(
std::string("/workers/fetch_from_shared_worker.html?url=") +
fetch_url.spec());
NavigateToURL(shell(), url);
const base::string16 title = base::ASCIIToUTF16("DONE");
TitleWatcher watcher(shell()->web_contents(), title);
EXPECT_EQ(title, watcher.WaitAndGetTitle());
ExpectPageTextEq("1");
}
// Checks that the DNT header is preserved when fetching from a service worker.
IN_PROC_BROWSER_TEST_F(DoNotTrackTest, FetchFromServiceWorker) {
#if defined(OS_ANDROID)
// TODO(crbug.com/864403): It seems that we call unsupported Android APIs on
// KitKat when we set a ContentBrowserClient. Don't call such APIs and make
// this test available on KitKat.
int32_t major_version = 0, minor_version = 0, bugfix_version = 0;
base::SysInfo::OperatingSystemVersionNumbers(&major_version, &minor_version,
&bugfix_version);
if (major_version < 5)
return;
#endif
MockContentBrowserClient client;
ContentBrowserClient* original_client = SetBrowserClientForTesting(&client);
ASSERT_TRUE(embedded_test_server()->Start());
EnableDoNotTrack();
const GURL fetch_url = embedded_test_server()->GetURL("/echoheader?DNT");
const GURL url = embedded_test_server()->GetURL(
std::string("/service_worker/fetch_from_service_worker.html?url=") +
fetch_url.spec());
NavigateToURL(shell(), url);
const base::string16 title = base::ASCIIToUTF16("DONE");
TitleWatcher watcher(shell()->web_contents(), title);
EXPECT_EQ(title, watcher.WaitAndGetTitle());
ExpectPageTextEq("1");
SetBrowserClientForTesting(original_client);
}
} // namespace
} // namespace content