diff --git a/docs/development/creating-api.md b/docs/development/creating-api.md index d53a3a579bf0..b80b575f6392 100644 --- a/docs/development/creating-api.md +++ b/docs/development/creating-api.md @@ -117,7 +117,7 @@ void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { - v8::Isolate* isolate = context->GetIsolate(); + v8::Isolate* const isolate = v8::Isolate::GetCurrent(); gin_helper::Dictionary dict(isolate, exports); dict.Set("apiName", electron::api::ApiName::Create(isolate)); } diff --git a/shell/common/gin_helper/promise.cc b/shell/common/gin_helper/promise.cc index 344e583198ab..219633033da9 100644 --- a/shell/common/gin_helper/promise.cc +++ b/shell/common/gin_helper/promise.cc @@ -14,15 +14,15 @@ namespace gin_helper { PromiseBase::SettleScope::SettleScope(const PromiseBase& base) - : handle_scope_{base.isolate()}, + : isolate_{base.isolate()}, + handle_scope_{isolate_}, context_{base.GetContext()}, microtasks_scope_(context_, v8::MicrotasksScope::kRunMicrotasks), context_scope_{context_} {} PromiseBase::SettleScope::~SettleScope() { - if (electron::IsBrowserProcess()) { - context_->GetMicrotaskQueue()->PerformCheckpoint(context_->GetIsolate()); - } + if (electron::IsBrowserProcess()) + context_->GetMicrotaskQueue()->PerformCheckpoint(isolate_); } PromiseBase::PromiseBase(v8::Isolate* isolate) diff --git a/shell/common/gin_helper/promise.h b/shell/common/gin_helper/promise.h index 23da2aee801e..547d43bfcb50 100644 --- a/shell/common/gin_helper/promise.h +++ b/shell/common/gin_helper/promise.h @@ -59,6 +59,7 @@ class PromiseBase { explicit SettleScope(const PromiseBase& base); ~SettleScope(); + const raw_ptr isolate_; v8::HandleScope handle_scope_; v8::Local context_; v8::MicrotasksScope microtasks_scope_; diff --git a/shell/common/node_bindings.cc b/shell/common/node_bindings.cc index 47b9cf5f1adb..c90809e99fb1 100644 --- a/shell/common/node_bindings.cc +++ b/shell/common/node_bindings.cc @@ -1007,8 +1007,9 @@ void OnNodePreload(node::Environment* env, env->isolate(), {node::FIXED_ONE_BYTE_STRING(env->isolate(), "process"), node::FIXED_ONE_BYTE_STRING(env->isolate(), "require")}); v8::LocalVector bundle_args(env->isolate(), {process, require}); - electron::util::CompileAndCall(env->context(), "electron/js2c/node_init", - &bundle_params, &bundle_args); + electron::util::CompileAndCall(env->isolate(), env->context(), + "electron/js2c/node_init", &bundle_params, + &bundle_args); } } // namespace electron diff --git a/shell/common/node_util.cc b/shell/common/node_util.cc index 448329c430dc..fb763208c344 100644 --- a/shell/common/node_util.cc +++ b/shell/common/node_util.cc @@ -21,12 +21,12 @@ namespace electron::util { v8::MaybeLocal CompileAndCall( + v8::Isolate* const isolate, v8::Local context, const char* id, v8::LocalVector* parameters, v8::LocalVector* arguments) { - v8::Isolate* isolate = context->GetIsolate(); - v8::TryCatch try_catch(isolate); + v8::TryCatch try_catch{isolate}; thread_local node::builtins::BuiltinLoader builtin_loader; v8::MaybeLocal compiled = builtin_loader.LookupAndCompile( diff --git a/shell/common/node_util.h b/shell/common/node_util.h index 1ad7fc22a296..b9595e15a2f4 100644 --- a/shell/common/node_util.h +++ b/shell/common/node_util.h @@ -51,6 +51,7 @@ void EmitDeprecationWarning(std::string_view warning_msg, // JS code run with this method can assume that their top-level // declarations won't affect the global scope. v8::MaybeLocal CompileAndCall( + v8::Isolate* isolate, v8::Local context, const char* id, v8::LocalVector* parameters, diff --git a/shell/renderer/electron_render_frame_observer.cc b/shell/renderer/electron_render_frame_observer.cc index 02fb0b35cce2..cfca2519482e 100644 --- a/shell/renderer/electron_render_frame_observer.cc +++ b/shell/renderer/electron_render_frame_observer.cc @@ -122,9 +122,9 @@ void ElectronRenderFrameObserver::DidInstallConditionalFeatures( v8::MicrotasksScope microtasks_scope( context, v8::MicrotasksScope::kDoNotRunMicrotasks); + v8::Isolate* const isolate = v8::Isolate::GetCurrent(); if (ShouldNotifyClient(world_id)) - renderer_client_->DidCreateScriptContext(v8::Isolate::GetCurrent(), context, - render_frame_); + renderer_client_->DidCreateScriptContext(isolate, context, render_frame_); auto prefs = render_frame_->GetBlinkPreferences(); bool use_context_isolation = prefs.context_isolation; @@ -141,8 +141,9 @@ void ElectronRenderFrameObserver::DidInstallConditionalFeatures( if (should_create_isolated_context) { CreateIsolatedWorldContext(); - if (!renderer_client_->IsWebViewFrame(context, render_frame_)) - renderer_client_->SetupMainWorldOverrides(context, render_frame_); + if (!renderer_client_->IsWebViewFrame(isolate, context, render_frame_)) + renderer_client_->SetupMainWorldOverrides(isolate, context, + render_frame_); } } @@ -150,7 +151,8 @@ void ElectronRenderFrameObserver::WillReleaseScriptContext( v8::Local context, int world_id) { if (ShouldNotifyClient(world_id)) - renderer_client_->WillReleaseScriptContext(context, render_frame_); + renderer_client_->WillReleaseScriptContext(context->GetIsolate(), context, + render_frame_); } void ElectronRenderFrameObserver::OnDestruct() { diff --git a/shell/renderer/electron_renderer_client.cc b/shell/renderer/electron_renderer_client.cc index 5e8b126662b8..d9cf97f6f85a 100644 --- a/shell/renderer/electron_renderer_client.cc +++ b/shell/renderer/electron_renderer_client.cc @@ -98,7 +98,7 @@ void ElectronRendererClient::DidCreateScriptContext( // Only load Node.js if we are a main frame or a devtools extension // unless Node.js support has been explicitly enabled for subframes. - if (!ShouldLoadPreload(renderer_context, render_frame)) + if (!ShouldLoadPreload(isolate, renderer_context, render_frame)) return; injected_frames_.insert(render_frame); @@ -178,6 +178,7 @@ void ElectronRendererClient::DidCreateScriptContext( } void ElectronRendererClient::WillReleaseScriptContext( + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) { if (injected_frames_.erase(render_frame) == 0) @@ -189,7 +190,7 @@ void ElectronRendererClient::WillReleaseScriptContext( if (iter == environments_.end()) return; - gin_helper::EmitEvent(env->isolate(), env->process_object(), "exit"); + gin_helper::EmitEvent(isolate, env->process_object(), "exit"); // The main frame may be replaced. if (env == node_bindings_->uv_env()) diff --git a/shell/renderer/electron_renderer_client.h b/shell/renderer/electron_renderer_client.h index 7184741d2c37..35fff484e9cd 100644 --- a/shell/renderer/electron_renderer_client.h +++ b/shell/renderer/electron_renderer_client.h @@ -32,7 +32,8 @@ class ElectronRendererClient : public RendererClientBase { void DidCreateScriptContext(v8::Isolate* isolate, v8::Local context, content::RenderFrame* render_frame) override; - void WillReleaseScriptContext(v8::Local context, + void WillReleaseScriptContext(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame) override; private: diff --git a/shell/renderer/electron_sandboxed_renderer_client.cc b/shell/renderer/electron_sandboxed_renderer_client.cc index 702ab6879536..4243a128f2c8 100644 --- a/shell/renderer/electron_sandboxed_renderer_client.cc +++ b/shell/renderer/electron_sandboxed_renderer_client.cc @@ -36,9 +36,9 @@ constinit thread_local ServiceWorkerData* service_worker_data = nullptr; constexpr std::string_view kEmitProcessEventKey = "emit-process-event"; -void InvokeEmitProcessEvent(v8::Local context, +void InvokeEmitProcessEvent(v8::Isolate* const isolate, + v8::Local context, const std::string& event_name) { - auto* isolate = context->GetIsolate(); // set by sandboxed_renderer/init.js auto binding_key = gin::ConvertToV8(isolate, kEmitProcessEventKey) ->ToString(context) @@ -69,9 +69,9 @@ ElectronSandboxedRendererClient::~ElectronSandboxedRendererClient() = default; void ElectronSandboxedRendererClient::InitializeBindings( v8::Local binding, + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) { - auto* isolate = context->GetIsolate(); gin_helper::Dictionary b(isolate, binding); b.SetMethod("get", preload_utils::GetBinding); b.SetMethod("createPreloadScript", preload_utils::CreatePreloadScript); @@ -114,7 +114,7 @@ void ElectronSandboxedRendererClient::DidCreateScriptContext( // Only allow preload for the main frame or // For devtools we still want to run the preload_bundle script // Or when nodeSupport is explicitly enabled in sub frames - if (!ShouldLoadPreload(context, render_frame)) + if (!ShouldLoadPreload(isolate, context, render_frame)) return; injected_frames_.insert(render_frame); @@ -122,7 +122,7 @@ void ElectronSandboxedRendererClient::DidCreateScriptContext( // Wrap the bundle into a function that receives the binding object as // argument. auto binding = v8::Object::New(isolate); - InitializeBindings(binding, context, render_frame); + InitializeBindings(binding, isolate, context, render_frame); v8::LocalVector sandbox_preload_bundle_params( isolate, {node::FIXED_ONE_BYTE_STRING(isolate, "binding")}); @@ -130,26 +130,26 @@ void ElectronSandboxedRendererClient::DidCreateScriptContext( v8::LocalVector sandbox_preload_bundle_args(isolate, {binding}); util::CompileAndCall( - isolate->GetCurrentContext(), "electron/js2c/sandbox_bundle", + isolate, isolate->GetCurrentContext(), "electron/js2c/sandbox_bundle", &sandbox_preload_bundle_params, &sandbox_preload_bundle_args); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(context); - InvokeEmitProcessEvent(context, "loaded"); + v8::HandleScope handle_scope{isolate}; + v8::Context::Scope context_scope{context}; + InvokeEmitProcessEvent(isolate, context, "loaded"); } void ElectronSandboxedRendererClient::WillReleaseScriptContext( + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) { if (injected_frames_.erase(render_frame) == 0) return; - auto* isolate = context->GetIsolate(); v8::MicrotasksScope microtasks_scope( context, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(context); - InvokeEmitProcessEvent(context, "exit"); + v8::HandleScope handle_scope{isolate}; + v8::Context::Scope context_scope{context}; + InvokeEmitProcessEvent(isolate, context, "exit"); } void ElectronSandboxedRendererClient::EmitProcessEvent( @@ -163,11 +163,11 @@ void ElectronSandboxedRendererClient::EmitProcessEvent( v8::HandleScope handle_scope{isolate}; v8::Local context = GetContext(frame, isolate); - v8::MicrotasksScope microtasks_scope( - context, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Context::Scope context_scope(context); + v8::MicrotasksScope microtasks_scope{ + context, v8::MicrotasksScope::kDoNotRunMicrotasks}; + v8::Context::Scope context_scope{context}; - InvokeEmitProcessEvent(context, event_name); + InvokeEmitProcessEvent(isolate, context, event_name); } void ElectronSandboxedRendererClient::WillEvaluateServiceWorkerOnWorkerThread( @@ -183,12 +183,14 @@ void ElectronSandboxedRendererClient::WillEvaluateServiceWorkerOnWorkerThread( auto* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kServiceWorkerPreload)) { + v8::Isolate* const v8_isolate = v8_context->GetIsolate(); + if (!service_worker_data) { - service_worker_data = new ServiceWorkerData( - context_proxy, service_worker_version_id, v8_context); + service_worker_data = new ServiceWorkerData{ + context_proxy, service_worker_version_id, v8_isolate, v8_context}; } - preload_realm::OnCreatePreloadableV8Context(v8_context, + preload_realm::OnCreatePreloadableV8Context(v8_isolate, v8_context, service_worker_data); } } diff --git a/shell/renderer/electron_sandboxed_renderer_client.h b/shell/renderer/electron_sandboxed_renderer_client.h index 3e36e19c3492..42e72ddd1852 100644 --- a/shell/renderer/electron_sandboxed_renderer_client.h +++ b/shell/renderer/electron_sandboxed_renderer_client.h @@ -31,13 +31,15 @@ class ElectronSandboxedRendererClient : public RendererClientBase { const ElectronSandboxedRendererClient&) = delete; void InitializeBindings(v8::Local binding, + v8::Isolate* isolate, v8::Local context, content::RenderFrame* render_frame); // electron::RendererClientBase: void DidCreateScriptContext(v8::Isolate* isolate, v8::Local context, content::RenderFrame* render_frame) override; - void WillReleaseScriptContext(v8::Local context, + void WillReleaseScriptContext(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame) override; // content::ContentRendererClient: void RenderFrameCreated(content::RenderFrame*) override; diff --git a/shell/renderer/preload_realm_context.cc b/shell/renderer/preload_realm_context.cc index 2ff76548d9c7..1912c9aabcc8 100644 --- a/shell/renderer/preload_realm_context.cc +++ b/shell/renderer/preload_realm_context.cc @@ -181,7 +181,7 @@ class PreloadRealmLifetimeController v8::LocalVector preload_realm_bundle_args(isolate, {binding}); - util::CompileAndCall(context, "electron/js2c/preload_realm_bundle", + util::CompileAndCall(isolate, context, "electron/js2c/preload_realm_bundle", &preload_realm_bundle_params, &preload_realm_bundle_args); } @@ -232,9 +232,9 @@ electron::ServiceWorkerData* GetServiceWorkerData( } void OnCreatePreloadableV8Context( + v8::Isolate* const isolate, v8::Local initiator_context, electron::ServiceWorkerData* service_worker_data) { - v8::Isolate* isolate = initiator_context->GetIsolate(); blink::ScriptState* initiator_script_state = blink::ScriptState::MaybeFrom(isolate, initiator_context); DCHECK(initiator_script_state); diff --git a/shell/renderer/preload_realm_context.h b/shell/renderer/preload_realm_context.h index 4a57670cb1ba..ec5f35472237 100644 --- a/shell/renderer/preload_realm_context.h +++ b/shell/renderer/preload_realm_context.h @@ -26,6 +26,7 @@ electron::ServiceWorkerData* GetServiceWorkerData( // Create void OnCreatePreloadableV8Context( + v8::Isolate* const isolate, v8::Local initiator_context, electron::ServiceWorkerData* service_worker_data); diff --git a/shell/renderer/renderer_client_base.cc b/shell/renderer/renderer_client_base.cc index d82e4f125bfb..4d2548c6074a 100644 --- a/shell/renderer/renderer_client_base.cc +++ b/shell/renderer/renderer_client_base.cc @@ -196,6 +196,7 @@ void RendererClientBase::BindProcess(v8::Isolate* isolate, } bool RendererClientBase::ShouldLoadPreload( + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) const { auto prefs = render_frame->GetBlinkPreferences(); @@ -205,7 +206,7 @@ bool RendererClientBase::ShouldLoadPreload( bool allow_node_in_sub_frames = prefs.node_integration_in_sub_frames; return (is_main_frame || is_devtools || allow_node_in_sub_frames) && - !IsWebViewFrame(context, render_frame); + !IsWebViewFrame(isolate, context, render_frame); } void RendererClientBase::RenderThreadStarted() { @@ -545,10 +546,9 @@ v8::Local RendererClientBase::GetContext( } bool RendererClientBase::IsWebViewFrame( + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) const { - auto* isolate = context->GetIsolate(); - if (render_frame->IsMainFrame()) return false; @@ -566,6 +566,7 @@ bool RendererClientBase::IsWebViewFrame( } void RendererClientBase::SetupMainWorldOverrides( + v8::Isolate* const isolate, v8::Local context, content::RenderFrame* render_frame) { auto prefs = render_frame->GetBlinkPreferences(); @@ -576,9 +577,8 @@ void RendererClientBase::SetupMainWorldOverrides( // Setup window overrides in the main world context // Wrap the bundle into a function that receives the isolatedApi as // an argument. - auto* isolate = context->GetIsolate(); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(context); + v8::HandleScope handle_scope{isolate}; + v8::Context::Scope context_scope{context}; auto isolated_api = gin_helper::Dictionary::CreateEmpty(isolate); isolated_api.SetMethod("allowGuestViewElementDefinition", @@ -604,7 +604,7 @@ void RendererClientBase::SetupMainWorldOverrides( v8::LocalVector isolated_bundle_args(isolate, {isolated_api.GetHandle()}); - util::CompileAndCall(context, "electron/js2c/isolated_bundle", + util::CompileAndCall(isolate, context, "electron/js2c/isolated_bundle", &isolated_bundle_params, &isolated_bundle_args); } diff --git a/shell/renderer/renderer_client_base.h b/shell/renderer/renderer_client_base.h index 7311e832ae41..c14158eef53f 100644 --- a/shell/renderer/renderer_client_base.h +++ b/shell/renderer/renderer_client_base.h @@ -59,10 +59,12 @@ class RendererClientBase : public content::ContentRendererClient virtual void DidCreateScriptContext(v8::Isolate* isolate, v8::Local context, content::RenderFrame* render_frame) = 0; - virtual void WillReleaseScriptContext(v8::Local context, + virtual void WillReleaseScriptContext(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame) = 0; virtual void DidClearWindowObject(content::RenderFrame* render_frame); - virtual void SetupMainWorldOverrides(v8::Local context, + virtual void SetupMainWorldOverrides(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame); std::unique_ptr CreatePrescientNetworking( @@ -77,7 +79,8 @@ class RendererClientBase : public content::ContentRendererClient v8::Local context, v8::Local register_cb); - bool IsWebViewFrame(v8::Local context, + bool IsWebViewFrame(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame) const; #if BUILDFLAG(ENABLE_BUILTIN_SPELLCHECKER) @@ -89,7 +92,8 @@ class RendererClientBase : public content::ContentRendererClient gin_helper::Dictionary* process, content::RenderFrame* render_frame); - bool ShouldLoadPreload(v8::Local context, + bool ShouldLoadPreload(v8::Isolate* isolate, + v8::Local context, content::RenderFrame* render_frame) const; // content::ContentRendererClient: diff --git a/shell/renderer/service_worker_data.cc b/shell/renderer/service_worker_data.cc index 63f6f3364112..1484148a7294 100644 --- a/shell/renderer/service_worker_data.cc +++ b/shell/renderer/service_worker_data.cc @@ -18,11 +18,12 @@ ServiceWorkerData::~ServiceWorkerData() = default; ServiceWorkerData::ServiceWorkerData(blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, + v8::Isolate* const isolate, const v8::Local& v8_context) - : proxy_(proxy), - service_worker_version_id_(service_worker_version_id), - isolate_(v8_context->GetIsolate()), - v8_context_(v8_context->GetIsolate(), v8_context) { + : proxy_{proxy}, + service_worker_version_id_{service_worker_version_id}, + isolate_{isolate}, + v8_context_(isolate_, v8_context) { proxy_->GetAssociatedInterfaceRegistry() .AddInterface( base::BindRepeating(&ServiceWorkerData::OnElectronRendererRequest, diff --git a/shell/renderer/service_worker_data.h b/shell/renderer/service_worker_data.h index 9a6387a24362..73a5b343a735 100644 --- a/shell/renderer/service_worker_data.h +++ b/shell/renderer/service_worker_data.h @@ -25,6 +25,7 @@ class ServiceWorkerData : public mojom::ElectronRenderer { public: ServiceWorkerData(blink::WebServiceWorkerContextProxy* proxy, int64_t service_worker_version_id, + v8::Isolate* const isolate, const v8::Local& v8_context); ~ServiceWorkerData() override;