diff --git a/lib/delegate.js b/lib/delegate.js index df37477..550d4d4 100644 --- a/lib/delegate.js +++ b/lib/delegate.js @@ -397,7 +397,16 @@ function matchesTag(tagName, element) { */ function matchesRoot(selector, element) { /*jshint validthis:true*/ - if (this.rootElement === window) return element === document; + if (this.rootElement === window) { + return ( + // Match the outer document (dispatched from document) + element === document || + // The element (dispatched from document.body or document.documentElement) + element === document.documentElement || + // Or the window itself (dispatched from window) + element === window + ); + } return this.rootElement === element; } diff --git a/test/tests/delegateTest.js b/test/tests/delegateTest.js index 6a7ed14..27c4c38 100644 --- a/test/tests/delegateTest.js +++ b/test/tests/delegateTest.js @@ -1,6 +1,9 @@ /*jshint laxbreak:true*/ -/*global buster, assert, refute, Delegate*/ +/*global buster, Delegate*/ + +var assert = buster.referee.assert; +var refute = buster.referee.refute; var setupHelper = {}; @@ -593,6 +596,63 @@ buster.testCase('Delegate', { assert.calledOnce(captureSpy); assert.calledOnce(bubbleSpy); }, + 'Delegate instances on window catch events when bubbled from the body' : function() { + var delegate, spy; + + delegate = new Delegate(window); + spy = this.spy(); + + delegate.on('click', spy); + + setupHelper.fireMouseEvent(document.body, 'click'); + + assert.calledOnce(spy); + + delegate.off(); + }, + 'Delegate instances on window catch events when bubbled from the document' : function() { + var delegate, spy; + + delegate = new Delegate(window); + spy = this.spy(); + + delegate.on('click', spy); + + setupHelper.fireMouseEvent(document, 'click'); + + // assert.calledOnce(spy); // "Invalid Argument" in IE 9 + assert(spy.callCount === 1); // Workaround for Buster.js IE 9 error + + delegate.off(); + }, + 'Delegate instances on window catch events when bubbled from the element' : function() { + var delegate, spy; + + delegate = new Delegate(window); + spy = this.spy(); + + delegate.on('click', spy); + + setupHelper.fireMouseEvent(document.documentElement, 'click'); + + assert.calledOnce(spy); + + delegate.off(); + }, + 'Delegate instances on window cause events when dispatched directly on window' : function() { + var delegate, spy; + + delegate = new Delegate(window); + spy = this.spy(); + + delegate.on('click', spy); + + setupHelper.fireMouseEvent(window, 'click'); + + assert.calledOnce(spy); + + delegate.off(); + }, 'tearDown': function() { setupHelper.tearDown();