Skip to content

Commit 8fc247b

Browse files
webcompat exceptions user interface (#24554)
1 parent 0b150c8 commit 8fc247b

File tree

52 files changed

+628
-241
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+628
-241
lines changed

browser/about_flags.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#include "brave/components/request_otr/common/buildflags/buildflags.h"
3838
#include "brave/components/skus/common/features.h"
3939
#include "brave/components/speedreader/common/buildflags/buildflags.h"
40-
#include "brave/components/webcompat/features.h"
40+
#include "brave/components/webcompat/core/common/features.h"
4141
#include "build/build_config.h"
4242
#include "chrome/browser/ui/ui_features.h"
4343
#include "components/content_settings/core/common/features.h"

browser/brave_browser_process_impl.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
#include "brave/components/p3a/histograms_braveizer.h"
4444
#include "brave/components/p3a/p3a_config.h"
4545
#include "brave/components/p3a/p3a_service.h"
46-
#include "brave/components/webcompat/features.h"
47-
#include "brave/components/webcompat/webcompat_exceptions_service.h"
46+
#include "brave/components/webcompat/content/browser/webcompat_exceptions_service.h"
47+
#include "brave/components/webcompat/core/common/features.h"
4848
#include "brave/services/network/public/cpp/system_request_handler.h"
4949
#include "build/build_config.h"
5050
#include "chrome/browser/component_updater/component_updater_utils.h"

browser/brave_shields/brave_shields_tab_helper.cc

+42
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ std::vector<GURL> BraveShieldsTabHelper::GetFingerprintsList() {
159159
return fingerprints_list;
160160
}
161161

162+
const base::flat_set<ContentSettingsType>&
163+
BraveShieldsTabHelper::GetInvokedWebcompatFeatures() {
164+
return webcompat_features_invoked_;
165+
}
166+
162167
bool BraveShieldsTabHelper::GetBraveShieldsEnabled() {
163168
return brave_shields::GetBraveShieldsEnabled(
164169
GetHostContentSettingsMap(web_contents()), GetCurrentSiteURL());
@@ -475,6 +480,43 @@ void BraveShieldsTabHelper::HandleItemAllowedOnce(
475480
}
476481
}
477482

483+
void BraveShieldsTabHelper::HandleWebcompatFeatureInvoked(
484+
ContentSettingsType webcompat_content_settings) {
485+
if (webcompat_content_settings > ContentSettingsType::BRAVE_WEBCOMPAT_NONE &&
486+
webcompat_content_settings < ContentSettingsType::BRAVE_WEBCOMPAT_ALL) {
487+
webcompat_features_invoked_.insert(webcompat_content_settings);
488+
}
489+
490+
for (Observer& obs : observer_list_) {
491+
obs.OnResourcesChanged();
492+
}
493+
}
494+
495+
void BraveShieldsTabHelper::SetWebcompatEnabled(
496+
ContentSettingsType webcompat_settings_type,
497+
bool enabled) {
498+
brave_shields::SetWebcompatEnabled(
499+
GetHostContentSettingsMap(web_contents()), webcompat_settings_type,
500+
enabled, GetCurrentSiteURL(), g_browser_process->local_state());
501+
ReloadWebContents();
502+
}
503+
504+
base::flat_map<ContentSettingsType, bool>
505+
BraveShieldsTabHelper::GetWebcompatSettings() {
506+
auto* map = GetHostContentSettingsMap(web_contents());
507+
const GURL& current_site_url = GetCurrentSiteURL();
508+
base::flat_map<ContentSettingsType, bool> result;
509+
for (auto webcompat_settings_type = ContentSettingsType::BRAVE_WEBCOMPAT_NONE;
510+
webcompat_settings_type != ContentSettingsType::BRAVE_WEBCOMPAT_ALL;
511+
webcompat_settings_type = static_cast<ContentSettingsType>(
512+
static_cast<int32_t>(webcompat_settings_type) + 1)) {
513+
const bool enabled = brave_shields::IsWebcompatEnabled(
514+
map, webcompat_settings_type, current_site_url);
515+
result[webcompat_settings_type] = enabled;
516+
}
517+
return result;
518+
}
519+
478520
WEB_CONTENTS_USER_DATA_KEY_IMPL(BraveShieldsTabHelper);
479521

480522
} // namespace brave_shields

