diff --git a/browser/farbling/BUILD.gn b/browser/farbling/BUILD.gn index 61fcdbbbf9fd..077e80e3b421 100644 --- a/browser/farbling/BUILD.gn +++ b/browser/farbling/BUILD.gn @@ -18,6 +18,7 @@ if (!is_android) { "brave_navigator_keyboard_api_browsertest.cc", "brave_navigator_languages_farbling_browsertest.cc", "brave_navigator_plugins_farbling_browsertest.cc", + "brave_navigator_usb_farbling_browsertest.cc", "brave_navigator_useragent_farbling_browsertest.cc", "brave_offscreencanvas_farbling_browsertest.cc", "brave_screen_farbling_browsertest.cc", diff --git a/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc b/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc index 8a6e942c4754..d2c88f385d18 100644 --- a/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc +++ b/browser/farbling/brave_dark_mode_fingerprint_protection_browsertest.cc @@ -126,11 +126,6 @@ class BraveDarkModeFingerprintProtectionTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - void NavigateToURLUntilLoadStop(const GURL& url) { - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - ASSERT_TRUE(WaitForLoadStop(contents())); - } - protected: ui::TestNativeTheme test_theme_; @@ -144,17 +139,17 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, DarkModeCheck) { // On fingerprinting off, should return dark mode AllowFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(IsReportingDarkMode()); // On fingerprinting default, should return dark mode SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(IsReportingDarkMode()); // On fingerprinting block, should return light BlockFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_FALSE(IsReportingDarkMode()); } @@ -165,17 +160,17 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, // On all modes, should return light // Fingerprinting off AllowFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_FALSE(IsReportingDarkMode()); // Fingerprinting default SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_FALSE(IsReportingDarkMode()); // Fingerprinting strict/block BlockFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_FALSE(IsReportingDarkMode()); } @@ -185,7 +180,8 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, SetDarkMode(true); BlockFingerprinting(); - NavigateToURLUntilLoadStop(GURL("brave://settings")); + ASSERT_TRUE( + ui_test_utils::NavigateToURL(browser(), GURL("brave://settings"))); ASSERT_TRUE(IsReportingDarkMode()); } @@ -194,13 +190,13 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionTest, SetFingerprintingDefault(); SetDarkMode(false); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); std::u16string tab_title; ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title)); EXPECT_EQ(u"light", tab_title); SetDarkMode(true); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title)); EXPECT_EQ(u"dark", tab_title); } @@ -222,17 +218,17 @@ IN_PROC_BROWSER_TEST_F(BraveDarkModeFingerprintProtectionFlagDisabledTest, // On fingerprinting off, should return dark mode AllowFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(IsReportingDarkMode()); // On fingerprinting default, should return dark mode SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(IsReportingDarkMode()); // On fingerprinting block, should still return dark due to the // BraveDarkModeBlock feature being disabled for this test. BlockFingerprinting(); - NavigateToURLUntilLoadStop(dark_mode_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), dark_mode_url())); ASSERT_TRUE(IsReportingDarkMode()); } diff --git a/browser/farbling/brave_enumeratedevices_farbling_browsertest.cc b/browser/farbling/brave_enumeratedevices_farbling_browsertest.cc index 49ceb45dfd7a..d6d88aa69d74 100644 --- a/browser/farbling/brave_enumeratedevices_farbling_browsertest.cc +++ b/browser/farbling/brave_enumeratedevices_farbling_browsertest.cc @@ -121,11 +121,6 @@ class BraveEnumerateDevicesFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: GURL top_level_page_url_; GURL farbling_url_; @@ -139,7 +134,7 @@ IN_PROC_BROWSER_TEST_F(BraveEnumerateDevicesFarblingBrowserTest, // Farbling level: off // get real navigator.mediaDevices.enumerateDevices array AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); std::string real_value = ExecScriptGetStr(kEnumerateDevicesScript, contents()); ASSERT_NE(real_value, ""); @@ -148,7 +143,7 @@ IN_PROC_BROWSER_TEST_F(BraveEnumerateDevicesFarblingBrowserTest, // navigator.mediaDevices.enumerateDevices array is shuffled // pseudo-randomly based on domain+session key SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); std::string balanced_value = ExecScriptGetStr(kEnumerateDevicesScript, contents()); EXPECT_NE(balanced_value, real_value); @@ -156,7 +151,7 @@ IN_PROC_BROWSER_TEST_F(BraveEnumerateDevicesFarblingBrowserTest, // Farbling level: maximum // same as farbling level: balanced BlockFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); std::string maximum_value = ExecScriptGetStr(kEnumerateDevicesScript, contents()); EXPECT_EQ(balanced_value, maximum_value); diff --git a/browser/farbling/brave_navigator_devicememory_farbling_browsertest.cc b/browser/farbling/brave_navigator_devicememory_farbling_browsertest.cc index a275e77566dc..11408b50036b 100644 --- a/browser/farbling/brave_navigator_devicememory_farbling_browsertest.cc +++ b/browser/farbling/brave_navigator_devicememory_farbling_browsertest.cc @@ -98,11 +98,6 @@ class BraveDeviceMemoryFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: std::unique_ptr content_client_; std::unique_ptr browser_content_client_; @@ -122,25 +117,25 @@ IN_PROC_BROWSER_TEST_F(BraveDeviceMemoryFarblingBrowserTest, EXPECT_EQ(true_value, 8192); // Farbling level: off AllowFingerprinting(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); EXPECT_EQ(true_value, EvalJs(contents(), kDeviceMemoryScript)); AllowFingerprinting(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(true_value, EvalJs(contents(), kDeviceMemoryScript)); // Farbling level: default SetFingerprintingDefault(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); EXPECT_EQ(2048, EvalJs(contents(), kDeviceMemoryScript)); SetFingerprintingDefault(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(4096, EvalJs(contents(), kDeviceMemoryScript)); // Farbling level: maximum BlockFingerprinting(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); EXPECT_EQ(512, EvalJs(contents(), kDeviceMemoryScript)); AllowFingerprinting(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(8192, EvalJs(contents(), kDeviceMemoryScript)); } diff --git a/browser/farbling/brave_navigator_hardwareconcurrency_farbling_browsertest.cc b/browser/farbling/brave_navigator_hardwareconcurrency_farbling_browsertest.cc index c255c3017882..a98ef8808578 100644 --- a/browser/farbling/brave_navigator_hardwareconcurrency_farbling_browsertest.cc +++ b/browser/farbling/brave_navigator_hardwareconcurrency_farbling_browsertest.cc @@ -103,11 +103,6 @@ class BraveNavigatorHardwareConcurrencyFarblingBrowserTest return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: GURL top_level_page_url_; GURL farbling_url_; @@ -121,7 +116,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, // Farbling level: off // get real navigator.hardwareConcurrency AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int real_value = ExecScriptGetInt(kHardwareConcurrencyScript, contents()); ASSERT_GE(real_value, 2); @@ -129,7 +124,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, // navigator.hardwareConcurrency should be greater than or equal to 2 // and less than or equal to the real value SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int fake_value = ExecScriptGetInt(kHardwareConcurrencyScript, contents()); EXPECT_GE(fake_value, 2); EXPECT_LE(fake_value, real_value); @@ -138,7 +133,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, // navigator.hardwareConcurrency should be greater than or equal to 2 // and less than or equal to 8 BlockFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int completely_fake_value = ExecScriptGetInt(kHardwareConcurrencyScript, contents()); // For this domain (a.com) + the random seed (constant for browser tests), @@ -153,13 +148,13 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, // Farbling level: off // get real navigator.hardwareConcurrency AllowFingerprinting(); - NavigateToURLUntilLoadStop(url); - // NavigateToURLUntilLoadStop() will return before our Worker has a chance - // to run its code to completion, so we block here until document.title - // changes. This will happen relatively quickly if things are going well - // inside the Worker. If the browser crashes while executing the Worker - // code (which is what this test is really testing), then this will never - // unblock and the entire browser test will eventually time out. Timing + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); + // ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), ) will return before + // our Worker has a chance to run its code to completion, so we block here + // until document.title changes. This will happen relatively quickly if things + // are going well inside the Worker. If the browser crashes while executing + // the Worker code (which is what this test is really testing), then this will + // never unblock and the entire browser test will eventually time out. Timing // out indicates a fatal error. while (ExecScriptGetStr(kTitleScript, contents()) == "") { } @@ -168,7 +163,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, ASSERT_GE(real_value, 2); SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } int fake_value; @@ -177,7 +172,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorHardwareConcurrencyFarblingBrowserTest, EXPECT_LE(fake_value, real_value); BlockFingerprinting(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } int completely_fake_value; diff --git a/browser/farbling/brave_navigator_languages_farbling_browsertest.cc b/browser/farbling/brave_navigator_languages_farbling_browsertest.cc index 10091aa3e15b..5bf9dd5bda1e 100644 --- a/browser/farbling/brave_navigator_languages_farbling_browsertest.cc +++ b/browser/farbling/brave_navigator_languages_farbling_browsertest.cc @@ -139,11 +139,6 @@ class BraveNavigatorLanguagesFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(web_contents()); - } - void SetAcceptLanguages(const std::string& accept_languages) { content::BrowserContext* context = static_cast(browser()->profile()); @@ -153,10 +148,12 @@ class BraveNavigatorLanguagesFarblingBrowserTest : public InProcessBrowserTest { } void MonitorHTTPRequest(const net::test_server::HttpRequest& request) { - if (request.relative_url.find("/reduce-language/") == std::string::npos) + if (request.relative_url.find("/reduce-language/") == std::string::npos) { return; - if (expected_http_accept_language_.empty()) + } + if (expected_http_accept_language_.empty()) { return; + } EXPECT_EQ(request.headers.at("accept-language"), expected_http_accept_language_); } @@ -181,35 +178,35 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest, GURL url2 = https_server_.GetURL(domain2, "/simple.html"); // Farbling level: off AllowFingerprinting(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); std::string testing_languages = "en-US,en,es,la"; SetAcceptLanguages(testing_languages); EXPECT_EQ(testing_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); AllowFingerprinting(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(testing_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); // Farbling level: default SetFingerprintingDefault(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); std::string standard_languages = "en-US"; EXPECT_EQ(standard_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); SetFingerprintingDefault(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(standard_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); // Farbling level: maximum BlockFingerprinting(domain1); - NavigateToURLUntilLoadStop(url1); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); std::string strict_languages = "en-US,en"; EXPECT_EQ(strict_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); BlockFingerprinting(domain2); - NavigateToURLUntilLoadStop(url2); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2)); EXPECT_EQ(strict_languages, EvalJs(web_contents(), kNavigatorLanguagesScript)); } @@ -223,19 +220,19 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest, // Farbling level: off AllowFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); TitleWatcher watcher1(web_contents(), expected_title); EXPECT_EQ(expected_title, watcher1.WaitAndGetTitle()); // Farbling level: default SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); TitleWatcher watcher2(web_contents(), expected_title); EXPECT_EQ(expected_title, watcher2.WaitAndGetTitle()); // Farbling level: maximum BlockFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); TitleWatcher watcher3(web_contents(), expected_title); EXPECT_EQ(expected_title, watcher3.WaitAndGetTitle()); } @@ -249,7 +246,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest, https_server_.GetURL(domain, "/navigator/service-workers-languages.html"); // Farbling level: default SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); TitleWatcher watcher2(web_contents(), expected_title); EXPECT_EQ(expected_title, watcher2.WaitAndGetTitle()); } @@ -275,26 +272,26 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest, // HTTP Accept-Language header should not be farbled. AllowFingerprinting(domain_b); SetExpectedHTTPAcceptLanguage("la,es;q=0.9,en;q=0.8"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); AllowFingerprinting(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Farbling level: default // HTTP Accept-Language header should be farbled by domain. SetFingerprintingDefault(domain_b); SetExpectedHTTPAcceptLanguage("la;q=0.7"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); SetExpectedHTTPAcceptLanguage("la;q=0.8"); SetFingerprintingDefault(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Farbling level: maximum // HTTP Accept-Language header should be farbled but the same across domains. BlockFingerprinting(domain_b); SetExpectedHTTPAcceptLanguage("en-US,en;q=0.9"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); BlockFingerprinting(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Test with subdivided language code as the primary language. SetAcceptLanguages("zh-HK,zh,la"); @@ -303,32 +300,32 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest, // HTTP Accept-Language header should not be farbled. AllowFingerprinting(domain_b); SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.9,la;q=0.8"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); AllowFingerprinting(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Farbling level: default // HTTP Accept-Language header should be farbled by domain. SetFingerprintingDefault(domain_b); SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.7"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.8"); SetFingerprintingDefault(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Farbling level: maximum // HTTP Accept-Language header should be farbled but the same across domains. BlockFingerprinting(domain_b); SetExpectedHTTPAcceptLanguage("en-US,en;q=0.9"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); BlockFingerprinting(domain_d); - NavigateToURLUntilLoadStop(url_d); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_d)); // Farbling level: maximum but domain is on exceptions list // HTTP Accept-Language header should not be farbled. BlockFingerprinting(domain_x); SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.9,la;q=0.8"); - NavigateToURLUntilLoadStop(url_x); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_x)); BlockFingerprinting(domain_y); - NavigateToURLUntilLoadStop(url_y); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_y)); } diff --git a/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc b/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc index ed48126d4efc..adedbd866dfd 100644 --- a/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc +++ b/browser/farbling/brave_navigator_plugins_farbling_browsertest.cc @@ -105,11 +105,6 @@ class BraveNavigatorPluginsFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: GURL top_level_page_url_; GURL farbling_url_; @@ -120,7 +115,7 @@ class BraveNavigatorPluginsFarblingBrowserTest : public InProcessBrowserTest { // Tests that access to navigator.pdfViewerEnabled attribute does not crash. IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, NavigatorPdfViewerEnabledNoCrash) { - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(true, EvalJs(contents(), kNavigatorPdfViewerEnabledCrashTest)); } @@ -131,35 +126,35 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, // Farbling level: off // get real length of navigator.plugins AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); // Farbling level: balanced (default) // navigator.plugins should contain all real plugins + 2 fake ones SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int balanced_length = ExecScriptGetInt(kPluginsLengthScript, contents()); EXPECT_EQ(balanced_length, off_length + 2); // Farbling level: maximum // navigator.plugins should contain no real plugins, only 2 fake ones BlockFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int maximum_length = ExecScriptGetInt(kPluginsLengthScript, contents()); EXPECT_EQ(maximum_length, 2); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0].name);", contents()), - "8.fPHDhw"); + "8mTJjRv2"); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0].filename);", contents()), - "06du37du3bt2bNmT"); + "0iZUpzhYrVxgvf2b"); EXPECT_EQ( ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0].description);", contents()), - "BgwYMmTpUq1aNmTJky5cOnTp069ePnTp"); + "z8eu2Eh36GLs9mTRIMtWyZrdOuf2bNl5"); EXPECT_EQ(ExecScriptGetInt( "domAutomationController.send(navigator.plugins[0].length);", contents()), @@ -172,20 +167,20 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0][0].description);", contents()), - "qVKly58ePHDBgQoUqVKFix48.fvXLlSJ"); + "6pc1iZMOHDBny4cOuf2j4FCgYrVpzhYz"); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[1].name);", contents()), - "Xr1at27"); + "JjZUxgv"); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[1].filename);", contents()), - "SJEChw48ev3bNGD"); + "2nyCJECgYrVp7GD"); EXPECT_EQ( ExecScriptGetStr( "domAutomationController.send(navigator.plugins[1].description);", contents()), - "rVqVqVqVqVKlSpUqVqVKlSJEChQIECh"); + "nb0Do7GLs9mb0DgYzCJMteXq8HiwYUx"); EXPECT_EQ(ExecScriptGetInt( "domAutomationController.send(navigator.plugins[1].length);", contents()), @@ -198,7 +193,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, ExecScriptGetStr( "domAutomationController.send(navigator.plugins[1][0].description);", contents()), - "HDBAgQo0aNGDBgw48.fvXrVKFiRIkyZM"); + "pzhQIECgYzCBny4cOuXLFh3Epc1aseXq"); } // Tests that names of built-in plugins get farbled by default @@ -207,7 +202,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, FarbleNavigatorPluginsBuiltin) { // Farbling level: off AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); EXPECT_EQ(off_length, 2); EXPECT_EQ(ExecScriptGetStr( @@ -221,7 +216,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, // Farbling level: balanced (default) SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0].name);", contents()), @@ -239,7 +234,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, FarbleNavigatorPluginsReset) { // Farbling level: balanced (default) SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr( "domAutomationController.send(navigator.plugins[0].name);", contents()), @@ -251,7 +246,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorPluginsFarblingBrowserTest, // Farbling level: off AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); int off_length = ExecScriptGetInt(kPluginsLengthScript, contents()); EXPECT_EQ(off_length, 2); EXPECT_EQ(ExecScriptGetStr( diff --git a/browser/farbling/brave_navigator_usb_farbling_browsertest.cc b/browser/farbling/brave_navigator_usb_farbling_browsertest.cc new file mode 100644 index 000000000000..9b530f4a9e8a --- /dev/null +++ b/browser/farbling/brave_navigator_usb_farbling_browsertest.cc @@ -0,0 +1,317 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include +#include +#include + +#include "base/path_service.h" +#include "brave/browser/brave_content_browser_client.h" +#include "brave/components/brave_shields/browser/brave_shields_util.h" +#include "brave/components/constants/brave_paths.h" +#include "chrome/browser/chrome_content_browser_client.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_dialogs.h" +#include "chrome/browser/ui/chooser_bubble_testapi.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/usb/chrome_usb_delegate.h" +#include "chrome/browser/usb/usb_chooser_context_factory.h" +#include "chrome/browser/usb/usb_chooser_controller.h" +#include "chrome/browser/usb/web_usb_chooser.h" +#include "chrome/common/chrome_content_client.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/permissions/permission_request.h" +#include "content/public/browser/usb_chooser.h" +#include "content/public/common/content_client.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_mock_cert_verifier.h" +#include "content/public/test/test_navigation_observer.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.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 "services/device/public/cpp/test/fake_usb_device_manager.h" +#include "services/device/public/mojom/usb_device.mojom.h" +#include "services/device/public/mojom/usb_enumeration_options.mojom.h" +#include "services/service_manager/public/cpp/binder_registry.h" +#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h" + +using brave_shields::ControlType; + +namespace { + +constexpr char kTestDeviceSerialNumber[] = "123456"; +constexpr char kGetDevicesScript[] = R"((async () => { + let devices = await navigator.usb.getDevices(); + return devices.map(device => device.serialNumber); + })())"; +constexpr char kRequestDeviceScript[] = R"((async () => { + let device = + await navigator.usb.requestDevice({ filters: [{ vendorId: 0 }] }); + return device.serialNumber; + })())"; + +class FakeChooserView : public permissions::ChooserController::View { + public: + explicit FakeChooserView( + std::unique_ptr controller) + : controller_(std::move(controller)) { + controller_->set_view(this); + } + + FakeChooserView(const FakeChooserView&) = delete; + FakeChooserView& operator=(const FakeChooserView&) = delete; + + ~FakeChooserView() override { controller_->set_view(nullptr); } + + void OnOptionsInitialized() override { + if (controller_->NumOptions()) { + controller_->Select({0}); + } else { + controller_->Cancel(); + } + delete this; + } + + void OnOptionAdded(size_t index) override { NOTREACHED(); } + void OnOptionRemoved(size_t index) override { NOTREACHED(); } + void OnOptionUpdated(size_t index) override { NOTREACHED(); } + void OnAdapterEnabledChanged(bool enabled) override { NOTREACHED(); } + void OnRefreshStateChanged(bool refreshing) override { NOTREACHED(); } + + private: + std::unique_ptr controller_; +}; + +class FakeUsbChooser : public WebUsbChooser { + public: + FakeUsbChooser() = default; + FakeUsbChooser(const FakeUsbChooser&) = delete; + FakeUsbChooser& operator=(const FakeUsbChooser&) = delete; + ~FakeUsbChooser() override = default; + + void ShowChooser(content::RenderFrameHost* frame, + std::unique_ptr controller) override { + // Device list initialization in UsbChooserController may complete before + // having a valid view in which case OnOptionsInitialized() has no chance to + // be triggered, so select the first option directly if options are ready. + if (controller->NumOptions()) { + controller->Select({0}); + } else { + new FakeChooserView(std::move(controller)); + } + } +}; + +class TestUsbDelegate : public ChromeUsbDelegate { + public: + TestUsbDelegate() = default; + TestUsbDelegate(const TestUsbDelegate&) = delete; + TestUsbDelegate& operator=(const TestUsbDelegate&) = delete; + ~TestUsbDelegate() override = default; + + std::unique_ptr RunChooser( + content::RenderFrameHost& frame, + std::vector filters, + blink::mojom::WebUsbService::GetPermissionCallback callback) override { + if (use_fake_chooser_) { + auto chooser = std::make_unique(); + chooser->ShowChooser( + &frame, std::make_unique( + &frame, std::move(filters), std::move(callback))); + return chooser; + } else { + return ChromeUsbDelegate::RunChooser(frame, std::move(filters), + std::move(callback)); + } + } + + void UseFakeChooser() { use_fake_chooser_ = true; } + + private: + bool use_fake_chooser_ = false; +}; + +class TestContentBrowserClient : public BraveContentBrowserClient { + public: + TestContentBrowserClient() + : usb_delegate_(std::make_unique()) {} + TestContentBrowserClient(const TestContentBrowserClient&) = delete; + TestContentBrowserClient& operator=(const TestContentBrowserClient&) = delete; + ~TestContentBrowserClient() override = default; + + // ChromeContentBrowserClient: + content::UsbDelegate* GetUsbDelegate() override { + return usb_delegate_.get(); + } + + TestUsbDelegate& delegate() { return *usb_delegate_; } + + void ResetUsbDelegate() { usb_delegate_.reset(); } + + private: + std::unique_ptr usb_delegate_; +}; + +class BraveNavigatorUsbFarblingBrowserTest : public InProcessBrowserTest { + public: + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + + content_client_ = std::make_unique(); + content::SetContentClient(content_client_.get()); + browser_content_client_ = std::make_unique(); + content::SetBrowserClientForTesting(browser_content_client_.get()); + + mock_cert_verifier_.mock_cert_verifier()->set_default_result(net::OK); + host_resolver()->AddRule("*", "127.0.0.1"); + https_server_ = std::make_unique( + net::test_server::EmbeddedTestServer::TYPE_HTTPS); + content::SetupCrossSiteRedirector(https_server_.get()); + + brave::RegisterPathProvider(); + base::FilePath test_data_dir; + base::PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); + https_server_->ServeFilesFromDirectory(test_data_dir); + ASSERT_TRUE(https_server_->Start()); + + // Connect with the FakeUsbDeviceManager. + mojo::PendingRemote device_manager; + device_manager_.AddReceiver( + device_manager.InitWithNewPipeAndPassReceiver()); + UsbChooserContextFactory::GetForProfile(browser()->profile()) + ->SetDeviceManagerForTesting(std::move(device_manager)); + } + + void TearDownOnMainThread() override { + browser_content_client_->ResetUsbDelegate(); + } + + void TearDown() override { + browser_content_client_.reset(); + content_client_.reset(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpCommandLine(command_line); + mock_cert_verifier_.SetUpCommandLine(command_line); + } + + void SetUpInProcessBrowserTestFixture() override { + InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); + mock_cert_verifier_.SetUpInProcessBrowserTestFixture(); + } + + void TearDownInProcessBrowserTestFixture() override { + InProcessBrowserTest::TearDownInProcessBrowserTestFixture(); + mock_cert_verifier_.TearDownInProcessBrowserTestFixture(); + } + + net::EmbeddedTestServer* https_server() { return https_server_.get(); } + + HostContentSettingsMap* content_settings() { + return HostContentSettingsMapFactory::GetForProfile(browser()->profile()); + } + + void AllowFingerprinting(std::string domain) { + brave_shields::SetFingerprintingControlType( + content_settings(), ControlType::ALLOW, + https_server()->GetURL(domain, "/")); + } + + void SetFingerprintingDefault(std::string domain) { + brave_shields::SetFingerprintingControlType( + content_settings(), ControlType::DEFAULT, + https_server()->GetURL(domain, "/")); + } + + content::WebContents* web_contents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + void AddFakeDevice(const std::string& serial_number) { + DCHECK(!fake_device_info_); + fake_device_info_ = device_manager_.CreateAndAddDevice( + 0, 0, "Test Manufacturer", "Test Device", serial_number); + } + + void RemoveFakeDevice() { + DCHECK(fake_device_info_); + device_manager_.RemoveDevice(fake_device_info_->guid); + fake_device_info_ = nullptr; + } + + void UseFakeChooser() { + browser_content_client_->delegate().UseFakeChooser(); + } + + UsbChooserContext* GetChooserContext() { + return UsbChooserContextFactory::GetForProfile(browser()->profile()); + } + + private: + content::ContentMockCertVerifier mock_cert_verifier_; + std::unique_ptr https_server_; + std::unique_ptr content_client_; + std::unique_ptr browser_content_client_; + device::FakeUsbDeviceManager device_manager_; + device::mojom::UsbDeviceInfoPtr fake_device_info_; +}; + +IN_PROC_BROWSER_TEST_F(BraveNavigatorUsbFarblingBrowserTest, + FarbleSerialNumber) { + // Insert a fake USB device. + AddFakeDevice(kTestDeviceSerialNumber); + + // Navigate with farbling off. + std::string domain_b = "b.com"; + GURL url_b = https_server()->GetURL(domain_b, "/simple.html"); + // Farbling level: off + AllowFingerprinting(domain_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); + + // Call getDevices with no device permissions. This should return an empty + // list. + EXPECT_EQ(content::ListValueOf(), EvalJs(web_contents(), kGetDevicesScript)); + + // Request permission to access a USB device. The fake chooser view will + // automatically select the item representing the fake device we created and + // grant permission. + UseFakeChooser(); + + // Request the device configuration and check its serial number. This + // should be the actual serial number we assigned when we created the device. + EXPECT_EQ(kTestDeviceSerialNumber, + EvalJs(web_contents(), kRequestDeviceScript)); + + // Call getDevices again. Our fake device should be included, still with + // the actual serial number we assigned when we created the device. + EXPECT_EQ(content::ListValueOf(kTestDeviceSerialNumber), + EvalJs(web_contents(), kGetDevicesScript)); + + // Reload with farbling at default. + SetFingerprintingDefault(domain_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); + + // Call getDevices again. The fake device is still included, but now its + // serial number is farbled. + EXPECT_EQ(content::ListValueOf("ZrVxgvfuAn6laVSJ"), + EvalJs(web_contents(), kGetDevicesScript)); + + // Do it all again, but on a different domain. + std::string domain_z = "z.com"; + GURL url_z = https_server()->GetURL(domain_z, "/simple.html"); + SetFingerprintingDefault(domain_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); + EXPECT_EQ("MGi47dt1DgYrVxYM", EvalJs(web_contents(), kRequestDeviceScript)); +} + +} // namespace diff --git a/browser/farbling/brave_navigator_useragent_farbling_browsertest.cc b/browser/farbling/brave_navigator_useragent_farbling_browsertest.cc index 81f33312e9ac..12cee1a53257 100644 --- a/browser/farbling/brave_navigator_useragent_farbling_browsertest.cc +++ b/browser/farbling/brave_navigator_useragent_farbling_browsertest.cc @@ -138,8 +138,9 @@ class BraveNavigatorUserAgentFarblingBrowserTest : public InProcessBrowserTest { net::EmbeddedTestServer* https_server() { return https_server_.get(); } std::string last_requested_http_user_agent() { - if (user_agents_.empty()) + if (user_agents_.empty()) { return ""; + } return user_agents_[user_agents_.size() - 1]; } @@ -169,11 +170,6 @@ class BraveNavigatorUserAgentFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: content::ContentMockCertVerifier mock_cert_verifier_; std::unique_ptr https_server_; @@ -194,7 +190,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, std::string unfarbled_ua = embedder_support::GetUserAgent(); // Farbling level: off AllowFingerprinting(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); // HTTP User-Agent header we just sent in that request should be the same as // the unfarbled user agent EXPECT_EQ(last_requested_http_user_agent(), unfarbled_ua); @@ -202,7 +198,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, // user agent should be the same as the unfarbled user agent EXPECT_EQ(unfarbled_ua, off_ua_b); AllowFingerprinting(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); // HTTP User-Agent header we just sent in that request should be the same as // the unfarbled user agent EXPECT_EQ(last_requested_http_user_agent(), unfarbled_ua); @@ -214,11 +210,11 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, // navigator.userAgent may be farbled, but the farbling is not // domain-specific SetFingerprintingDefault(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); std::string default_ua_b = EvalJs(contents(), kUserAgentScript).ExtractString(); SetFingerprintingDefault(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); std::string default_ua_z = EvalJs(contents(), kUserAgentScript).ExtractString(); // user agent should be the same on every domain if farbling is default @@ -230,18 +226,19 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, // on domain and session key BlockFingerprinting(domain_b); // test known values - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); auto max_ua_b = EvalJs(contents(), kUserAgentScript); EXPECT_EQ(default_ua_b + " ", max_ua_b); BlockFingerprinting(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); auto max_ua_z = EvalJs(contents(), kUserAgentScript); EXPECT_EQ(default_ua_z + " ", max_ua_z); // test that web workers also inherit the farbled user agent // (farbling level is still maximum) - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/workers-useragent.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/workers-useragent.html"))); // HTTP User-Agent header we just sent in that request should be the same as // the unfarbled user agent EXPECT_EQ(last_requested_http_user_agent(), unfarbled_ua); @@ -250,8 +247,9 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, // test that service workers also inherit the farbled user agent // (farbling level is still maximum) - NavigateToURLUntilLoadStop(https_server()->GetURL( - domain_b, "/navigator/service-workers-useragent.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), https_server()->GetURL( + domain_b, "/navigator/service-workers-useragent.html"))); // HTTP User-Agent header we just sent in that request should be the same as // the unfarbled user agent EXPECT_EQ(last_requested_http_user_agent(), unfarbled_ua); @@ -261,7 +259,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, // Farbling level: off // verify that user agent is reset properly after having been farbled AllowFingerprinting(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); EXPECT_EQ(last_requested_http_user_agent(), unfarbled_ua); auto off_ua_b2 = EvalJs(contents(), kUserAgentScript); EXPECT_EQ(off_ua_b.ExtractString(), off_ua_b2); @@ -276,51 +274,60 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, BlockFingerprinting(domain_b); // test that local iframes inherit the farbled user agent - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-local-iframe.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-local-iframe.html"))); TitleWatcher watcher1(contents(), expected_title); EXPECT_EQ(expected_title, watcher1.WaitAndGetTitle()); // test that remote iframes inherit the farbled user agent - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-remote-iframe.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-remote-iframe.html"))); TitleWatcher watcher2(contents(), expected_title); EXPECT_EQ(expected_title, watcher2.WaitAndGetTitle()); // test that dynamic iframes inherit the farbled user agent // 7 variations based on https://arkenfox.github.io/TZP/tzp.html - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-1.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-1.html"))); TitleWatcher dynamic_iframe_1_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_1_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-2.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-2.html"))); TitleWatcher dynamic_iframe_2_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_2_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-3.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-3.html"))); TitleWatcher dynamic_iframe_3_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_3_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-4.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-4.html"))); TitleWatcher dynamic_iframe_4_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_4_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-5.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-5.html"))); TitleWatcher dynamic_iframe_5_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_5_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-6.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-6.html"))); TitleWatcher dynamic_iframe_6_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_6_watcher.WaitAndGetTitle()); - NavigateToURLUntilLoadStop( - https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-7.html")); + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + https_server()->GetURL(domain_b, "/navigator/ua-dynamic-iframe-7.html"))); TitleWatcher dynamic_iframe_7_watcher(contents(), expected_title); EXPECT_EQ(expected_title, dynamic_iframe_7_watcher.WaitAndGetTitle()); } @@ -329,7 +336,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, FarbleNavigatorUserAgentModel) { GURL url_b = https_server()->GetURL("b.com", "/navigator/useragentdata.html"); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); std::u16string expected_title(u"pass"); TitleWatcher watcher(contents(), expected_title); EXPECT_EQ(expected_title, watcher.WaitAndGetTitle()); @@ -339,7 +346,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, BraveIsInNavigatorUserAgentBrandList) { GURL url = https_server()->GetURL("a.com", "/simple.html"); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::string brands = EvalJs(contents(), kBrandScript).ExtractString(); EXPECT_NE(std::string::npos, brands.find("Brave")); EXPECT_NE(std::string::npos, brands.find("Chromium")); @@ -349,7 +356,7 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, IN_PROC_BROWSER_TEST_F(BraveNavigatorUserAgentFarblingBrowserTest, CheckUserAgentMetadataVersions) { GURL url = https_server()->GetURL("a.com", "/simple.html"); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); const content::EvalJsResult result = EvalJs(contents(), kGetHighEntropyValuesScript); EXPECT_TRUE(result.error.empty()); diff --git a/browser/farbling/brave_offscreencanvas_farbling_browsertest.cc b/browser/farbling/brave_offscreencanvas_farbling_browsertest.cc index e237c3793f68..afd615dfd907 100644 --- a/browser/farbling/brave_offscreencanvas_farbling_browsertest.cc +++ b/browser/farbling/brave_offscreencanvas_farbling_browsertest.cc @@ -93,11 +93,6 @@ class BraveOffscreenCanvasFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: GURL top_level_page_url_; std::unique_ptr content_client_; @@ -109,8 +104,8 @@ IN_PROC_BROWSER_TEST_F(BraveOffscreenCanvasFarblingBrowserTest, GURL url = embedded_test_server()->GetURL("a.com", "/offscreen-farbling.html"); AllowFingerprinting(); - NavigateToURLUntilLoadStop(url); - // NavigateToURLUntilLoadStop() will return before our Worker has a chance + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); + // NavigateToURL will return before our Worker has a chance // to run its code to completion, so we block here until document.title // changes. This will happen relatively quickly if things are going well // inside the Worker. If the browser crashes while executing the Worker @@ -122,13 +117,13 @@ IN_PROC_BROWSER_TEST_F(BraveOffscreenCanvasFarblingBrowserTest, EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "pass"); BlockFingerprinting(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "pass"); SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "pass"); @@ -140,7 +135,7 @@ IN_PROC_BROWSER_TEST_F(BraveOffscreenCanvasFarblingBrowserTest, "a.com", "/offscreen-getimagedata-farbling.html"); AllowFingerprinting(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); // wait for worker thread to complete while (ExecScriptGetStr(kTitleScript, contents()) == "") { } @@ -148,14 +143,14 @@ IN_PROC_BROWSER_TEST_F(BraveOffscreenCanvasFarblingBrowserTest, kExpectedImageDataHashFarblingOff); BlockFingerprinting(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), kExpectedImageDataHashFarblingMaximum); SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), @@ -165,7 +160,7 @@ IN_PROC_BROWSER_TEST_F(BraveOffscreenCanvasFarblingBrowserTest, // properly respects shields setting separately from fingerprinting // setting. brave_shields::SetBraveShieldsEnabled(content_settings(), false, url); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); while (ExecScriptGetStr(kTitleScript, contents()) == "") { } EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), diff --git a/browser/farbling/brave_screen_farbling_browsertest.cc b/browser/farbling/brave_screen_farbling_browsertest.cc index f4db29afb01a..851b8b6d40c2 100644 --- a/browser/farbling/brave_screen_farbling_browsertest.cc +++ b/browser/farbling/brave_screen_farbling_browsertest.cc @@ -64,8 +64,9 @@ class WidgetBoundsChangeWaiter final : public views::WidgetObserver { // Wait for changes to occur, or return immediately if they already have. void Wait() { - if (!BoundsChangeMeetsThreshold(widget_->GetWindowBoundsInScreen())) + if (!BoundsChangeMeetsThreshold(widget_->GetWindowBoundsInScreen())) { run_loop_.Run(); + } } private: @@ -138,11 +139,6 @@ class BraveScreenFarblingBrowserTest : public InProcessBrowserTest { content::RenderFrameHost* IFrame() const { return ChildFrameAt(Parent(), 0); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(Contents()); - } - Browser* OpenPopup(const std::string& script, bool from_iframe) const { content::ExecuteScriptAsync(from_iframe ? Parent() : IFrame(), script); Browser* popup = ui_test_utils::WaitForBrowserToOpen(); @@ -165,7 +161,7 @@ class BraveScreenFarblingBrowserTest : public InProcessBrowserTest { SetBounds(kTestWindowBounds[j]); for (bool allow_fingerprinting : {false, true}) { SetFingerprintingSetting(allow_fingerprinting); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); for (bool test_iframe : {false, true}) { if (!content_scheme) { continue; @@ -223,7 +219,7 @@ class BraveScreenFarblingBrowserTest : public InProcessBrowserTest { SetFingerprintingSetting(allow_fingerprinting); for (int i = 0; i < static_cast(std::size(kTestWindowBounds)); ++i) { SetBounds(kTestWindowBounds[i]); - NavigateToURLUntilLoadStop(parent_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), parent_url())); for (bool test_iframe : {false, true}) { content::RenderFrameHost* host = test_iframe ? Parent() : IFrame(); if (!allow_fingerprinting && !IsFlagDisabled()) { @@ -255,7 +251,7 @@ class BraveScreenFarblingBrowserTest : public InProcessBrowserTest { SetBounds(kTestWindowBounds[j]); for (bool allow_fingerprinting : {false, true}) { SetFingerprintingSetting(allow_fingerprinting); - NavigateToURLUntilLoadStop(parent_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), parent_url())); for (bool test_iframe : {false, true}) { content::RenderFrameHost* host = test_iframe ? Parent() : IFrame(); EXPECT_EQ( @@ -277,7 +273,7 @@ class BraveScreenFarblingBrowserTest : public InProcessBrowserTest { parent_bounds = SetBounds(kTestWindowBounds[j]); for (bool allow_fingerprinting : {false, true}) { SetFingerprintingSetting(allow_fingerprinting); - NavigateToURLUntilLoadStop(parent_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), parent_url())); for (bool test_iframe : {false, true}) { const char* script = "open('/simple.html', '', `" diff --git a/browser/farbling/brave_speech_synthesis_farbling_browsertest.cc b/browser/farbling/brave_speech_synthesis_farbling_browsertest.cc index 96557781fce2..f4b289f8a0da 100644 --- a/browser/farbling/brave_speech_synthesis_farbling_browsertest.cc +++ b/browser/farbling/brave_speech_synthesis_farbling_browsertest.cc @@ -83,11 +83,6 @@ class BraveSpeechSynthesisFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(web_contents()); - } - private: std::unique_ptr content_client_; std::unique_ptr browser_content_client_; @@ -104,17 +99,18 @@ IN_PROC_BROWSER_TEST_F(BraveSpeechSynthesisFarblingBrowserTest, FarbleVoices) { // Farbling level: off // The voices list should be the real voices list. AllowFingerprinting(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); std::string off_voices_b = EvalJs(web_contents(), kTitleScript).ExtractString(); ASSERT_NE("failed", off_voices_b); // On platforms without any voices, the rest of this test is invalid. - if (off_voices_b == "") + if (off_voices_b == "") { return; + } AllowFingerprinting(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); std::string off_voices_z = EvalJs(web_contents(), kTitleScript).ExtractString(); ASSERT_NE("failed", off_voices_z); @@ -124,11 +120,11 @@ IN_PROC_BROWSER_TEST_F(BraveSpeechSynthesisFarblingBrowserTest, FarbleVoices) { // Farbling level: default // The voices list is farbled per domain. SetFingerprintingDefault(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); std::string default_voices_b = EvalJs(web_contents(), kTitleScript).ExtractString(); SetFingerprintingDefault(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); std::string default_voices_z = EvalJs(web_contents(), kTitleScript).ExtractString(); // The farbled voices list should be different from the unfarbled voices @@ -142,11 +138,11 @@ IN_PROC_BROWSER_TEST_F(BraveSpeechSynthesisFarblingBrowserTest, FarbleVoices) { // Farbling level: maximum // The voices list is empty. BlockFingerprinting(domain_b); - NavigateToURLUntilLoadStop(url_b); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_b)); auto max_voices_b = EvalJs(web_contents(), kTitleScript); EXPECT_EQ("", max_voices_b); BlockFingerprinting(domain_z); - NavigateToURLUntilLoadStop(url_z); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url_z)); auto max_voices_z = EvalJs(web_contents(), kTitleScript); EXPECT_EQ("", max_voices_z); } diff --git a/browser/farbling/brave_webaudio_farbling_browsertest.cc b/browser/farbling/brave_webaudio_farbling_browsertest.cc index b560d13516c8..5334c8ea9b48 100644 --- a/browser/farbling/brave_webaudio_farbling_browsertest.cc +++ b/browser/farbling/brave_webaudio_farbling_browsertest.cc @@ -97,11 +97,6 @@ class BraveWebAudioFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - private: GURL top_level_page_url_; GURL copy_from_channel_url_; @@ -115,7 +110,7 @@ class BraveWebAudioFarblingBrowserTest : public InProcessBrowserTest { // No crash indicates a successful test. IN_PROC_BROWSER_TEST_F(BraveWebAudioFarblingBrowserTest, CopyFromChannelNoCrash) { - NavigateToURLUntilLoadStop(copy_from_channel_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), copy_from_channel_url())); } // Tests results of farbling known values @@ -123,22 +118,22 @@ IN_PROC_BROWSER_TEST_F(BraveWebAudioFarblingBrowserTest, FarbleWebAudio) { // Farbling level: maximum // web audio: pseudo-random data with no relation to underlying audio channel BlockFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "405"); // second time, same as the first (tests that the PRNG properly resets itself // at the beginning of each calculation) - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "405"); // Farbling level: balanced (default) // web audio: farbled audio data SetFingerprintingDefault(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "7968"); // Farbling level: off // web audio: original audio data AllowFingerprinting(); - NavigateToURLUntilLoadStop(farbling_url()); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), farbling_url())); EXPECT_EQ(ExecScriptGetStr(kTitleScript, contents()), "8000"); } diff --git a/browser/farbling/brave_webgl_farbling_browsertest.cc b/browser/farbling/brave_webgl_farbling_browsertest.cc index e4961d61e624..fd01240ed647 100644 --- a/browser/farbling/brave_webgl_farbling_browsertest.cc +++ b/browser/farbling/brave_webgl_farbling_browsertest.cc @@ -85,11 +85,6 @@ class BraveWebGLFarblingBrowserTest : public InProcessBrowserTest { return browser()->tab_strip_model()->GetActiveWebContents(); } - bool NavigateToURLUntilLoadStop(const GURL& url) { - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - return WaitForLoadStop(contents()); - } - std::vector SplitStringAsInts(std::string raw_values) { std::vector results; for (const auto& cur : base::SplitStringPiece( @@ -119,31 +114,31 @@ class BraveWebGLFarblingBrowserTest : public InProcessBrowserTest { IN_PROC_BROWSER_TEST_F(BraveWebGLFarblingBrowserTest, FarbleGetParameterWebGL) { std::string domain = "a.com"; GURL url = embedded_test_server()->GetURL(domain, "/getParameter.html"); - const std::string kExpectedRandomString = "UKlSpUqV,TJEix48e"; + const std::string kExpectedRandomString = "USRQv2Ep,t9e2jwYU"; // Farbling level: maximum // WebGL getParameter of restricted values: pseudo-random data with no // relation to original data BlockFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), kExpectedRandomString); // second time, same as the first (tests that results are consistent for the // lifetime of a session, and that the PRNG properly resets itself at the // beginning of each calculation) - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), kExpectedRandomString); // Farbling level: balanced (default) // WebGL getParameter of restricted values: original data SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::string actual = EvalJs(contents(), kTitleScript).ExtractString(); // Farbling level: off // WebGL getParameter of restricted values: original data AllowFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); // Since this value depends on the underlying hardware, we just test that the // results for "off" are the same as the results for "balanced", and that // they're different than the results for "maximum". @@ -165,7 +160,7 @@ IN_PROC_BROWSER_TEST_F(BraveWebGLFarblingBrowserTest, // Farbling level: off // Get the actual WebGL2 parameter values. AllowFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::vector real_values = SplitStringAsInts(EvalJs(contents(), kTitleScript).ExtractString()); ASSERT_EQ(real_values.size(), 12UL); @@ -174,7 +169,7 @@ IN_PROC_BROWSER_TEST_F(BraveWebGLFarblingBrowserTest, // WebGL2 parameter values will be farbled based on session+domain keys, // so we get the farbled values and look at the differences. SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::vector farbled_values = SplitStringAsInts(EvalJs(contents(), kTitleScript).ExtractString()); ASSERT_EQ(farbled_values.size(), 12UL); @@ -190,21 +185,21 @@ IN_PROC_BROWSER_TEST_F(BraveWebGLFarblingBrowserTest, GetSupportedExtensions) { // Farbling level: maximum // WebGL getSupportedExtensions returns abbreviated list BlockFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), kSupportedExtensionsMax); // Farbling level: off // WebGL getSupportedExtensions is real AllowFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::string actual = EvalJs(contents(), kTitleScript).ExtractString(); EXPECT_NE(actual, kSupportedExtensionsMax); // Farbling level: balanced (default) // WebGL getSupportedExtensions is real SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), actual); } @@ -215,20 +210,20 @@ IN_PROC_BROWSER_TEST_F(BraveWebGLFarblingBrowserTest, GetExtension) { // Farbling level: maximum // WebGL getExtension returns null for most names BlockFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), kExpectedExtensionListMax); // Farbling level: off // WebGL getExtension returns real objects AllowFingerprinting(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); std::string actual = EvalJs(contents(), kTitleScript).ExtractString(); EXPECT_NE(actual, kExpectedExtensionListMax); // Farbling level: balanced (default) // WebGL getExtension returns real objects SetFingerprintingDefault(domain); - NavigateToURLUntilLoadStop(url); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); EXPECT_EQ(EvalJs(contents(), kTitleScript).ExtractString(), actual); } diff --git a/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.cc b/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.cc new file mode 100644 index 000000000000..ae5fb1183ee1 --- /dev/null +++ b/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.cc @@ -0,0 +1,30 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "third_party/blink/renderer/modules/webusb/usb_device.h" + +#include "brave/third_party/blink/renderer/brave_farbling_constants.h" +#include "brave/third_party/blink/renderer/core/farbling/brave_session_cache.h" + +#include "src/third_party/blink/renderer/modules/webusb/usb_device.cc" + +namespace blink { + +String USBDevice::serialNumber() const { + String realSerialNumber = serialNumber_ChromiumImpl(); + if (realSerialNumber.length() > 0) { + if (ExecutionContext* context = GetExecutionContext()) { + if (brave::GetBraveFarblingLevelFor(context, + BraveFarblingLevel::BALANCED) != + BraveFarblingLevel::OFF) { + return brave::BraveSessionCache::From(*context).GenerateRandomString( + "WEBUSB_SERIAL_NUMBER", 16); + } + } + } + return realSerialNumber; +} + +} // namespace blink diff --git a/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.h b/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.h new file mode 100644 index 000000000000..d98c0eaee2a8 --- /dev/null +++ b/chromium_src/third_party/blink/renderer/modules/webusb/usb_device.h @@ -0,0 +1,17 @@ +/* Copyright (c) 2023 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_DEVICE_H_ +#define BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_DEVICE_H_ + +#define serialNumber \ + serialNumber() const; \ + String serialNumber_ChromiumImpl + +#include "src/third_party/blink/renderer/modules/webusb/usb_device.h" // IWYU pragma: export + +#undef serialNumber + +#endif // BRAVE_CHROMIUM_SRC_THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_DEVICE_H_ diff --git a/third_party/blink/renderer/core/farbling/brave_session_cache.cc b/third_party/blink/renderer/core/farbling/brave_session_cache.cc index a42e24bbe1a2..904b336ec230 100644 --- a/third_party/blink/renderer/core/farbling/brave_session_cache.cc +++ b/third_party/blink/renderer/core/farbling/brave_session_cache.cc @@ -56,9 +56,9 @@ const int kFarbledUserAgentMaxExtraSpaces = 5; // acceptable letters for generating random strings const char kLettersForRandomStrings[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789. "; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // length of kLettersForRandomStrings array -const size_t kLettersForRandomStringsLength = 64; +const size_t kLettersForRandomStringsLength = 62; blink::WebContentSettingsClient* GetContentSettingsClientFor( ExecutionContext* context) {