Fix unsubscribe of a function listening on a channel using subscribeOnce. Plus added a couple other subscribeOnce tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/commit/32ddfa69 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/32ddfa69 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/32ddfa69 Branch: refs/heads/master Commit: 32ddfa699d37e282645f2f0a53f5d95863a82eb9 Parents: 0911e19 Author: Andrew Grieve <agri...@chromium.org> Authored: Thu Aug 23 23:05:39 2012 -0400 Committer: Anis Kadri <anis.ka...@gmail.com> Committed: Fri Aug 24 13:50:04 2012 -0700 ---------------------------------------------------------------------- lib/common/channel.js | 13 ++++++------- test/test.channel.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/32ddfa69/lib/common/channel.js ---------------------------------------------------------------------- diff --git a/lib/common/channel.js b/lib/common/channel.js index 446f105..c1cd702 100755 --- a/lib/common/channel.js +++ b/lib/common/channel.js @@ -169,15 +169,14 @@ Channel.prototype.subscribeOnce = function(f, c) { var g = null; var _this = this; - var m = function() { - f.apply(c || null, arguments); - _this.unsubscribe(g); - }; if (this.fired) { - if (typeof c == "object") { f = utils.close(c, f); } - f.apply(this, this.fireArgs); + f.apply(c || null, this.fireArgs); } else { - g = this.subscribe(m); + g = this.subscribe(function() { + _this.unsubscribe(g); + f.apply(c || null, arguments); + }); + f.observer_guid = g; } return g; }; http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/32ddfa69/test/test.channel.js ---------------------------------------------------------------------- diff --git a/test/test.channel.js b/test/test.channel.js index 8e97685..9968901 100644 --- a/test/test.channel.js +++ b/test/test.channel.js @@ -129,6 +129,16 @@ describe("channel", function () { expect(c.numHandlers).toEqual(1); expect(c2.numHandlers).toEqual(1); }); + it("should be able to unsubscribe a subscribeOnce.", function() { + var handler = function(){}; + c.subscribeOnce(handler); + + expect(c.numHandlers).toEqual(1); + + c.unsubscribe(handler); + + expect(c.numHandlers).toEqual(0); + }); }); describe("fire method", function() { @@ -197,4 +207,22 @@ describe("channel", function () { expect(after).toHaveBeenCalled(); }); }); + describe("subscribeOnce method", function() { + it("should be unregistered after being fired.", function() { + var count = 0; + var handler = jasmine.createSpy().andCallFake(function() { count++; }); + c.subscribeOnce(handler); + c.fire(); + c.fire(); + expect(count).toEqual(1); + }); + it("should be safe to add listeners from within callback.", function() { + var count = 0; + var handler = jasmine.createSpy().andCallFake(function() { count++; c.subscribeOnce(handler2); }); + var handler2 = jasmine.createSpy().andCallFake(function() { count++; }); + c.subscribeOnce(handler); + c.fire(); + expect(count).toEqual(2); + }); + }); });