aboutsummaryrefslogtreecommitdiff
path: root/js/src/dom
diff options
context:
space:
mode:
authorJohann-S <[email protected]>2018-06-07 21:43:04 +0200
committerXhmikosR <[email protected]>2019-02-20 22:05:45 +0200
commit2b780787797da2bed2af0f95963be61e2b8e94a4 (patch)
treec5efa177458d3a64b4a072137b6c171ac65bfcfd /js/src/dom
parent7eddee286eb76da4d057a59706e4c512206dab45 (diff)
downloadbootstrap-2b780787797da2bed2af0f95963be61e2b8e94a4.tar.xz
bootstrap-2b780787797da2bed2af0f95963be61e2b8e94a4.zip
fix(data): do not use data object in our unit tests
Diffstat (limited to 'js/src/dom')
-rw-r--r--js/src/dom/polyfill.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/js/src/dom/polyfill.js b/js/src/dom/polyfill.js
new file mode 100644
index 000000000..644e6025b
--- /dev/null
+++ b/js/src/dom/polyfill.js
@@ -0,0 +1,94 @@
+import EventHandler from './eventHandler'
+
+const Polyfill = (() => {
+ // defaultPrevented is broken in IE.
+ // https://connect.microsoft.com/IE/feedback/details/790389/event-defaultprevented-returns-false-after-preventdefault-was-called
+ const workingDefaultPrevented = (() => {
+ const e = document.createEvent('CustomEvent')
+ e.initEvent('Bootstrap', true, true)
+ e.preventDefault()
+ return e.defaultPrevented
+ })()
+
+ let defaultPreventedPreservedOnDispatch = true
+
+ // CustomEvent polyfill for IE (see: https://mzl.la/2v76Zvn)
+ if (typeof window.CustomEvent !== 'function') {
+ window.CustomEvent = (event, params) => {
+ params = params || {
+ bubbles: false,
+ cancelable: false,
+ detail: null
+ }
+ const evt = document.createEvent('CustomEvent')
+ evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)
+ if (!workingDefaultPrevented) {
+ const origPreventDefault = Event.prototype.preventDefault
+ evt.preventDefault = () => {
+ if (!evt.cancelable) {
+ return
+ }
+
+ origPreventDefault.call(evt)
+ Object.defineProperty(evt, 'defaultPrevented', {
+ get() {
+ return true
+ },
+ configurable: true
+ })
+ }
+ }
+ return evt
+ }
+
+ window.CustomEvent.prototype = window.Event.prototype
+ } else {
+ // MSEdge resets defaultPrevented flag upon dispatchEvent call if at least one listener is attached
+ defaultPreventedPreservedOnDispatch = (() => {
+ const e = new CustomEvent('Bootstrap', {
+ cancelable: true
+ })
+
+ const element = document.createElement('div')
+ element.addEventListener('Bootstrap', () => null)
+
+ e.preventDefault()
+ element.dispatchEvent(e)
+ return e.defaultPrevented
+ })()
+ }
+
+ // Event constructor shim
+ if (!window.Event || typeof window.Event !== 'function') {
+ const origEvent = window.Event
+ window.Event = (inType, params) => {
+ params = params || {}
+ const e = document.createEvent('Event')
+ e.initEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable))
+ return e
+ }
+ window.Event.prototype = origEvent.prototype
+ }
+
+ // focusin and focusout polyfill
+ if (typeof window.onfocusin === 'undefined') {
+ (() => {
+ function listenerFocus(event) {
+ EventHandler.trigger(event.target, 'focusin')
+ }
+ function listenerBlur(event) {
+ EventHandler.trigger(event.target, 'focusout')
+ }
+ EventHandler.on(document, 'focus', 'input', listenerFocus)
+ EventHandler.on(document, 'blur', 'input', listenerBlur)
+ })()
+ }
+
+ return {
+ get defaultPreventedPreservedOnDispatch() {
+ return defaultPreventedPreservedOnDispatch
+ }
+ }
+})()
+
+export default Polyfill