Web extension content setting changes affecting Shields (Block scripts) (#31484)

Added an abilityt o detect Java Script blocking is enforced by permission or extension etc
Fixed script blocking issue when Java Script blocking is enforced

Resolves: https://github.com/brave/brave-browser/issues/45019

---------

Signed-off-by: Vadym Struts <vstruts@brave.com>
This commit is contained in:
vadims
2025-10-29 16:23:04 +01:00
committed by GitHub
parent e8deaf99af
commit 5419ed9807
27 changed files with 385 additions and 19 deletions
+17 -1
View File
@@ -27,6 +27,7 @@
#include "brave/browser/brave_search/backup_results_navigation_throttle.h"
#include "brave/browser/brave_search/backup_results_service_factory.h"
#include "brave/browser/brave_shields/brave_farbling_service_factory.h"
#include "brave/browser/brave_shields/brave_shields_settings_service_factory.h"
#include "brave/browser/brave_shields/brave_shields_web_contents_observer.h"
#include "brave/browser/brave_wallet/brave_wallet_context_utils.h"
#include "brave/browser/brave_wallet/brave_wallet_provider_delegate_impl.h"
@@ -79,8 +80,10 @@
#include "brave/components/brave_shields/content/browser/brave_farbling_service.h"
#include "brave/components/brave_shields/content/browser/brave_shields_util.h"
#include "brave/components/brave_shields/content/browser/domain_block_navigation_throttle.h"
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
#include "brave/components/brave_shields/core/common/brave_shield_constants.h"
#include "brave/components/brave_shields/core/common/features.h"
#include "brave/components/brave_shields/core/common/shields_settings.mojom.h"
#include "brave/components/brave_vpn/common/buildflags/buildflags.h"
#include "brave/components/brave_wallet/browser/brave_wallet_p3a_private.h"
#include "brave/components/brave_wallet/browser/brave_wallet_service.h"
@@ -484,6 +487,18 @@ void MaybeBindColorChangeHandler(
}
#endif
bool IsJsBlockingEnforced(content::BrowserContext* browser_context,
const GURL& url) {
Profile* profile = Profile::FromBrowserContext(browser_context);
auto* settings_service =
BraveShieldsSettingsServiceFactory::GetForProfile(profile);
if (!settings_service) {
return false;
}
return settings_service->IsJsBlockingEnforced(url);
}
} // namespace
BraveContentBrowserClient::BraveContentBrowserClient() = default;
@@ -763,7 +778,8 @@ BraveContentBrowserClient::WorkerGetBraveShieldSettings(
return brave_shields::mojom::ShieldsSettings::New(
farbling_level, farbling_token, std::vector<std::string>(),
brave_shields::IsReduceLanguageEnabledForProfile(pref_service));
brave_shields::IsReduceLanguageEnabledForProfile(pref_service),
IsJsBlockingEnforced(browser_context, url));
}
content::ContentBrowserClient::AllowWebBluetoothResult
@@ -384,6 +384,12 @@ bool BraveShieldsTabHelper::GetNoScriptEnabled() {
return brave_shields_settings_->IsNoScriptEnabled(GetCurrentSiteURL());
}
mojom::ContentSettingsOverriddenDataPtr
BraveShieldsTabHelper::GetJsContentSettingsOverriddenData() {
return brave_shields_settings_->GetJsContentSettingOverriddenData(
GetCurrentSiteURL());
}
bool BraveShieldsTabHelper::GetForgetFirstPartyStorageEnabled() {
return brave_shields::GetForgetFirstPartyStorageEnabled(
&*host_content_settings_map_, GetCurrentSiteURL());
@@ -85,6 +85,7 @@ class BraveShieldsTabHelper
bool IsForgetFirstPartyStorageFeatureEnabled() const;
HttpsUpgradeMode GetHttpsUpgradeMode();
bool GetNoScriptEnabled();
mojom::ContentSettingsOverriddenDataPtr GetJsContentSettingsOverriddenData();
bool GetForgetFirstPartyStorageEnabled();
void SetAdBlockMode(AdBlockMode mode);
void SetFingerprintMode(FingerprintMode mode);
@@ -13,7 +13,9 @@
#include "base/check.h"
#include "base/feature_list.h"
#include "base/strings/utf_string_conversions.h"
#include "brave/browser/brave_shields/brave_shields_settings_service_factory.h"
#include "brave/components/brave_perf_predictor/browser/perf_predictor_tab_helper.h"
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
#include "brave/components/brave_shields/core/common/brave_shield_constants.h"
#include "brave/components/brave_shields/core/common/pref_names.h"
@@ -23,6 +25,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/renderer_configuration.mojom.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/user_prefs/user_prefs.h"
@@ -49,6 +52,18 @@ namespace {
BraveShieldsWebContentsObserver* g_receiver_impl_for_testing = nullptr;
bool IsJsBlockingEnforced(content::BrowserContext* browser_context,
const GURL& url) {
Profile* profile = Profile::FromBrowserContext(browser_context);
auto* settings_service =
BraveShieldsSettingsServiceFactory::GetForProfile(profile);
if (!settings_service) {
return false;
}
return settings_service->IsJsBlockingEnforced(url);
}
} // namespace
BraveShieldsWebContentsObserver::~BraveShieldsWebContentsObserver() = default;
@@ -305,7 +320,6 @@ void BraveShieldsWebContentsObserver::SendShieldsSettings(
? brave_shields::GetFarblingToken(host_content_settings_map,
primary_url)
: base::Token();
PrefService* pref_service =
user_prefs::UserPrefs::Get(rfh->GetBrowserContext());
@@ -313,7 +327,8 @@ void BraveShieldsWebContentsObserver::SendShieldsSettings(
rfh->GetRemoteAssociatedInterfaces()->GetInterface(&agent);
agent->SetShieldsSettings(brave_shields::mojom::ShieldsSettings::New(
farbling_level, farbling_token, allowed_scripts_,
brave_shields::IsReduceLanguageEnabledForProfile(pref_service)));
brave_shields::IsReduceLanguageEnabledForProfile(pref_service),
IsJsBlockingEnforced(rfh->GetBrowserContext(), primary_url)));
}
void BraveShieldsWebContentsObserver::BindReceiver(
@@ -7,6 +7,7 @@
#include "base/memory/raw_ptr.h"
#include "base/path_service.h"
#include "base/values.h"
#include "brave/browser/brave_shields/brave_shields_tab_helper.h"
#include "brave/components/constants/brave_paths.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -18,6 +19,10 @@
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/policy/core/browser/browser_policy_connector.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
@@ -118,6 +123,60 @@ class BraveShieldsWebContentsObserverBrowserTest : public InProcessBrowserTest {
brave_shields_web_contents_observer_ = nullptr;
};
class BraveShieldsWebContentsObserverManagedPolicyBrowserTest
: public BraveShieldsWebContentsObserverBrowserTest {
public:
BraveShieldsWebContentsObserverManagedPolicyBrowserTest() = default;
void SetUpOnMainThread() override {
BraveShieldsWebContentsObserverBrowserTest::SetUpOnMainThread();
}
void SetUpInProcessBrowserTestFixture() override {
EXPECT_CALL(provider_, IsInitializationComplete(testing::_))
.WillRepeatedly(testing::Return(true));
policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
policy::PolicyMap policies;
// Set JavaScript blocked for URLs policy
policies.Set(policy::key::kJavaScriptAllowedForUrls,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_PLATFORM, base::Value(), nullptr);
auto blocked_list = base::Value::List().Append("http://a.com");
policies.Set(policy::key::kJavaScriptBlockedForUrls,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_PLATFORM,
base::Value(std::move(blocked_list)), nullptr);
provider_.UpdateChromePolicy(policies);
}
private:
policy::MockConfigurationPolicyProvider provider_;
};
IN_PROC_BROWSER_TEST_F(BraveShieldsWebContentsObserverManagedPolicyBrowserTest,
JavaScriptBlockedEvents) {
auto a_com_url = GURL("http://a.com");
auto b_com_url = GURL("http://b.com");
// Verify that the policy is applied correctly
ContentSetting a_com_javascript_setting =
content_settings()->GetContentSetting(a_com_url, a_com_url,
ContentSettingsType::JAVASCRIPT);
EXPECT_EQ(CONTENT_SETTING_BLOCK, a_com_javascript_setting);
ContentSetting b_com_javascript_setting =
content_settings()->GetContentSetting(b_com_url, b_com_url,
ContentSettingsType::JAVASCRIPT);
EXPECT_EQ(CONTENT_SETTING_ALLOW, b_com_javascript_setting);
// Navigate to the to the a.com URL which has JavaScript blocked by policy
EXPECT_TRUE(ui_test_utils::NavigateToURL(
browser(), embedded_test_server()->GetURL("a.com", "/load_js.html")));
EXPECT_TRUE(WaitForLoadStop(GetWebContents()));
EXPECT_EQ(brave_shields_web_contents_observer()->block_javascript_count(), 5);
EXPECT_EQ(GetBlockedJsList().size(), 3u);
}
IN_PROC_BROWSER_TEST_F(BraveShieldsWebContentsObserverBrowserTest,
JavaScriptBlockedEvents) {
const GURL& url = GURL("a.com");
@@ -85,6 +85,8 @@ void ShieldsPanelDataHandler::GetSiteSettings(
active_shields_data_controller_->GetForgetFirstPartyStorageEnabled();
settings.webcompat_settings =
active_shields_data_controller_->GetWebcompatSettings();
settings.scripts_blocked_override_status =
active_shields_data_controller_->GetJsContentSettingsOverriddenData();
std::move(callback).Run(settings.Clone());
}
@@ -3,6 +3,8 @@
* 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 "brave/browser/brave_shields/brave_shields_settings_service_factory.h"
#include "brave/components/brave_shields/core/browser/brave_shields_settings_service.h"
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
#include "brave/components/brave_shields/core/common/shields_settings.mojom-shared.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -12,6 +14,18 @@
namespace {
bool IsJsBlockingEnforced(content::BrowserContext* browser_context,
const GURL& url) {
Profile* profile = Profile::FromBrowserContext(browser_context);
auto* settings_service =
BraveShieldsSettingsServiceFactory::GetForProfile(profile);
if (!settings_service) {
return false;
}
return settings_service->IsJsBlockingEnforced(url);
}
brave_shields::mojom::ShieldsSettingsPtr GetBraveShieldsSettingsOnUI(
const content::GlobalRenderFrameHostToken& frame_token) {
content::RenderFrameHost* rfh =
@@ -37,12 +51,12 @@ brave_shields::mojom::ShieldsSettingsPtr GetBraveShieldsSettingsOnUI(
HostContentSettingsMapFactory::GetForProfile(browser_context),
top_frame_url)
: base::Token();
PrefService* pref_service = user_prefs::UserPrefs::Get(browser_context);
return brave_shields::mojom::ShieldsSettings::New(
farbling_level, farbling_token, std::vector<std::string>(),
brave_shields::IsReduceLanguageEnabledForProfile(pref_service));
brave_shields::IsReduceLanguageEnabledForProfile(pref_service),
IsJsBlockingEnforced(browser_context, top_frame_url));
}
} // namespace
@@ -89,7 +89,8 @@ WorkerContentSettingsClient_BraveImpl::GetBraveShieldsSettings(
HasContentSettingsRules());
base::debug::DumpWithoutCrashing();
return brave_shields::mojom::ShieldsSettings::New(
farbling_level, base::Token(), std::vector<std::string>(), false);
farbling_level, base::Token(), std::vector<std::string>(), false,
false);
}
}
@@ -77,6 +77,7 @@ source_set("unit_tests") {
"//base/test:test_support",
"//brave/components/brave_shields/core/common",
"//components/content_settings/core/browser",
"//components/content_settings/core/test:test_support",
"//components/prefs",
"//components/prefs:test_support",
"//components/sync_preferences:test_support",
@@ -200,4 +200,29 @@ mojom::AutoShredMode BraveShieldsSettingsService::GetAutoShredMode(
url, GURL(), AutoShredSetting::kContentSettingsType));
}
bool BraveShieldsSettingsService::IsJsBlockingEnforced(const GURL& url) {
const auto js_content_settings_overridden_data =
GetJsContentSettingOverriddenData(url);
return js_content_settings_overridden_data &&
js_content_settings_overridden_data->status ==
::ContentSetting::CONTENT_SETTING_BLOCK;
}
mojom::ContentSettingsOverriddenDataPtr
BraveShieldsSettingsService::GetJsContentSettingOverriddenData(
const GURL& url) {
content_settings::SettingInfo info;
const auto rule = host_content_settings_map_->GetContentSetting(
url, GURL(), content_settings::mojom::ContentSettingsType::JAVASCRIPT,
&info);
// No override
if (info.source == content_settings::SettingSource::kUser) {
return nullptr;
}
return mojom::ContentSettingsOverriddenData::New(
rule, ConvertSettingsSource(info.source));
}
} // namespace brave_shields
@@ -8,6 +8,7 @@
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "brave/components/brave_shields/core/common/brave_shields_panel.mojom.h"
#include "brave/components/brave_shields/core/common/shields_settings.mojom.h"
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/keyed_service/core/keyed_service.h"
@@ -53,6 +54,10 @@ class BraveShieldsSettingsService : public KeyedService {
void SetAutoShredMode(mojom::AutoShredMode mode, const GURL& url);
mojom::AutoShredMode GetAutoShredMode(const GURL& url);
bool IsJsBlockingEnforced(const GURL& url);
mojom::ContentSettingsOverriddenDataPtr GetJsContentSettingOverriddenData(
const GURL& url);
private:
const raw_ref<HostContentSettingsMap>
host_content_settings_map_; // NOT OWNED
@@ -11,6 +11,8 @@
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
#include "brave/components/brave_shields/core/common/features.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/test/content_settings_mock_provider.h"
#include "components/content_settings/core/test/content_settings_test_utils.h"
#include "components/prefs/pref_service.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -384,3 +386,35 @@ TEST_F(BraveShieldsSettingsServiceTest, DefaultAutoShredMode) {
brave_shields::AutoShredSetting::kContentSettingsType),
AutoShredDictFrom(AutoShredMode::NEVER));
}
TEST_F(BraveShieldsSettingsServiceTest, GetJsContentSettingsOverriddenData) {
const GURL url = GURL("https://brave.com");
brave_shields::SetNoScriptControlType(GetHostContentSettingsMap(),
brave_shields::ControlType::BLOCK, url);
// No override
auto content_settings_overridden_data =
brave_shields_settings()->GetJsContentSettingOverriddenData(url);
EXPECT_FALSE(brave_shields_settings()->IsJsBlockingEnforced(url));
EXPECT_FALSE(content_settings_overridden_data);
auto extension_provider = std::make_unique<content_settings::MockProvider>();
extension_provider->SetWebsiteSetting(
ContentSettingsPattern::FromURL(url), ContentSettingsPattern::Wildcard(),
ContentSettingsType::JAVASCRIPT, base::Value(CONTENT_SETTING_ALLOW),
/*constraints=*/{},
content_settings::PartitionKey::GetDefaultForTesting());
// Overridde to ALLOW via extension
content_settings::TestUtils::OverrideProvider(
GetHostContentSettingsMap(), std::move(extension_provider),
content_settings::ProviderType::kCustomExtensionProvider);
content_settings_overridden_data =
brave_shields_settings()->GetJsContentSettingOverriddenData(url);
EXPECT_FALSE(brave_shields_settings()->IsJsBlockingEnforced(url));
EXPECT_TRUE(content_settings_overridden_data);
EXPECT_EQ(::ContentSetting::CONTENT_SETTING_ALLOW,
content_settings_overridden_data->status);
EXPECT_EQ(brave_shields::mojom::ContentSettingSource::kExtension,
content_settings_overridden_data->override_source);
}
@@ -5,6 +5,7 @@
#include "brave/components/brave_shields/core/browser/brave_shields_utils.h"
#include <optional>
#include <string>
#include <utility>
@@ -12,6 +13,7 @@
#include "base/hash/hash.h"
#include "brave/components/brave_shields/core/browser/brave_shields_p3a.h"
#include "brave/components/brave_shields/core/common/brave_shield_utils.h"
#include "brave/components/brave_shields/core/common/brave_shields_panel.mojom-data-view.h"
#include "brave/components/brave_shields/core/common/features.h"
#include "brave/components/brave_shields/core/common/pref_names.h"
#include "brave/components/constants/url_constants.h"
@@ -20,6 +22,7 @@
#include "components/content_settings/core/browser/cookie_settings.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_enums.mojom-data-view.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "components/content_settings/core/common/content_settings_utils.h"
#include "components/content_settings/core/common/pref_names.h"
@@ -8,6 +8,7 @@
#include <string>
#include "brave/components/brave_shields/core/common/brave_shields_panel.mojom-data-view.h"
#include "brave/components/brave_shields/core/common/brave_shields_settings_values.h"
#include "brave/components/brave_shields/core/common/shields_settings.mojom.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
@@ -25,6 +25,7 @@ static_library("common") {
deps = [
"//base",
"//brave/components/brave_shields/core/common:mojom",
"//brave/components/brave_shields/core/common:mojom_shared__generator",
"//brave/components/webcompat/core/common",
"//components/content_settings/core/common",
"//net",
@@ -45,7 +46,10 @@ mojom_component("mojom") {
"shields_settings.mojom",
]
deps = [ "//components/content_settings/core/common:content_settings_types" ]
deps = [
"//components/content_settings/core/common:content_settings_types",
"//components/content_settings/core/common:mojo_bindings",
]
public_deps = [
"//mojo/public/mojom/base",
@@ -55,6 +55,18 @@ inline constexpr webui::LocalizedString kLocalizedStrings[] = {
{"braveShieldsConnectionsUpgraded", IDS_BRAVE_SHIELDS_CONNECTIONS_UPGRADED},
{"braveShieldsHTTPSEnable", IDS_BRAVE_SHIELDS_HTTPS_ENABLE},
{"braveShieldsScriptsBlocked", IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED},
{"braveShieldsScriptsBlockedOverridden",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN},
{"braveShieldsScriptsBlockedOverriddenByExt",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_EXTENSION},
{"braveShieldsScriptsBlockedOverriddenByPolicy",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_POLICY},
{"braveShieldsScriptsBlockedOverriddenByAllowlist",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_ALLOWLIST},
{"braveShieldsScriptsBlockedOverriddenBySupervisor",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_SUPERVISOR},
{"braveShieldsScriptsBlockedOverriddenByPWA",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_PWA},
{"braveShieldsScriptsBlockedEnable",
IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_ENABLE},
{"braveShieldsTrackersAndAds", IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS},
@@ -12,6 +12,7 @@
#include "base/no_destructor.h"
#include "base/strings/string_util.h"
#include "brave/components/brave_shields/core/common/brave_shields_settings_values.h"
#include "brave/components/brave_shields/core/common/shields_settings.mojom-data-view.h"
#include "brave/components/webcompat/core/common/features.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
@@ -101,4 +102,33 @@ ShieldsSettingCounts GetSettingCountFromCosmeticFilteringRules(
return result;
}
mojom::ContentSettingSource ConvertSettingsSource(
const content_settings::SettingSource source) {
switch (source) {
case content_settings::SettingSource::kUser:
return mojom::ContentSettingSource::kUser;
case content_settings::SettingSource::kExtension:
return mojom::ContentSettingSource::kExtension;
case content_settings::SettingSource::kPolicy:
return mojom::ContentSettingSource::kPolicy;
case content_settings::SettingSource::kSupervised:
return mojom::ContentSettingSource::kSupervised;
case content_settings::SettingSource::kInstalledWebApp:
return mojom::ContentSettingSource::kInstalledWebApp;
case content_settings::SettingSource::kNone:
return mojom::ContentSettingSource::kNone;
case content_settings::SettingSource::kAllowList:
return mojom::ContentSettingSource::kAllowList;
case content_settings::SettingSource::kTpcdGrant:
return mojom::ContentSettingSource::kTpcdGrant;
case content_settings::SettingSource::kRemoteList:
return mojom::ContentSettingSource::kRemoteList;
case content_settings::SettingSource::kOsJavascriptOptimizer:
return mojom::ContentSettingSource::kOsJavascriptOptimizer;
case content_settings::SettingSource::kTest:
return mojom::ContentSettingSource::kTest;
}
NOTREACHED();
}
} // namespace brave_shields
@@ -8,6 +8,7 @@
#include <map>
#include "brave/components/brave_shields/core/common/shields_settings.mojom-data-view.h"
#include "components/content_settings/core/common/content_settings.h"
class GURL;
@@ -36,6 +37,9 @@ ShieldsSettingCounts GetSettingCountFromRules(
ShieldsSettingCounts GetSettingCountFromCosmeticFilteringRules(
const ContentSettingsForOneType& fp_rules);
mojom::ContentSettingSource ConvertSettingsSource(
const content_settings::SettingSource source);
} // namespace brave_shields
#endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_CORE_COMMON_BRAVE_SHIELD_UTILS_H_
@@ -7,6 +7,7 @@ module brave_shields.mojom;
import "brave/components/brave_shields/core/common/shields_settings.mojom";
import "components/content_settings/core/common/content_settings_types.mojom";
import "components/content_settings/core/common/content_settings.mojom";
import "url/mojom/url.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
@@ -81,6 +82,11 @@ struct SiteBlockInfo {
array<content_settings.mojom.ContentSettingsType> invoked_webcompat_list;
};
struct ContentSettingsOverriddenData {
content_settings.mojom.ContentSetting status;
ContentSettingSource override_source;
};
struct SiteSettings {
AdBlockMode ad_block_mode;
FingerprintMode fingerprint_mode;
@@ -88,5 +94,6 @@ struct SiteSettings {
HttpsUpgradeMode https_upgrade_mode;
bool is_noscript_enabled;
bool is_forget_first_party_storage_enabled;
ContentSettingsOverriddenData? scripts_blocked_override_status;
map<content_settings.mojom.ContentSettingsType, bool> webcompat_settings;
};
@@ -13,11 +13,27 @@ enum FarblingLevel {
MAXIMUM,
};
// Maps to content_settings::SettingSource
enum ContentSettingSource {
kNone = 0,
kPolicy,
kExtension,
kUser,
kAllowList,
kRemoteList,
kSupervised,
kInstalledWebApp,
kTpcdGrant,
kOsJavascriptOptimizer,
kTest,
};
struct ShieldsSettings {
FarblingLevel farbling_level;
mojo_base.mojom.Token farbling_token;
array<string> origins_to_allow_scripts;
bool reduce_language;
bool enforced_script_blocking;
};
enum AdBlockMode {
@@ -12,5 +12,6 @@ ios_objc_mojom_wrappers("mojom") {
exclude_types = [
"FarblingLevel",
"ShieldsSettings",
"ContentSettingsOverriddenData",
]
}
@@ -10,9 +10,18 @@ import { loadTimeData } from '$web-common/loadTimeData'
import Select from '$web-components/select'
import * as S from './style'
import getPanelBrowserAPI, { AdBlockMode, CookieBlockMode, FingerprintMode, HttpsUpgradeMode } from '../../api/panel_browser_api'
import getPanelBrowserAPI, {
AdBlockMode,
CookieBlockMode,
FingerprintMode,
HttpsUpgradeMode,
ContentSettingSource,
} from '../../api/panel_browser_api'
import DataContext from '../../state/context'
import { ViewType } from '../../state/component_types'
import {
ContentSetting
} from 'gen/components/content_settings/core/common/content_settings.mojom.m'
const adBlockModeOptions = [
{ value: AdBlockMode.AGGRESSIVE, text: getLocale('braveShieldsTrackersAndAdsBlockedAgg') },
@@ -110,6 +119,27 @@ function AdvancedControlsContent () {
if (getSiteSettings) getSiteSettings()
}
const getEnforcedDescription = () => {
if (!siteSettings?.scriptsBlockedOverrideStatus) {
return getLocale('braveShieldsScriptsBlockedOverridden')
}
switch (siteSettings.scriptsBlockedOverrideStatus.overrideSource) {
case ContentSettingSource.kExtension:
return getLocale('braveShieldsScriptsBlockedOverriddenByExt')
case ContentSettingSource.kPolicy:
return getLocale('braveShieldsScriptsBlockedOverriddenByPolicy')
case ContentSettingSource.kAllowList:
return getLocale('braveShieldsScriptsBlockedOverriddenByAllowlist')
case ContentSettingSource.kSupervised:
return getLocale('braveShieldsScriptsBlockedOverriddenBySupervisor')
case ContentSettingSource.kInstalledWebApp:
return getLocale('braveShieldsScriptsBlockedOverriddenByPWA')
default:
return getLocale('braveShieldsScriptsBlockedOverridden')
}
}
const adsListCount = siteBlockInfo?.adsList.length ?? 0
const jsListCount = siteBlockInfo?.blockedJsList.length ?? 0
const invokedWebcompatListCount = siteBlockInfo?.invokedWebcompatList.length ?? 0
@@ -120,6 +150,14 @@ function AdvancedControlsContent () {
const isBraveForgetFirstPartyStorageFeatureEnabled = loadTimeData.getBoolean(
'isBraveForgetFirstPartyStorageFeatureEnabled'
)
const isEnforced =
siteSettings?.scriptsBlockedOverrideStatus?.overrideSource !== undefined
&& siteSettings?.scriptsBlockedOverrideStatus?.status
!== ContentSetting.DEFAULT
&& siteSettings?.scriptsBlockedOverrideStatus?.overrideSource
!== ContentSettingSource.kUser
&& siteSettings?.scriptsBlockedOverrideStatus?.overrideSource
!== ContentSettingSource.kNone
return (
<section
@@ -170,19 +208,27 @@ function AdvancedControlsContent () {
</S.ControlGroup>}
<S.ControlGroup>
<label>
<span>{getLocale('braveShieldsScriptsBlocked')}</span>
<S.LabelContainer>
<span>
{getLocale('braveShieldsScriptsBlocked')}
</span>
{isEnforced && (
<S.SecondaryText>{getEnforcedDescription()}</S.SecondaryText>
)}
</S.LabelContainer>
<Toggle
aria-label={getLocale('braveShieldsScriptsBlockedEnable')}
onChange={handleIsNoScriptEnabledChange}
checked={siteSettings?.isNoscriptEnabled}
size='small'
disabled={siteBlockInfo?.isBraveShieldsManaged}
disabled={siteBlockInfo?.isBraveShieldsManaged || isEnforced}
/>
</label>
<S.CountButton
title={jsListCount.toString()}
aria-label={getLocale('braveShieldsScriptsBlocked')}
onClick={() => setViewType?.(ViewType.ScriptsList)}
visible={!isEnforced}
disabled={jsListCount <= 0}
>
{jsListCount > 99 ? '99+' : jsListCount}
@@ -28,7 +28,7 @@ export const FooterActionBox = styled.div`
background-color: transparent;
padding: 0;
margin: 0;
border:0;
border: 0;
color: var(--text-color);
font-size: 13px;
font-weight: 500;
@@ -46,7 +46,7 @@ export const FooterActionBox = styled.div`
--svg-color: ${color.primary[60]};
}
}
i {
display: block;
width: 17px;
@@ -76,7 +76,7 @@ export const ControlGroup = styled.div`
grid-gap: 10px;
align-items: center;
margin-bottom: 8px;
.col-2,
label {
grid-column: 2;
@@ -103,7 +103,20 @@ export const ControlGroup = styled.div`
}
`
export const CountButton = styled.button`
export const LabelContainer = styled.div`
display: flex;
flex-direction: column;
`
export const SecondaryText = styled.span`
color: ${color.text.disabled};
margin-top: 5px;
`
interface CountButtonProps {
visible?: boolean
}
export const CountButton = styled.button<CountButtonProps>`
background-color: transparent;
border: 0;
padding: 0;
@@ -117,6 +130,7 @@ export const CountButton = styled.button`
border-radius: 4px;
border: 2px solid transparent;
cursor: pointer;
display: ${(props) => (props.visible === false ? 'none' : 'block')};
&:hover {
background-color: ${color.neutral[10]};
@@ -135,5 +149,4 @@ export const CountButton = styled.button`
background-color: unset;
}
}
`
@@ -11,13 +11,22 @@ import MainPanel from '../components/main-panel'
import TreeList from '../components/tree-list'
import ThemeProvider from '../../../../common/BraveCoreThemeProvider'
import DataContext from '../state/context'
import { AdBlockMode, FingerprintMode, CookieBlockMode, HttpsUpgradeMode } from '../api/panel_browser_api'
import {
AdBlockMode,
FingerprintMode,
CookieBlockMode,
HttpsUpgradeMode,
ContentSettingSource,
} from '../api/panel_browser_api'
import {
ViewType
} from '../state/component_types'
import { getLocale } from '../../../../common/locale'
import '@brave/leo/tokens/css/variables.css'
import {
ContentSetting
} from 'gen/components/content_settings/core/common/content_settings.mojom.m'
const LIST_JS = [
{ 'url': 'https://www.reddit.com/' },
@@ -74,6 +83,10 @@ export default {
cookieBlockMode: CookieBlockMode.ALLOW,
httpsUpgradeMode: HttpsUpgradeMode.DISABLED_MODE,
isNoscriptEnabled: false,
scriptsBlockedOverrideStatus: {
status: ContentSetting.DEFAULT,
overrideSource: ContentSettingSource.kNone,
},
isForgetFirstPartyStorageEnabled: false,
webcompatSettings: {}
},
@@ -146,6 +146,13 @@ bool BraveContentSettingsAgentImpl::IsReduceLanguageEnabled() {
return shields_settings_->reduce_language;
}
bool BraveContentSettingsAgentImpl::IsJsBlockingEnforced() const {
if (!shields_settings_) {
return false;
}
return shields_settings_->enforced_script_blocking;
}
void BraveContentSettingsAgentImpl::BraveSpecificDidAllowJavaScriptOnce(
const GURL& resource_url) {
// This will be called for all resources on a page, we want to notify only
@@ -175,7 +182,8 @@ bool BraveContentSettingsAgentImpl::AllowScript(bool enabled_per_settings) {
auto is_shields_down = IsBraveShieldsDown(primary_url, secondary_url);
auto is_script_temporarily_allowed =
IsScriptTemporarilyAllowed(secondary_url);
allow = allow || is_shields_down || is_script_temporarily_allowed;
allow = !IsJsBlockingEnforced() &&
(allow || is_shields_down || is_script_temporarily_allowed);
if (!allow) {
blocked_script_url_ = secondary_url;
} else if (!is_shields_down) {
@@ -183,6 +191,7 @@ bool BraveContentSettingsAgentImpl::AllowScript(bool enabled_per_settings) {
BraveSpecificDidAllowJavaScriptOnce(secondary_url);
}
}
return allow;
}
@@ -218,7 +227,8 @@ bool BraveContentSettingsAgentImpl::AllowScriptFromSource(
auto is_shields_down = IsBraveShieldsDown(primary_url, secondary_url);
auto is_script_temporarily_allowed =
IsScriptTemporarilyAllowed(secondary_url);
allow = allow || is_shields_down || is_script_temporarily_allowed;
allow = !IsJsBlockingEnforced() &&
(allow || is_shields_down || is_script_temporarily_allowed);
if (!allow) {
blocked_script_url_ = secondary_url;
@@ -397,7 +407,8 @@ BraveContentSettingsAgentImpl::GetBraveShieldsSettings(
HasContentSettingsRules());
base::debug::DumpWithoutCrashing();
return brave_shields::mojom::ShieldsSettings::New(
farbling_level, base::Token(), std::vector<std::string>(), false);
farbling_level, base::Token(), std::vector<std::string>(), false,
false);
}
}
@@ -83,6 +83,8 @@ class BraveContentSettingsAgentImpl
bool IsScriptTemporarilyAllowed(const GURL& script_url);
bool IsJsBlockingEnforced() const;
// brave_shields::mojom::BraveShields.
void SetShieldsSettings(
brave_shields::mojom::ShieldsSettingsPtr settings) override;
@@ -139,6 +139,30 @@
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED" desc="A label for scripts Scripts blocked option.">
Block scripts
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN" desc="A label for scripts Scripts blocked option which is overridden by rule.">
(enforced)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_EXTENSION" desc="A label for scripts Scripts blocked option which is overridden by extension rule.">
(enforced by extension)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_POLICY" desc="A label for scripts Scripts blocked option which is overridden by a policy rule.">
(enforced by policy)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_ALLOWLIST" desc="A label for scripts Scripts blocked option which is overridden by a allowlist built into the browser's WebUI.">
(enforced by allowlist)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_SUPERVISOR" desc="A label for scripts Scripts blocked option which is overridden by a supervisor rule.">
(enforced by supervisor)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_PWA" desc="A label for scripts Scripts blocked option which is overridden by a PWA.">
(enforced by PWA)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_ENABLE" desc="A label to describe expand/collapse button for the website scripts blocked section.">
Enable Scripts Blocked