c670e38b4b
* chore: bump chromium in DEPS to 124.0.6361.0 * chore: bump chromium in DEPS to 124.0.6363.0 * chore: update patches Manually apply printing.patch w/no code changes due to upstream shear. Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5349263 * chore: bump chromium in DEPS to 124.0.6365.0 * chore: bump chromium in DEPS to 124.0.6367.0 * update patches * 5371735: Rename SystemGeolocationSourceMac to SystemGeolocationSourceApple https://chromium-review.googlesource.com/c/chromium/src/+/5371735 * missed a MAS bit * chore: update windows toolchain 5350823: New toolchain for Windows 11 10.0.22621.2428 SDK | https://chromium-review.googlesource.com/c/chromium/src/+/5350823 * chore: bump chromium in DEPS to 125.0.6368.0 * fix patches * chore: update patches * 5232401: [PDF] Move generic utils from //chrome to //components/pdf (1/2) https://chromium-review.googlesource.com/c/chromium/src/+/5232401 * revert https://chromium-review.googlesource.com/c/chromium/src/+/5380898 * chore: bump chromium in DEPS to 125.0.6370.0 * build: use updated windows toolchain * fix patches * chore: update patches * more pdf_util to components * 5372414: [Extensions] Remove DispatcherDelegate https://chromium-review.googlesource.com/c/chromium/src/+/5372414 * fix accessibility_ui patch * chore: bump chromium in DEPS to 125.0.6372.0 * chore: bump chromium in DEPS to 125.0.6374.0 * chore: bump chromium in DEPS to 125.0.6376.0 * chore: bump chromium in DEPS to 125.0.6378.0 * chore: bump chromium in DEPS to 125.0.6379.3 * chore: update patches (+ MAS patch changes) * chore: update patches * 5381159: Cleanup media::KeySystemSupportObserver https://chromium-review.googlesource.com/c/chromium/src/+/5381159 * 5382233: Reland "Web `Speech to Text` with SODA backend" https://chromium-review.googlesource.com/c/chromium/src/+/5382233 * chore: update `exclusive_access` patch - 5367497: Add a metric for the website state when Fullscreen API is requested - https://chromium-review.googlesource.com/c/chromium/src/+/5367497 * chore: add build dependency 5367497: Add a metric for the website state when Fullscreen API is requested https://chromium-review.googlesource.com/c/chromium/src/+/5367497 * chore: bump chromium in DEPS to 125.0.6382.0 * chore: update libcxx filenames * chore: update patches * chore: bump chromium in DEPS to 125.0.6384.0 * chore: remove old patch * 5394039: [Extensions] Change "blessed" -> "privileged" in extension feature files https://chromium-review.googlesource.com/c/chromium/src/+/5394039 * fix: remove deprecated errno constants in node/libuv * 5362194: Return expected from ProcessMetrics CPU methods https://chromium-review.googlesource.com/c/chromium/src/+/5362194 * 5383927: Add new Pickle factory functions with explicit ownership https://chromium-review.googlesource.com/c/chromium/src/+/5383927 * 5373340: Simplify app-region/Draggable Region implementation https://chromium-review.googlesource.com/c/chromium/src/+/5373340 * 5386875: Cleanup printing preferences files https://chromium-review.googlesource.com/c/chromium/src/+/5386875 * chore: update libc++ filenames * fix: add enterprise buildflags dep * chore: bump chromium in DEPS to 125.0.6386.0 * chore: add build dep * chore: update patches * chore: bump chromium in DEPS to 125.0.6388.0 * chore: bump chromium in DEPS to 125.0.6390.0 * chore: update patches * 4918014: preloading: Add NewTabPagePageLoadMetricsObserver https://chromium-review.googlesource.com/c/chromium/src/+/4918014 * 5401234: [PDF] Remove `PDFDocumentHelperClient::FindPdfChildFrame` API https://chromium-review.googlesource.com/c/chromium/src/+/5401234 * 5116175: Relocate Windows XPS printing feature helper methods https://chromium-review.googlesource.com/c/chromium/src/+/5116175 * fixup! 5373340: Simplify app-region/Draggable Region implementation https://chromium-review.googlesource.com/c/chromium/src/+/5373340 * fixup! chore: add build dep * chore: remove dead code & dead patch Was dealing with https://chromium-review.googlesource.com/c/chromium/src/+/5402805 when I realized this code is no longer possible to call. It seems like this code became dead in the previous roll (#41514). The patch exposed a `DxdiagDx12VulkanRequested` method on Chromium's `GpuDataManagerImpl`, which we consumed only in our own `GPUInfoManager::NeedsCompleteGpuInfoCollection`. There are no other references to this method, so it and the patch can both be deleted. Yay! * chore: bump chromium in DEPS to 125.0.6392.0 * chore: bump chromium in DEPS to 125.0.6393.0 * chore: update patches * chore: bump chromium in DEPS to 125.0.6394.0 * chore: bump chromium in DEPS to 125.0.6396.0 * chore: bump chromium in DEPS to 125.0.6397.0 * chore: update printing.patch Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5100842 No code changes, but had to apply patch manually due to upstream code shear * chore: update add_maximized_parameter_to_linuxui_getwindowframeprovider.patch No manual changes; patch applied with fuzz 1 * chore: update feat_allow_code_cache_in_custom_schemes.patch No manual changes; patch applied with fuzz 2 * chore: silence "space before tab in indent" git rebase-apply warning * chore: e patches all * build: update all.gn to avoid FTBFS when disabling raw_ptr Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5371737 * Rename PdfService Mojo interface to PdfHost Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5411957 * chore: bump chromium in DEPS to 125.0.6398.0 * chore: update patches * chore: bump chromium in DEPS to 125.0.6400.0 * chore: update patches * [media] Remove unused `GetSupportedKeySystems` from MediaClient Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5420247 * chore: update JSInjection::New call to match upstream change Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5403967 [Extensions] Wire up the renderer for multiple user script worlds * 5362362: Derive display ID from monitor adapter ID instead of szDevice. https://chromium-review.googlesource.com/c/chromium/src/+/5362362 * 5116175: Relocate Windows XPS printing feature helper methods https://chromium-review.googlesource.com/c/chromium/src/+/5116175 * chore: add v8-sandbox.h to electron-node * chore: update patches * chore: update patches * fixup! 5394039: [Extensions] Change blessed -> privileged in extension feature files * chore: bump chromium in DEPS to 125.0.6412.0 * chore: update patches * chore: node script/gen-libc++-filenames.js * [FPF] Create Fingerprinting Protection ruleset service. Refs https://chromium-review.googlesource.com/c/chromium/src/+/5420158 * Add ExclusiveAccessPermissionManager Refs https://chromium-review.googlesource.com/c/chromium/src/+/5273787 * Preserve the PNG colorspace when decoding into a SkBitmap. Refs https://chromium-review.googlesource.com/c/chromium/src/+/5421254 * chore: iwyu * fix: abstract-socket compilation * ci: bump container for node 20 support * fixup! abstract-socket compilation * fix: compiling nan specs * chore: revert winreg version bump accidental bump to 1.2.5 revealed failing app.setasdefaultprotocolclient test suite. Should be revisited separately. * ci: set node 20 for darwin x64 tests * fix: broken patch export * chore: cleanup mas_avoid_private_macos_api_usage.patch.patch Removed code that was inadvertently put back after https://chromium-review.googlesource.com/c/chromium/src/+/5348565 removed it --------- Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: Jeremy Rose <jeremya@chromium.org> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com> Co-authored-by: clavin <clavin@electronjs.org> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: deepak1556 <hop2deep@gmail.com>
218 lines
8.9 KiB
C++
218 lines
8.9 KiB
C++
// Copyright (c) 2017 GitHub, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "shell/renderer/electron_render_frame_observer.h"
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "base/command_line.h"
|
|
#include "base/memory/ref_counted_memory.h"
|
|
#include "base/trace_event/trace_event.h"
|
|
#include "content/public/renderer/render_frame.h"
|
|
#include "electron/buildflags/buildflags.h"
|
|
#include "electron/shell/common/api/api.mojom.h"
|
|
#include "ipc/ipc_message_macros.h"
|
|
#include "net/base/net_module.h"
|
|
#include "net/grit/net_resources.h"
|
|
#include "services/service_manager/public/cpp/interface_provider.h"
|
|
#include "shell/common/gin_helper/microtasks_scope.h"
|
|
#include "shell/common/options_switches.h"
|
|
#include "shell/common/world_ids.h"
|
|
#include "shell/renderer/renderer_client_base.h"
|
|
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
|
|
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
|
|
#include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
|
|
#include "third_party/blink/public/platform/web_isolated_world_info.h"
|
|
#include "third_party/blink/public/web/blink.h"
|
|
#include "third_party/blink/public/web/web_document.h"
|
|
#include "third_party/blink/public/web/web_draggable_region.h"
|
|
#include "third_party/blink/public/web/web_element.h"
|
|
#include "third_party/blink/public/web/web_local_frame.h"
|
|
#include "third_party/blink/public/web/web_script_source.h"
|
|
#include "third_party/blink/public/web/web_view.h"
|
|
#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" // nogncheck
|
|
#include "ui/base/resource/resource_bundle.h"
|
|
|
|
namespace electron {
|
|
|
|
namespace {
|
|
|
|
scoped_refptr<base::RefCountedMemory> NetResourceProvider(int key) {
|
|
if (key == IDR_DIR_HEADER_HTML) {
|
|
return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
|
|
IDR_DIR_HEADER_HTML);
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
[[nodiscard]] constexpr bool is_main_world(int world_id) {
|
|
return world_id == WorldIDs::MAIN_WORLD_ID;
|
|
}
|
|
|
|
[[nodiscard]] constexpr bool is_isolated_world(int world_id) {
|
|
return world_id == WorldIDs::ISOLATED_WORLD_ID;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
ElectronRenderFrameObserver::ElectronRenderFrameObserver(
|
|
content::RenderFrame* frame,
|
|
RendererClientBase* renderer_client)
|
|
: content::RenderFrameObserver(frame),
|
|
render_frame_(frame),
|
|
renderer_client_(renderer_client) {
|
|
// Initialise resource for directory listing.
|
|
net::NetModule::SetResourceProvider(NetResourceProvider);
|
|
|
|
// In Chrome, app regions are only supported in the main frame.
|
|
// However, we need to support draggable regions on other
|
|
// local frames/windows, so extend support beyond the main frame.
|
|
render_frame_->GetWebView()->SetSupportsDraggableRegions(true);
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::DidClearWindowObject() {
|
|
// Do a delayed Node.js initialization for child window.
|
|
// Check DidInstallConditionalFeatures below for the background.
|
|
auto* web_frame =
|
|
static_cast<blink::WebLocalFrameImpl*>(render_frame_->GetWebFrame());
|
|
if (has_delayed_node_initialization_ &&
|
|
!web_frame->IsOnInitialEmptyDocument()) {
|
|
v8::Isolate* isolate = web_frame->GetAgentGroupScheduler()->Isolate();
|
|
v8::HandleScope handle_scope{isolate};
|
|
v8::Handle<v8::Context> context = web_frame->MainWorldScriptContext();
|
|
v8::MicrotasksScope microtasks_scope(
|
|
isolate, context->GetMicrotaskQueue(),
|
|
v8::MicrotasksScope::kDoNotRunMicrotasks);
|
|
v8::Context::Scope context_scope(context);
|
|
// DidClearWindowObject only emits for the main world.
|
|
DidInstallConditionalFeatures(context, MAIN_WORLD_ID);
|
|
}
|
|
|
|
renderer_client_->DidClearWindowObject(render_frame_);
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::DidInstallConditionalFeatures(
|
|
v8::Handle<v8::Context> context,
|
|
int world_id) {
|
|
// When a child window is created with window.open, its WebPreferences will
|
|
// be copied from its parent, and Chromium will initialize JS context in it
|
|
// immediately.
|
|
// Normally the WebPreferences is overridden in browser before navigation,
|
|
// but this behavior bypasses the browser side navigation and the child
|
|
// window will get wrong WebPreferences in the initialization.
|
|
// This will end up initializing Node.js in the child window with wrong
|
|
// WebPreferences, leads to problem that child window having node integration
|
|
// while "nodeIntegration=no" is passed.
|
|
// We work around this issue by delaying the child window's initialization of
|
|
// Node.js if this is the initial empty document, and only do it when the
|
|
// actual page has started to load.
|
|
auto* web_frame =
|
|
static_cast<blink::WebLocalFrameImpl*>(render_frame_->GetWebFrame());
|
|
if (web_frame->Opener() && web_frame->IsOnInitialEmptyDocument()) {
|
|
// FIXME(zcbenz): Chromium does not do any browser side navigation for
|
|
// window.open('about:blank'), so there is no way to override WebPreferences
|
|
// of it. We should not delay Node.js initialization as there will be no
|
|
// further loadings.
|
|
// Please check http://crbug.com/1215096 for updates which may help remove
|
|
// this hack.
|
|
GURL url = web_frame->GetDocument().Url();
|
|
if (!url.IsAboutBlank()) {
|
|
has_delayed_node_initialization_ = true;
|
|
return;
|
|
}
|
|
}
|
|
has_delayed_node_initialization_ = false;
|
|
|
|
auto* isolate = context->GetIsolate();
|
|
v8::MicrotasksScope microtasks_scope(
|
|
isolate, context->GetMicrotaskQueue(),
|
|
v8::MicrotasksScope::kDoNotRunMicrotasks);
|
|
|
|
if (ShouldNotifyClient(world_id))
|
|
renderer_client_->DidCreateScriptContext(context, render_frame_);
|
|
|
|
auto prefs = render_frame_->GetBlinkPreferences();
|
|
bool use_context_isolation = prefs.context_isolation;
|
|
// This logic matches the EXPLAINED logic in electron_renderer_client.cc
|
|
// to avoid explaining it twice go check that implementation in
|
|
// DidCreateScriptContext();
|
|
bool is_main_world = electron::is_main_world(world_id);
|
|
bool is_main_frame = render_frame_->IsMainFrame();
|
|
bool allow_node_in_sub_frames = prefs.node_integration_in_sub_frames;
|
|
|
|
bool should_create_isolated_context =
|
|
use_context_isolation && is_main_world &&
|
|
(is_main_frame || allow_node_in_sub_frames);
|
|
|
|
if (should_create_isolated_context) {
|
|
CreateIsolatedWorldContext();
|
|
if (!renderer_client_->IsWebViewFrame(context, render_frame_))
|
|
renderer_client_->SetupMainWorldOverrides(context, render_frame_);
|
|
}
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::WillReleaseScriptContext(
|
|
v8::Local<v8::Context> context,
|
|
int world_id) {
|
|
if (ShouldNotifyClient(world_id))
|
|
renderer_client_->WillReleaseScriptContext(context, render_frame_);
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::OnDestruct() {
|
|
delete this;
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::DidMeaningfulLayout(
|
|
blink::WebMeaningfulLayout layout_type) {
|
|
if (layout_type == blink::WebMeaningfulLayout::kVisuallyNonEmpty) {
|
|
mojo::AssociatedRemote<mojom::ElectronWebContentsUtility>
|
|
web_contents_utility_remote;
|
|
render_frame_->GetRemoteAssociatedInterfaces()->GetInterface(
|
|
&web_contents_utility_remote);
|
|
web_contents_utility_remote->OnFirstNonEmptyLayout();
|
|
}
|
|
}
|
|
|
|
void ElectronRenderFrameObserver::CreateIsolatedWorldContext() {
|
|
auto* frame = render_frame_->GetWebFrame();
|
|
blink::WebIsolatedWorldInfo info;
|
|
// This maps to the name shown in the context combo box in the Console tab
|
|
// of the dev tools.
|
|
info.human_readable_name =
|
|
blink::WebString::FromUTF8("Electron Isolated Context");
|
|
// Setup document's origin policy in isolated world
|
|
info.security_origin = frame->GetDocument().GetSecurityOrigin();
|
|
blink::SetIsolatedWorldInfo(WorldIDs::ISOLATED_WORLD_ID, info);
|
|
|
|
// Create initial script context in isolated world
|
|
blink::WebScriptSource source("void 0");
|
|
frame->ExecuteScriptInIsolatedWorld(
|
|
WorldIDs::ISOLATED_WORLD_ID, source,
|
|
blink::BackForwardCacheAware::kPossiblyDisallow);
|
|
}
|
|
|
|
bool ElectronRenderFrameObserver::ShouldNotifyClient(int world_id) const {
|
|
const auto& prefs = render_frame_->GetBlinkPreferences();
|
|
|
|
// This is necessary because if an iframe is created and a source is not
|
|
// set, the iframe loads about:blank and creates a script context for the
|
|
// same. We don't want to create a Node.js environment here because if the src
|
|
// is later set, the JS necessary to do that triggers illegal access errors
|
|
// when the initial about:blank Node.js environment is cleaned up. See:
|
|
// https://source.chromium.org/chromium/chromium/src/+/main:content/renderer/render_frame_impl.h;l=870-892;drc=4b6001440a18740b76a1c63fa2a002cc941db394
|
|
const bool allow_node_in_sub_frames = prefs.node_integration_in_sub_frames;
|
|
if (allow_node_in_sub_frames && !render_frame_->IsMainFrame()) {
|
|
if (GURL{render_frame_->GetWebFrame()->GetDocument().Url()}.IsAboutBlank())
|
|
return false;
|
|
}
|
|
|
|
if (prefs.context_isolation &&
|
|
(render_frame_->IsMainFrame() || allow_node_in_sub_frames))
|
|
return is_isolated_world(world_id);
|
|
|
|
return is_main_world(world_id);
|
|
}
|
|
|
|
} // namespace electron
|