Ensure only main frame get notifications
authorCheng Zhao <zcbenz@gmail.com>
Tue, 2 Feb 2016 15:44:33 +0000 (23:44 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Tue, 2 Feb 2016 15:44:33 +0000 (23:44 +0800)
atom/renderer/atom_renderer_client.cc
atom/renderer/atom_renderer_client.h

index 925088e..00ac245 100644 (file)
@@ -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<v8::Context> 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<v8::Context> 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<v8::Context> 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();
 
index a8d404e..59b407b 100644 (file)
@@ -22,8 +22,7 @@ class AtomRendererClient : public content::ContentRendererClient,
   AtomRendererClient();
   virtual ~AtomRendererClient();
 
-  void DidCreateScriptContext(blink::WebFrame* frame,
-                              v8::Handle<v8::Context> context);
+  void DidCreateScriptContext(v8::Handle<v8::Context> context);
   void WillReleaseScriptContext(v8::Handle<v8::Context> context);
 
  private: