From 2c59f4567e2e1b707b0e5493188f0106801837e4 Mon Sep 17 00:00:00 2001 From: Robo Date: Fri, 30 Oct 2015 08:34:40 +0530 Subject: [PATCH] use webcontents id to identify callbacks --- atom/browser/lib/rpc-server.coffee | 15 ++++++++++++--- atom/common/api/atom_api_id_weak_map.cc | 4 ++-- atom/common/api/atom_api_id_weak_map.h | 4 ++-- atom/common/api/lib/callbacks-registry.coffee | 2 -- atom/common/id_weak_map.cc | 15 ++++++--------- atom/common/id_weak_map.h | 6 +++--- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/atom/browser/lib/rpc-server.coffee b/atom/browser/lib/rpc-server.coffee index 40e1b0e46ac7..eb97c721396f 100644 --- a/atom/browser/lib/rpc-server.coffee +++ b/atom/browser/lib/rpc-server.coffee @@ -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) -> diff --git a/atom/common/api/atom_api_id_weak_map.cc b/atom/common/api/atom_api_id_weak_map.cc index bdc298fa0c49..8c17e8330ccc 100644 --- a/atom/common/api/atom_api_id_weak_map.cc +++ b/atom/common/api/atom_api_id_weak_map.cc @@ -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, diff --git a/atom/common/api/atom_api_id_weak_map.h b/atom/common/api/atom_api_id_weak_map.h index 3acdddc9c75f..4a2f8e397a80 100644 --- a/atom/common/api/atom_api_id_weak_map.h +++ b/atom/common/api/atom_api_id_weak_map.h @@ -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 id_weak_map_; + atom::IDWeakMap* id_weak_map_; DISALLOW_COPY_AND_ASSIGN(IDWeakMap); }; diff --git a/atom/common/api/lib/callbacks-registry.coffee b/atom/common/api/lib/callbacks-registry.coffee index 57f5d0343dc2..001ecae14a61 100644 --- a/atom/common/api/lib/callbacks-registry.coffee +++ b/atom/common/api/lib/callbacks-registry.coffee @@ -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 diff --git a/atom/common/id_weak_map.cc b/atom/common/id_weak_map.cc index 7fda009e0ee1..a78dcbceba53 100644 --- a/atom/common/id_weak_map.cc +++ b/atom/common/id_weak_map.cc @@ -32,15 +32,6 @@ IDWeakMap::IDWeakMap() : next_id_(0) { IDWeakMap::~IDWeakMap() { } -int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local object) { - int32_t id = GetNextID(); - auto global = make_linked_ptr(new v8::Global(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 object) { @@ -50,6 +41,12 @@ void IDWeakMap::Set(v8::Isolate* isolate, map_[id] = global; } +int32_t IDWeakMap::Add(v8::Isolate* isolate, v8::Local object) { + int32_t id = GetNextID(); + Set(isolate, id, object); + return id; +} + v8::MaybeLocal IDWeakMap::Get(v8::Isolate* isolate, int32_t id) { auto iter = map_.find(id); if (iter == map_.end()) diff --git a/atom/common/id_weak_map.h b/atom/common/id_weak_map.h index 688e85cd0cce..72c64c6ae5d4 100644 --- a/atom/common/id_weak_map.h +++ b/atom/common/id_weak_map.h @@ -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 object); - // Sets the object to WeakMap with the given |id|. void Set(v8::Isolate* isolate, int32_t id, v8::Local object); + // Adds |object| to WeakMap and returns its allocated |id|. + int32_t Add(v8::Isolate* isolate, v8::Local object); + // Gets the object from WeakMap by its |id|. v8::MaybeLocal Get(v8::Isolate* isolate, int32_t id);