From 67f998357c4dc9dea6eabcfdb6953c7e387cff4b Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sun, 5 May 2013 20:30:38 +0800 Subject: [PATCH] Make the CallbacksRegistry a separate module, though rather small. --- atom.gyp | 1 + browser/api/lib/dialog.coffee | 28 ++++++------------------ common/api/lib/callbacks_registry.coffee | 21 ++++++++++++++++++ renderer/api/lib/remote.coffee | 22 +++++-------------- 4 files changed, 34 insertions(+), 38 deletions(-) create mode 100644 common/api/lib/callbacks_registry.coffee diff --git a/atom.gyp b/atom.gyp index 7f86ec5583a9..cebb03c2900a 100644 --- a/atom.gyp +++ b/atom.gyp @@ -14,6 +14,7 @@ 'browser/atom/atom.coffee', 'browser/atom/objects_registry.coffee', 'browser/atom/rpc_server.coffee', + 'common/api/lib/callbacks_registry.coffee', 'common/api/lib/clipboard.coffee', 'common/api/lib/id_weak_map.coffee', 'common/api/lib/shell.coffee', diff --git a/browser/api/lib/dialog.coffee b/browser/api/lib/dialog.coffee index 20f83d053c2a..473368ef8324 100644 --- a/browser/api/lib/dialog.coffee +++ b/browser/api/lib/dialog.coffee @@ -1,36 +1,22 @@ binding = process.atomBinding 'dialog' +CallbacksRegistry = require 'callbacks_registry' EventEmitter = require('events').EventEmitter ipc = require 'ipc' FileDialog = binding.FileDialog FileDialog.prototype.__proto__ = EventEmitter.prototype -class CallbacksRegistry - @nextId = 0 - @callbacks = {} - - @add: (callback) -> - @callbacks[++@nextId] = callback - @nextId - - @get: (id) -> - @callbacks[id] - - @call: (id, args...) -> - @callbacks[id].call global, args... - - @remove: (id) -> - delete @callbacks[id] +callbacksRegistry = new CallbacksRegistry fileDialog = new FileDialog fileDialog.on 'selected', (event, callbackId, paths...) -> - CallbacksRegistry.call callbackId, 'selected', paths... - CallbacksRegistry.remove callbackId + callbacksRegistry.call callbackId, 'selected', paths... + callbacksRegistry.remove callbackId fileDialog.on 'cancelled', (event, callbackId) -> - CallbacksRegistry.call callbackId, 'cancelled' - CallbacksRegistry.remove callbackId + callbacksRegistry.call callbackId, 'cancelled' + callbacksRegistry.remove callbackId validateOptions = (options) -> return false unless typeof options is 'object' @@ -55,7 +41,7 @@ selectFileWrap = (window, options, callback, type, title) -> throw new TypeError('Bad arguments') unless validateOptions options - callbackId = CallbacksRegistry.add callback + callbackId = callbacksRegistry.add callback fileDialog.selectFile window.getProcessId(), window.getRoutingId(), options.type, diff --git a/common/api/lib/callbacks_registry.coffee b/common/api/lib/callbacks_registry.coffee new file mode 100644 index 000000000000..6a0120bf1d60 --- /dev/null +++ b/common/api/lib/callbacks_registry.coffee @@ -0,0 +1,21 @@ +module.exports = +class CallbacksRegistry + constructor: -> + @nextId = 0 + @callbacks = {} + + add: (callback) -> + @callbacks[++@nextId] = callback + @nextId + + get: (id) -> + @callbacks[id] + + call: (id, args...) -> + @get(id).call global, args... + + apply: (id, args...) -> + @get(id).apply global, args... + + remove: (id) -> + delete @callbacks[id] diff --git a/renderer/api/lib/remote.coffee b/renderer/api/lib/remote.coffee index 8416fd8a8ea9..74e3fdc9e1b7 100644 --- a/renderer/api/lib/remote.coffee +++ b/renderer/api/lib/remote.coffee @@ -1,21 +1,9 @@ ipc = require 'ipc' +CallbacksRegistry = require 'callbacks_registry' v8_util = process.atomBinding 'v8_util' currentContextExist = true - -class CallbacksRegistry - @nextId = 0 - @callbacks = {} - - @add: (callback) -> - @callbacks[++@nextId] = callback - @nextId - - @call: (id, args) -> - @callbacks[id].apply global, args - - @remove: (id) -> - delete @callbacks[id] +callbacksRegistry = new CallbacksRegistry # Convert the arguments object into an array of meta data. wrapArgs = (args) -> @@ -23,7 +11,7 @@ wrapArgs = (args) -> if typeof value is 'object' and v8_util.getHiddenValue value, 'isRemoteObject' type: 'object', id: value.id else if typeof value is 'function' - type: 'function', id: CallbacksRegistry.add(value) + type: 'function', id: callbacksRegistry.add(value) else type: 'value', value: value @@ -85,11 +73,11 @@ metaToValue = (meta) -> # Browser calls a callback in renderer. ipc.on 'ATOM_RENDERER_CALLBACK', (id, args) -> - CallbacksRegistry.call id, metaToValue(args) + callbacksRegistry.apply id, metaToValue(args) # A callback in browser is released. ipc.on 'ATOM_RENDERER_RELEASE_CALLBACK', (id) -> - CallbacksRegistry.remove id + callbacksRegistry.remove id # Release all resources of current render view when it's going to be unloaded. window.addEventListener 'unload', (event) ->