browser/brave_shields/brave_shields_tab_helper.h

+8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <string>
1111
#include <vector>
1212

13+
#include "base/containers/flat_set.h"
1314
#include "base/observer_list.h"
1415
#include "base/observer_list_types.h"
1516
#include "base/scoped_observation.h"
@@ -51,6 +52,8 @@ class BraveShieldsTabHelper
5152
const std::string& subresource);
5253
void HandleItemAllowedOnce(const std::string& allowed_once_type,
5354
const std::string& subresource);
55+
void HandleWebcompatFeatureInvoked(
56+
ContentSettingsType webcompat_content_settings);
5457
void ClearAllResourcesList();
5558
int GetTotalBlockedCount();
5659
std::vector<GURL> GetBlockedAdsList();
@@ -62,6 +65,7 @@ class BraveShieldsTabHelper
6265
void SetBraveShieldsEnabled(bool is_enabled);
6366
GURL GetCurrentSiteURL();
6467
GURL GetFaviconURL(bool refresh);
68+
const base::flat_set<ContentSettingsType>& GetInvokedWebcompatFeatures();
6569

6670
AdBlockMode GetAdBlockMode();
6771
FingerprintMode GetFingerprintMode();
@@ -79,6 +83,9 @@ class BraveShieldsTabHelper
7983
void SetForgetFirstPartyStorageEnabled(bool is_enabled);
8084
void AllowScriptsOnce(const std::vector<std::string>& origins);
8185
void BlockAllowedScripts(const std::vector<std::string>& origins);
86+
void SetWebcompatEnabled(ContentSettingsType webcompat_settings_type,
87+
bool enabled);
88+
base::flat_map<ContentSettingsType, bool> GetWebcompatSettings();
8289

8390
void AddObserver(Observer* obs);
8491
void RemoveObserver(Observer* obs);
@@ -115,6 +122,7 @@ class BraveShieldsTabHelper
115122
std::set<GURL> resource_list_blocked_js_;
116123
std::set<GURL> resource_list_allowed_once_js_;
117124
std::set<GURL> resource_list_blocked_fingerprints_;
125+
base::flat_set<ContentSettingsType> webcompat_features_invoked_;
118126
base::ScopedObservation<HostContentSettingsMap, content_settings::Observer>
119127
observation_{this};
120128

browser/brave_shields/brave_shields_web_contents_observer.cc

+30
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,23 @@ void BraveShieldsWebContentsObserver::DispatchAllowedOnceEventForWebContents(
194194
}
195195
shields_data_ctrlr->HandleItemAllowedOnce(block_type, subresource);
196196
}
197+
// static
198+
void BraveShieldsWebContentsObserver::
199+
DispatchWebcompatFeatureInvokedForWebContents(
200+
ContentSettingsType webcompat_content_settings,
201+
WebContents* web_contents) {
202+
if (!web_contents) {
203+
return;
204+
}
205+
auto* shields_data_ctrlr =
206+
brave_shields::BraveShieldsTabHelper::FromWebContents(web_contents);
207+
// |shields_data_ctrlr| can be null if the |web_contents| is generated in
208+
// component layer - We don't attach any tab helpers in this case.
209+
if (!shields_data_ctrlr) {
210+
return;
211+
}
212+
shields_data_ctrlr->HandleWebcompatFeatureInvoked(webcompat_content_settings);
213+
}
197214
#endif
198215

