From 8c21f2e1717a87a88a0507f090b1a5572c1d1799 Mon Sep 17 00:00:00 2001 From: Daniel Freedman Date: Fri, 13 Nov 2015 12:15:21 -0800 Subject: [PATCH] Make sure fixed preventDefault can be called multiple times Fixes #441 Interact .draggable and webcomponentsjs conflict in IE --- src/ShadowDOM/wrappers/events.js | 15 ++++++++++----- src/WebComponents/dom.js | 17 +++++++++++------ tests/WebComponents/html/dom.html | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/ShadowDOM/wrappers/events.js b/src/ShadowDOM/wrappers/events.js index 0e9d2ff..6ddfeb2 100644 --- a/src/ShadowDOM/wrappers/events.js +++ b/src/ShadowDOM/wrappers/events.js @@ -534,12 +534,17 @@ Event.prototype.preventDefault = function() { if (!this.cancelable) return; + unsafeUnwrap(this).preventDefault(); - Object.defineProperty(this, 'defaultPrevented', { - get: function() { - return true; - } - }); + + if (!this.defaultPrevented) { + Object.defineProperty(this, 'defaultPrevented', { + get: function() { + return true; + }, + configurable: true + }); + } }; } diff --git a/src/WebComponents/dom.js b/src/WebComponents/dom.js index b713380..d082afd 100644 --- a/src/WebComponents/dom.js +++ b/src/WebComponents/dom.js @@ -17,7 +17,7 @@ if (!window.performance) { var start = Date.now(); // only at millisecond precision - window.performance = {now: function(){ return Date.now() - start }}; + window.performance = {now: function(){ return Date.now() - start; }}; } // polyfill for requestAnimationFrame @@ -64,12 +64,17 @@ if (!this.cancelable) { return; } + origPreventDefault.call(this); - Object.defineProperty(this, 'defaultPrevented', { - get: function() { - return true; - } - }); + + if (!this.defaultPrevented) { + 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 990c3d5..7262262 100644 --- a/tests/WebComponents/html/dom.html +++ b/tests/WebComponents/html/dom.html @@ -87,6 +87,8 @@ var e = new Event('foo', {cancelable: true}); e.preventDefault(); assert.isTrue(e.defaultPrevented); + // call again, just in case + assert.doesNotThrow(e.preventDefault); }); });