objectsRegistry = require './objects-registry.js'
v8Util = process.atomBinding 'v8_util'
+# caches callback with their registry ID.
+rendererCallbacks = {}
+
# Convert a real value into meta data.
valueToMeta = (sender, value, optimizeSimpleObject=false) ->
meta = type: typeof value
objectsRegistry.once "clear-#{sender.getId()}", ->
rendererReleased = true
+ return rendererCallbacks[meta.id] if rendererCallbacks[meta.id]?
+
ret = ->
if rendererReleased
throw new Error("Attempting to call a function in a renderer window
sender.send 'ATOM_RENDERER_CALLBACK', meta.id, valueToMeta(sender, arguments)
v8Util.setDestructor ret, ->
return if rendererReleased
+ delete rendererCallbacks[meta.id]
sender.send 'ATOM_RENDERER_RELEASE_CALLBACK', meta.id
+ rendererCallbacks[meta.id] = ret
ret
else throw new TypeError("Unknown type: #{meta.type}")
add: (callback) ->
id = ++@nextId
+ for id,value of @callbacks
+ if value == callback
+ return id
+
# Capture the location of the function and put it in the ID string,
# so that release errors can be tracked down easily.
regexp = /at (.*)/gi
w.destroy()
done()
w.loadUrl 'file://' + path.join(fixtures, 'api', 'send-sync-message.html')
+
+ describe 'remote listeners', ->
+ it 'can be added and removed correctly', ->
+ count = 0
+ w = new BrowserWindow(show: false)
+ listener = () ->
+ count += 1
+ w.removeListener 'blur', listener
+ w.on 'blur', listener
+ w.emit 'blur'
+ w.emit 'blur'
+ assert.equal count, 1
+ w.destroy()