{"version":3,"sources":["src/cdk/cdk-testing-protractor.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","cdk","testing","protractor","this","_a","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","TypeError","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spread","arguments","concat","keyMap","TestKey","BACKSPACE","Key","BACK_SPACE","TAB","ENTER","SHIFT","CONTROL","ALT","ESCAPE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT_ARROW","ARROW_LEFT","UP_ARROW","ARROW_UP","RIGHT_ARROW","ARROW_RIGHT","DOWN_ARROW","ARROW_DOWN","INSERT","DELETE","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","META","toProtractorModifierKeys","modifiers","control","alt","shift","meta","ProtractorElement","element","blur","browser","executeScript","clear","click","args","_i","_dispatchClickEventSequence","Button","LEFT","rightClick","RIGHT","focus","getCssValue","property","hover","_b","_c","actions","mouseMove","getWebElement","perform","mouseAway","x","sendKeys","modifiersAndKeys","first","rest","modifierKeys","keys","slice","map","k","split","reduce","arr","chord","text","options","exclude","_getTextWithExcludedElements","getText","getAttribute","name","hasClass","classes","Set","filter","c","has","getDimensions","width","height","getSize","getLocation","left","top","getProperty","setInputValue","selectOptions","optionIndexes","indexes","all","by","css","size","keyDown","keyUp","matchesSelector","selector","isFocused","equals","driver","switchTo","activeElement","dispatchEvent","data","_dispatchEvent","button","offsetArgs","modifierKeys_1","modifierKeys_1_1","modifierKeys_2","modifierKeys_2_1","_d","e_1","_e","e_2","_f","_g","e_1_1","e_2_1","event","document","createEvent","initEvent","assign","defaultEnvironmentOptions","queryFn","root","ProtractorHarnessEnvironment","_super","rawRootElement","_this","_options","__extends","String","__","constructor","create","loader","getNativeElement","el","Error","forceStabilize","waitForTasksOutsideAngular","getDocumentRoot","createTestElement","createEnvironment","getAllRawElements","elementArrayFinder","elements","count","get","HarnessEnvironment","defineProperty"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing'), require('protractor')) :\n    typeof define === 'function' && define.amd ? define('@angular/cdk/testing/protractor', ['exports', '@angular/cdk/testing', 'protractor'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.testing = global.ng.cdk.testing || {}, global.ng.cdk.testing.protractor = {}), global.ng.cdk.testing, global.protractor));\n}(this, (function (exports, testing, protractor) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    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)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    var _a;\n    /** Maps the `TestKey` constants to Protractor's `Key` constants. */\n    var keyMap = (_a = {},\n        _a[testing.TestKey.BACKSPACE] = protractor.Key.BACK_SPACE,\n        _a[testing.TestKey.TAB] = protractor.Key.TAB,\n        _a[testing.TestKey.ENTER] = protractor.Key.ENTER,\n        _a[testing.TestKey.SHIFT] = protractor.Key.SHIFT,\n        _a[testing.TestKey.CONTROL] = protractor.Key.CONTROL,\n        _a[testing.TestKey.ALT] = protractor.Key.ALT,\n        _a[testing.TestKey.ESCAPE] = protractor.Key.ESCAPE,\n        _a[testing.TestKey.PAGE_UP] = protractor.Key.PAGE_UP,\n        _a[testing.TestKey.PAGE_DOWN] = protractor.Key.PAGE_DOWN,\n        _a[testing.TestKey.END] = protractor.Key.END,\n        _a[testing.TestKey.HOME] = protractor.Key.HOME,\n        _a[testing.TestKey.LEFT_ARROW] = protractor.Key.ARROW_LEFT,\n        _a[testing.TestKey.UP_ARROW] = protractor.Key.ARROW_UP,\n        _a[testing.TestKey.RIGHT_ARROW] = protractor.Key.ARROW_RIGHT,\n        _a[testing.TestKey.DOWN_ARROW] = protractor.Key.ARROW_DOWN,\n        _a[testing.TestKey.INSERT] = protractor.Key.INSERT,\n        _a[testing.TestKey.DELETE] = protractor.Key.DELETE,\n        _a[testing.TestKey.F1] = protractor.Key.F1,\n        _a[testing.TestKey.F2] = protractor.Key.F2,\n        _a[testing.TestKey.F3] = protractor.Key.F3,\n        _a[testing.TestKey.F4] = protractor.Key.F4,\n        _a[testing.TestKey.F5] = protractor.Key.F5,\n        _a[testing.TestKey.F6] = protractor.Key.F6,\n        _a[testing.TestKey.F7] = protractor.Key.F7,\n        _a[testing.TestKey.F8] = protractor.Key.F8,\n        _a[testing.TestKey.F9] = protractor.Key.F9,\n        _a[testing.TestKey.F10] = protractor.Key.F10,\n        _a[testing.TestKey.F11] = protractor.Key.F11,\n        _a[testing.TestKey.F12] = protractor.Key.F12,\n        _a[testing.TestKey.META] = protractor.Key.META,\n        _a);\n    /** Converts a `ModifierKeys` object to a list of Protractor `Key`s. */\n    function toProtractorModifierKeys(modifiers) {\n        var result = [];\n        if (modifiers.control) {\n            result.push(protractor.Key.CONTROL);\n        }\n        if (modifiers.alt) {\n            result.push(protractor.Key.ALT);\n        }\n        if (modifiers.shift) {\n            result.push(protractor.Key.SHIFT);\n        }\n        if (modifiers.meta) {\n            result.push(protractor.Key.META);\n        }\n        return result;\n    }\n    /** A `TestElement` implementation for Protractor. */\n    var ProtractorElement = /** @class */ (function () {\n        function ProtractorElement(element) {\n            this.element = element;\n        }\n        ProtractorElement.prototype.blur = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript('arguments[0].blur()', this.element)];\n                });\n            });\n        };\n        ProtractorElement.prototype.clear = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.element.clear()];\n                });\n            });\n        };\n        ProtractorElement.prototype.click = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._dispatchClickEventSequence(args, protractor.Button.LEFT)];\n                        case 1:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.rightClick = function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._dispatchClickEventSequence(args, protractor.Button.RIGHT)];\n                        case 1:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.focus = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript('arguments[0].focus()', this.element)];\n                });\n            });\n        };\n        ProtractorElement.prototype.getCssValue = function (property) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.element.getCssValue(property)];\n                });\n            });\n        };\n        ProtractorElement.prototype.hover = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0:\n                            _b = (_a = protractor.browser.actions())\n                                .mouseMove;\n                            return [4 /*yield*/, this.element.getWebElement()];\n                        case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])\n                                .perform()];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.mouseAway = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0:\n                            _b = (_a = protractor.browser.actions())\n                                .mouseMove;\n                            return [4 /*yield*/, this.element.getWebElement()];\n                        case 1: return [2 /*return*/, _b.apply(_a, [_c.sent(), { x: -1, y: -1 }])\n                                .perform()];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.sendKeys = function () {\n            var modifiersAndKeys = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                modifiersAndKeys[_i] = arguments[_i];\n            }\n            return __awaiter(this, void 0, void 0, function () {\n                var first, modifiers, rest, modifierKeys, keys;\n                var _a;\n                return __generator(this, function (_b) {\n                    first = modifiersAndKeys[0];\n                    if (typeof first !== 'string' && typeof first !== 'number') {\n                        modifiers = first;\n                        rest = modifiersAndKeys.slice(1);\n                    }\n                    else {\n                        modifiers = {};\n                        rest = modifiersAndKeys;\n                    }\n                    modifierKeys = toProtractorModifierKeys(modifiers);\n                    keys = rest.map(function (k) { return typeof k === 'string' ? k.split('') : [keyMap[k]]; })\n                        .reduce(function (arr, k) { return arr.concat(k); }, [])\n                        // Key.chord doesn't work well with geckodriver (mozilla/geckodriver#1502),\n                        // so avoid it if no modifier keys are required.\n                        .map(function (k) { return modifierKeys.length > 0 ? protractor.Key.chord.apply(protractor.Key, __spread(modifierKeys, [k])) : k; });\n                    return [2 /*return*/, (_a = this.element).sendKeys.apply(_a, __spread(keys))];\n                });\n            });\n        };\n        ProtractorElement.prototype.text = function (options) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    if (options === null || options === void 0 ? void 0 : options.exclude) {\n                        return [2 /*return*/, protractor.browser.executeScript(testing._getTextWithExcludedElements, this.element, options.exclude)];\n                    }\n                    return [2 /*return*/, this.element.getText()];\n                });\n            });\n        };\n        ProtractorElement.prototype.getAttribute = function (name) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript(\"return arguments[0].getAttribute(arguments[1])\", this.element, name)];\n                });\n            });\n        };\n        ProtractorElement.prototype.hasClass = function (name) {\n            return __awaiter(this, void 0, void 0, function () {\n                var classes;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getAttribute('class')];\n                        case 1:\n                            classes = (_a.sent()) || '';\n                            return [2 /*return*/, new Set(classes.split(/\\s+/).filter(function (c) { return c; })).has(name)];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.getDimensions = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, width, height, _b, left, top;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0: return [4 /*yield*/, this.element.getSize()];\n                        case 1:\n                            _a = _c.sent(), width = _a.width, height = _a.height;\n                            return [4 /*yield*/, this.element.getLocation()];\n                        case 2:\n                            _b = _c.sent(), left = _b.x, top = _b.y;\n                            return [2 /*return*/, { width: width, height: height, left: left, top: top }];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.getProperty = function (name) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript(\"return arguments[0][arguments[1]]\", this.element, name)];\n                });\n            });\n        };\n        ProtractorElement.prototype.setInputValue = function (value) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript(\"arguments[0].value = arguments[1]\", this.element, value)];\n                });\n            });\n        };\n        ProtractorElement.prototype.selectOptions = function () {\n            var optionIndexes = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                optionIndexes[_i] = arguments[_i];\n            }\n            return __awaiter(this, void 0, void 0, function () {\n                var options, indexes, i;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.element.all(protractor.by.css('option'))];\n                        case 1:\n                            options = _a.sent();\n                            indexes = new Set(optionIndexes);\n                            if (!(options.length && indexes.size)) return [3 /*break*/, 8];\n                            // Reset the value so all the selected states are cleared. We can\n                            // reuse the input-specific method since the logic is the same.\n                            return [4 /*yield*/, this.setInputValue('')];\n                        case 2:\n                            // Reset the value so all the selected states are cleared. We can\n                            // reuse the input-specific method since the logic is the same.\n                            _a.sent();\n                            i = 0;\n                            _a.label = 3;\n                        case 3:\n                            if (!(i < options.length)) return [3 /*break*/, 8];\n                            if (!indexes.has(i)) return [3 /*break*/, 7];\n                            // We have to hold the control key while clicking on options so that multiple can be\n                            // selected in multi-selection mode. The key doesn't do anything for single selection.\n                            return [4 /*yield*/, protractor.browser.actions().keyDown(protractor.Key.CONTROL).perform()];\n                        case 4:\n                            // We have to hold the control key while clicking on options so that multiple can be\n                            // selected in multi-selection mode. The key doesn't do anything for single selection.\n                            _a.sent();\n                            return [4 /*yield*/, options[i].click()];\n                        case 5:\n                            _a.sent();\n                            return [4 /*yield*/, protractor.browser.actions().keyUp(protractor.Key.CONTROL).perform()];\n                        case 6:\n                            _a.sent();\n                            _a.label = 7;\n                        case 7:\n                            i++;\n                            return [3 /*break*/, 3];\n                        case 8: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        ProtractorElement.prototype.matchesSelector = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript(\"\\n          return (Element.prototype.matches ||\\n                  Element.prototype.msMatchesSelector).call(arguments[0], arguments[1])\\n          \", this.element, selector)];\n                });\n            });\n        };\n        ProtractorElement.prototype.isFocused = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.element.equals(protractor.browser.driver.switchTo().activeElement())];\n                });\n            });\n        };\n        ProtractorElement.prototype.dispatchEvent = function (name, data) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, protractor.browser.executeScript(_dispatchEvent, name, this.element, data)];\n                });\n            });\n        };\n        /** Dispatches all the events that are part of a click event sequence. */\n        ProtractorElement.prototype._dispatchClickEventSequence = function (args, button) {\n            return __awaiter(this, void 0, void 0, function () {\n                var modifiers, modifierKeys, offsetArgs, actions, _a, _b, _c, modifierKeys_1, modifierKeys_1_1, modifierKey, modifierKeys_2, modifierKeys_2_1, modifierKey;\n                var _d, e_1, _e, e_2, _f;\n                return __generator(this, function (_g) {\n                    switch (_g.label) {\n                        case 0:\n                            modifiers = {};\n                            if (args.length && typeof args[args.length - 1] === 'object') {\n                                modifiers = args.pop();\n                            }\n                            modifierKeys = toProtractorModifierKeys(modifiers);\n                            offsetArgs = (args.length === 2 ?\n                                [{ x: args[0], y: args[1] }] : []);\n                            _b = (_a = (_d = protractor.browser.actions())\n                                .mouseMove).apply;\n                            _c = [_d];\n                            return [4 /*yield*/, this.element.getWebElement()];\n                        case 1:\n                            actions = _b.apply(_a, _c.concat([__spread.apply(void 0, [[_g.sent()], offsetArgs])]));\n                            try {\n                                for (modifierKeys_1 = __values(modifierKeys), modifierKeys_1_1 = modifierKeys_1.next(); !modifierKeys_1_1.done; modifierKeys_1_1 = modifierKeys_1.next()) {\n                                    modifierKey = modifierKeys_1_1.value;\n                                    actions = actions.keyDown(modifierKey);\n                                }\n                            }\n                            catch (e_1_1) { e_1 = { error: e_1_1 }; }\n                            finally {\n                                try {\n                                    if (modifierKeys_1_1 && !modifierKeys_1_1.done && (_e = modifierKeys_1.return)) _e.call(modifierKeys_1);\n                                }\n                                finally { if (e_1) throw e_1.error; }\n                            }\n                            actions = actions.click(button);\n                            try {\n                                for (modifierKeys_2 = __values(modifierKeys), modifierKeys_2_1 = modifierKeys_2.next(); !modifierKeys_2_1.done; modifierKeys_2_1 = modifierKeys_2.next()) {\n                                    modifierKey = modifierKeys_2_1.value;\n                                    actions = actions.keyUp(modifierKey);\n                                }\n                            }\n                            catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                            finally {\n                                try {\n                                    if (modifierKeys_2_1 && !modifierKeys_2_1.done && (_f = modifierKeys_2.return)) _f.call(modifierKeys_2);\n                                }\n                                finally { if (e_2) throw e_2.error; }\n                            }\n                            return [4 /*yield*/, actions.perform()];\n                        case 2:\n                            _g.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return ProtractorElement;\n    }());\n    /**\n     * Dispatches an event with a particular name and data to an element.\n     * Note that this needs to be a pure function, because it gets stringified by\n     * Protractor and is executed inside the browser.\n     */\n    function _dispatchEvent(name, element, data) {\n        var event = document.createEvent('Event');\n        event.initEvent(name);\n        if (data) {\n            // tslint:disable-next-line:ban Have to use `Object.assign` to preserve the original object.\n            Object.assign(event, data);\n        }\n        // This type has a string index signature, so we cannot access it using a dotted property access.\n        element['dispatchEvent'](event);\n    }\n\n    /** The default environment options. */\n    var defaultEnvironmentOptions = {\n        queryFn: function (selector, root) { return root.all(protractor.by.css(selector)); }\n    };\n    /** A `HarnessEnvironment` implementation for Protractor. */\n    var ProtractorHarnessEnvironment = /** @class */ (function (_super) {\n        __extends(ProtractorHarnessEnvironment, _super);\n        function ProtractorHarnessEnvironment(rawRootElement, options) {\n            var _this = _super.call(this, rawRootElement) || this;\n            _this._options = Object.assign(Object.assign({}, defaultEnvironmentOptions), options);\n            return _this;\n        }\n        /** Creates a `HarnessLoader` rooted at the document root. */\n        ProtractorHarnessEnvironment.loader = function (options) {\n            return new ProtractorHarnessEnvironment(protractor.element(protractor.by.css('body')), options);\n        };\n        /** Gets the ElementFinder corresponding to the given TestElement. */\n        ProtractorHarnessEnvironment.getNativeElement = function (el) {\n            if (el instanceof ProtractorElement) {\n                return el.element;\n            }\n            throw Error('This TestElement was not created by the ProtractorHarnessEnvironment');\n        };\n        ProtractorHarnessEnvironment.prototype.forceStabilize = function () {\n            return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {\n                return [2 /*return*/];\n            }); });\n        };\n        ProtractorHarnessEnvironment.prototype.waitForTasksOutsideAngular = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/];\n                });\n            });\n        };\n        ProtractorHarnessEnvironment.prototype.getDocumentRoot = function () {\n            return protractor.element(protractor.by.css('body'));\n        };\n        ProtractorHarnessEnvironment.prototype.createTestElement = function (element) {\n            return new ProtractorElement(element);\n        };\n        ProtractorHarnessEnvironment.prototype.createEnvironment = function (element) {\n            return new ProtractorHarnessEnvironment(element, this._options);\n        };\n        ProtractorHarnessEnvironment.prototype.getAllRawElements = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var elementArrayFinder, length, elements, i;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0:\n                            elementArrayFinder = this._options.queryFn(selector, this.rawRootElement);\n                            return [4 /*yield*/, elementArrayFinder.count()];\n                        case 1:\n                            length = _a.sent();\n                            elements = [];\n                            for (i = 0; i < length; i++) {\n                                elements.push(elementArrayFinder.get(i));\n                            }\n                            return [2 /*return*/, elements];\n                    }\n                });\n            });\n        };\n        return ProtractorHarnessEnvironment;\n    }(testing.HarnessEnvironment));\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    /**\n     * @license\n     * Copyright Google LLC All Rights Reserved.\n     *\n     * Use of this source code is governed by an MIT-style license that can be\n     * found in the LICENSE file at https://angular.io/license\n     */\n\n    exports.ProtractorElement = ProtractorElement;\n    exports.ProtractorHarnessEnvironment = ProtractorHarnessEnvironment;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=cdk-testing-protractor.umd.js.map\n"]}