forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
116 lines
3.7 KiB
JavaScript
116 lines
3.7 KiB
JavaScript
/**
|
|
* @file
|
|
* Provides a few disposable polyfills till IE is gone from planet earth.
|
|
*
|
|
* @todo remove a few when min D9.2+ since they are included as core polyfills
|
|
* and can be made dependencies instead. Unless by then, IE is already gone, and
|
|
* core deprecates them like classList.
|
|
* @see https://www.drupal.org/node/3243406
|
|
* @see https://www.drupal.org/node/3159731
|
|
* @see https://www.drupal.org/node/3211146
|
|
* @see https://www.drupal.org/node/3079238
|
|
* @see https://www.drupal.org/node/3113447
|
|
*/
|
|
|
|
(function (_win) {
|
|
|
|
'use strict';
|
|
|
|
var _eProto = Element.prototype;
|
|
var _nProto = NodeList.prototype;
|
|
var _sProto = String.prototype;
|
|
|
|
// See https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
|
|
if (!_eProto.matches) {
|
|
_eProto.matches = _eProto.msMatchesSelector || _eProto.webkitMatchesSelector;
|
|
}
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
|
|
// @todo remove when min D9.2 for drupal.element.closest|matches.
|
|
// @see http://caniuse.com/#feat=element-closest
|
|
// @see http://caniuse.com/#feat=matchesselector
|
|
// @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
|
|
// @see https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType
|
|
// @see https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
|
|
if (!_eProto.closest) {
|
|
_eProto.closest = function (s) {
|
|
var el = this;
|
|
|
|
do {
|
|
if (_eProto.matches.call(el, s)) {
|
|
return el;
|
|
}
|
|
el = el.parentElement || el.parentNode;
|
|
} while (el !== null && el.nodeType === 1);
|
|
return null;
|
|
};
|
|
}
|
|
|
|
// @see https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill
|
|
if (_win.NodeList && !_nProto.forEach) {
|
|
_nProto.forEach = Array.prototype.forEach;
|
|
}
|
|
|
|
// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill
|
|
// @see https://developer.mozilla.org/en-US/docs/MDN/About#Code_samples_and_snippets
|
|
if (typeof Object.assign !== 'function') {
|
|
Object.defineProperty(Object, 'assign', {
|
|
value: function assign(target, varArgs) {
|
|
|
|
if (target === null || target === 'undefined') {
|
|
throw new TypeError('Cannot convert undefined or null to object');
|
|
}
|
|
|
|
var to = Object(target);
|
|
|
|
for (var index = 1; index < arguments.length; index++) {
|
|
var nextSource = arguments[index];
|
|
|
|
if (nextSource !== null && nextSource !== 'undefined') {
|
|
for (var nextKey in nextSource) {
|
|
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
|
|
to[nextKey] = nextSource[nextKey];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return to;
|
|
},
|
|
writable: true,
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
|
|
if (!_sProto.startsWith) {
|
|
Object.defineProperty(_sProto, 'startsWith', {
|
|
value: function (search, rawPos) {
|
|
var pos = rawPos > 0 ? rawPos | 0 : 0;
|
|
return this.substring(pos, pos + search.length) === search;
|
|
}
|
|
});
|
|
}
|
|
|
|
// IE >= 9 compat, else SCRIPT445: Object doesn't support this action.
|
|
// @see https://msdn.microsoft.com/library/ff975299(v=vs.85).aspx.
|
|
if (typeof _win.CustomEvent === 'function') {
|
|
return false;
|
|
}
|
|
|
|
function CustomEvent(event, params) {
|
|
params = params || {
|
|
bubbles: false,
|
|
cancelable: false,
|
|
detail: null
|
|
};
|
|
var evt = document.createEvent('CustomEvent');
|
|
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
|
|
return evt;
|
|
}
|
|
|
|
CustomEvent.prototype = _win.Event.prototype;
|
|
_win.CustomEvent = CustomEvent;
|
|
|
|
})(this);
|