123 lines
4.9 KiB
Java
123 lines
4.9 KiB
Java
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
// This file can be removed, when we stop supporting IE11.
|
|
// Polyfill for .before()
|
|
// from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/before()/before().md
|
|
// Copyright (c) 2016-present, jszhou
|
|
// MIT License
|
|
(function (arr) {
|
|
arr.forEach(function (item) {
|
|
if (item.hasOwnProperty('before')) {
|
|
return;
|
|
}
|
|
Object.defineProperty(item, 'before', {
|
|
configurable: true,
|
|
enumerable: true,
|
|
writable: true,
|
|
value: function before() {
|
|
var argArr = Array.prototype.slice.call(arguments),
|
|
docFrag = document.createDocumentFragment();
|
|
|
|
argArr.forEach(function (argItem) {
|
|
var isNode = argItem instanceof Node;
|
|
docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
|
|
});
|
|
|
|
this.parentNode.insertBefore(docFrag, this);
|
|
}
|
|
});
|
|
});
|
|
})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
|
|
// Polyfill for .startsWith()
|
|
// from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill
|
|
if (!String.prototype.startsWith) {
|
|
Object.defineProperty(String.prototype, 'startsWith', {
|
|
value: function(search, pos) {
|
|
pos = !pos || pos < 0 ? 0 : +pos;
|
|
return this.substring(pos, pos + search.length) === search;
|
|
}
|
|
});
|
|
}
|
|
// Polyfill for .matches()
|
|
// from: https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill
|
|
if (!Element.prototype.matches) {
|
|
Element.prototype.matches = Element.prototype.msMatchesSelector ||
|
|
Element.prototype.webkitMatchesSelector;
|
|
}
|
|
// Polyfill for iterable Set (IE11)
|
|
// from: https://stackoverflow.com/a/45686452/3057764
|
|
if (new Set([0]).size === 0) {
|
|
//constructor doesn't take an iterable as an argument - thanks IE
|
|
const BuiltinSet = Set;
|
|
Set = function Set(iterable) {
|
|
const set = new BuiltinSet();
|
|
if (iterable) {
|
|
iterable.forEach(set.add, set);
|
|
}
|
|
return set;
|
|
};
|
|
Set.prototype = BuiltinSet.prototype;
|
|
Set.prototype.constructor = Set;
|
|
}
|
|
// Polyfill for using :scope in querySelector/querySelectorAll
|
|
// from: https://github.com/lazd/scopedQuerySelectorShim
|
|
// Copyright (C) 2015 Larry Davis
|
|
// This software may be modified and distributed under the terms of the BSD license.
|
|
(function() {
|
|
if (!HTMLElement.prototype.querySelectorAll) {
|
|
throw new Error("rootedQuerySelectorAll: This polyfill can only be used with browsers that support querySelectorAll");
|
|
}
|
|
// A temporary element to query against for elements not currently in the DOM
|
|
// We'll also use this element to test for :scope support
|
|
var container = document.createElement("div");
|
|
// Check if the browser supports :scope
|
|
try {
|
|
// Browser supports :scope, do nothing
|
|
container.querySelectorAll(":scope *");
|
|
} catch (e) {
|
|
// Match usage of scope
|
|
var scopeRE = /^\s*:scope/gi;
|
|
// Overrides
|
|
function overrideNodeMethod(prototype, methodName) {
|
|
// Store the old method for use later
|
|
var oldMethod = prototype[methodName];
|
|
// Override the method
|
|
prototype[methodName] = function(query) {
|
|
var nodeList, gaveId = false, gaveContainer = false;
|
|
if (query.match(scopeRE)) {
|
|
// Remove :scope
|
|
query = query.replace(scopeRE, "");
|
|
if (!this.parentNode) {
|
|
// Add to temporary container
|
|
container.appendChild(this);
|
|
gaveContainer = true;
|
|
}
|
|
parentNode = this.parentNode;
|
|
if (!this.id) {
|
|
// Give temporary ID
|
|
this.id = "rootedQuerySelector_id_" + new Date().getTime();
|
|
gaveId = true;
|
|
}
|
|
// Find elements against parent node
|
|
nodeList = oldMethod.call(parentNode, "#" + this.id + " " + query);
|
|
// Reset the ID
|
|
if (gaveId) {
|
|
this.id = "";
|
|
}
|
|
// Remove from temporary container
|
|
if (gaveContainer) {
|
|
container.removeChild(this);
|
|
}
|
|
return nodeList;
|
|
} else {
|
|
// No immediate child selector used
|
|
return oldMethod.call(this, query);
|
|
}
|
|
};
|
|
}
|
|
// Browser doesn't support :scope, add polyfill
|
|
overrideNodeMethod(HTMLElement.prototype, "querySelector");
|
|
overrideNodeMethod(HTMLElement.prototype, "querySelectorAll");
|
|
}
|
|
})();
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
|