"use strict"; require("core-js/modules/es.symbol"); require("core-js/modules/es.symbol.description"); require("core-js/modules/es.symbol.iterator"); require("core-js/modules/es.array.concat"); require("core-js/modules/es.array.from"); require("core-js/modules/es.array.includes"); require("core-js/modules/es.array.index-of"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.array.join"); require("core-js/modules/es.array.slice"); require("core-js/modules/es.object.get-prototype-of"); require("core-js/modules/es.object.to-string"); require("core-js/modules/es.regexp.constructor"); require("core-js/modules/es.regexp.exec"); require("core-js/modules/es.regexp.to-string"); require("core-js/modules/es.string.includes"); require("core-js/modules/es.string.iterator"); require("core-js/modules/es.string.replace"); require("core-js/modules/es.string.split"); require("core-js/modules/es.string.trim"); require("core-js/modules/web.dom-collections.iterator"); exports.__esModule = true; exports.getParent = getParent; exports.getFrameElement = getFrameElement; exports.getParentWindow = getParentWindow; exports.hasAccessToParentWindow = hasAccessToParentWindow; exports.closest = closest; exports.closestDown = closestDown; exports.isChildOf = isChildOf; exports.isChildOfWebComponentTable = isChildOfWebComponentTable; exports.polymerWrap = polymerWrap; exports.polymerUnwrap = polymerUnwrap; exports.index = index; exports.overlayContainsElement = overlayContainsElement; exports.hasClass = hasClass; exports.addClass = addClass; exports.removeClass = removeClass; exports.removeTextNodes = removeTextNodes; exports.empty = empty; exports.fastInnerHTML = fastInnerHTML; exports.fastInnerText = fastInnerText; exports.isVisible = isVisible; exports.offset = offset; exports.getWindowScrollTop = getWindowScrollTop; exports.getWindowScrollLeft = getWindowScrollLeft; exports.getScrollTop = getScrollTop; exports.getScrollLeft = getScrollLeft; exports.getScrollableElement = getScrollableElement; exports.getTrimmingContainer = getTrimmingContainer; exports.getStyle = getStyle; exports.matchesCSSRules = matchesCSSRules; exports.getComputedStyle = getComputedStyle; exports.outerWidth = outerWidth; exports.outerHeight = outerHeight; exports.innerHeight = innerHeight; exports.innerWidth = innerWidth; exports.addEvent = addEvent; exports.removeEvent = removeEvent; exports.getCaretPosition = getCaretPosition; exports.getSelectionEndPosition = getSelectionEndPosition; exports.getSelectionText = getSelectionText; exports.clearTextSelection = clearTextSelection; exports.setCaretPosition = setCaretPosition; exports.getScrollbarWidth = getScrollbarWidth; exports.hasVerticalScrollbar = hasVerticalScrollbar; exports.hasHorizontalScrollbar = hasHorizontalScrollbar; exports.setOverlayPosition = setOverlayPosition; exports.getCssTransform = getCssTransform; exports.resetCssTransform = resetCssTransform; exports.isInput = isInput; exports.isOutsideInput = isOutsideInput; exports.selectElementIfAllowed = selectElementIfAllowed; exports.HTML_CHARACTERS = void 0; var _browser = require("../browser"); var _feature = require("../feature"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } /** * Get the parent of the specified node in the DOM tree. * * @param {HTMLElement} element Element from which traversing is started. * @param {Number} [level=0] Traversing deep level. * @returns {HTMLElement|null} */ function getParent(element) { var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var iteration = -1; var parent = null; var elementToCheck = element; while (elementToCheck !== null) { if (iteration === level) { parent = elementToCheck; break; } if (elementToCheck.host && elementToCheck.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { elementToCheck = elementToCheck.host; } else { iteration += 1; elementToCheck = elementToCheck.parentNode; } } return parent; } /** * Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property. * * @param {Window} frame Frame from which should be get frameElement in safe way. * @returns {HTMLIFrameElement|null} */ function getFrameElement(frame) { return Object.getPrototypeOf(frame.parent) && frame.frameElement; } /** * Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property. * * @param {Window} frame Frame from which should be get frameElement in safe way. * @returns {Window|null} */ function getParentWindow(frame) { return getFrameElement(frame) && frame.parent; } /** * Checks if script has access to read from parent frame of specified frame. * @param {Window} frame Frame from which should be get frameElement in safe way. */ function hasAccessToParentWindow(frame) { return !!Object.getPrototypeOf(frame.parent); } /** * Goes up the DOM tree (including given element) until it finds an parent element that matches the nodes or nodes name. * This method goes up through web components. * * @param {Node} element Element from which traversing is started. * @param {(string | Node)[]} [nodes] Array of elements or Array of elements name (in uppercase form). * @param {Node} [until] The element until the traversing ends. * @returns {Node|null} */ function closest(element) { var nodes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var until = arguments.length > 2 ? arguments[2] : undefined; var _Node = Node, ELEMENT_NODE = _Node.ELEMENT_NODE, DOCUMENT_FRAGMENT_NODE = _Node.DOCUMENT_FRAGMENT_NODE; var elementToCheck = element; while (elementToCheck !== null && elementToCheck !== void 0 && elementToCheck !== until) { var _elementToCheck = elementToCheck, nodeType = _elementToCheck.nodeType, nodeName = _elementToCheck.nodeName; if (nodeType === ELEMENT_NODE && (nodes.includes(nodeName) || nodes.includes(elementToCheck))) { return elementToCheck; } var _elementToCheck2 = elementToCheck, host = _elementToCheck2.host; if (host && nodeType === DOCUMENT_FRAGMENT_NODE) { elementToCheck = host; } else { elementToCheck = elementToCheck.parentNode; } } return null; } /** * Goes "down" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name. * * @param {HTMLElement} element Element from which traversing is started * @param {Array} nodes Array of elements or Array of elements name * @param {HTMLElement} [until] * @returns {HTMLElement|null} */ function closestDown(element, nodes, until) { var matched = []; var elementToCheck = element; while (elementToCheck) { elementToCheck = closest(elementToCheck, nodes, until); if (!elementToCheck || until && !until.contains(elementToCheck)) { break; } matched.push(elementToCheck); if (elementToCheck.host && elementToCheck.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { elementToCheck = elementToCheck.host; } else { elementToCheck = elementToCheck.parentNode; } } var length = matched.length; return length ? matched[length - 1] : null; } /** * Goes up the DOM tree and checks if element is child of another element. * * @param child Child element * @param {Object|String} parent Parent element OR selector of the parent element. * If string provided, function returns `true` for the first occurrence of element with that class. * @returns {Boolean} */ function isChildOf(child, parent) { var node = child.parentNode; var queriedParents = []; if (typeof parent === 'string') { if (child.defaultView) { queriedParents = Array.prototype.slice.call(child.querySelectorAll(parent), 0); } else { queriedParents = Array.prototype.slice.call(child.ownerDocument.querySelectorAll(parent), 0); } } else { queriedParents.push(parent); } while (node !== null) { if (queriedParents.indexOf(node) > -1) { return true; } node = node.parentNode; } return false; } /** * Check if an element is part of `hot-table` web component. * * @param {Element} element * @returns {Boolean} */ function isChildOfWebComponentTable(element) { var hotTableName = 'hot-table'; var result = false; var parentNode = polymerWrap(element); function isHotTable(testElement) { return testElement.nodeType === Node.ELEMENT_NODE && testElement.nodeName === hotTableName.toUpperCase(); } while (parentNode !== null) { if (isHotTable(parentNode)) { result = true; break; } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { result = isHotTable(parentNode.host); if (result) { break; } parentNode = parentNode.host; } parentNode = parentNode.parentNode; } return result; } /* global Polymer wrap unwrap */ /** * Wrap element into polymer/webcomponent container if exists * * @param element * @returns {*} */ function polymerWrap(element) { return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element; } /** * Unwrap element from polymer/webcomponent container if exists * * @param element * @returns {*} */ function polymerUnwrap(element) { return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element; } /** * Counts index of element within its parent * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable * Otherwise would need to check for nodeType or use previousElementSibling * * @see http://jsperf.com/sibling-index/10 * @param {Element} element * @returns {Number} */ function index(element) { var i = 0; var elementToCheck = element; if (elementToCheck.previousSibling) { /* eslint-disable no-cond-assign */ while (elementToCheck = elementToCheck.previousSibling) { i += 1; } } return i; } /** * Check if the provided overlay contains the provided element * * @param {String} overlay * @param {HTMLElement} element * @param {HTMLElement} root * @returns {boolean} */ function overlayContainsElement(overlayType, element, root) { var overlayElement = root.parentElement.querySelector(".ht_clone_".concat(overlayType)); return overlayElement ? overlayElement.contains(element) : null; } var _hasClass; var _addClass; var _removeClass; function filterEmptyClassNames(classNames) { var result = []; if (!classNames || !classNames.length) { return result; } var len = 0; while (classNames[len]) { result.push(classNames[len]); len += 1; } return result; } if ((0, _feature.isClassListSupported)()) { var isSupportMultipleClassesArg = function isSupportMultipleClassesArg(rootDocument) { var element = rootDocument.createElement('div'); element.classList.add('test', 'test2'); return element.classList.contains('test2'); }; _hasClass = function _hasClass(element, className) { if (element.classList === void 0 || typeof className !== 'string' || className === '') { return false; } return element.classList.contains(className); }; _addClass = function _addClass(element, classes) { var rootDocument = element.ownerDocument; var className = classes; if (typeof className === 'string') { className = className.split(' '); } className = filterEmptyClassNames(className); if (className.length > 0) { if (isSupportMultipleClassesArg(rootDocument)) { var _element$classList; (_element$classList = element.classList).add.apply(_element$classList, _toConsumableArray(className)); } else { var len = 0; while (className && className[len]) { element.classList.add(className[len]); len += 1; } } } }; _removeClass = function _removeClass(element, classes) { var className = classes; if (typeof className === 'string') { className = className.split(' '); } className = filterEmptyClassNames(className); if (className.length > 0) { if (isSupportMultipleClassesArg) { var _element$classList2; (_element$classList2 = element.classList).remove.apply(_element$classList2, _toConsumableArray(className)); } else { var len = 0; while (className && className[len]) { element.classList.remove(className[len]); len += 1; } } } }; } else { var createClassNameRegExp = function createClassNameRegExp(className) { return new RegExp("(\\s|^)".concat(className, "(\\s|$)")); }; _hasClass = function _hasClass(element, className) { // http://snipplr.com/view/3561/addclass-removeclass-hasclass/ return element.className !== void 0 && createClassNameRegExp(className).test(element.className); }; _addClass = function _addClass(element, classes) { var len = 0; var _className = element.className; var className = classes; if (typeof className === 'string') { className = className.split(' '); } if (_className === '') { _className = className.join(' '); } else { while (className && className[len]) { if (!createClassNameRegExp(className[len]).test(_className)) { _className += " ".concat(className[len]); } len += 1; } } element.className = _className; }; _removeClass = function _removeClass(element, classes) { var len = 0; var _className = element.className; var className = classes; if (typeof className === 'string') { className = className.split(' '); } while (className && className[len]) { // String.prototype.trim is defined in polyfill.js _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim(); len += 1; } if (element.className !== _className) { element.className = _className; } }; } /** * Checks if element has class name * * @param {HTMLElement} element * @param {String} className Class name to check * @returns {Boolean} */ function hasClass(element, className) { return _hasClass(element, className); } /** * Add class name to an element * * @param {HTMLElement} element * @param {String|Array} className Class name as string or array of strings */ function addClass(element, className) { return _addClass(element, className); } /** * Remove class name from an element * * @param {HTMLElement} element * @param {String|Array} className Class name as string or array of strings */ function removeClass(element, className) { return _removeClass(element, className); } function removeTextNodes(element, parent) { if (element.nodeType === 3) { parent.removeChild(element); // bye text nodes! } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) { var childs = element.childNodes; for (var i = childs.length - 1; i >= 0; i--) { removeTextNodes(childs[i], element); } } } /** * Remove childs function * WARNING - this doesn't unload events and data attached by jQuery * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9 * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method * * @param element * @returns {void} */ // function empty(element) { var child; /* eslint-disable no-cond-assign */ while (child = element.lastChild) { element.removeChild(child); } } var HTML_CHARACTERS = /(<(.*)>|&(.*);)/; /** * Insert content into element trying avoid innerHTML method. * @returns {void} */ exports.HTML_CHARACTERS = HTML_CHARACTERS; function fastInnerHTML(element, content) { if (HTML_CHARACTERS.test(content)) { element.innerHTML = content; } else { fastInnerText(element, content); } } /** * Insert text content into element * @returns {Boolean} */ function fastInnerText(element, content) { var child = element.firstChild; if (child && child.nodeType === 3 && child.nextSibling === null) { // fast lane - replace existing text node if (_feature.isTextContentSupported) { // http://jsperf.com/replace-text-vs-reuse child.textContent = content; } else { // http://jsperf.com/replace-text-vs-reuse child.data = content; } } else { // slow lane - empty element and insert a text node empty(element); element.appendChild(element.ownerDocument.createTextNode(content)); } } /** * Returns true if element is attached to the DOM and visible, false otherwise * @param elem * @returns {boolean} */ function isVisible(elem) { var documentElement = elem.ownerDocument.documentElement; var next = elem; while (polymerUnwrap(next) !== documentElement) { // until reached if (next === null) { // parent detached from DOM return false; } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) { if (next.host) { // this is Web Components Shadow DOM // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet if (next.host.impl) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled return isVisible(next.host.impl); } else if (next.host) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled return isVisible(next.host); } throw new Error('Lost in Web Components world'); } else { return false; // this is a node detached from document in IE8 } } else if (next.style && next.style.display === 'none') { return false; } next = next.parentNode; } return true; } /** * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset. * * @param {HTMLElement} elem * @returns {Object} Returns object with `top` and `left` props */ function offset(elem) { var rootDocument = elem.ownerDocument; var rootWindow = rootDocument.defaultView; var documentElement = rootDocument.documentElement; var elementToCheck = elem; var offsetLeft; var offsetTop; var lastElem; var box; if ((0, _feature.hasCaptionProblem)() && elementToCheck.firstChild && elementToCheck.firstChild.nodeName === 'CAPTION') { // fixes problem with Firefox ignoring