Skip to content

Commit

Permalink
Fix dispatchEvent(). Fixes #17 and #18.
Browse files Browse the repository at this point in the history
  • Loading branch information
developit committed Jun 13, 2018
1 parent 92c9808 commit 468729e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/dist
/node_modules
/npm-debug.log
package-lock.json
.DS_Store
15 changes: 9 additions & 6 deletions src/undom.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,16 +140,19 @@ export default function undom() {
splice(this.__handlers[toLower(type)], handler, 0, true);
}
dispatchEvent(event) {
let t = event.currentTarget = this,
let t = event.target = this,
c = event.cancelable,
l, i;
do {
event.currentTarget = t;
l = t.__handlers && t.__handlers[toLower(event.type)];
if (l) for (i=l.length; i--; ) {
if ((l[i].call(t, event)===false || event._end) && c) break;
if ((l[i].call(t, event) === false || event._end) && c) {
event.defaultPrevented = true;
}
}
} while (event.bubbles && !(c && event._stop) && (event.target=t=t.parentNode));
return !event.defaultPrevented;
} while (event.bubbles && !(c && event._stop) && (t=t.parentNode));
return l!=null;
}
}

Expand All @@ -164,8 +167,8 @@ export default function undom() {
class Event {
constructor(type, opts) {
this.type = type;
this.bubbles = !!opts.bubbles;
this.cancelable = !!opts.cancelable;
this.bubbles = !!(opts && opts.bubbles);
this.cancelable = !!(opts && opts.cancelable);
}
stopPropagation() {
this._stop = true;
Expand Down
28 changes: 27 additions & 1 deletion test/undom.js
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ describe('undom', () => {
});

it('should bubble if enabled', () => {
let event = { type:'foo', cancelable:true, bubbles:true };
let event = new document.defaultView.Event('foo', { cancelable:true, bubbles:true });
let child = document.createElement('div');
let parent = document.createElement('div');
parent.appendChild(child);
Expand All @@ -264,6 +264,32 @@ describe('undom', () => {
child.dispatchEvent(event);
expect(parent.fn).not.to.have.been.called;
});

it('should return `found`', () => {
let el = document.createElement('div');
let el2 = document.createElement('div');
el.addEventListener('foo', () => {});

expect(el.dispatchEvent(new document.defaultView.Event('foo'))).to.equal(true);
expect(el2.dispatchEvent(new document.defaultView.Event('foo'))).to.equal(false);
});

it('preventDefault() should set defaultPrevented', () => {
let event = new document.defaultView.Event('foo', { cancelable: true, bubbles: true });
let el = document.createElement('div');
let parent = document.createElement('div');
parent.appendChild(el);
let fn = spy(e => { e.preventDefault(); });
let parentFn = spy(e => { e.preventDefault(); });
el.addEventListener('foo', fn);
parent.addEventListener('foo', parentFn);

el.dispatchEvent(event);

expect(fn).to.have.been.calledOnce;
expect(parentFn).to.have.been.calledOnce;
expect(parentFn.firstCall.args[0]).to.have.property('defaultPrevented', true);
});
});
});
});

0 comments on commit 468729e

Please sign in to comment.