use webcontents id to identify callbacks
authorRobo <hop2deep@gmail.com>
Fri, 30 Oct 2015 03:04:40 +0000 (08:34 +0530)
committerRobo <hop2deep@gmail.com>
Fri, 30 Oct 2015 14:21:19 +0000 (19:51 +0530)
atom/browser/lib/rpc-server.coffee
atom/common/api/atom_api_id_weak_map.cc
atom/common/api/atom_api_id_weak_map.h
atom/common/api/lib/callbacks-registry.coffee
atom/common/id_weak_map.cc
atom/common/id_weak_map.h

index 40e1b0e..eb97c72 100644 (file)
@@ -4,8 +4,8 @@ objectsRegistry = require './objects-registry.js'
 v8Util = process.atomBinding 'v8_util'
 IDWeakMap = process.atomBinding('id_weak_map').IDWeakMap
 
-# Weak reference to callback with their registry ID.
-rendererCallbacks = new IDWeakMap()
+# Object mapping from webcontents id to their renderer callbacks weakmap.
+rendererRegistry = {}
 
 # Convert a real value into meta data.
 valueToMeta = (sender, value, optimizeSimpleObject=false) ->
@@ -74,11 +74,18 @@ unwrapArgs = (sender, args) ->
         returnValue = metaToValue meta.value
         -> returnValue
       when 'function'
+        webContentsId = sender.getId()
+        rendererCallbacks = rendererRegistry[webContentsId]
+        if not rendererCallbacks?
+          # Weak reference to callbacks with their ID
+          rendererCallbacks = new IDWeakMap()
+          rendererRegistry[webContentsId] = rendererCallbacks
+
         if rendererCallbacks.has(meta.id)
           return rendererCallbacks.get(meta.id)
 
         rendererReleased = false
-        objectsRegistry.once "clear-#{sender.getId()}", ->
+        objectsRegistry.once "clear-#{webContentsId}", ->
           rendererReleased = true
 
         ret = ->
@@ -109,6 +116,8 @@ callFunction = (event, func, caller, args) ->
 
 # Send by BrowserWindow when its render view is deleted.
 process.on 'ATOM_BROWSER_RELEASE_RENDER_VIEW', (id) ->
+  if rendererRegistry.id?
+    delete rendererRegistry.id
   objectsRegistry.clear id
 
 ipc.on 'ATOM_BROWSER_REQUIRE', (event, module) ->
index bdc298f..8c17e83 100644 (file)
@@ -12,11 +12,11 @@ namespace atom {
 
 namespace api {
 
-IDWeakMap::IDWeakMap() {
-  id_weak_map_.reset(new atom::IDWeakMap);
+IDWeakMap::IDWeakMap() : id_weak_map_(new atom::IDWeakMap) {
 }
 
 IDWeakMap::~IDWeakMap() {
+  id_weak_map_ = nullptr;
 }
 
 void IDWeakMap::Set(v8::Isolate* isolate,
index 3acdddc..4a2f8e3 100644 (file)
@@ -22,7 +22,7 @@ class IDWeakMap : public mate::Wrappable {
 
  protected:
   IDWeakMap();
-  virtual ~IDWeakMap();
+  ~IDWeakMap();
 
   // mate::Wrappable:
   bool IsDestroyed() const override;
@@ -34,7 +34,7 @@ class IDWeakMap : public mate::Wrappable {
   bool Has(int32_t id);
   void Remove(int32_t id);
 
-  scoped_ptr<atom::IDWeakMap> id_weak_map_;
+  atom::IDWeakMap* id_weak_map_;
 
   DISALLOW_COPY_AND_ASSIGN(IDWeakMap);
 };
index 57f5d03..001ecae 100644 (file)
@@ -22,8 +22,6 @@ class CallbacksRegistry
       continue if location.indexOf('(native)') isnt -1
       continue if location.indexOf('atom.asar') isnt -1
       [x, filenameAndLine] = /([^/^\)]*)\)?$/gi.exec(location)
-      [x, line, column] = /(\d+):(\d+)/g.exec(filenameAndLine)
-      id += parseInt(line) + parseInt(column)
       break
 
     @callbacks[id] = callback
index 7fda009..a78dcbc 100644 (file)
@@ -32,15 +32,6 @@ IDWeakMap::IDWeakMap() : next_id_(0) {
 IDWeakMap::~IDWeakMap() {
 }
 
-int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local<v8::Object> object) {
-  int32_t id = GetNextID();
-  auto global = make_linked_ptr(new v8::Global<v8::Object>(isolate, object));
-  ObjectKey* key = new ObjectKey(id, this);
-  global->SetWeak(key, OnObjectGC, v8::WeakCallbackType::kParameter);
-  map_[id] = global;
-  return id;
-}
-
 void IDWeakMap::Set(v8::Isolate* isolate,
                     int32_t id,
                     v8::Local<v8::Object> object) {
@@ -50,6 +41,12 @@ void IDWeakMap::Set(v8::Isolate* isolate,
   map_[id] = global;
 }
 
+int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local<v8::Object> object) {
+  int32_t id = GetNextID();
+  Set(isolate, id, object);
+  return id;
+}
+
 v8::MaybeLocal<v8::Object> IDWeakMap::Get(v8::Isolate* isolate, int32_t id) {
   auto iter = map_.find(id);
   if (iter == map_.end())
index 688e85c..72c64c6 100644 (file)
@@ -19,12 +19,12 @@ class IDWeakMap {
   IDWeakMap();
   ~IDWeakMap();
 
-  // Adds |object| to WeakMap and returns its allocated |id|.
-  int32_t Add(v8::Isolate* isolate, v8::Local<v8::Object> object);
-
   // Sets the object to WeakMap with the given |id|.
   void Set(v8::Isolate* isolate, int32_t id, v8::Local<v8::Object> object);
 
+  // Adds |object| to WeakMap and returns its allocated |id|.
+  int32_t Add(v8::Isolate* isolate, v8::Local<v8::Object> object);
+
   // Gets the object from WeakMap by its |id|.
   v8::MaybeLocal<v8::Object> Get(v8::Isolate* isolate, int32_t id);