fix(jqLite): fix event.stopImmediatePropagation() so it works as expected

jqLite doesn't override the default implementation of event.stopImmediatePropagation()
and so it doesn't work as expected, i.e, it doesn't prevent the rest of the event
handlers from being executed.

Closes #4833
This commit is contained in:
Michael Benford
2013-11-08 00:38:04 -02:00
committed by Michał Gołębiowski
parent 19871d28cf
commit 30354c58fe
2 changed files with 110 additions and 6 deletions

View File

@@ -1102,6 +1102,58 @@ describe('jqLite', function() {
browserTrigger(a, 'click');
});
it('should stop triggering handlers when stopImmediatePropagation is called', function() {
var element = jqLite(a),
clickSpy1 = jasmine.createSpy('clickSpy1'),
clickSpy2 = jasmine.createSpy('clickSpy2').andCallFake(function(event) { event.stopImmediatePropagation(); }),
clickSpy3 = jasmine.createSpy('clickSpy3'),
clickSpy4 = jasmine.createSpy('clickSpy4');
element.on('click', clickSpy1);
element.on('click', clickSpy2);
element.on('click', clickSpy3);
element[0].addEventListener('click', clickSpy4);
browserTrigger(element, 'click');
expect(clickSpy1).toHaveBeenCalled();
expect(clickSpy2).toHaveBeenCalled();
expect(clickSpy3).not.toHaveBeenCalled();
expect(clickSpy4).not.toHaveBeenCalled();
});
it('should execute stopPropagation when stopImmediatePropagation is called', function() {
var element = jqLite(a),
clickSpy = jasmine.createSpy('clickSpy');
clickSpy.andCallFake(function(event) {
spyOn(event, 'stopPropagation');
event.stopImmediatePropagation();
expect(event.stopPropagation).toHaveBeenCalled();
});
element.on('click', clickSpy);
browserTrigger(element, 'click');
expect(clickSpy).toHaveBeenCalled();
});
it('should have event.isImmediatePropagationStopped method', function() {
var element = jqLite(a),
clickSpy = jasmine.createSpy('clickSpy');
clickSpy.andCallFake(function(event) {
expect(event.isImmediatePropagationStopped()).toBe(false);
event.stopImmediatePropagation();
expect(event.isImmediatePropagationStopped()).toBe(true);
});
element.on('click', clickSpy);
browserTrigger(element, 'click');
expect(clickSpy).toHaveBeenCalled();
});
describe('mouseenter-mouseleave', function() {
var root, parent, sibling, child, log;
@@ -1784,7 +1836,6 @@ describe('jqLite', function() {
expect(event.isDefaultPrevented()).toBe(true);
});
it('should support handlers that deregister themselves', function() {
var element = jqLite('<a>poke</a>'),
clickSpy = jasmine.createSpy('click'),
@@ -1821,6 +1872,37 @@ describe('jqLite', function() {
expect(actualEvent.target).toEqual(element[0]);
expect(actualEvent.type).toEqual('click');
});
it('should stop triggering handlers when stopImmediatePropagation is called', function () {
var element = jqLite(a),
clickSpy1 = jasmine.createSpy('clickSpy1'),
clickSpy2 = jasmine.createSpy('clickSpy2').andCallFake(function(event) { event.stopImmediatePropagation(); }),
clickSpy3 = jasmine.createSpy('clickSpy3');
element.on('click', clickSpy1);
element.on('click', clickSpy2);
element.on('click', clickSpy3);
element.triggerHandler('click');
expect(clickSpy1).toHaveBeenCalled();
expect(clickSpy2).toHaveBeenCalled();
expect(clickSpy3).not.toHaveBeenCalled();
});
it('should have event.isImmediatePropagationStopped method', function() {
var element = jqLite(a),
clickSpy = jasmine.createSpy('clickSpy'),
event;
element.on('click', clickSpy);
element.triggerHandler('click');
event = clickSpy.mostRecentCall.args[0];
expect(event.isImmediatePropagationStopped()).toBe(false);
event.stopImmediatePropagation();
expect(event.isImmediatePropagationStopped()).toBe(true);
});
});