From bba5fb870f88a20670c8d72eeb8aebdccf60a0c2 Mon Sep 17 00:00:00 2001 From: Daniel Freedman Date: Mon, 16 Nov 2015 14:57:33 -0800 Subject: [PATCH] IE's preventDefault is only right during event dispatch Regression fix from #444 --- src/ShadowDOM/wrappers/events.js | 14 ++++++-------- src/WebComponents/dom.js | 14 ++++++-------- tests/WebComponents/html/dom.html | 27 ++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/ShadowDOM/wrappers/events.js b/src/ShadowDOM/wrappers/events.js index 6ddfeb2..2ac5843 100644 --- a/src/ShadowDOM/wrappers/events.js +++ b/src/ShadowDOM/wrappers/events.js @@ -537,14 +537,12 @@ unsafeUnwrap(this).preventDefault(); - if (!this.defaultPrevented) { - Object.defineProperty(this, 'defaultPrevented', { - get: function() { - return true; - }, - configurable: true - }); - } + Object.defineProperty(this, 'defaultPrevented', { + get: function() { + return true; + }, + configurable: true + }); }; } diff --git a/src/WebComponents/dom.js b/src/WebComponents/dom.js index d082afd..5c8c734 100644 --- a/src/WebComponents/dom.js +++ b/src/WebComponents/dom.js @@ -67,14 +67,12 @@ origPreventDefault.call(this); - if (!this.defaultPrevented) { - Object.defineProperty(this, 'defaultPrevented', { - get: function() { - return true; - }, - configurable: true - }); - } + Object.defineProperty(this, 'defaultPrevented', { + get: function() { + return true; + }, + configurable: true + }); }; } diff --git a/tests/WebComponents/html/dom.html b/tests/WebComponents/html/dom.html index 7262262..886c6de 100644 --- a/tests/WebComponents/html/dom.html +++ b/tests/WebComponents/html/dom.html @@ -88,7 +88,32 @@ e.preventDefault(); assert.isTrue(e.defaultPrevented); // call again, just in case - assert.doesNotThrow(e.preventDefault); + assert.doesNotThrow(function() {e.preventDefault(); }); + }); + + test('CustomEvent defaultPrevented', function() { + var e = new CustomEvent('foo', {cancelable: true}); + e.preventDefault(); + assert.isTrue(e.defaultPrevented); + // call again, just in case + assert.doesNotThrow(function() {e.preventDefault(); }); + }); + + test('dispatch and prevent', function() { + var el = document.createElement('div'); + document.body.appendChild(el); + var e = new CustomEvent('foo', {cancelable: true, bubbles: true}); + var fn = function(e) { + e.preventDefault(); + }; + var check = function check(e) { + assert.isTrue(e.defaultPrevented); + document.body.removeEventListener('foo', check); + document.body.removeChild(el); + }; + el.addEventListener('foo', fn); + document.body.addEventListener('foo', check); + assert.isTrue(e.defaultPrevented); }); });