diff options
| author | Johann-S <[email protected]> | 2018-06-07 21:43:04 +0200 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2019-02-20 22:05:45 +0200 |
| commit | 2b780787797da2bed2af0f95963be61e2b8e94a4 (patch) | |
| tree | c5efa177458d3a64b4a072137b6c171ac65bfcfd /js/src/dom | |
| parent | 7eddee286eb76da4d057a59706e4c512206dab45 (diff) | |
| download | bootstrap-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.js | 94 |
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 |