199216
void BraveShieldsWebContentsObserver::OnJavaScriptAllowedOnce(
@@ -209,6 +226,19 @@ void BraveShieldsWebContentsObserver::OnJavaScriptAllowedOnce(
209226
#endif
210227
}
211228

229+
void BraveShieldsWebContentsObserver::OnWebcompatFeatureInvoked(
230+
ContentSettingsType webcompat_settings_type) {
231+
#if !BUILDFLAG(IS_ANDROID)
232+
WebContents* web_contents =
233+
WebContents::FromRenderFrameHost(receivers_.GetCurrentTargetFrame());
234+
if (!web_contents) {
235+
return;
236+
}
237+
DispatchWebcompatFeatureInvokedForWebContents(webcompat_settings_type,
238+
web_contents);
239+
#endif
240+
}
241+
212242
void BraveShieldsWebContentsObserver::OnJavaScriptBlocked(
213243
const std::u16string& details) {
214244
WebContents* web_contents =

browser/brave_shields/brave_shields_web_contents_observer.h

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "base/containers/flat_map.h"
1515
#include "base/synchronization/lock.h"
1616
#include "brave/components/brave_shields/core/common/brave_shields.mojom.h"
17+
#include "components/content_settings/core/common/content_settings_types.h"
1718
#include "content/public/browser/render_frame_host_receiver_set.h"
1819
#include "content/public/browser/web_contents_observer.h"
1920
#include "content/public/browser/web_contents_user_data.h"
@@ -52,6 +53,9 @@ class BraveShieldsWebContentsObserver
5253
const std::string& block_type,
5354
const std::string& subresource,
5455
content::WebContents* web_contents);
56+
static void DispatchWebcompatFeatureInvokedForWebContents(
57+
ContentSettingsType webcompat_content_settings,
58+
content::WebContents* web_contents);
5559
static void DispatchBlockedEvent(const GURL& request_url,
5660
int frame_tree_node_id,
5761
const std::string& block_type);
@@ -73,6 +77,8 @@ class BraveShieldsWebContentsObserver
7377
// brave_shields::mojom::BraveShieldsHost.
7478
void OnJavaScriptBlocked(const std::u16string& details) override;
7579
void OnJavaScriptAllowedOnce(const std::u16string& details) override;
80+
void OnWebcompatFeatureInvoked(
81+
ContentSettingsType webcompat_settings_type) override;
7682

7783
private:
7884
friend class content::WebContentsUserData<BraveShieldsWebContentsObserver>;

browser/brave_shields/eventsource_pool_limit_browsertest.cc

+11-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "base/path_service.h"
1010
#include "brave/components/brave_shields/content/browser/brave_shields_util.h"
1111
#include "brave/components/constants/brave_paths.h"
12+
#include "brave/components/webcompat/core/common/features.h"
1213
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
1314
#include "chrome/browser/profiles/profile.h"
1415
#include "chrome/browser/ui/browser.h"
@@ -93,7 +94,10 @@ constexpr char kEventSourceCloseInSwScript[] = R"(
9394

9495
class EventSourcePoolLimitBrowserTest : public InProcessBrowserTest {
9596
public:
96-
EventSourcePoolLimitBrowserTest() = default;
97+
EventSourcePoolLimitBrowserTest() {
98+
scoped_feature_list_.InitAndEnableFeature(
99+
webcompat::features::kBraveWebcompatExceptionsService);
100+
}
97101

98102
void SetUpOnMainThread() override {
99103
InProcessBrowserTest::SetUpOnMainThread();
@@ -204,6 +208,9 @@ class EventSourcePoolLimitBrowserTest : public InProcessBrowserTest {
204208
content::ContentMockCertVerifier mock_cert_verifier_;
205209
EmbeddedTestServer https_server_{EmbeddedTestServer::TYPE_HTTPS};
206210
GURL es_url_;
211+
212+
private:
213+
base::test::ScopedFeatureList scoped_feature_list_;
207214
};
208215

209216
IN_PROC_BROWSER_TEST_F(EventSourcePoolLimitBrowserTest,
@@ -356,11 +363,10 @@ IN_PROC_BROWSER_TEST_F(EventSourcePoolLimitBrowserTest,
356363
brave_shields::SetBraveShieldsEnabled(content_settings(), true, url);
357364

358365
// Enable webcompat exception.
359-
brave_shields::SetWebcompatFeatureSetting(
366+
brave_shields::SetWebcompatEnabled(
360367
content_settings(),
361-
ContentSettingsType::BRAVE_WEBCOMPAT_EVENT_SOURCE_POOL,
362-
brave_shields::ControlType::ALLOW, https_server_.GetURL("a.com", "/"),
363-
nullptr);
368+
ContentSettingsType::BRAVE_WEBCOMPAT_EVENT_SOURCE_POOL, true,
369+
https_server_.GetURL("a.com", "/"), nullptr);
364370

365371
auto* a_com_rfh = ui_test_utils::NavigateToURLWithDisposition(
366372
browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,

browser/brave_shields/websockets_pool_limit_browsertest.cc

+10-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "base/path_service.h"
99
#include "brave/components/brave_shields/content/browser/brave_shields_util.h"
1010
#include "brave/components/constants/brave_paths.h"
11+
#include "brave/components/webcompat/core/common/features.h"
1112
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
1213
#include "chrome/browser/profiles/profile.h"
1314
#include "chrome/browser/ui/browser.h"
@@ -91,7 +92,10 @@ constexpr char kWsCloseInSwScript[] = R"(
9192

9293
class WebSocketsPoolLimitBrowserTest : public InProcessBrowserTest {
9394
public:
94-
WebSocketsPoolLimitBrowserTest() = default;
95+
WebSocketsPoolLimitBrowserTest() {
96+
scoped_feature_list_.InitAndEnableFeature(
97+
webcompat::features::kBraveWebcompatExceptionsService);
98+
}
9599

96100
void SetUpOnMainThread() override {
97101
InProcessBrowserTest::SetUpOnMainThread();
@@ -192,8 +196,10 @@ class WebSocketsPoolLimitBrowserTest : public InProcessBrowserTest {
192196
net::test_server::EmbeddedTestServer https_server_{
193197
net::test_server::EmbeddedTestServer::TYPE_HTTPS};
194198
std::unique_ptr<net::SpawnedTestServer> ws_server_;
195-
196199
GURL ws_url_;
200+
201+
private:
202+
base::test::ScopedFeatureList scoped_feature_list_;
197203
};
198204

199205
IN_PROC_BROWSER_TEST_F(WebSocketsPoolLimitBrowserTest, PoolIsLimitedByDefault) {
@@ -328,10 +334,9 @@ IN_PROC_BROWSER_TEST_F(WebSocketsPoolLimitBrowserTest,
328334
// Enable shields.
329335
brave_shields::SetBraveShieldsEnabled(content_settings(), true, url);
330336
// Enable webcompat exception.
331-
brave_shields::SetWebcompatFeatureSetting(
337+
brave_shields::SetWebcompatEnabled(
332338
content_settings(), ContentSettingsType::BRAVE_WEBCOMPAT_WEB_SOCKETS_POOL,
333-
brave_shields::ControlType::ALLOW, https_server_.GetURL("a.com", "/"),
334-
nullptr);
339+
true, https_server_.GetURL("a.com", "/"), nullptr);
335340

336341
auto* a_com_rfh = ui_test_utils::NavigateToURLWithDisposition(
337342
browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,

browser/farbling/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ if (!is_android) {
3535
"//brave/components/brave_shields/content/browser",
3636
"//brave/components/brave_shields/core/common",
3737
"//brave/components/constants",
38+
"//brave/components/webcompat/core/common",
3839
"//brave/third_party/blink/renderer",
3940
"//chrome/browser",
4041
"//chrome/browser/ui",

browser/farbling/brave_enumeratedevices_farbling_browsertest.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ class BraveEnumerateDevicesFarblingBrowserTest : public InProcessBrowserTest {
9494
}
9595

9696
void EnableWebcompatException() {
97-
brave_shields::SetWebcompatFeatureSetting(
97+
brave_shields::SetWebcompatEnabled(
9898
content_settings(),
99-
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY,
100-
ControlType::ALLOW, top_level_page_url_, nullptr);
99+
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY, true,
100+
top_level_page_url_, nullptr);
101101
}
102102

103103
private:

browser/farbling/brave_navigator_devicememory_farbling_browsertest.cc

+12-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "brave/components/brave_shields/content/browser/brave_shields_util.h"
1414
#include "brave/components/constants/brave_paths.h"
1515
#include "brave/components/constants/pref_names.h"
16+
#include "brave/components/webcompat/core/common/features.h"
1617
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
1718
#include "chrome/browser/extensions/extension_browsertest.h"
1819
#include "chrome/browser/profiles/profile.h"
@@ -35,7 +36,10 @@ const char kDeviceMemoryScript[] = "navigator.deviceMemory * 1024";
3536
class BraveDeviceMemoryFarblingBrowserTest : public InProcessBrowserTest {
3637
public:
3738
BraveDeviceMemoryFarblingBrowserTest()
38-
: https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
39+
: https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
40+
scoped_feature_list_.InitAndEnableFeature(
41+
webcompat::features::kBraveWebcompatExceptionsService);
42+
}
3943

4044
BraveDeviceMemoryFarblingBrowserTest(
4145
const BraveDeviceMemoryFarblingBrowserTest&) = delete;
@@ -83,6 +87,9 @@ class BraveDeviceMemoryFarblingBrowserTest : public InProcessBrowserTest {
8387
content::WebContents* contents() {
8488
return browser()->tab_strip_model()->GetActiveWebContents();
8589
}
90+
91+
private:
92+
base::test::ScopedFeatureList scoped_feature_list_;
8693
};
8794

8895
// Tests results of farbling known values
@@ -123,15 +130,15 @@ IN_PROC_BROWSER_TEST_F(BraveDeviceMemoryFarblingBrowserTest,
123130

124131
// Farbling level: default, but webcompat exception enabled
125132
SetFingerprintingDefault(domain1);
126-
brave_shields::SetWebcompatFeatureSetting(
133+
brave_shields::SetWebcompatEnabled(
127134
content_settings(), ContentSettingsType::BRAVE_WEBCOMPAT_DEVICE_MEMORY,
128-
ControlType::ALLOW, url1, nullptr);
135+
true, url1, nullptr);
129136
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1));
130137
EXPECT_EQ(true_value, EvalJs(contents(), kDeviceMemoryScript));
131138
SetFingerprintingDefault(domain2);
132-
brave_shields::SetWebcompatFeatureSetting(
139+
brave_shields::SetWebcompatEnabled(
133140
content_settings(), ContentSettingsType::BRAVE_WEBCOMPAT_DEVICE_MEMORY,
134-
ControlType::ALLOW, url2, nullptr);
141+
true, url2, nullptr);
135142
ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url2));
136143
EXPECT_EQ(true_value, EvalJs(contents(), kDeviceMemoryScript));
137144
}

browser/farbling/brave_navigator_hardwareconcurrency_farbling_browsertest.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ class BraveNavigatorHardwareConcurrencyFarblingBrowserTest
7373
}
7474

7575
void EnableWebcompatException() {
76-
brave_shields::SetWebcompatFeatureSetting(
76+
brave_shields::SetWebcompatEnabled(
7777
content_settings(),
78-
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY,
79-
ControlType::ALLOW, top_level_page_url_, nullptr);
78+
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY, true,
79+
top_level_page_url_, nullptr);
8080
}
8181

8282
content::WebContents* contents() {

browser/farbling/brave_navigator_keyboard_api_browsertest.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ class BraveNavigatorKeyboardAPIBrowserTest : public InProcessBrowserTest {
8181
}
8282

8383
void EnableWebcompatException() {
84-
brave_shields::SetWebcompatFeatureSetting(
84+
brave_shields::SetWebcompatEnabled(
8585
content_settings(),
86-
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY,
87-
ControlType::ALLOW, top_level_page_url_, nullptr);
86+
ContentSettingsType::BRAVE_WEBCOMPAT_HARDWARE_CONCURRENCY, true,
87+
top_level_page_url_, nullptr);
8888
}
8989

9090
private:

0 commit comments

Comments
 (0)