From ffcf609de1369b053c8bd077e2e33f5f021b4e4f Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 2 Feb 2016 23:44:33 +0800 Subject: [PATCH] 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 925088e..00ac245 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 a8d404e..59b407b 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: -- 2.7.4