Merge pull request #3251 from deepak1556/remote_callback_patch

remote: track listeners on browser side
This commit is contained in:
Cheng Zhao 2015-10-31 14:18:58 +08:00
commit 323ab92299
10 changed files with 180 additions and 6 deletions

View file

@ -2,6 +2,10 @@ ipc = require 'ipc'
path = require 'path'
objectsRegistry = require './objects-registry.js'
v8Util = process.atomBinding 'v8_util'
IDWeakMap = process.atomBinding('id_weak_map').IDWeakMap
# Object mapping from webcontents id to their renderer callbacks weakmap.
rendererRegistry = {}
# Convert a real value into meta data.
valueToMeta = (sender, value, optimizeSimpleObject=false) ->
@ -70,18 +74,30 @@ 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 = ->
if rendererReleased
throw new Error("Attempting to call a function in a renderer window
that has been closed or released. Function provided here: #{meta.id}.")
that has been closed or released. Function provided here: #{meta.location}.")
sender.send 'ATOM_RENDERER_CALLBACK', meta.id, valueToMeta(sender, arguments)
v8Util.setDestructor ret, ->
return if rendererReleased
rendererCallbacks.remove meta.id
sender.send 'ATOM_RENDERER_RELEASE_CALLBACK', meta.id
rendererCallbacks.set meta.id, ret
ret
else throw new TypeError("Unknown type: #{meta.type}")
@ -100,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) ->