diff --git a/lib/common/api/callbacks-registry.js b/lib/common/api/callbacks-registry.js index aaafbe4e632..1aca6104e79 100644 --- a/lib/common/api/callbacks-registry.js +++ b/lib/common/api/callbacks-registry.js @@ -10,25 +10,25 @@ class CallbacksRegistry { add (callback) { // The callback is already added. - var filenameAndLine, id, location, match, ref, regexp, stackString - id = v8Util.getHiddenValue(callback, 'callbackId') - if (id != null) { - return id - } - id = ++this.nextId + let id = v8Util.getHiddenValue(callback, 'callbackId') + if (id != null) return id + + id = this.nextId += 1 // 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 - stackString = (new Error()).stack + const regexp = /at (.*)/gi + const stackString = (new Error()).stack + + let ref + let filenameAndLine + let match + while ((match = regexp.exec(stackString)) !== null) { - location = match[1] - if (location.indexOf('(native)') !== -1) { - continue - } - if (location.indexOf('electron.asar') !== -1) { - continue - } + const location = match[1] + if (location.indexOf('(native)') !== -1) continue + if (location.indexOf('electron.asar') !== -1) continue + ref = /([^/^)]*)\)?$/gi.exec(location) filenameAndLine = ref[1] break @@ -40,8 +40,7 @@ class CallbacksRegistry { } get (id) { - var ref - return (ref = this.callbacks[id]) != null ? ref : function () {} + return this.callbacks[id] != null ? this.callbacks[id] : () => {} } apply (id, ...args) { diff --git a/spec/api-callbacks-registry-spec.js b/spec/api-callbacks-registry-spec.js new file mode 100644 index 00000000000..b411be4551e --- /dev/null +++ b/spec/api-callbacks-registry-spec.js @@ -0,0 +1,42 @@ +const assert = require('assert') +const {CallbacksRegistry} = require('electron') + +describe.only('CallbacksRegistry module', () => { + let registry = null + + beforeEach(() => { + registry = new CallbacksRegistry() + }) + + it('adds a callback to the registry', () => { + const cb = () => [1, 2, 3, 4, 5] + const id = registry.add(cb) + assert.equal(id, 1) + }) + + it('returns a specified callback if it is in the registry', () => { + const cb = () => [1, 2, 3, 4, 5] + registry.add(cb) + + const callback = registry.get(1) + assert.equal(callback.toString(), cb.toString()) + }) + + it('returns an empty function if the cb doesnt exist', () => { + const callback = registry.get(1) + assert.equal(callback.toString(), 'function () {}') + }) + + it('removes a callback to the registry', () => { + const cb = () => [1, 2, 3, 4, 5] + const id = registry.add(cb) + assert.equal(id, 1) + + const beforeCB = registry.get(1) + assert.equal(beforeCB.toString(), cb.toString()) + + registry.remove(1) + const afterCB = registry.get(1) + assert.equal(afterCB.toString(), 'function () {}') + }) +}) \ No newline at end of file