Files
brave-core/renderer/brave_content_renderer_client.cc
T

251 lines
9.8 KiB
C++

/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/renderer/brave_content_renderer_client.h"
#include <utility>
#include "base/feature_list.h"
#include "base/ranges/algorithm.h"
#include "brave/components/ai_chat/core/common/buildflags/buildflags.h"
#include "brave/components/brave_search/common/brave_search_utils.h"
#include "brave/components/brave_search/renderer/brave_search_render_frame_observer.h"
#include "brave/components/brave_shields/common/features.h"
#include "brave/components/brave_vpn/common/buildflags/buildflags.h"
#include "brave/components/brave_wallet/common/features.h"
#include "brave/components/cosmetic_filters/renderer/cosmetic_filters_js_render_frame_observer.h"
#include "brave/components/playlist/common/buildflags/buildflags.h"
#include "brave/components/safe_builtins/renderer/safe_builtins.h"
#include "brave/components/script_injector/renderer/script_injector_render_frame_observer.h"
#include "brave/components/skus/common/features.h"
#include "brave/components/skus/renderer/skus_render_frame_observer.h"
#include "brave/components/speedreader/common/buildflags/buildflags.h"
#include "brave/renderer/brave_render_thread_observer.h"
#include "brave/renderer/brave_url_loader_throttle_provider_impl.h"
#include "brave/renderer/brave_wallet/brave_wallet_render_frame_observer.h"
#include "chrome/common/chrome_isolated_world_ids.h"
#include "chrome/renderer/chrome_render_thread_observer.h"
#include "content/public/renderer/render_thread.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/platform/web_runtime_features.h"
#include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h"
#include "third_party/blink/public/web/web_script_controller.h"
#include "third_party/widevine/cdm/buildflags.h"
#include "url/gurl.h"
#if BUILDFLAG(ENABLE_SPEEDREADER)
#include "brave/components/speedreader/common/features.h"
#include "brave/components/speedreader/renderer/speedreader_render_frame_observer.h"
#endif
#if BUILDFLAG(ENABLE_BRAVE_VPN)
#include "brave/components/brave_vpn/common/brave_vpn_utils.h"
#if BUILDFLAG(IS_ANDROID)
#include "brave/components/brave_mobile_subscription/renderer/android/subscription_render_frame_observer.h"
#endif // BUILDFLAG(IS_ANDROID)
#endif // BUILDFLAG(ENABLE_BRAVE_VPN)
#if BUILDFLAG(ENABLE_PLAYLIST)
#include "brave/components/playlist/common/features.h"
#include "brave/components/playlist/renderer/playlist_render_frame_observer.h"
#endif
#if BUILDFLAG(ENABLE_WIDEVINE)
#include "media/base/key_system_info.h"
#include "third_party/widevine/cdm/widevine_cdm_common.h"
#endif
#if BUILDFLAG(ENABLE_AI_CHAT) && BUILDFLAG(IS_ANDROID)
#include "brave/components/ai_chat/core/common/features.h"
#endif
namespace {
void MaybeRemoveWidevineSupport(media::GetSupportedKeySystemsCB cb,
media::KeySystemInfos key_systems) {
#if BUILDFLAG(ENABLE_WIDEVINE)
auto dynamic_params = BraveRenderThreadObserver::GetDynamicParams();
if (!dynamic_params.widevine_enabled) {
key_systems.erase(
base::ranges::remove(
key_systems, kWidevineKeySystem,
[](const std::unique_ptr<media::KeySystemInfo>& key_system) {
return key_system->GetBaseKeySystemName();
}),
key_systems.cend());
}
#endif
cb.Run(std::move(key_systems));
}
} // namespace
BraveContentRendererClient::BraveContentRendererClient() = default;
void BraveContentRendererClient::
SetRuntimeFeaturesDefaultsBeforeBlinkInitialization() {
ChromeContentRendererClient::
SetRuntimeFeaturesDefaultsBeforeBlinkInitialization();
blink::WebRuntimeFeatures::EnableWebNFC(false);
blink::WebRuntimeFeatures::EnableAnonymousIframe(false);
// These features don't have dedicated WebRuntimeFeatures wrappers.
blink::WebRuntimeFeatures::EnableFeatureFromString("DigitalGoods", false);
if (!base::FeatureList::IsEnabled(blink::features::kFileSystemAccessAPI)) {
blink::WebRuntimeFeatures::EnableFeatureFromString("FileSystemAccessLocal",
false);
blink::WebRuntimeFeatures::EnableFeatureFromString(
"FileSystemAccessAPIExperimental", false);
}
if (!base::FeatureList::IsEnabled(blink::features::kBraveWebSerialAPI)) {
blink::WebRuntimeFeatures::EnableFeatureFromString("Serial", false);
}
blink::WebRuntimeFeatures::EnableFeatureFromString(
"SpeculationRulesPrefetchProxy", false);
blink::WebRuntimeFeatures::EnableFeatureFromString("AdTagging", false);
blink::WebRuntimeFeatures::EnableFeatureFromString("WebEnvironmentIntegrity",
false);
}
BraveContentRendererClient::~BraveContentRendererClient() = default;
void BraveContentRendererClient::RenderThreadStarted() {
ChromeContentRendererClient::RenderThreadStarted();
brave_observer_ = std::make_unique<BraveRenderThreadObserver>();
content::RenderThread::Get()->AddObserver(brave_observer_.get());
brave_search_service_worker_holder_.SetBrowserInterfaceBrokerProxy(
browser_interface_broker_.get());
blink::WebScriptController::RegisterExtension(
brave::SafeBuiltins::CreateV8Extension());
}
void BraveContentRendererClient::RenderFrameCreated(
content::RenderFrame* render_frame) {
ChromeContentRendererClient::RenderFrameCreated(render_frame);
if (base::FeatureList::IsEnabled(
brave_shields::features::kBraveAdblockCosmeticFiltering)) {
auto dynamic_params_closure = base::BindRepeating([]() {
auto dynamic_params = BraveRenderThreadObserver::GetDynamicParams();
return dynamic_params.de_amp_enabled;
});
new cosmetic_filters::CosmeticFiltersJsRenderFrameObserver(
render_frame, ISOLATED_WORLD_ID_BRAVE_INTERNAL, dynamic_params_closure);
}
if (base::FeatureList::IsEnabled(
brave_wallet::features::kNativeBraveWalletFeature)) {
new brave_wallet::BraveWalletRenderFrameObserver(
render_frame,
base::BindRepeating(&BraveRenderThreadObserver::GetDynamicParams));
}
new script_injector::ScriptInjectorRenderFrameObserver(render_frame);
if (brave_search::IsDefaultAPIEnabled()) {
new brave_search::BraveSearchRenderFrameObserver(
render_frame, content::ISOLATED_WORLD_ID_GLOBAL);
}
if (base::FeatureList::IsEnabled(skus::features::kSkusFeature) &&
!ChromeRenderThreadObserver::is_incognito_process()) {
new skus::SkusRenderFrameObserver(render_frame);
}
#if BUILDFLAG(IS_ANDROID)
if (brave_vpn::IsBraveVPNFeatureEnabled()
#if BUILDFLAG(ENABLE_AI_CHAT)
|| ai_chat::features::IsAIChatHistoryEnabled()
#endif
) {
new brave_subscription::SubscriptionRenderFrameObserver(
render_frame, content::ISOLATED_WORLD_ID_GLOBAL);
}
#endif
#if BUILDFLAG(ENABLE_SPEEDREADER)
if (base::FeatureList::IsEnabled(speedreader::kSpeedreaderFeature)) {
new speedreader::SpeedreaderRenderFrameObserver(
render_frame, ISOLATED_WORLD_ID_BRAVE_INTERNAL);
}
#endif
#if BUILDFLAG(ENABLE_PLAYLIST)
if (base::FeatureList::IsEnabled(playlist::features::kPlaylist) &&
!ChromeRenderThreadObserver::is_incognito_process()) {
new playlist::PlaylistRenderFrameObserver(render_frame,
ISOLATED_WORLD_ID_BRAVE_INTERNAL);
}
#endif
}
void BraveContentRendererClient::GetSupportedKeySystems(
media::GetSupportedKeySystemsCB cb) {
ChromeContentRendererClient::GetSupportedKeySystems(
base::BindRepeating(&MaybeRemoveWidevineSupport, cb));
}
void BraveContentRendererClient::RunScriptsAtDocumentStart(
content::RenderFrame* render_frame) {
auto* observer =
cosmetic_filters::CosmeticFiltersJsRenderFrameObserver::Get(render_frame);
// Run this before any extensions
if (observer) {
observer->RunScriptsAtDocumentStart();
}
#if BUILDFLAG(ENABLE_PLAYLIST)
if (base::FeatureList::IsEnabled(playlist::features::kPlaylist)) {
if (auto* playlist_observer =
playlist::PlaylistRenderFrameObserver::Get(render_frame)) {
playlist_observer->RunScriptsAtDocumentStart();
}
}
#endif
ChromeContentRendererClient::RunScriptsAtDocumentStart(render_frame);
}
void BraveContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread(
blink::WebServiceWorkerContextProxy* context_proxy,
v8::Local<v8::Context> v8_context,
int64_t service_worker_version_id,
const GURL& service_worker_scope,
const GURL& script_url) {
brave_search_service_worker_holder_.WillEvaluateServiceWorkerOnWorkerThread(
context_proxy, v8_context, service_worker_version_id,
service_worker_scope, script_url);
ChromeContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread(
context_proxy, v8_context, service_worker_version_id,
service_worker_scope, script_url);
}
void BraveContentRendererClient::WillDestroyServiceWorkerContextOnWorkerThread(
v8::Local<v8::Context> v8_context,
int64_t service_worker_version_id,
const GURL& service_worker_scope,
const GURL& script_url) {
brave_search_service_worker_holder_
.WillDestroyServiceWorkerContextOnWorkerThread(
v8_context, service_worker_version_id, service_worker_scope,
script_url);
ChromeContentRendererClient::WillDestroyServiceWorkerContextOnWorkerThread(
v8_context, service_worker_version_id, service_worker_scope, script_url);
}
std::unique_ptr<blink::URLLoaderThrottleProvider>
BraveContentRendererClient::CreateURLLoaderThrottleProvider(
blink::URLLoaderThrottleProviderType provider_type) {
return std::make_unique<BraveURLLoaderThrottleProviderImpl>(
browser_interface_broker_.get(), provider_type, this);
}
bool BraveContentRendererClient::IsOnionAllowed() const {
return brave_observer_->IsOnionAllowed();
}