diff --git a/native/atom_application.mm b/native/atom_application.mm index 218cf0c50..b94a0ccdc 100644 --- a/native/atom_application.mm +++ b/native/atom_application.mm @@ -129,7 +129,7 @@ CefString(&settings.cache_path) = [[self supportDirectory] UTF8String]; CefString(&settings.user_agent) = [userAgent UTF8String]; CefString(&settings.log_file) = ""; - CefString(&settings.javascript_flags) = ""; + CefString(&settings.javascript_flags) = "--harmony_collections"; settings.remote_debugging_port = 9090; settings.log_severity = LOGSEVERITY_ERROR; return settings; diff --git a/spec/stdlib/subscriber-spec.coffee b/spec/stdlib/subscriber-spec.coffee new file mode 100644 index 000000000..60f43cd40 --- /dev/null +++ b/spec/stdlib/subscriber-spec.coffee @@ -0,0 +1,42 @@ +Subscriber = require 'subscriber' +EventEmitter = require 'event-emitter' +_ = require 'underscore' + +describe "Subscriber", -> + [emitter1, emitter2, event1Handler, event2Handler, subscriber] = [] + + class TestEventEmitter + _.extend TestEventEmitter.prototype, EventEmitter + + class TestSubscriber + _.extend TestSubscriber.prototype, Subscriber + + beforeEach -> + emitter1 = new TestEventEmitter + emitter2 = new TestEventEmitter + subscriber = new TestSubscriber + event1Handler = jasmine.createSpy("event1Handler") + event2Handler = jasmine.createSpy("event2Handler") + subscriber.subscribe emitter1, 'event1', event1Handler + subscriber.subscribe emitter2, 'event2', event2Handler + + it "subscribes to events on the specified object", -> + emitter1.trigger 'event1', 'foo' + expect(event1Handler).toHaveBeenCalledWith('foo') + + emitter2.trigger 'event2', 'bar' + expect(event2Handler).toHaveBeenCalledWith('bar') + + it "allows an object to unsubscribe en-masse", -> + subscriber.unsubscribe() + emitter1.trigger 'event1', 'foo' + emitter2.trigger 'event2', 'bar' + expect(event1Handler).not.toHaveBeenCalled() + expect(event2Handler).not.toHaveBeenCalled() + + it "allows an object to unsubscribe from a specific object", -> + subscriber.unsubscribe(emitter1) + emitter1.trigger 'event1', 'foo' + emitter2.trigger 'event2', 'bar' + expect(event1Handler).not.toHaveBeenCalled() + expect(event2Handler).toHaveBeenCalledWith('bar') diff --git a/src/stdlib/subscriber.coffee b/src/stdlib/subscriber.coffee index da308b336..69c91c5d1 100644 --- a/src/stdlib/subscriber.coffee +++ b/src/stdlib/subscriber.coffee @@ -1,13 +1,28 @@ +_ = require 'underscore' + module.exports = subscribe: (eventEmitter, eventName, callback) -> eventEmitter.on eventName, callback @subscriptions ?= [] - @subscriptions.push(cancel: -> eventEmitter.off eventName, callback) + @subscriptionsByObject ?= new WeakMap + @subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter) + + subscription = cancel: -> eventEmitter.off eventName, callback + @subscriptions.push(subscription) + @subscriptionsByObject.get(eventEmitter).push(subscription) subscribeToCommand: (view, eventName, callback) -> view.command eventName, callback @subscriptions ?= [] @subscriptions.push(cancel: -> view.off eventName, callback) - unsubscribe: -> - subscription.cancel() for subscription in @subscriptions ? [] + unsubscribe: (object) -> + if object + for subscription in @subscriptionsByObject?.get(object) ? [] + subscription.cancel() + _.remove(@subscriptions, subscription) + @subscriptionsByObject?.delete(object) + else + subscription.cancel() for subscription in @subscriptions ? [] + @subscriptions = null + @subscriptionsByObject = null