From a075aa2b072b21c76c082389c47a704382ab9003 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Sep 2014 08:39:14 -0600 Subject: [PATCH] Perform synthetic bubbling through event target ancestors --- spec/command-registry-spec.coffee | 17 +++++++++++++++++ src/command-registry.coffee | 10 +++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/spec/command-registry-spec.coffee b/spec/command-registry-spec.coffee index aec55e920..0addcde6a 100644 --- a/spec/command-registry-spec.coffee +++ b/spec/command-registry-spec.coffee @@ -28,3 +28,20 @@ describe "CommandRegistry", -> grandchild.dispatchEvent(new CustomEvent('command', bubbles: true)) expect(called).toBe true + + it "invokes callbacks with selectors matching ancestors of the target", -> + calls = [] + registry.add 'command', '.child', (event) -> + expect(this).toBe child + expect(event.target).toBe grandchild + expect(event.currentTarget).toBe child + calls.push('child') + + registry.add 'command', '.parent', (event) -> + expect(this).toBe parent + expect(event.target).toBe grandchild + expect(event.currentTarget).toBe parent + calls.push('parent') + + grandchild.dispatchEvent(new CustomEvent('command', bubbles: true)) + expect(calls).toEqual ['child', 'parent'] diff --git a/src/command-registry.coffee b/src/command-registry.coffee index 3c17f2ea8..3042f7d8d 100644 --- a/src/command-registry.coffee +++ b/src/command-registry.coffee @@ -16,6 +16,10 @@ class CommandRegistry currentTarget: get: -> currentTarget currentTarget = event.target - for listener in @listenersByCommandName[event.type] - if event.target.webkitMatchesSelector(listener.selector) - listener.callback.call(currentTarget, syntheticEvent) + loop + for listener in @listenersByCommandName[event.type] + if currentTarget.webkitMatchesSelector(listener.selector) + listener.callback.call(currentTarget, syntheticEvent) + + break if currentTarget is @rootNode + currentTarget = currentTarget.parentNode