Merge pull request #3251 from deepak1556/remote_callback_patch
remote: track listeners on browser side
This commit is contained in:
commit
323ab92299
10 changed files with 180 additions and 6 deletions
|
@ -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) ->
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue