From b7b7373b8dd861e453693766620a5bb7630fd894 Mon Sep 17 00:00:00 2001 From: simonihmig Date: Mon, 12 Jun 2017 21:57:17 +0200 Subject: [PATCH] Call event.preventDefault() when returning false from view handler --- addon/index.js | 2 + .../components/test-event-dispatching-test.js | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/addon/index.js b/addon/index.js index daca955..0e3c168 100644 --- a/addon/index.js +++ b/addon/index.js @@ -121,6 +121,8 @@ export default Ember.EventDispatcher.extend({ do { if (viewRegistry[target.id]) { if (viewHandler(target, event) === false) { + event.preventDefault(); + event.stopPropagation(); break; } } else if (target.hasAttribute('data-ember-action')) { diff --git a/tests/integration/components/test-event-dispatching-test.js b/tests/integration/components/test-event-dispatching-test.js index 72bd26b..e0a33a2 100644 --- a/tests/integration/components/test-event-dispatching-test.js +++ b/tests/integration/components/test-event-dispatching-test.js @@ -91,3 +91,48 @@ test('events bubble up', function(assert) { focus('input'); blur('input'); }); + +test('events are not stopped by default', function(assert) { + assert.expect(2); + + this.on('submit', (e) => { + e.preventDefault(); + assert.ok(true, 'submit was fired!'); + }); + + this.register('component:submit-button', Component.extend({ + tagName: 'button', + attributeBindings: ['type'], + type: 'submit', + click() { + assert.ok(true, 'button was clicked!'); + } + })); + + this.render(hbs`
{{submit-button}}
`); + + click('button'); +}); + +test('events are stopped when returning false from view handler', function(assert) { + assert.expect(1); + + this.on('submit', (e) => { + e.preventDefault(); + assert.notOk(true, 'submit should not be fired!'); + }); + + this.register('component:submit-button', Component.extend({ + tagName: 'button', + attributeBindings: ['type'], + type: 'submit', + click() { + assert.ok(true, 'button was clicked!'); + return false; + } + })); + + this.render(hbs`
{{submit-button}}
`); + + click('button'); +});