electron/shell/app/electron_content_client.cc
trop[bot] 124bfd25f8
chore: bump chromium to 140.0.7301.0 (38-x-y) (#47849)
* chore: bump chromium in DEPS to 140.0.7296.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: update patches

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6702959: Remove OwnedByWidgetPassKey usage from content analysis dialog tests | https://chromium-review.googlesource.com/c/chromium/src/+/6702959

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6722750: Remove un-used `stream_id` argument for `AidaCodeComplete` | https://chromium-review.googlesource.com/c/chromium/src/+/6722750

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6696478: Reland Reland [video pip] Add fade in/out animation to controls visibility changes | https://chromium-review.googlesource.com/c/chromium/src/+/6696478

Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>

* chore: update libc++-filenames

Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>

* build: explicitly include cstdlib in Boyer-Moore patch

Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>

* chore: bump chromium in DEPS to 140.0.7297.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: update patches

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6729537: [FPF] Pipe flag state from the browser to the renderer | https://chromium-review.googlesource.com/c/chromium/src/+/6729537

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6727996: [Win] Detect pre-IPC crashes in sandboxed utility processes | https://chromium-review.googlesource.com/c/chromium/src/+/6727996

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6707182: Move wtf/cross_thread_copier*.* to "blink" namespace | https://chromium-review.googlesource.com/c/chromium/src/+/6707182

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6730796: extensions: Extract safe browsing/telemetry methods to new client class | https://chromium-review.googlesource.com/c/chromium/src/+/6730796

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* chore: bump chromium in DEPS to 140.0.7299.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: update patches

Co-authored-by: patchup[bot] <73610968+patchup[bot]@users.noreply.github.com>

* chore: update main patches

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* build: reset the minimum macOS SDK to 15 to match upstream

This reverts commit 499e987c77.

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6730215: Remove IPC_MESSAGE_LOG_ENABLED ifdef blocks. | https://chromium-review.googlesource.com/c/chromium/src/+/6730215

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6690442: Delete ppapi/buildflags/buildflags.h | https://chromium-review.googlesource.com/c/chromium/src/+/6690442

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6667681: Use more binaries from clang toolchain in mac build | https://chromium-review.googlesource.com/c/chromium/src/+/6667681

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* chore: bump chromium in DEPS to 140.0.7301.0

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>

* chore: update patches

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6656309: extensions: Port proxy API to desktop Android | https://chromium-review.googlesource.com/c/chromium/src/+/6656309

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6758510: Reland 'Move GN enable_plugins variable out of //ppapi' | https://chromium-review.googlesource.com/c/chromium/src/+/6758510

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6701466: [Extensions] Remove NaCl arch info from Update Client URLs | https://chromium-review.googlesource.com/c/chromium/src/+/6701466

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6735979: [FSA] Replace `request_writable` with a new enum `FileSystemAccessPermissionMode`. | https://chromium-review.googlesource.com/c/chromium/src/+/6735979

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6712080: Reland "Turn on gender translation PAK generation everywhere" | https://chromium-review.googlesource.com/c/chromium/src/+/6712080

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* 6730796: extensions: Extract safe browsing/telemetry methods to new client class | https://chromium-review.googlesource.com/c/chromium/src/+/6730796

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* build: restore minimum macOS SDK to 10, restore patch

This reverts commit a04c579b994d5f4a782b793a69f34ff7a260e74f.

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* fixup! 6701466: [Extensions] Remove NaCl arch info from Update Client URLs | https://chromium-review.googlesource.com/c/chromium/src/+/6701466

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* chore: correct node patches

Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>

* fixup! 6667681: Use more binaries from clang toolchain in mac build | https://chromium-review.googlesource.com/c/chromium/src/+/6667681

Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Keeley Hammond <khammond@slack-corp.com>
Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>
Co-authored-by: patchup[bot] <73610968+patchup[bot]@users.noreply.github.com>
2025-07-21 11:55:08 -07:00

217 lines
8.1 KiB
C++

// Copyright (c) 2014 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/app/electron_content_client.h"
#include <string>
#include <string_view>
#include <vector>
#include "base/command_line.h"
#include "base/containers/extend.h"
#include "base/files/file_util.h"
#include "base/strings/string_split.h"
#include "content/public/common/buildflags.h"
#include "content/public/common/content_constants.h"
#include "electron/buildflags/buildflags.h"
#include "electron/fuses.h"
#include "extensions/common/constants.h"
#include "pdf/buildflags.h"
#include "shell/common/options_switches.h"
#include "shell/common/process_util.h"
#include "third_party/widevine/cdm/buildflags.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "url/url_constants.h"
#if BUILDFLAG(ENABLE_WIDEVINE)
#include "base/native_library.h"
#include "content/public/common/cdm_info.h"
#include "media/base/video_codecs.h"
#endif // BUILDFLAG(ENABLE_WIDEVINE)
#if BUILDFLAG(ENABLE_PDF_VIEWER)
#include "components/pdf/common/constants.h" // nogncheck
#include "shell/common/electron_constants.h"
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
#if BUILDFLAG(ENABLE_PLUGINS)
#include "content/public/common/content_plugin_info.h"
#endif // BUILDFLAG(ENABLE_PLUGINS)
namespace electron {
namespace {
enum class WidevineCdmFileCheck {
kNotChecked,
kFound,
kNotFound,
};
#if BUILDFLAG(ENABLE_WIDEVINE)
bool IsWidevineAvailable(
base::FilePath* cdm_path,
std::vector<media::VideoCodec>* codecs_supported,
base::flat_set<media::CdmSessionType>* session_types_supported,
base::flat_set<media::EncryptionMode>* modes_supported) {
static WidevineCdmFileCheck widevine_cdm_file_check =
WidevineCdmFileCheck::kNotChecked;
if (widevine_cdm_file_check == WidevineCdmFileCheck::kNotChecked) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
*cdm_path = command_line->GetSwitchValuePath(switches::kWidevineCdmPath);
if (!cdm_path->empty()) {
*cdm_path = cdm_path->AppendASCII(
base::GetNativeLibraryName(kWidevineCdmLibraryName));
widevine_cdm_file_check = base::PathExists(*cdm_path)
? WidevineCdmFileCheck::kFound
: WidevineCdmFileCheck::kNotFound;
}
}
if (widevine_cdm_file_check == WidevineCdmFileCheck::kFound) {
// Add the supported codecs as if they came from the component manifest.
// This list must match the CDM that is being bundled with Chrome.
codecs_supported->push_back(media::VideoCodec::kCodecVP8);
codecs_supported->push_back(media::VideoCodec::kCodecVP9);
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
codecs_supported->push_back(media::VideoCodec::kCodecH264);
#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
// TODO(crbug.com/767941): Push persistent-license support info here once
// we check in a new CDM that supports it on Linux.
session_types_supported->insert(media::CdmSessionType::kTemporary);
#if BUILDFLAG(IS_CHROMEOS)
session_types_supported->insert(media::CdmSessionType::kPersistentLicense);
#endif // BUILDFLAG(IS_CHROMEOS)
modes_supported->insert(media::EncryptionMode::kCenc);
return true;
}
return false;
}
#endif // BUILDFLAG(ENABLE_WIDEVINE)
} // namespace
ElectronContentClient::ElectronContentClient() = default;
ElectronContentClient::~ElectronContentClient() = default;
std::u16string ElectronContentClient::GetLocalizedString(int message_id) {
return l10n_util::GetStringUTF16(message_id);
}
std::string_view ElectronContentClient::GetDataResource(
int resource_id,
ui::ResourceScaleFactor scale_factor) {
return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
resource_id, scale_factor);
}
gfx::Image& ElectronContentClient::GetNativeImageNamed(int resource_id) {
return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed(
resource_id);
}
base::RefCountedMemory* ElectronContentClient::GetDataResourceBytes(
int resource_id) {
return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
resource_id);
}
void ElectronContentClient::AddAdditionalSchemes(Schemes* schemes) {
// Browser Process registration happens in
// `api::Protocol::RegisterSchemesAsPrivileged`
//
// Renderer Process registration happens in `RendererClientBase`
//
// We use this for registration to network utility process
if (IsUtilityProcess()) {
const auto& cmd = *base::CommandLine::ForCurrentProcess();
auto append_cli_schemes = [&cmd](auto& appendme, const auto key) {
base::Extend(appendme, base::SplitString(cmd.GetSwitchValueASCII(key),
",", base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY));
};
using namespace switches;
append_cli_schemes(schemes->cors_enabled_schemes, kCORSSchemes);
append_cli_schemes(schemes->csp_bypassing_schemes, kBypassCSPSchemes);
append_cli_schemes(schemes->secure_schemes, kSecureSchemes);
append_cli_schemes(schemes->service_worker_schemes, kServiceWorkerSchemes);
append_cli_schemes(schemes->standard_schemes, kStandardSchemes);
}
if (electron::fuses::IsGrantFileProtocolExtraPrivilegesEnabled()) {
schemes->service_worker_schemes.emplace_back(url::kFileScheme);
}
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
schemes->standard_schemes.push_back(extensions::kExtensionScheme);
schemes->savable_schemes.push_back(extensions::kExtensionScheme);
schemes->secure_schemes.push_back(extensions::kExtensionScheme);
schemes->service_worker_schemes.push_back(extensions::kExtensionScheme);
schemes->cors_enabled_schemes.push_back(extensions::kExtensionScheme);
schemes->csp_bypassing_schemes.push_back(extensions::kExtensionScheme);
#endif
}
void ElectronContentClient::AddPlugins(
std::vector<content::ContentPluginInfo>* plugins) {
#if BUILDFLAG(ENABLE_PDF_VIEWER)
static constexpr char kPDFPluginExtension[] = "pdf";
static constexpr char kPDFPluginDescription[] = "Portable Document Format";
content::ContentPluginInfo pdf_info;
pdf_info.is_internal = true;
pdf_info.name = kPDFInternalPluginName;
pdf_info.description = kPDFPluginDescription;
// This isn't a real file path; it's just used as a unique identifier.
static constexpr std::string_view kPdfPluginPath = "internal-pdf-viewer";
pdf_info.path = base::FilePath::FromASCII(kPdfPluginPath);
content::WebPluginMimeType pdf_mime_type(
pdf::kInternalPluginMimeType, kPDFPluginExtension, kPDFPluginDescription);
pdf_info.mime_types.push_back(pdf_mime_type);
plugins->push_back(pdf_info);
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
}
void ElectronContentClient::AddContentDecryptionModules(
std::vector<content::CdmInfo>* cdms,
std::vector<media::CdmHostFilePath>* cdm_host_file_paths) {
if (cdms) {
#if BUILDFLAG(ENABLE_WIDEVINE)
base::FilePath cdm_path;
std::vector<media::VideoCodec> video_codecs_supported;
base::flat_set<media::CdmSessionType> session_types_supported;
base::flat_set<media::EncryptionMode> encryption_modes_supported;
if (IsWidevineAvailable(&cdm_path, &video_codecs_supported,
&session_types_supported,
&encryption_modes_supported)) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
auto cdm_version_string =
command_line->GetSwitchValueASCII(switches::kWidevineCdmVersion);
// CdmInfo needs |path| to be the actual Widevine library,
// not the adapter, so adjust as necessary. It will be in the
// same directory as the installed adapter.
const base::Version version(cdm_version_string);
DCHECK(version.IsValid());
content::CdmCapability capability(
video_codecs_supported, encryption_modes_supported,
session_types_supported, base::flat_set<media::CdmProxy::Protocol>());
cdms->push_back(content::CdmInfo(
kWidevineCdmDisplayName, kWidevineCdmGuid, version, cdm_path,
kWidevineCdmFileSystemId, capability, kWidevineKeySystem, false));
}
#endif // BUILDFLAG(ENABLE_WIDEVINE)
}
}
} // namespace electron