blob: 6fdb37edfa1290169a293193cd5ceeeaf1f41620 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/content_settings/generated_javascript_optimizer_pref.h"
#include <optional>
#include "base/types/cxx23_to_underlying.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/site_protection/site_familiarity_utils.h"
#include "chrome/common/extensions/api/settings_private.h"
#include "components/content_settings/core/common/features.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
using extensions::api::settings_private::Enforcement;
using extensions::api::settings_private::PrefObject;
using extensions::settings_private::SetPrefResult;
namespace content_settings {
const char kGeneratedJavascriptOptimizerPref[] =
"generated.javascript_optimizer";
GeneratedJavascriptOptimizerPref::GeneratedJavascriptOptimizerPref(
Profile* profile)
: profile_(profile) {
user_prefs_registrar_.Init(profile->GetPrefs());
user_prefs_registrar_.AddMultiple(
{prefs::kJavascriptOptimizerBlockedForUnfamiliarSites,
prefs::kSafeBrowsingEnabled},
base::BindRepeating(
&GeneratedJavascriptOptimizerPref::OnPreferencesChanged,
base::Unretained(this)));
host_content_settings_map_ =
HostContentSettingsMapFactory::GetForProfile(profile_);
content_setting_observation_.Observe(host_content_settings_map_.get());
}
GeneratedJavascriptOptimizerPref::~GeneratedJavascriptOptimizerPref() = default;
void GeneratedJavascriptOptimizerPref::OnContentSettingChanged(
const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsTypeSet content_type_set) {
if (content_type_set.Contains(ContentSettingsType::JAVASCRIPT_OPTIMIZER)) {
OnPreferencesChanged();
}
}
SetPrefResult GeneratedJavascriptOptimizerPref::SetPref(
const base::Value* value) {
if (!value->is_int()) {
return SetPrefResult::PREF_TYPE_MISMATCH;
}
auto selection = static_cast<int>(value->GetInt());
if (selection != static_cast<int>(JavascriptOptimizerSetting::kBlocked) &&
selection != static_cast<int>(JavascriptOptimizerSetting::kAllowed) &&
selection !=
static_cast<int>(
JavascriptOptimizerSetting::kBlockedForUnfamiliarSites)) {
return SetPrefResult::PREF_TYPE_MISMATCH;
}
host_content_settings_map_->SetDefaultContentSetting(
ContentSettingsType::JAVASCRIPT_OPTIMIZER,
selection == static_cast<int>(JavascriptOptimizerSetting::kBlocked)
? ContentSetting::CONTENT_SETTING_BLOCK
: ContentSetting::CONTENT_SETTING_ALLOW);
profile_->GetPrefs()->SetBoolean(
prefs::kJavascriptOptimizerBlockedForUnfamiliarSites,
selection == static_cast<int>(
JavascriptOptimizerSetting::kBlockedForUnfamiliarSites));
return SetPrefResult::SUCCESS;
}
PrefObject GeneratedJavascriptOptimizerPref::GetPrefObject() const {
PrefObject pref_object;
pref_object.key = kGeneratedJavascriptOptimizerPref;
pref_object.type = extensions::api::settings_private::PrefType::kNumber;
pref_object.value = base::Value(static_cast<int>(
site_protection::ComputeDefaultJavascriptOptimizerSetting(profile_)));
content_settings::ProviderType content_setting_provider;
host_content_settings_map_->GetDefaultContentSetting(
ContentSettingsType::JAVASCRIPT_OPTIMIZER, &content_setting_provider);
auto content_setting_source =
content_settings::GetSettingSourceFromProviderType(
content_setting_provider);
if (content_setting_source != content_settings::SettingSource::kUser) {
pref_object.enforcement = Enforcement::kEnforced;
GeneratedPref::ApplyControlledByFromContentSettingSource(
&pref_object, SettingSource::kPolicy);
}
if (!safe_browsing::IsSafeBrowsingEnabled(*profile_->GetPrefs())) {
pref_object.enforcement =
extensions::api::settings_private::Enforcement::kEnforced;
pref_object.controlled_by =
extensions::api::settings_private::ControlledBy::kSafeBrowsingOff;
base::Value::List user_selectable_values;
user_selectable_values.Append(
base::Value(static_cast<int>(JavascriptOptimizerSetting::kAllowed)));
user_selectable_values.Append(
base::Value(static_cast<int>(JavascriptOptimizerSetting::kBlocked)));
pref_object.user_selectable_values = std::move(user_selectable_values);
}
return pref_object;
}
void GeneratedJavascriptOptimizerPref::OnPreferencesChanged() {
NotifyObservers(kGeneratedJavascriptOptimizerPref);
}
} // namespace content_settings