UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

1,129 lines (1,111 loc) 203 kB
window['%hammerhead%'].utils.removeInjectedScript(); // NOTE: We should have the capability to initialize scripts with different contexts. // This is required for iframes without the src attribute because Hammerhead does not // inject scripts into such iframes. So, we wrap all scripts in initialization functions. (function () { function initTestCafeCore(window, isIFrameWithoutSrc) { var document = window.document; (function (hammerhead, Promise$6) { function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var hammerhead__default = /*#__PURE__*/_interopDefaultLegacy(hammerhead); var Promise__default = /*#__PURE__*/_interopDefaultLegacy(Promise$6); var browserUtils$3 = hammerhead__default["default"].utils.browser; var MODIFIERS = { alt: 18, ctrl: 17, meta: 91, shift: 16, }; var SHIFT_MAP = { '~': '`', '!': '1', '@': '2', '#': '3', '$': '4', '%': '5', '^': '6', '&': '7', '*': '8', '(': '9', ')': '0', '_': '-', '+': '=', '{': '[', '}': ']', ':': ';', '"': '\'', '|': '\\', '<': ',', '>': '.', '?': '/', '±': '§', }; var SPECIAL_KEYS = { backspace: 8, capslock: 20, delete: 46, down: 40, end: 35, enter: 13, esc: 27, home: 36, ins: 45, left: 37, pagedown: 34, pageup: 33, right: 39, space: 32, tab: 9, up: 38, }; var KEY_PROPERTY = { left: 'ArrowLeft', down: 'ArrowDown', right: 'ArrowRight', up: 'ArrowUp', backspace: 'Backspace', capslock: 'CapsLock', delete: 'Delete', end: 'End', enter: 'Enter', esc: 'Escape', home: 'Home', ins: 'Insert', pagedown: 'PageDown', pageup: 'PageUp', space: ' ', tab: 'Tab', alt: 'Alt', ctrl: 'Control', meta: 'Meta', shift: 'Shift', }; var NEW_LINE_KEYS = [ 'enter', '\n', '\r', ]; function reverseMap(map) { var reversed = {}; for (var key in map) { if (map.hasOwnProperty(key)) reversed[map[key]] = key; } return reversed; } var KEY_MAPS = { modifiers: MODIFIERS, shiftMap: SHIFT_MAP, specialKeys: SPECIAL_KEYS, keyProperty: KEY_PROPERTY, modifiersMap: { option: 'alt', }, symbolCharCodeToKeyCode: { 96: 192, 91: 219, 93: 221, 92: 220, 59: 186, 39: 222, 44: 188, 45: browserUtils$3.isFirefox ? 173 : 189, 46: 190, 47: 191, // / }, symbolKeysCharCodes: { 109: 45, 173: 45, 186: 59, 187: 61, 188: 44, 189: 45, 190: 46, 191: 47, 192: 96, 219: 91, 220: 92, 221: 93, 222: 39, 110: 46, 96: 48, 97: 49, 98: 50, 99: 51, 100: 52, 101: 53, 102: 54, 103: 55, 104: 56, 105: 57, 107: 43, 106: 42, 111: 47, }, reversedModifiers: reverseMap(MODIFIERS), reversedShiftMap: reverseMap(SHIFT_MAP), reversedSpecialKeys: reverseMap(SPECIAL_KEYS), reversedKeyProperty: reverseMap(KEY_PROPERTY), newLineKeys: NEW_LINE_KEYS, }; var Promise$5 = hammerhead__default["default"].Promise; var nativeMethods$7 = hammerhead__default["default"].nativeMethods; function delay$1 (ms) { return new Promise$5(function (resolve) { return nativeMethods$7.setTimeout.call(window, resolve, ms); }); } var REQUESTS_COLLECTION_DELAY_DEFAULT = 50; var RequestBarrier = /** @class */ (function () { function RequestBarrier(emitter, delays) { if (delays === void 0) { delays = {}; } var _a, _b, _c; this._delays = { requestsCollection: (_a = delays.requestsCollection) !== null && _a !== void 0 ? _a : REQUESTS_COLLECTION_DELAY_DEFAULT, additionalRequestsCollection: (_b = delays.additionalRequestsCollection) !== null && _b !== void 0 ? _b : REQUESTS_COLLECTION_DELAY_DEFAULT, pageInitialRequestsCollection: (_c = delays.pageInitialRequestsCollection) !== null && _c !== void 0 ? _c : REQUESTS_COLLECTION_DELAY_DEFAULT, }; this._emitter = emitter; this._waitResolve = null; this._watchdog = null; this._requests = new Set(); this._collectingReqs = true; this._startListening(); } RequestBarrier.prototype._startListening = function () { var _this = this; this._emitter.onRequestSend(function (req) { return _this._onRequestSend(req); }); this._emitter.onRequestCompleted(function (req) { return _this._onRequestCompleted(req); }); this._emitter.onRequestError(function (req) { return _this._onRequestError(req); }); }; RequestBarrier.prototype._offListening = function () { this._emitter.offAll(); }; RequestBarrier.prototype._onRequestSend = function (req) { if (this._collectingReqs) this._requests.add(req); }; RequestBarrier.prototype._onRequestCompleted = function (req) { var _this = this; // NOTE: let the last real XHR handler finish its job and try to obtain // any additional requests if they were initiated by this handler delay$1(this._delays.additionalRequestsCollection) .then(function () { return _this._onRequestFinished(req); }); }; RequestBarrier.prototype._onRequestFinished = function (req) { if (!this._requests.has(req)) return; this._requests.delete(req); if (!this._collectingReqs && !this._requests.size && this._watchdog) this._finishWaiting(); }; RequestBarrier.prototype._onRequestError = function (req) { this._onRequestFinished(req); }; RequestBarrier.prototype._finishWaiting = function () { if (this._watchdog) { var clearTimeout_1 = hammerhead.nativeMethods.clearTimeout; clearTimeout_1(this._watchdog); this._watchdog = null; } this._requests.clear(); this._offListening(); this._waitResolve(); // eslint-disable-line @typescript-eslint/no-non-null-assertion }; RequestBarrier.prototype.wait = function (isPageLoad) { var _this = this; return delay$1(isPageLoad ? this._delays.pageInitialRequestsCollection : this._delays.requestsCollection) .then(function () { return new hammerhead.Promise(function (resolve) { _this._collectingReqs = false; _this._waitResolve = resolve; if (!_this._requests.size) { _this._finishWaiting(); return; } var setTimeout = hammerhead.nativeMethods.setTimeout; _this._watchdog = setTimeout(function () { return _this._finishWaiting(); }, RequestBarrier.TIMEOUT); }); }); }; RequestBarrier.TIMEOUT = 3000; return RequestBarrier; }()); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise__default["default"]))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; // @ts-ignore var EventEmitter$1 = /** @class */ (function () { function EventEmitter() { this._eventsListeners = {}; } EventEmitter.prototype.on = function (evt, listener) { if (!this._eventsListeners[evt]) this._eventsListeners[evt] = []; this._eventsListeners[evt].push(listener); }; EventEmitter.prototype.once = function (evt, listener) { var _this = this; this.on(evt, function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } _this.off(evt, listener); return listener.apply(void 0, args); }); }; EventEmitter.prototype.off = function (evt, listener) { var listeners = this._eventsListeners[evt]; if (listeners) this._eventsListeners[evt] = hammerhead.nativeMethods.arrayFilter.call(listeners, function (item) { return item !== listener; }); }; EventEmitter.prototype.offAll = function (evt) { if (evt) this._eventsListeners[evt] = []; else this._eventsListeners = {}; }; EventEmitter.prototype.emit = function (evt) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var listeners = this._eventsListeners[evt]; if (!listeners) return; for (var i = 0; i < listeners.length; i++) listeners[i].apply(this, args); }; return EventEmitter; }()); var REQUEST_SEND_EVENT = 'request-send'; var REQUEST_COMPLETED_EVENT = 'request-completed'; var REQUEST_ERROR_EVENT = 'request-error'; var HammerheadClientRequestEmitter = /** @class */ (function (_super) { __extends(HammerheadClientRequestEmitter, _super); function HammerheadClientRequestEmitter() { var _this = _super.call(this) || this; _this._hammerheadListenersInfo = []; _this._addHammerheadListener(hammerhead__default["default"].EVENTS.beforeXhrSend, function (_a) { var xhr = _a.xhr; return _this.emit(REQUEST_SEND_EVENT, xhr); }); _this._addHammerheadListener(hammerhead__default["default"].EVENTS.xhrCompleted, function (_a) { var xhr = _a.xhr; return _this.emit(REQUEST_COMPLETED_EVENT, xhr); }); _this._addHammerheadListener(hammerhead__default["default"].EVENTS.xhrError, function (_a) { var xhr = _a.xhr; return _this.emit(REQUEST_ERROR_EVENT, xhr); }); _this._addHammerheadListener(hammerhead__default["default"].EVENTS.fetchSent, function (fetch) { _this.emit(REQUEST_SEND_EVENT, fetch); fetch.then(function () { return _this.emit(REQUEST_COMPLETED_EVENT, fetch); }, function () { return _this.emit(REQUEST_ERROR_EVENT, fetch); }); }); return _this; } HammerheadClientRequestEmitter.prototype._addHammerheadListener = function (evt, listener) { hammerhead__default["default"].on(evt, listener); this._hammerheadListenersInfo.push({ evt: evt, listener: listener }); }; HammerheadClientRequestEmitter.prototype.onRequestSend = function (listener) { this.on(REQUEST_SEND_EVENT, listener); }; HammerheadClientRequestEmitter.prototype.onRequestCompleted = function (listener) { this.on(REQUEST_COMPLETED_EVENT, listener); }; HammerheadClientRequestEmitter.prototype.onRequestError = function (listener) { this.on(REQUEST_ERROR_EVENT, listener); }; HammerheadClientRequestEmitter.prototype.offAll = function () { _super.prototype.offAll.call(this); for (var _i = 0, _a = this._hammerheadListenersInfo; _i < _a.length; _i++) { var info = _a[_i]; hammerhead__default["default"].off.call(hammerhead__default["default"], info.evt, info.listener); } }; return HammerheadClientRequestEmitter; }(EventEmitter$1)); var WAIT_FOR_NEW_SCRIPTS_DELAY = 25; var ScriptExecutionBarrier = /** @class */ (function () { function ScriptExecutionBarrier(emitter) { this._emitter = emitter; this._watchdog = null; this._waitResolve = null; this._scripts = new Map(); this._startListening(); } ScriptExecutionBarrier.prototype._startListening = function () { var _this = this; this._emitter.onScriptAdded(function (script) { return _this._onScriptElementAdded(script); }); this._emitter.onScriptLoadedOrFailed(function (script) { return _this._onScriptLoadedOrFailed(script); }); }; ScriptExecutionBarrier.prototype._offListening = function () { this._emitter.offAll(); }; ScriptExecutionBarrier.prototype._onScriptElementAdded = function (script) { var _this = this; var setTimeout = hammerhead.nativeMethods.setTimeout; var timeoutFn = function () { return _this._onScriptLoadedOrFailed(script, true); }; var loadingTimeout = setTimeout(timeoutFn, ScriptExecutionBarrier.LOADING_TIMEOUT); this._scripts.set(script, loadingTimeout); }; ScriptExecutionBarrier.prototype._onScriptLoadedOrFailed = function (script, isTimeout) { var _this = this; if (isTimeout === void 0) { isTimeout = false; } if (!this._scripts.has(script)) return; if (!isTimeout) { var clearTimeout_1 = hammerhead.nativeMethods.clearTimeout; clearTimeout_1(this._scripts.get(script)); } this._scripts.delete(script); if (this._scripts.size) return; delay$1(WAIT_FOR_NEW_SCRIPTS_DELAY) .then(function () { if (_this._waitResolve && !_this._scripts.size) _this._finishWaiting(); }); }; ScriptExecutionBarrier.prototype._finishWaiting = function () { if (this._watchdog) { var clearTimeout_2 = hammerhead.nativeMethods.clearTimeout; clearTimeout_2(this._watchdog); this._watchdog = null; } this._scripts.clear(); this._offListening(); this._waitResolve(); // eslint-disable-line @typescript-eslint/no-non-null-assertion this._waitResolve = null; }; ScriptExecutionBarrier.prototype.wait = function () { var _this = this; return new hammerhead.Promise(function (resolve) { _this._waitResolve = resolve; if (!_this._scripts.size) { _this._finishWaiting(); return; } var setTimeout = hammerhead.nativeMethods.setTimeout; _this._watchdog = setTimeout(function () { return _this._finishWaiting(); }, ScriptExecutionBarrier.TIMEOUT); }); }; ScriptExecutionBarrier.TIMEOUT = 3000; ScriptExecutionBarrier.LOADING_TIMEOUT = 2000; return ScriptExecutionBarrier; }()); var nativeMethods$6 = hammerhead__default["default"].nativeMethods; var SCRIPT_ADDED = 'script-added'; var SCRIPT_LOADED_OR_FAILED = 'script-loaded-or-failed'; var HammerheadScriptExecutionEmitter = /** @class */ (function (_super) { __extends(HammerheadScriptExecutionEmitter, _super); function HammerheadScriptExecutionEmitter() { var _this = _super.call(this) || this; _this._scriptElementAddedListener = function (_a) { var el = _a.el; return _this._onScriptElementAdded(el); }; hammerhead__default["default"].on(hammerhead__default["default"].EVENTS.scriptElementAdded, _this._scriptElementAddedListener); return _this; } HammerheadScriptExecutionEmitter.prototype._onScriptElementAdded = function (script) { var _this = this; var scriptSrc = nativeMethods$6.scriptSrcGetter.call(script); if (scriptSrc === void 0 || scriptSrc === '') return; this.emit(SCRIPT_ADDED, script); var done = function () { nativeMethods$6.removeEventListener.call(script, 'load', done); nativeMethods$6.removeEventListener.call(script, 'error', done); _this.emit(SCRIPT_LOADED_OR_FAILED, script); }; nativeMethods$6.addEventListener.call(script, 'load', done); nativeMethods$6.addEventListener.call(script, 'error', done); }; HammerheadScriptExecutionEmitter.prototype.onScriptAdded = function (listener) { this.on(SCRIPT_ADDED, listener); }; HammerheadScriptExecutionEmitter.prototype.onScriptLoadedOrFailed = function (listener) { this.on(SCRIPT_LOADED_OR_FAILED, listener); }; HammerheadScriptExecutionEmitter.prototype.offAll = function () { _super.prototype.offAll.call(this); hammerhead__default["default"].off(hammerhead__default["default"].EVENTS.scriptElementAdded, this._onScriptElementAdded); }; return HammerheadScriptExecutionEmitter; }(EventEmitter$1)); var ARRAY_METHODS_PREFIX = 'array'; function createNativeMethodWrapper(methodName) { var nativeMethodName = ARRAY_METHODS_PREFIX + methodName.charAt(0).toUpperCase() + methodName.slice(1); var nativeMethod = hammerhead.nativeMethods[nativeMethodName]; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return nativeMethod.call.apply(nativeMethod, args); }; } var filter = createNativeMethodWrapper('filter'); var map = createNativeMethodWrapper('map'); var slice = createNativeMethodWrapper('slice'); var splice = createNativeMethodWrapper('splice'); var unshift = createNativeMethodWrapper('unshift'); var forEach = createNativeMethodWrapper('forEach'); var indexOf = createNativeMethodWrapper('indexOf'); var some = createNativeMethodWrapper('some'); var reverse = createNativeMethodWrapper('reverse'); var reduce = createNativeMethodWrapper('reduce'); var concat = createNativeMethodWrapper('concat'); var join = createNativeMethodWrapper('join'); var every = createNativeMethodWrapper('every'); function isArray(arg) { return hammerhead.nativeMethods.objectToString.call(arg) === '[object Array]'; } function from(arg) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return hammerhead.nativeMethods.arrayFrom.apply(hammerhead.nativeMethods, __spreadArray([arg], args, false)); } function find$1(arr, callback) { return hammerhead.nativeMethods.arrayFind.call(arr, callback); } function remove$1(arr, item) { var index = hammerhead.nativeMethods.arrayIndexOf.call(arr, item); if (index > -1) hammerhead.nativeMethods.arraySplice.call(arr, index, 1); } function equals(arr1, arr2) { if (arr1.length !== arr2.length) return false; for (var i = 0, l = arr1.length; i < l; i++) { if (arr1[i] !== arr2[i]) return false; } return true; } function getCommonElement(arr1, arr2) { for (var i = 0; i < arr1.length; i++) { for (var t = 0; t < arr2.length; t++) { if (arr1[i] === arr2[t]) return arr1[i]; } } return null; } var arrayUtils = /*#__PURE__*/Object.freeze({ __proto__: null, filter: filter, map: map, slice: slice, splice: splice, unshift: unshift, forEach: forEach, indexOf: indexOf, some: some, reverse: reverse, reduce: reduce, concat: concat, join: join, every: every, isArray: isArray, from: from, find: find$1, remove: remove$1, equals: equals, getCommonElement: getCommonElement }); var browserUtils$2 = hammerhead__default["default"].utils.browser; var nativeMethods$5 = hammerhead__default["default"].nativeMethods; // NOTE: We have to retrieve styleUtils.get from hammerhead // to avoid circular dependencies between domUtils and styleUtils var getElementStyleProperty = hammerhead__default["default"].utils.style.get; var getActiveElement = hammerhead__default["default"].utils.dom.getActiveElement; var findDocument = hammerhead__default["default"].utils.dom.findDocument; var find = hammerhead__default["default"].utils.dom.find; var isElementInDocument = hammerhead__default["default"].utils.dom.isElementInDocument; var isElementInIframe = hammerhead__default["default"].utils.dom.isElementInIframe; var getIframeByElement = hammerhead__default["default"].utils.dom.getIframeByElement; var isCrossDomainWindows = hammerhead__default["default"].utils.dom.isCrossDomainWindows; var getSelectParent = hammerhead__default["default"].utils.dom.getSelectParent; var getChildVisibleIndex = hammerhead__default["default"].utils.dom.getChildVisibleIndex; var getSelectVisibleChildren = hammerhead__default["default"].utils.dom.getSelectVisibleChildren; var isElementNode = hammerhead__default["default"].utils.dom.isElementNode; var isTextNode = hammerhead__default["default"].utils.dom.isTextNode; var isRenderedNode = hammerhead__default["default"].utils.dom.isRenderedNode; var isIframeElement = hammerhead__default["default"].utils.dom.isIframeElement; var isInputElement = hammerhead__default["default"].utils.dom.isInputElement; var isButtonElement = hammerhead__default["default"].utils.dom.isButtonElement; var isFileInput = hammerhead__default["default"].utils.dom.isFileInput; var isTextAreaElement = hammerhead__default["default"].utils.dom.isTextAreaElement; var isAnchorElement = hammerhead__default["default"].utils.dom.isAnchorElement; var isImgElement = hammerhead__default["default"].utils.dom.isImgElement; var isFormElement = hammerhead__default["default"].utils.dom.isFormElement; var isLabelElement = hammerhead__default["default"].utils.dom.isLabelElement; var isSelectElement = hammerhead__default["default"].utils.dom.isSelectElement; var isRadioButtonElement = hammerhead__default["default"].utils.dom.isRadioButtonElement; var isColorInputElement = hammerhead__default["default"].utils.dom.isColorInputElement; var isCheckboxElement = hammerhead__default["default"].utils.dom.isCheckboxElement; var isOptionElement = hammerhead__default["default"].utils.dom.isOptionElement; var isSVGElement = hammerhead__default["default"].utils.dom.isSVGElement; var isMapElement = hammerhead__default["default"].utils.dom.isMapElement; var isBodyElement = hammerhead__default["default"].utils.dom.isBodyElement; var isHtmlElement = hammerhead__default["default"].utils.dom.isHtmlElement; var isDocument = hammerhead__default["default"].utils.dom.isDocument; var isTextEditableInput = hammerhead__default["default"].utils.dom.isTextEditableInput; var isTextEditableElement = hammerhead__default["default"].utils.dom.isTextEditableElement; var isTextEditableElementAndEditingAllowed = hammerhead__default["default"].utils.dom.isTextEditableElementAndEditingAllowed; var isContentEditableElement = hammerhead__default["default"].utils.dom.isContentEditableElement; var isDomElement = hammerhead__default["default"].utils.dom.isDomElement; var isShadowUIElement = hammerhead__default["default"].utils.dom.isShadowUIElement; var isShadowRoot = hammerhead__default["default"].utils.dom.isShadowRoot; var isElementFocusable = hammerhead__default["default"].utils.dom.isElementFocusable; var isHammerheadAttr = hammerhead__default["default"].utils.dom.isHammerheadAttr; var isElementReadOnly = hammerhead__default["default"].utils.dom.isElementReadOnly; var getScrollbarSize = hammerhead__default["default"].utils.dom.getScrollbarSize; var getMapContainer = hammerhead__default["default"].utils.dom.getMapContainer; var getTagName = hammerhead__default["default"].utils.dom.getTagName; var closest = hammerhead__default["default"].utils.dom.closest; var getParents = hammerhead__default["default"].utils.dom.getParents; var findParent = hammerhead__default["default"].utils.dom.findParent; var getTopSameDomainWindow = hammerhead__default["default"].utils.dom.getTopSameDomainWindow; var getParentExceptShadowRoot = hammerhead__default["default"].utils.dom.getParentExceptShadowRoot; function canFocus(element, parent, tabIndex) { var activeElement = null; if (parent.nodeType === Node.DOCUMENT_NODE) activeElement = nativeMethods$5.documentActiveElementGetter.call(parent); if (element === activeElement) return true; if (element.disabled) return false; if (getElementStyleProperty(element, 'display') === 'none' || getElementStyleProperty(element, 'visibility') === 'hidden') return false; if (browserUtils$2.isAndroid && isOptionElement(element)) return false; if (tabIndex !== null && tabIndex < 0) return false; return true; } function wrapElement(el) { return { el: el, skip: el.shadowRoot && el.tabIndex < 0, children: {}, }; } function buildFocusableTree(parent, sort) { var node = wrapElement(parent); parent = parent.shadowRoot || parent; if (isIframeElement(parent)) parent = nativeMethods$5.contentDocumentGetter.call(parent); if (parent && (parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE || parent.nodeType === Node.DOCUMENT_NODE)) { var elements = filterFocusableElements(parent); for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) { var el = elements_1[_i]; var key = !sort || el.tabIndex <= 0 ? -1 : el.tabIndex; node.children[key] = node.children[key] || []; node.children[key].push(buildFocusableTree(el, sort)); } } return node; } function filterFocusableElements(parent) { // NOTE: We don't take into account the case of embedded contentEditable // elements and specify the contentEditable attribute for focusable elements var allElements = parent.querySelectorAll('*'); var invisibleElements = getInvisibleElements(allElements); var inputElementsRegExp = /^(input|button|select|textarea)$/; var focusableElements = []; var element = null; var tagName = null; var tabIndex = null; for (var i = 0; i < allElements.length; i++) { element = allElements[i]; tagName = getTagName(element); tabIndex = getTabIndexAttributeIntValue(element); if (!canFocus(element, parent, tabIndex)) continue; var contentEditableAttr = element.getAttribute('contenteditable'); var needPush = inputElementsRegExp.test(tagName) || element.shadowRoot || isIframeElement(element) || isAnchorElement(element) && element.hasAttribute('href') || contentEditableAttr === '' || contentEditableAttr === 'true' || tabIndex !== null; if (needPush) focusableElements.push(element); } //NOTE: remove children of invisible elements return filter(focusableElements, function (el) { return !containsElement(invisibleElements, el); }); } function flattenFocusableTree(node) { var result = []; if (!node.skip && node.el.nodeType !== Node.DOCUMENT_NODE && !isIframeElement(node.el)) result.push(node.el); for (var prop in node.children) { for (var _i = 0, _a = node.children[prop]; _i < _a.length; _i++) { var childNode = _a[_i]; result.push.apply(result, flattenFocusableTree(childNode)); } } return result; } function getFocusableElements(doc, sort) { if (sort === void 0) { sort = false; } var root = buildFocusableTree(doc, sort); return flattenFocusableTree(root); } function getInvisibleElements(elements) { var invisibleElements = []; for (var i = 0; i < elements.length; i++) { if (getElementStyleProperty(elements[i], 'display') === 'none') invisibleElements.push(elements[i]); } return invisibleElements; } function getTabIndexAttributeIntValue(el) { var tabIndex = nativeMethods$5.getAttribute.call(el, 'tabindex'); if (tabIndex !== null) { tabIndex = parseInt(tabIndex, 10); tabIndex = isNaN(tabIndex) ? null : tabIndex; } return tabIndex; } function containsElement(elements, element) { if (elements.contains) return elements.contains(element); return some(elements, function (parent) { return parent.contains(element); }); } function getTextareaIndentInLine(textarea, position) { var textareaValue = getTextAreaValue(textarea); if (!textareaValue) return 0; var topPart = textareaValue.substring(0, position); var linePosition = topPart.lastIndexOf('\n') === -1 ? 0 : topPart.lastIndexOf('\n') + 1; return position - linePosition; } function getTextareaLineNumberByPosition(textarea, position) { var textareaValue = getTextAreaValue(textarea); var lines = textareaValue.split('\n'); var topPartLength = 0; var line = 0; for (var i = 0; topPartLength <= position; i++) { if (position <= topPartLength + lines[i].length) { line = i; break; } topPartLength += lines[i].length + 1; } return line; } function getTextareaPositionByLineAndOffset(textarea, line, offset) { var textareaValue = getTextAreaValue(textarea); var lines = textareaValue.split('\n'); var lineIndex = 0; for (var i = 0; i < line; i++) lineIndex += lines[i].length + 1; return lineIndex + offset; } // NOTE: the form is also submitted on enter key press if there is only one input of certain // types (referred to as types that block implicit submission in the HTML5 standard) on the // form and this input is focused (http://www.w3.org/TR/html5/forms.html#implicit-submission) function blocksImplicitSubmission(el) { var inputTypeRegExp = null; if (browserUtils$2.isSafari) inputTypeRegExp = /^(text|password|color|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i; else if (browserUtils$2.isFirefox) inputTypeRegExp = /^(text|password|date|time|datetime|datetime-local|email|month|number|search|tel|url|week|image)$/i; else inputTypeRegExp = /^(text|password|datetime|email|number|search|tel|url|image)$/i; return inputTypeRegExp.test(el.type); } function isEditableElement(el, checkEditingAllowed) { return checkEditingAllowed ? isTextEditableElementAndEditingAllowed(el) || isContentEditableElement(el) : isTextEditableElement(el) || isContentEditableElement(el); } function isElementContainsNode(parentElement, childNode) { if (isTheSameNode(childNode, parentElement)) return true; var childNodes = nativeMethods$5.nodeChildNodesGetter.call(parentElement); var length = getChildNodesLength(childNodes); for (var i = 0; i < length; i++) { var el = childNodes[i]; if (!isShadowUIElement(el) && isElementContainsNode(el, childNode)) return true; } return false; } function isOptionGroupElement(element) { return hammerhead__default["default"].utils.dom.instanceToString(element) === '[object HTMLOptGroupElement]'; } function getElementIndexInParent(parent, child) { var children = parent.querySelectorAll(getTagName(child)); return indexOf(children, child); } function isTheSameNode(node1, node2) { //NOTE: Mozilla has not isSameNode method if (node1 && node2 && node1.isSameNode) return node1.isSameNode(node2); return node1 === node2; } function getElementDescription(el) { var attributes = { id: 'id', name: 'name', 'class': 'className', }; var res = []; res.push('<'); res.push(getTagName(el)); for (var attr in attributes) { if (attributes.hasOwnProperty(attr)) { //eslint-disable-line no-prototype-builtins var val = el[attributes[attr]]; if (val) res.push(' ' + attr + '="' + val + '"'); } } res.push('>'); return res.join(''); } function getFocusableParent(el) { var parents = getParents(el); for (var i = 0; i < parents.length; i++) { if (isElementFocusable(parents[i])) return parents[i]; } return null; } function remove(el) { if (el && el.parentElement) el.parentElement.removeChild(el); } function isIFrameWindowInDOM(win) { var frameElement = null; try { //NOTE: This may raise a cross-domain policy error in some browsers. frameElement = win.frameElement; } catch (e) { return !!win.top; } // NOTE: in Firefox and WebKit, frameElement is null for cross-domain iframes even if they are in the DOM. // But these browsers don't execute scripts in removed iframes, so we suppose that the iframe is in the DOM. if ((browserUtils$2.isFirefox || browserUtils$2.isWebKit) && win.top !== win && !frameElement) return true; return !!(frameElement && nativeMethods$5.contentDocumentGetter.call(frameElement)); } function isTopWindow(win) { return win.top === win; } function findIframeByWindow(iframeWindow) { var iframes = []; find(document, '*', function (elem) { if (elem.tagName === 'IFRAME') iframes.push(elem); if (elem.shadowRoot) find(elem.shadowRoot, 'iframe', function (iframe) { return iframes.push(iframe); }); }); for (var i = 0; i < iframes.length; i++) { if (nativeMethods$5.contentWindowGetter.call(iframes[i]) === iframeWindow) return iframes[i]; } return null; } function isEditableFormElement(element) { return isTextEditableElement(element) || isSelectElement(element); } function getCommonAncestor(element1, element2) { if (isTheSameNode(element1, element2)) return element1; var el1Parents = [element1].concat(getParents(element1)); var commonAncestor = element2; while (commonAncestor) { if (indexOf(el1Parents, commonAncestor) > -1) return commonAncestor; commonAncestor = nativeMethods$5.nodeParentNodeGetter.call(commonAncestor); } return commonAncestor; } function getChildrenLength(children) { return nativeMethods$5.htmlCollectionLengthGetter.call(children); } function getChildNodesLength(childNodes) { return nativeMethods$5.nodeListLengthGetter.call(childNodes); } function getInputValue(input) { return nativeMethods$5.inputValueGetter.call(input); } function getTextAreaValue(textArea) { return nativeMethods$5.textAreaValueGetter.call(textArea); } function setInputValue(input, value) { return nativeMethods$5.inputValueSetter.call(input, value); } function setTextAreaValue(textArea, value) { return nativeMethods$5.textAreaValueSetter.call(textArea, value); } function getElementValue(element) { if (isInputElement(element)) return getInputValue(element); else if (isTextAreaElement(element)) return getTextAreaValue(element); /*eslint-disable no-restricted-properties*/ return element.value; /*eslint-enable no-restricted-properties*/ } function setElementValue(element, value) { if (isInputElement(element)) return setInputValue(element, value); else if (isTextAreaElement(element)) return setTextAreaValue(element, value); /*eslint-disable no-restricted-properties*/ element.value = value; /*eslint-enable no-restricted-properties*/ return value; } function isShadowElement(element) { return element && element.getRootNode && findDocument(element) !== element.getRootNode(); } function contains(element, target) { if (!element || !target) return false; if (element.contains) return element.contains(target); return !!findParent(target, true, function (node) { return node === element; }); } function isNodeEqual(el1, el2) { return el1 === el2; } function getNodeText(el) { return nativeMethods$5.nodeTextContentGetter.call(el); } function getImgMapName(img) { return img.useMap.substring(1); } function getDocumentElement(win) { return win.document.documentElement; } function isDocumentElement(el) { return el === document.documentElement; } var domUtils = /*#__PURE__*/Object.freeze({ __proto__: null, getActiveElement: getActiveElement, findDocument: findDocument, find: find, isElementInDocument: isElementInDocument, isElementInIframe: isElementInIframe, getIframeByElement: getIframeByElement, isCrossDomainWindows: isCrossDomainWindows, getSelectParent: getSelectParent, getChildVisibleIndex: getChildVisibleIndex, getSelectVisibleChildren: getSelectVisibleChildren, isElementNode: isElementNode, isTextNode: isTextNode, isRenderedNode: isRenderedNode, isIframeElement: isIframeElement, isInputElement: isInputElement, isButtonElement: isButtonElement, isFileInput: isFileInput, isTextAreaElement: isTextAreaElement, isAnchorElement: isAnchorElement, isImgElement: isImgElement, isFormElement: isFormElement, isLabelElement: isLabelElement, isSelectElement: isSelectElement, isRadioButtonElement: isRadioButtonElement, isColorInputElement: isColorInputElement, isCheckboxElement: isCheckboxElement, isOptionElement: isOptionElement, isSVGElement: isSVGElement, isMapElement: isMapElement, isBodyElement: isBodyElement, isHtmlElement: isHtmlElement, isDocument: isDocument, isTextEditableInput: isTextEditableInput, isTextEditableElement: isTextEditableElement, isTextEditableElementAndEditingAllowed: isTextEditableElementAndEditingAllowed, isContentEditableElement: isContentEditableElement, isDomElement: isDomElement, isShadowUIElement: isShadowUIElement, isShadowRoot: isShadowRoot, isElementFocusable: isElementFocusable, isHammerheadAttr: isHammerheadAttr, isElementReadOnly: isElementReadOnly, getScrollbarSize: getScrollbarSize, getMapContainer: getMapContainer, getTagName: getTagName, closest: closest, getParents: getParents, findParent: findParent, getTopSameDomainWindow: getTopSameDomainWindow, getParentExceptShadowRoot: getParentExceptShadowRoot, getFocusableElements: getFocusableElements, getTabIndexAttributeIntValue: getTabIndexAttributeIntValue, containsElement: containsElement, getTextareaIndentInLine: getTextareaIndentInLine, getTextareaLineNumberByPosition: getTextareaLineNumberByPosition, getTextareaPositionByLineAndOffset: getTextareaPositionByLineAndOffset, blocksImplicitSubmission: blocksImplicitSubmission, isEditableElement: isEditableElement, isElementContainsNode: isElementContainsNode, isOptionGroupElement: isOptionGroupElement, getElementIndexInParent: getElementIndexInParent, isTheSameNode: isTheSameNode, getElementDescription: getElementDescription, getFocusableParent: getFocusableParent, remove: remove, isIFrameWindowInDOM: isIFrameWindowInDOM, isTopWindow: isTopWindow, findIframeByWindow: findIframeByWindow, isEditableFormElement: isEditableFormElement, getCommonAncestor: getCommonAncestor, getChildrenLength: getChildrenLength, getChildNodesLength: getChildNodesLength, getInputValue: getInputValue, getTextAreaValue: getTextAreaValue, setInputValue: setInputValue, setTextAreaValue: setTextAreaValue, getElementValue: getE