From 4b67ff9534663df5936661ffddae649c142e5d6a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 2 Feb 2016 23:38:49 +0800 Subject: [PATCH 1/4] Override WillReleaseScriptContext --- atom/renderer/atom_renderer_client.cc | 11 ++++++++++- atom/renderer/atom_renderer_client.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 3c97db4b978..925088e3de3 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -52,11 +52,16 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver { // content::RenderFrameObserver: void DidCreateScriptContext(v8::Handle context, int extension_group, - int world_id) { + int world_id) override { renderer_client_->DidCreateScriptContext( render_frame()->GetWebFrame(), context); } + void WillReleaseScriptContext(v8::Local context, + int world_id) override { + renderer_client_->WillReleaseScriptContext(context); + } + private: AtomRendererClient* renderer_client_; @@ -162,6 +167,10 @@ void AtomRendererClient::DidCreateScriptContext( node_bindings_->LoadEnvironment(env); } +void AtomRendererClient::WillReleaseScriptContext( + v8::Handle context) { +} + bool AtomRendererClient::ShouldFork(blink::WebLocalFrame* frame, const GURL& url, const std::string& http_method, diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index beeeb9d530b..a8d404ea8c8 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -24,6 +24,7 @@ class AtomRendererClient : public content::ContentRendererClient, void DidCreateScriptContext(blink::WebFrame* frame, v8::Handle context); + void WillReleaseScriptContext(v8::Handle context); private: enum NodeIntegration { From ffcf609de1369b053c8bd077e2e33f5f021b4e4f Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 2 Feb 2016 23:44:33 +0800 Subject: [PATCH 2/4] Ensure only main frame get notifications --- atom/renderer/atom_renderer_client.cc | 27 ++++++++++++++++----------- atom/renderer/atom_renderer_client.h | 3 +-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 925088e3de3..00ac245070b 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -47,22 +47,27 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver { AtomRenderFrameObserver(content::RenderFrame* frame, AtomRendererClient* renderer_client) : content::RenderFrameObserver(frame), + world_id_(-1), renderer_client_(renderer_client) {} // content::RenderFrameObserver: void DidCreateScriptContext(v8::Handle context, int extension_group, int world_id) override { - renderer_client_->DidCreateScriptContext( - render_frame()->GetWebFrame(), context); + if (world_id_ != -1) + return; + world_id_ = world_id; + renderer_client_->DidCreateScriptContext(context); } - void WillReleaseScriptContext(v8::Local context, int world_id) override { + if (world_id_ != world_id) + return; renderer_client_->WillReleaseScriptContext(context); } private: + int world_id_; AtomRendererClient* renderer_client_; DISALLOW_COPY_AND_ASSIGN(AtomRenderFrameObserver); @@ -82,6 +87,9 @@ void AtomRendererClient::WebKitInitialized() { blink::WebCustomElement::addEmbedderCustomElementName("webview"); blink::WebCustomElement::addEmbedderCustomElementName("browserplugin"); + // Allow file scheme to handle service worker by default. + blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file"); + OverrideNodeArrayBuffer(); node_bindings_->Initialize(); @@ -113,10 +121,12 @@ void AtomRendererClient::RenderThreadStarted() { void AtomRendererClient::RenderFrameCreated( content::RenderFrame* render_frame) { new PepperHelper(render_frame); - new AtomRenderFrameObserver(render_frame, this); - // Allow file scheme to handle service worker by default. - blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file"); + // Only insert node integration for the main frame. + if (!render_frame->IsMainFrame()) + return; + + new AtomRenderFrameObserver(render_frame, this); } void AtomRendererClient::RenderViewCreated(content::RenderView* render_view) { @@ -144,12 +154,7 @@ bool AtomRendererClient::OverrideCreatePlugin( } void AtomRendererClient::DidCreateScriptContext( - blink::WebFrame* frame, v8::Handle context) { - // Only insert node integration for the main frame. - if (frame->parent()) - return; - // Give the node loop a run to make sure everything is ready. node_bindings_->RunMessageLoop(); diff --git a/atom/renderer/atom_renderer_client.h b/atom/renderer/atom_renderer_client.h index a8d404ea8c8..59b407ba1ef 100644 --- a/atom/renderer/atom_renderer_client.h +++ b/atom/renderer/atom_renderer_client.h @@ -22,8 +22,7 @@ class AtomRendererClient : public content::ContentRendererClient, AtomRendererClient(); virtual ~AtomRendererClient(); - void DidCreateScriptContext(blink::WebFrame* frame, - v8::Handle context); + void DidCreateScriptContext(v8::Handle context); void WillReleaseScriptContext(v8::Handle context); private: From bc196c016b9e801fd4c8459f51a70a263a06a1b8 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 2 Feb 2016 23:47:19 +0800 Subject: [PATCH 3/4] Do process.emit('exit') in WillReleaseScriptContext --- atom/renderer/atom_renderer_client.cc | 3 +++ atom/renderer/lib/init.js | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 00ac245070b..7ff87a582a2 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -9,6 +9,7 @@ #include "atom/common/api/api_messages.h" #include "atom/common/api/atom_bindings.h" +#include "atom/common/api/event_emitter_caller.h" #include "atom/common/node_bindings.h" #include "atom/common/node_includes.h" #include "atom/common/options_switches.h" @@ -174,6 +175,8 @@ void AtomRendererClient::DidCreateScriptContext( void AtomRendererClient::WillReleaseScriptContext( v8::Handle context) { + node::Environment* env = node::Environment::GetCurrent(context); + mate::EmitEvent(env->isolate(), env->process_object(), "exit"); } bool AtomRendererClient::ShouldFork(blink::WebLocalFrame* frame, diff --git a/atom/renderer/lib/init.js b/atom/renderer/lib/init.js index 18be7b08011..340a1ef5053 100644 --- a/atom/renderer/lib/init.js +++ b/atom/renderer/lib/init.js @@ -106,11 +106,6 @@ if (nodeIntegration === 'true' || nodeIntegration === 'all' || nodeIntegration = return false; } }; - - // Emit the 'exit' event when page is unloading. - window.addEventListener('unload', function() { - return process.emit('exit'); - }); } else { // Delete Node's symbols after the Environment has been loaded. process.once('loaded', function() { From 47de3f3f24a7a78a8881e477e0d83a2bc9d30e11 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 3 Feb 2016 00:05:27 +0800 Subject: [PATCH 4/4] Fix failing specs --- atom/renderer/atom_renderer_client.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 7ff87a582a2..a996bd0efb2 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -55,7 +55,7 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver { void DidCreateScriptContext(v8::Handle context, int extension_group, int world_id) override { - if (world_id_ != -1) + if (world_id_ != -1 && world_id_ != world_id) return; world_id_ = world_id; renderer_client_->DidCreateScriptContext(context); @@ -88,9 +88,6 @@ void AtomRendererClient::WebKitInitialized() { blink::WebCustomElement::addEmbedderCustomElementName("webview"); blink::WebCustomElement::addEmbedderCustomElementName("browserplugin"); - // Allow file scheme to handle service worker by default. - blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file"); - OverrideNodeArrayBuffer(); node_bindings_->Initialize(); @@ -123,6 +120,9 @@ void AtomRendererClient::RenderFrameCreated( content::RenderFrame* render_frame) { new PepperHelper(render_frame); + // Allow file scheme to handle service worker by default. + blink::WebSecurityPolicy::registerURLSchemeAsAllowingServiceWorkers("file"); + // Only insert node integration for the main frame. if (!render_frame->IsMainFrame()) return;