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:
@@ -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",
|
||||
]
|
||||
}
|
||||
|
||||
+49
-3
@@ -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}
|
||||
|
||||
+18
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user