testcafe 2.3.1 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/LICENSE +1 -1
  3. package/README.md +40 -46
  4. package/bin/testcafe-with-v8-flag-filter.js +10 -16
  5. package/lib/api/exportable-lib/index.js +1 -11
  6. package/lib/api/structure/test.js +4 -11
  7. package/lib/api/test-controller/execution-context.js +4 -2
  8. package/lib/api/test-controller/index.js +8 -10
  9. package/lib/api/test-run-tracker.js +1 -1
  10. package/lib/assertions/executor.js +2 -11
  11. package/lib/browser/connection/gateway/index.js +272 -0
  12. package/lib/browser/connection/gateway/status.js +10 -0
  13. package/lib/browser/connection/index.js +60 -47
  14. package/lib/browser/connection/service-routes.js +4 -2
  15. package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +3 -2
  16. package/lib/browser/provider/built-in/dedicated/chrome/index.js +48 -23
  17. package/lib/browser/provider/built-in/dedicated/edge/index.js +4 -1
  18. package/lib/browser/provider/index.js +13 -4
  19. package/lib/browser/provider/plugin-host.js +7 -1
  20. package/lib/cli/argument-parser/index.js +10 -16
  21. package/lib/cli/cli.js +4 -13
  22. package/lib/cli/remotes-wizard.js +2 -1
  23. package/lib/cli/utils/should-move-option-to-end.js +17 -0
  24. package/lib/client/automation/deps/hammerhead.js +24 -0
  25. package/lib/client/automation/deps/testcafe-core.js +24 -0
  26. package/lib/client/automation/index.js +567 -187
  27. package/lib/client/automation/index.min.js +1 -1
  28. package/lib/client/automation/playback/press/get-key-info.js +44 -0
  29. package/lib/client/automation/playback/press/utils.js +142 -0
  30. package/lib/client/automation/utils/get-key-code.js +15 -0
  31. package/lib/client/automation/utils/get-key-identifier.js +14 -0
  32. package/lib/client/automation/utils/is-letter.js +7 -0
  33. package/lib/client/automation/utils/key-identifier-maps.js +93 -0
  34. package/lib/client/browser/idle-page/index.html.mustache +2 -2
  35. package/lib/client/browser/idle-page/index.js +24 -11
  36. package/lib/client/core/index.js +67 -13
  37. package/lib/client/core/index.min.js +1 -1
  38. package/lib/client/core/utils/array.js +77 -0
  39. package/lib/client/core/utils/dom.js +459 -0
  40. package/lib/client/core/utils/send-request-to-frame.js +22 -0
  41. package/lib/client/core/utils/style.js +102 -0
  42. package/lib/client/core/utils/values/boundary-values.js +41 -0
  43. package/lib/client/driver/index.js +270 -242
  44. package/lib/client/driver/index.min.js +1 -1
  45. package/lib/client/test-run/iframe.js.mustache +6 -6
  46. package/lib/client/test-run/index.js.mustache +37 -33
  47. package/lib/client/ui/index.js +3238 -54
  48. package/lib/client/ui/index.min.js +1 -1
  49. package/lib/client/ui/sprite.svg +15 -0
  50. package/lib/client/ui/styles.css +184 -41
  51. package/lib/compiler/babel/load-libs.js +6 -6
  52. package/lib/compiler/compilers.js +7 -7
  53. package/lib/compiler/index.js +6 -6
  54. package/lib/compiler/interfaces.js +1 -1
  55. package/lib/compiler/test-file/add-export-api.js +3 -3
  56. package/lib/compiler/test-file/api-based.js +8 -37
  57. package/lib/compiler/test-file/formats/es-next/compiler.js +5 -5
  58. package/lib/compiler/test-file/formats/typescript/compiler.js +9 -9
  59. package/lib/compiler/test-file/get-exportable-lib-path.js +3 -3
  60. package/lib/configuration/configuration-base.js +9 -6
  61. package/lib/configuration/default-values.js +3 -3
  62. package/lib/configuration/formats.js +9 -5
  63. package/lib/configuration/interfaces.js +1 -1
  64. package/lib/configuration/option-names.js +3 -4
  65. package/lib/configuration/run-option-names.js +2 -2
  66. package/lib/configuration/testcafe-configuration.js +41 -24
  67. package/lib/configuration/types.js +1 -1
  68. package/lib/configuration/utils.js +32 -0
  69. package/lib/custom-client-scripts/client-script.js +2 -2
  70. package/lib/custom-client-scripts/get-code.js +3 -3
  71. package/lib/custom-client-scripts/routing.js +10 -12
  72. package/lib/errors/runtime/templates.js +3 -2
  73. package/lib/errors/test-run/templates.js +4 -1
  74. package/lib/errors/types.js +3 -1
  75. package/lib/index.js +6 -31
  76. package/lib/live/bootstrapper.js +3 -3
  77. package/lib/live/test-runner.js +9 -7
  78. package/lib/native-automation/add-custom-debug-formatters.js +23 -0
  79. package/lib/native-automation/api-base.js +27 -0
  80. package/lib/native-automation/client/event-descriptor.js +118 -0
  81. package/lib/native-automation/client/input.js +46 -0
  82. package/lib/native-automation/client/key-press/utils.js +31 -0
  83. package/lib/native-automation/client/types.js +11 -0
  84. package/lib/native-automation/client/utils.js +54 -0
  85. package/lib/native-automation/cookie-provider.js +115 -0
  86. package/lib/native-automation/empty-page-markup.js +11 -0
  87. package/lib/native-automation/error-route.js +7 -0
  88. package/lib/native-automation/errors.js +20 -0
  89. package/lib/native-automation/index.js +53 -0
  90. package/lib/native-automation/request-hooks/event-factory/frame-navigated-event-based.js +40 -0
  91. package/lib/native-automation/request-hooks/event-factory/request-paused-event-based.js +94 -0
  92. package/lib/native-automation/request-hooks/event-provider.js +55 -0
  93. package/lib/native-automation/request-hooks/pipeline-context.js +11 -0
  94. package/lib/{proxyless → native-automation}/request-pipeline/constants.js +1 -1
  95. package/lib/native-automation/request-pipeline/context-info.js +58 -0
  96. package/lib/native-automation/request-pipeline/index.js +329 -0
  97. package/lib/native-automation/request-pipeline/resendAuthRequest.js +23 -0
  98. package/lib/native-automation/request-pipeline/safe-api.js +66 -0
  99. package/lib/native-automation/request-pipeline/special-handlers.js +76 -0
  100. package/lib/native-automation/request-pipeline/test-run-bridge.js +45 -0
  101. package/lib/native-automation/resource-injector.js +175 -0
  102. package/lib/native-automation/session-storage/index.js +43 -0
  103. package/lib/native-automation/storages-provider.js +17 -0
  104. package/lib/native-automation/types.js +12 -0
  105. package/lib/native-automation/utils/cdp.js +71 -0
  106. package/lib/native-automation/utils/convert.js +11 -0
  107. package/lib/native-automation/utils/get-active-client.js +8 -0
  108. package/lib/native-automation/utils/headers.js +30 -0
  109. package/lib/native-automation/utils/string.js +32 -0
  110. package/lib/reporter/index.js +52 -4
  111. package/lib/reporter/interfaces.js +1 -1
  112. package/lib/reporter/plugin-host.js +44 -4
  113. package/lib/reporter/plugin-methods.js +2 -1
  114. package/lib/reporter/report-data-log.js +25 -0
  115. package/lib/role/role.js +4 -39
  116. package/lib/runner/bootstrapper.js +40 -15
  117. package/lib/runner/browser-job.js +4 -5
  118. package/lib/runner/fixture-hook-controller.js +1 -7
  119. package/lib/runner/index.js +87 -94
  120. package/lib/runner/interfaces.js +1 -1
  121. package/lib/runner/task/index.js +2 -32
  122. package/lib/runner/test-run-controller.js +46 -4
  123. package/lib/shared/errors/index.js +8 -2
  124. package/lib/shared/utils/is-file-protocol.js +2 -2
  125. package/lib/test-run/bookmark.js +5 -23
  126. package/lib/test-run/commands/actions.js +16 -4
  127. package/lib/test-run/commands/service.js +2 -3
  128. package/lib/test-run/commands/type.js +2 -1
  129. package/lib/test-run/commands/utils.js +4 -2
  130. package/lib/test-run/cookies/base.js +4 -1
  131. package/lib/test-run/cookies/factory.js +4 -4
  132. package/lib/test-run/cookies/provider.js +9 -2
  133. package/lib/test-run/execute-js-expression/index.js +4 -2
  134. package/lib/test-run/index.js +35 -151
  135. package/lib/test-run/request/create-request-options.js +37 -24
  136. package/lib/test-run/request/send.js +2 -3
  137. package/lib/test-run/role-provider.js +5 -5
  138. package/lib/test-run/session-controller.js +5 -5
  139. package/lib/test-run/storages/factory.js +4 -4
  140. package/lib/testcafe.js +17 -18
  141. package/lib/utils/check-is-vm.js +58 -0
  142. package/lib/utils/debug-loggers.js +9 -7
  143. package/lib/utils/get-browser.js +5 -2
  144. package/lib/utils/get-options/boolean-or-object-option.js +18 -0
  145. package/lib/utils/get-options/quarantine.js +10 -13
  146. package/lib/utils/get-options/skip-js-errors.js +12 -16
  147. package/lib/utils/parse-user-agent.js +20 -13
  148. package/lib/utils/string.js +1 -1
  149. package/package.json +14 -11
  150. package/ts-defs/index.d.ts +12 -2
  151. package/ts-defs/selectors.d.ts +8 -1
  152. package/ts-defs/testcafe-scripts.d.ts +8 -1
  153. package/lib/browser/connection/gateway.js +0 -205
  154. package/lib/compiler/test-file/test-file-temp-variable-name.js +0 -6
  155. package/lib/dashboard/config-storage.js +0 -26
  156. package/lib/dashboard/connector.js +0 -84
  157. package/lib/dashboard/documentation-url.js +0 -6
  158. package/lib/dashboard/formatting.js +0 -26
  159. package/lib/dashboard/get-dashboard-url.js +0 -10
  160. package/lib/dashboard/get-default-project-link.js +0 -23
  161. package/lib/dashboard/get-env-options.js +0 -26
  162. package/lib/dashboard/index.js +0 -145
  163. package/lib/dashboard/interfaces.js +0 -3
  164. package/lib/dashboard/messages.js +0 -21
  165. package/lib/proxyless/add-custom-debug-formatters.js +0 -22
  166. package/lib/proxyless/api-base.js +0 -25
  167. package/lib/proxyless/client/event-simulator.js +0 -40
  168. package/lib/proxyless/client/types.js +0 -11
  169. package/lib/proxyless/client/utils.js +0 -24
  170. package/lib/proxyless/cookie-provider.js +0 -87
  171. package/lib/proxyless/default-setup-options.js +0 -9
  172. package/lib/proxyless/empty-page-markup.js +0 -11
  173. package/lib/proxyless/error-route.js +0 -7
  174. package/lib/proxyless/index.js +0 -53
  175. package/lib/proxyless/request-hooks/event-factory/frame-navigated-event-based.js +0 -40
  176. package/lib/proxyless/request-hooks/event-factory/request-paused-event-based.js +0 -95
  177. package/lib/proxyless/request-hooks/event-provider.js +0 -52
  178. package/lib/proxyless/request-hooks/pipeline-context.js +0 -11
  179. package/lib/proxyless/request-pipeline/context-info.js +0 -55
  180. package/lib/proxyless/request-pipeline/index.js +0 -230
  181. package/lib/proxyless/request-pipeline/resendAuthRequest.js +0 -23
  182. package/lib/proxyless/request-pipeline/safe-api.js +0 -62
  183. package/lib/proxyless/request-pipeline/special-handlers.js +0 -73
  184. package/lib/proxyless/request-pipeline/test-run-bridge.js +0 -45
  185. package/lib/proxyless/resource-injector.js +0 -162
  186. package/lib/proxyless/session-storage/index.js +0 -39
  187. package/lib/proxyless/storages-provider.js +0 -17
  188. package/lib/proxyless/types.js +0 -10
  189. package/lib/proxyless/utils/cdp.js +0 -66
  190. package/lib/proxyless/utils/get-active-client.js +0 -8
  191. package/lib/proxyless/utils/headers.js +0 -30
  192. package/lib/proxyless/utils/string.js +0 -32
  193. package/lib/services/compiler/esm-runtime-holder-name.js +0 -6
  194. package/lib/services/compiler/host.js +0 -370
  195. package/lib/services/compiler/interfaces.js +0 -3
  196. package/lib/services/compiler/io.js +0 -10
  197. package/lib/services/compiler/protocol.js +0 -17
  198. package/lib/services/compiler/service-loader.js +0 -18
  199. package/lib/services/compiler/service.js +0 -361
  200. package/lib/services/compiler/test-run-proxy.js +0 -156
  201. package/lib/services/interfaces.js +0 -3
  202. package/lib/services/process-title.js +0 -10
  203. package/lib/services/serialization/prepare-options.js +0 -23
  204. package/lib/services/serialization/replicator/create-replicator.js +0 -58
  205. package/lib/services/serialization/replicator/interfaces.js +0 -3
  206. package/lib/services/serialization/replicator/transforms/base-transform.js +0 -16
  207. package/lib/services/serialization/replicator/transforms/browser-console-messages-transform.js +0 -23
  208. package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +0 -24
  209. package/lib/services/serialization/replicator/transforms/command-base-trasform/assertion-command-constructors.js +0 -28
  210. package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +0 -66
  211. package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +0 -49
  212. package/lib/services/serialization/replicator/transforms/command-base-trasform/types.js +0 -3
  213. package/lib/services/serialization/replicator/transforms/configure-response-event-option-transform.js +0 -21
  214. package/lib/services/serialization/replicator/transforms/custom-error-transform.js +0 -29
  215. package/lib/services/serialization/replicator/transforms/function-marker-transform/index.js +0 -21
  216. package/lib/services/serialization/replicator/transforms/function-marker-transform/marker.js +0 -9
  217. package/lib/services/serialization/replicator/transforms/promise-marker-transform/index.js +0 -21
  218. package/lib/services/serialization/replicator/transforms/promise-marker-transform/marker.js +0 -9
  219. package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +0 -22
  220. package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/index.js +0 -22
  221. package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/marker.js +0 -6
  222. package/lib/services/serialization/replicator/transforms/request-filter-rule-transform.js +0 -23
  223. package/lib/services/serialization/replicator/transforms/request-hook-event-data-transform.js +0 -41
  224. package/lib/services/serialization/replicator/transforms/response-mock-transform.js +0 -23
  225. package/lib/services/serialization/replicator/transforms/role-transform.js +0 -21
  226. package/lib/services/serialization/replicator/transforms/testcafe-error-list-transform.js +0 -23
  227. package/lib/services/serialization/replicator/transforms/url-transform.js +0 -23
  228. package/lib/services/serialization/test-structure.js +0 -91
  229. package/lib/services/utils/ipc/interfaces.js +0 -29
  230. package/lib/services/utils/ipc/io.js +0 -109
  231. package/lib/services/utils/ipc/message.js +0 -84
  232. package/lib/services/utils/ipc/packet.js +0 -57
  233. package/lib/services/utils/ipc/proxy.js +0 -94
  234. package/lib/services/utils/ipc/transport.js +0 -65
  235. package/lib/services/utils/method-should-not-be-called-error.js +0 -10
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const is_letter_1 = __importDefault(require("../../utils/is-letter"));
7
+ // @ts-ignore
8
+ const testcafe_core_1 = require("../../deps/testcafe-core");
9
+ const get_key_identifier_1 = __importDefault(require("../../utils/get-key-identifier"));
10
+ const get_key_code_1 = __importDefault(require("../../utils/get-key-code"));
11
+ function isNewLineKey(key) {
12
+ return testcafe_core_1.KEY_MAPS.newLineKeys.indexOf(key) > -1;
13
+ }
14
+ function default_1(key, eventKeyProperty) {
15
+ const sanitizedKey = (0, testcafe_core_1.getSanitizedKey)(key);
16
+ const isChar = key.length === 1 || key === 'space';
17
+ const isNewLine = isNewLineKey(key);
18
+ const modifierKeyCode = testcafe_core_1.KEY_MAPS.modifiers[sanitizedKey];
19
+ const specialKeyCode = testcafe_core_1.KEY_MAPS.specialKeys[sanitizedKey];
20
+ eventKeyProperty = eventKeyProperty || key;
21
+ return {
22
+ sanitizedKey,
23
+ isChar,
24
+ modifierKeyCode,
25
+ specialKeyCode,
26
+ isNewLine,
27
+ isLetter: (0, is_letter_1.default)(key),
28
+ keyIdentifierProperty: (0, get_key_identifier_1.default)(eventKeyProperty),
29
+ keyProperty: testcafe_core_1.KEY_MAPS.keyProperty[eventKeyProperty] || eventKeyProperty,
30
+ keyCode: getResultKeyCode(key, isChar, sanitizedKey, modifierKeyCode, specialKeyCode),
31
+ };
32
+ }
33
+ exports.default = default_1;
34
+ function getResultKeyCode(key, isChar, sanitizedKey, modifierKeyCode, specialKeyCode) {
35
+ let keyCode = null;
36
+ if (isChar && key !== 'space')
37
+ keyCode = (0, get_key_code_1.default)(sanitizedKey);
38
+ else if (modifierKeyCode)
39
+ keyCode = modifierKeyCode;
40
+ else if (specialKeyCode)
41
+ keyCode = specialKeyCode;
42
+ return keyCode;
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWtleS1pbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hdXRvbWF0aW9uL3BsYXliYWNrL3ByZXNzL2dldC1rZXktaW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNFQUFnRDtBQUNoRCxhQUFhO0FBQ2IsNERBQXFFO0FBQ3JFLHdGQUE4RDtBQUM5RCw0RUFBa0Q7QUFjbEQsU0FBUyxZQUFZLENBQUUsR0FBVztJQUM5QixPQUFPLHdCQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsbUJBQXlCLEdBQVcsRUFBRSxnQkFBeUI7SUFDM0QsTUFBTSxZQUFZLEdBQU0sSUFBQSwrQkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sTUFBTSxHQUFZLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxPQUFPLENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQVMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sZUFBZSxHQUFHLHdCQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pELE1BQU0sY0FBYyxHQUFJLHdCQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTNELGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLEdBQUcsQ0FBQztJQUUzQyxPQUFPO1FBQ0gsWUFBWTtRQUNaLE1BQU07UUFDTixlQUFlO1FBQ2YsY0FBYztRQUNkLFNBQVM7UUFDVCxRQUFRLEVBQWUsSUFBQSxtQkFBVyxFQUFDLEdBQUcsQ0FBQztRQUN2QyxxQkFBcUIsRUFBRSxJQUFBLDRCQUFnQixFQUFDLGdCQUFnQixDQUFDO1FBQ3pELFdBQVcsRUFBWSx3QkFBUSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQjtRQUNqRixPQUFPLEVBQWdCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7S0FDdEcsQ0FBQztBQUNOLENBQUM7QUFwQkQsNEJBb0JDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBRSxHQUFXLEVBQUUsTUFBZSxFQUFFLFlBQW9CLEVBQUUsZUFBdUIsRUFBRSxjQUFzQjtJQUMxSCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFFbkIsSUFBSSxNQUFNLElBQUksR0FBRyxLQUFLLE9BQU87UUFDekIsT0FBTyxHQUFHLElBQUEsc0JBQVUsRUFBQyxZQUFZLENBQUMsQ0FBQztTQUNsQyxJQUFJLGVBQWU7UUFDcEIsT0FBTyxHQUFHLGVBQWUsQ0FBQztTQUN6QixJQUFJLGNBQWM7UUFDbkIsT0FBTyxHQUFHLGNBQWMsQ0FBQztJQUU3QixPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGlzTGV0dGVyS2V5IGZyb20gJy4uLy4uL3V0aWxzL2lzLWxldHRlcic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBnZXRTYW5pdGl6ZWRLZXksIEtFWV9NQVBTIH0gZnJvbSAnLi4vLi4vZGVwcy90ZXN0Y2FmZS1jb3JlJztcbmltcG9ydCBnZXRLZXlJZGVudGlmaWVyIGZyb20gJy4uLy4uL3V0aWxzL2dldC1rZXktaWRlbnRpZmllcic7XG5pbXBvcnQgZ2V0S2V5Q29kZSBmcm9tICcuLi8uLi91dGlscy9nZXQta2V5LWNvZGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleUluZm8ge1xuICAgIHNhbml0aXplZEtleTogc3RyaW5nO1xuICAgIGlzQ2hhcjogYm9vbGVhbjtcbiAgICBtb2RpZmllcktleUNvZGU6IHN0cmluZztcbiAgICBzcGVjaWFsS2V5Q29kZTogc3RyaW5nO1xuICAgIGlzTGV0dGVyOiBib29sZWFuO1xuICAgIGlzTmV3TGluZTogYm9vbGVhbjtcbiAgICBrZXlJZGVudGlmaWVyUHJvcGVydHk6IHN0cmluZztcbiAgICBrZXlQcm9wZXJ0eTogc3RyaW5nO1xuICAgIGtleUNvZGU6IHN0cmluZyB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTmV3TGluZUtleSAoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gS0VZX01BUFMubmV3TGluZUtleXMuaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChrZXk6IHN0cmluZywgZXZlbnRLZXlQcm9wZXJ0eT86IHN0cmluZyk6IEtleUluZm8ge1xuICAgIGNvbnN0IHNhbml0aXplZEtleSAgICA9IGdldFNhbml0aXplZEtleShrZXkpO1xuICAgIGNvbnN0IGlzQ2hhciAgICAgICAgICA9IGtleS5sZW5ndGggPT09IDEgfHwga2V5ID09PSAnc3BhY2UnO1xuICAgIGNvbnN0IGlzTmV3TGluZSAgICAgICA9IGlzTmV3TGluZUtleShrZXkpO1xuICAgIGNvbnN0IG1vZGlmaWVyS2V5Q29kZSA9IEtFWV9NQVBTLm1vZGlmaWVyc1tzYW5pdGl6ZWRLZXldO1xuICAgIGNvbnN0IHNwZWNpYWxLZXlDb2RlICA9IEtFWV9NQVBTLnNwZWNpYWxLZXlzW3Nhbml0aXplZEtleV07XG5cbiAgICBldmVudEtleVByb3BlcnR5ID0gZXZlbnRLZXlQcm9wZXJ0eSB8fCBrZXk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzYW5pdGl6ZWRLZXksXG4gICAgICAgIGlzQ2hhcixcbiAgICAgICAgbW9kaWZpZXJLZXlDb2RlLFxuICAgICAgICBzcGVjaWFsS2V5Q29kZSxcbiAgICAgICAgaXNOZXdMaW5lLFxuICAgICAgICBpc0xldHRlcjogICAgICAgICAgICAgIGlzTGV0dGVyS2V5KGtleSksXG4gICAgICAgIGtleUlkZW50aWZpZXJQcm9wZXJ0eTogZ2V0S2V5SWRlbnRpZmllcihldmVudEtleVByb3BlcnR5KSxcbiAgICAgICAga2V5UHJvcGVydHk6ICAgICAgICAgICBLRVlfTUFQUy5rZXlQcm9wZXJ0eVtldmVudEtleVByb3BlcnR5XSB8fCBldmVudEtleVByb3BlcnR5LFxuICAgICAgICBrZXlDb2RlOiAgICAgICAgICAgICAgIGdldFJlc3VsdEtleUNvZGUoa2V5LCBpc0NoYXIsIHNhbml0aXplZEtleSwgbW9kaWZpZXJLZXlDb2RlLCBzcGVjaWFsS2V5Q29kZSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVzdWx0S2V5Q29kZSAoa2V5OiBzdHJpbmcsIGlzQ2hhcjogYm9vbGVhbiwgc2FuaXRpemVkS2V5OiBzdHJpbmcsIG1vZGlmaWVyS2V5Q29kZTogc3RyaW5nLCBzcGVjaWFsS2V5Q29kZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGtleUNvZGUgPSBudWxsO1xuXG4gICAgaWYgKGlzQ2hhciAmJiBrZXkgIT09ICdzcGFjZScpXG4gICAgICAgIGtleUNvZGUgPSBnZXRLZXlDb2RlKHNhbml0aXplZEtleSk7XG4gICAgZWxzZSBpZiAobW9kaWZpZXJLZXlDb2RlKVxuICAgICAgICBrZXlDb2RlID0gbW9kaWZpZXJLZXlDb2RlO1xuICAgIGVsc2UgaWYgKHNwZWNpYWxLZXlDb2RlKVxuICAgICAgICBrZXlDb2RlID0gc3BlY2lhbEtleUNvZGU7XG5cbiAgICByZXR1cm4ga2V5Q29kZTtcbn1cbiJdfQ==
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getNextFocusableElement = exports.focusNextElement = exports.getDeepActiveElement = exports.getChar = exports.getActualKeysAndEventKeyProperties = exports.changeLetterCase = void 0;
7
+ const hammerhead_1 = __importDefault(require("../../deps/hammerhead"));
8
+ const testcafe_core_1 = require("../../deps/testcafe-core");
9
+ const is_letter_1 = __importDefault(require("../../utils/is-letter"));
10
+ const nativeMethods = hammerhead_1.default.nativeMethods;
11
+ const browserUtils = hammerhead_1.default.utils.browser;
12
+ const focusBlurSandbox = hammerhead_1.default.eventSandbox.focusBlur;
13
+ const Promise = hammerhead_1.default.Promise;
14
+ const { isRadioButtonElement, getActiveElement, getTabIndexAttributeIntValue } = testcafe_core_1.domUtils;
15
+ function changeLetterCase(letter) {
16
+ const isLowCase = letter === letter.toLowerCase();
17
+ return isLowCase ? letter.toUpperCase() : letter.toLowerCase();
18
+ }
19
+ exports.changeLetterCase = changeLetterCase;
20
+ function getActualKeysAndEventKeyProperties(keyArray) {
21
+ const eventKeyProperties = keyArray.slice();
22
+ //NOTE: check 'shift' modifier in keys
23
+ for (let i = 0; i < keyArray.length; i++) {
24
+ const key = keyArray[i];
25
+ if (key.toLowerCase() === 'shift') {
26
+ const nextKey = keyArray[i + 1];
27
+ if (!nextKey)
28
+ continue;
29
+ if (testcafe_core_1.KEY_MAPS.shiftMap[nextKey])
30
+ keyArray[i + 1] = testcafe_core_1.KEY_MAPS.shiftMap[nextKey];
31
+ else if (testcafe_core_1.KEY_MAPS.reversedShiftMap[nextKey])
32
+ eventKeyProperties[i + 1] = testcafe_core_1.KEY_MAPS.reversedShiftMap[nextKey];
33
+ }
34
+ if (testcafe_core_1.KEY_MAPS.shiftMap[key] && (!keyArray[i - 1] || keyArray[i - 1].toLowerCase() !== 'shift')) {
35
+ keyArray[i] = testcafe_core_1.KEY_MAPS.shiftMap[key];
36
+ keyArray.splice(i, 0, 'shift');
37
+ eventKeyProperties.splice(i, 0, 'shift');
38
+ i++;
39
+ }
40
+ }
41
+ return { actualKeys: keyArray, eventKeyProperties };
42
+ }
43
+ exports.getActualKeysAndEventKeyProperties = getActualKeysAndEventKeyProperties;
44
+ function getChar(key, shiftModified) {
45
+ if (key === 'space')
46
+ return ' ';
47
+ if (shiftModified) {
48
+ if ((0, is_letter_1.default)(key))
49
+ return changeLetterCase(key);
50
+ if (testcafe_core_1.KEY_MAPS.reversedShiftMap[key])
51
+ return testcafe_core_1.KEY_MAPS.reversedShiftMap[key];
52
+ }
53
+ return key;
54
+ }
55
+ exports.getChar = getChar;
56
+ function getDeepActiveElement(currentDocument) {
57
+ const doc = currentDocument || document;
58
+ const activeElement = getActiveElement(doc);
59
+ let activeElementInIframe = null;
60
+ if (activeElement && testcafe_core_1.domUtils.isIframeElement(activeElement) &&
61
+ nativeMethods.contentDocumentGetter.call(activeElement)) {
62
+ try {
63
+ activeElementInIframe = getDeepActiveElement(nativeMethods.contentDocumentGetter.call(activeElement));
64
+ }
65
+ catch (e) { // eslint-disable-line no-empty
66
+ }
67
+ }
68
+ return activeElementInIframe || activeElement;
69
+ }
70
+ exports.getDeepActiveElement = getDeepActiveElement;
71
+ function focusNextElement(element, reverse, skipRadioGroups) {
72
+ return new Promise(resolve => {
73
+ const nextElement = getNextFocusableElement(element, reverse, skipRadioGroups);
74
+ if (nextElement)
75
+ focusBlurSandbox.focus(nextElement, () => resolve(nextElement));
76
+ else
77
+ resolve();
78
+ });
79
+ }
80
+ exports.focusNextElement = focusNextElement;
81
+ function getFocusableElementsFilter(sourceElement, skipRadioGroups) {
82
+ let filter = null;
83
+ if (skipRadioGroups) {
84
+ // NOTE: in all browsers except Mozilla and Opera focus sets on one radio set from group only.
85
+ // in Mozilla and Opera focus sets on any radio set.
86
+ if (sourceElement.name !== '' && !browserUtils.isFirefox)
87
+ filter = item => !item.name || item === sourceElement || item.name !== sourceElement.name;
88
+ }
89
+ // NOTE arrow navigations works with radio buttons in all browsers only between radio buttons with same names
90
+ // Navigation between radio buttons without name just moves focus between radio buttons in Chrome
91
+ // In other browsers navigation between radio buttons without name does not work
92
+ else if (sourceElement.name !== '')
93
+ filter = item => isRadioButtonElement(item) && item.name === sourceElement.name;
94
+ else if (browserUtils.isChrome)
95
+ filter = item => isRadioButtonElement(item) && !item.name;
96
+ return filter;
97
+ }
98
+ function filterFocusableElements(elements, sourceElement, skipRadioGroups) {
99
+ if (!isRadioButtonElement(sourceElement))
100
+ return elements;
101
+ if (!skipRadioGroups && !sourceElement.name && !browserUtils.isChrome)
102
+ return [sourceElement];
103
+ const filterFn = getFocusableElementsFilter(sourceElement, skipRadioGroups);
104
+ if (filterFn)
105
+ elements = testcafe_core_1.arrayUtils.filter(elements, filterFn);
106
+ return elements;
107
+ }
108
+ function correctFocusableElement(elements, element, skipRadioGroups) {
109
+ const isNotCheckedRadioButtonElement = isRadioButtonElement(element) && element.name && !element.checked;
110
+ let checkedRadioButtonElementWithSameName = null;
111
+ if (skipRadioGroups && isNotCheckedRadioButtonElement) {
112
+ checkedRadioButtonElementWithSameName = testcafe_core_1.arrayUtils.find(elements, el => {
113
+ return isRadioButtonElement(el) && el.name === element.name && el.checked;
114
+ });
115
+ }
116
+ return checkedRadioButtonElementWithSameName || element;
117
+ }
118
+ function activeElementHasNegativeTabIndex(doc) {
119
+ const activeElement = nativeMethods.documentActiveElementGetter.call(doc);
120
+ const activeElementTabIndex = activeElement && getTabIndexAttributeIntValue(activeElement);
121
+ return activeElement && activeElementTabIndex < 0;
122
+ }
123
+ function getNextFocusableElement(element, reverse, skipRadioGroups) {
124
+ const offset = reverse ? -1 : 1;
125
+ const doc = testcafe_core_1.domUtils.getTopSameDomainWindow(window).document;
126
+ const sort = !activeElementHasNegativeTabIndex(doc);
127
+ let allFocusable = testcafe_core_1.domUtils.getFocusableElements(doc, sort);
128
+ allFocusable = filterFocusableElements(allFocusable, element, skipRadioGroups);
129
+ const isRadioInput = isRadioButtonElement(element);
130
+ const currentIndex = testcafe_core_1.arrayUtils.indexOf(allFocusable, element);
131
+ const isLastElementFocused = reverse ? currentIndex === 0 : currentIndex === allFocusable.length - 1;
132
+ if (isLastElementFocused) {
133
+ if (!reverse && element.tabIndex < 0)
134
+ return testcafe_core_1.arrayUtils.find(allFocusable, el => el.tabIndex === 0);
135
+ return skipRadioGroups || !isRadioInput ? document.body : allFocusable[allFocusable.length - 1 - currentIndex];
136
+ }
137
+ if (reverse && currentIndex === -1)
138
+ return allFocusable[allFocusable.length - 1];
139
+ return correctFocusableElement(allFocusable, allFocusable[currentIndex + offset], skipRadioGroups);
140
+ }
141
+ exports.getNextFocusableElement = getNextFocusableElement;
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2F1dG9tYXRpb24vcGxheWJhY2svcHJlc3MvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUVBQStDO0FBQy9DLDREQUlrQztBQUVsQyxzRUFBNkM7QUFHN0MsTUFBTSxhQUFhLEdBQU0sb0JBQVUsQ0FBQyxhQUFhLENBQUM7QUFDbEQsTUFBTSxZQUFZLEdBQU8sb0JBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsb0JBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO0FBQzNELE1BQU0sT0FBTyxHQUFZLG9CQUFVLENBQUMsT0FBTyxDQUFDO0FBRTVDLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSw0QkFBNEIsRUFBRSxHQUFHLHdCQUFRLENBQUM7QUFFMUYsU0FBZ0IsZ0JBQWdCLENBQUUsTUFBTTtJQUNwQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWxELE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRSxDQUFDO0FBSkQsNENBSUM7QUFFRCxTQUFnQixrQ0FBa0MsQ0FBRSxRQUFRO0lBQ3hELE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTVDLHNDQUFzQztJQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEIsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUFFO1lBQy9CLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFBSSxDQUFDLE9BQU87Z0JBQ1IsU0FBUztZQUViLElBQUksd0JBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUMxQixRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLHdCQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM1QyxJQUFJLHdCQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsd0JBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksd0JBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRTtZQUMzRixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsd0JBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLENBQUMsRUFBRSxDQUFDO1NBQ1A7S0FDSjtJQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDeEQsQ0FBQztBQTVCRCxnRkE0QkM7QUFFRCxTQUFnQixPQUFPLENBQUUsR0FBRyxFQUFFLGFBQWE7SUFDdkMsSUFBSSxHQUFHLEtBQUssT0FBTztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBRWYsSUFBSSxhQUFhLEVBQUU7UUFDZixJQUFJLElBQUEsbUJBQVEsRUFBQyxHQUFHLENBQUM7WUFDYixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLElBQUksd0JBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7WUFDOUIsT0FBTyx3QkFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBYkQsMEJBYUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBRSxlQUFlO0lBQ2pELE1BQU0sR0FBRyxHQUFtQixlQUFlLElBQUksUUFBUSxDQUFDO0lBQ3hELE1BQU0sYUFBYSxHQUFTLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBR2pDLElBQUksYUFBYSxJQUFJLHdCQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3pELElBQUk7WUFDQSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDekc7UUFDRCxPQUFPLENBQUMsRUFBRSxFQUFFLCtCQUErQjtTQUMxQztLQUNKO0lBRUQsT0FBTyxxQkFBcUIsSUFBSSxhQUFhLENBQUM7QUFDbEQsQ0FBQztBQWhCRCxvREFnQkM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWU7SUFDL0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN6QixNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRS9FLElBQUksV0FBVztZQUNYLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7O1lBRWhFLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVRELDRDQVNDO0FBRUQsU0FBUywwQkFBMEIsQ0FBRSxhQUFhLEVBQUUsZUFBZTtJQUMvRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFFbEIsSUFBSSxlQUFlLEVBQUU7UUFDakIsOEZBQThGO1FBQzlGLG9EQUFvRDtRQUNwRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVM7WUFDcEQsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDO0tBQ2pHO0lBQ0QsNkdBQTZHO0lBQzdHLGlHQUFpRztJQUNqRyxnRkFBZ0Y7U0FDM0UsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLEVBQUU7UUFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsSUFBSSxDQUFDO1NBQy9FLElBQUksWUFBWSxDQUFDLFFBQVE7UUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBRTlELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsZUFBZTtJQUN0RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FBQ3BDLE9BQU8sUUFBUSxDQUFDO0lBRXBCLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7UUFDakUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUU1RSxJQUFJLFFBQVE7UUFDUixRQUFRLEdBQUcsMEJBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXJELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZTtJQUNoRSxNQUFNLDhCQUE4QixHQUFRLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzlHLElBQUkscUNBQXFDLEdBQUcsSUFBSSxDQUFDO0lBRWpELElBQUksZUFBZSxJQUFJLDhCQUE4QixFQUFFO1FBQ25ELHFDQUFxQyxHQUFHLDBCQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuRSxPQUFPLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFFRCxPQUFPLHFDQUFxQyxJQUFJLE9BQU8sQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBRSxHQUFHO0lBQzFDLE1BQU0sYUFBYSxHQUFXLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEYsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLElBQUksNEJBQTRCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFM0YsT0FBTyxhQUFhLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFnQix1QkFBdUIsQ0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWU7SUFDdEUsTUFBTSxNQUFNLEdBQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxHQUFVLHdCQUFRLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3BFLE1BQU0sSUFBSSxHQUFTLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsSUFBSSxZQUFZLEdBQUcsd0JBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFNUQsWUFBWSxHQUFHLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0UsTUFBTSxZQUFZLEdBQVcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsTUFBTSxZQUFZLEdBQVcsMEJBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFckcsSUFBSSxvQkFBb0IsRUFBRTtRQUN0QixJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQztZQUNoQyxPQUFPLDBCQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFbEUsT0FBTyxlQUFlLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztLQUNsSDtJQUVELElBQUksT0FBTyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUM7UUFDOUIsT0FBTyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVqRCxPQUFPLHVCQUF1QixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUF2QkQsMERBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGhhbW1lcmhlYWQgZnJvbSAnLi4vLi4vZGVwcy9oYW1tZXJoZWFkJztcbmltcG9ydCB7XG4gICAgS0VZX01BUFMsXG4gICAgZG9tVXRpbHMsXG4gICAgYXJyYXlVdGlscyxcbn0gZnJvbSAnLi4vLi4vZGVwcy90ZXN0Y2FmZS1jb3JlJztcblxuaW1wb3J0IGlzTGV0dGVyIGZyb20gJy4uLy4uL3V0aWxzL2lzLWxldHRlcic7XG5cblxuY29uc3QgbmF0aXZlTWV0aG9kcyAgICA9IGhhbW1lcmhlYWQubmF0aXZlTWV0aG9kcztcbmNvbnN0IGJyb3dzZXJVdGlscyAgICAgPSBoYW1tZXJoZWFkLnV0aWxzLmJyb3dzZXI7XG5jb25zdCBmb2N1c0JsdXJTYW5kYm94ID0gaGFtbWVyaGVhZC5ldmVudFNhbmRib3guZm9jdXNCbHVyO1xuY29uc3QgUHJvbWlzZSAgICAgICAgICA9IGhhbW1lcmhlYWQuUHJvbWlzZTtcblxuY29uc3QgeyBpc1JhZGlvQnV0dG9uRWxlbWVudCwgZ2V0QWN0aXZlRWxlbWVudCwgZ2V0VGFiSW5kZXhBdHRyaWJ1dGVJbnRWYWx1ZSB9ID0gZG9tVXRpbHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VMZXR0ZXJDYXNlIChsZXR0ZXIpIHtcbiAgICBjb25zdCBpc0xvd0Nhc2UgPSBsZXR0ZXIgPT09IGxldHRlci50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIGlzTG93Q2FzZSA/IGxldHRlci50b1VwcGVyQ2FzZSgpIDogbGV0dGVyLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3R1YWxLZXlzQW5kRXZlbnRLZXlQcm9wZXJ0aWVzIChrZXlBcnJheSkge1xuICAgIGNvbnN0IGV2ZW50S2V5UHJvcGVydGllcyA9IGtleUFycmF5LnNsaWNlKCk7XG5cbiAgICAvL05PVEU6IGNoZWNrICdzaGlmdCcgbW9kaWZpZXIgaW4ga2V5c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5QXJyYXlbaV07XG5cbiAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnc2hpZnQnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0S2V5ID0ga2V5QXJyYXlbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRLZXkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChLRVlfTUFQUy5zaGlmdE1hcFtuZXh0S2V5XSlcbiAgICAgICAgICAgICAgICBrZXlBcnJheVtpICsgMV0gPSBLRVlfTUFQUy5zaGlmdE1hcFtuZXh0S2V5XTtcbiAgICAgICAgICAgIGVsc2UgaWYgKEtFWV9NQVBTLnJldmVyc2VkU2hpZnRNYXBbbmV4dEtleV0pXG4gICAgICAgICAgICAgICAgZXZlbnRLZXlQcm9wZXJ0aWVzW2kgKyAxXSA9IEtFWV9NQVBTLnJldmVyc2VkU2hpZnRNYXBbbmV4dEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoS0VZX01BUFMuc2hpZnRNYXBba2V5XSAmJiAoIWtleUFycmF5W2kgLSAxXSB8fCBrZXlBcnJheVtpIC0gMV0udG9Mb3dlckNhc2UoKSAhPT0gJ3NoaWZ0JykpIHtcbiAgICAgICAgICAgIGtleUFycmF5W2ldID0gS0VZX01BUFMuc2hpZnRNYXBba2V5XTtcbiAgICAgICAgICAgIGtleUFycmF5LnNwbGljZShpLCAwLCAnc2hpZnQnKTtcbiAgICAgICAgICAgIGV2ZW50S2V5UHJvcGVydGllcy5zcGxpY2UoaSwgMCwgJ3NoaWZ0Jyk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBhY3R1YWxLZXlzOiBrZXlBcnJheSwgZXZlbnRLZXlQcm9wZXJ0aWVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFyIChrZXksIHNoaWZ0TW9kaWZpZWQpIHtcbiAgICBpZiAoa2V5ID09PSAnc3BhY2UnKVxuICAgICAgICByZXR1cm4gJyAnO1xuXG4gICAgaWYgKHNoaWZ0TW9kaWZpZWQpIHtcbiAgICAgICAgaWYgKGlzTGV0dGVyKGtleSkpXG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlTGV0dGVyQ2FzZShrZXkpO1xuXG4gICAgICAgIGlmIChLRVlfTUFQUy5yZXZlcnNlZFNoaWZ0TWFwW2tleV0pXG4gICAgICAgICAgICByZXR1cm4gS0VZX01BUFMucmV2ZXJzZWRTaGlmdE1hcFtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBrZXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWVwQWN0aXZlRWxlbWVudCAoY3VycmVudERvY3VtZW50KSB7XG4gICAgY29uc3QgZG9jICAgICAgICAgICAgICAgICA9IGN1cnJlbnREb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ICAgICAgID0gZ2V0QWN0aXZlRWxlbWVudChkb2MpO1xuICAgIGxldCBhY3RpdmVFbGVtZW50SW5JZnJhbWUgPSBudWxsO1xuXG5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBkb21VdGlscy5pc0lmcmFtZUVsZW1lbnQoYWN0aXZlRWxlbWVudCkgJiZcbiAgICAgICAgbmF0aXZlTWV0aG9kcy5jb250ZW50RG9jdW1lbnRHZXR0ZXIuY2FsbChhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWN0aXZlRWxlbWVudEluSWZyYW1lID0gZ2V0RGVlcEFjdGl2ZUVsZW1lbnQobmF0aXZlTWV0aG9kcy5jb250ZW50RG9jdW1lbnRHZXR0ZXIuY2FsbChhY3RpdmVFbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbklmcmFtZSB8fCBhY3RpdmVFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9jdXNOZXh0RWxlbWVudCAoZWxlbWVudCwgcmV2ZXJzZSwgc2tpcFJhZGlvR3JvdXBzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IGdldE5leHRGb2N1c2FibGVFbGVtZW50KGVsZW1lbnQsIHJldmVyc2UsIHNraXBSYWRpb0dyb3Vwcyk7XG5cbiAgICAgICAgaWYgKG5leHRFbGVtZW50KVxuICAgICAgICAgICAgZm9jdXNCbHVyU2FuZGJveC5mb2N1cyhuZXh0RWxlbWVudCwgKCkgPT4gcmVzb2x2ZShuZXh0RWxlbWVudCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZvY3VzYWJsZUVsZW1lbnRzRmlsdGVyIChzb3VyY2VFbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBsZXQgZmlsdGVyID0gbnVsbDtcblxuICAgIGlmIChza2lwUmFkaW9Hcm91cHMpIHtcbiAgICAgICAgLy8gTk9URTogaW4gYWxsIGJyb3dzZXJzIGV4Y2VwdCBNb3ppbGxhIGFuZCBPcGVyYSBmb2N1cyBzZXRzIG9uIG9uZSByYWRpbyBzZXQgZnJvbSBncm91cCBvbmx5LlxuICAgICAgICAvLyBpbiBNb3ppbGxhIGFuZCBPcGVyYSBmb2N1cyBzZXRzIG9uIGFueSByYWRpbyBzZXQuXG4gICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lm5hbWUgIT09ICcnICYmICFicm93c2VyVXRpbHMuaXNGaXJlZm94KVxuICAgICAgICAgICAgZmlsdGVyID0gaXRlbSA9PiAhaXRlbS5uYW1lIHx8IGl0ZW0gPT09IHNvdXJjZUVsZW1lbnQgfHwgaXRlbS5uYW1lICE9PSBzb3VyY2VFbGVtZW50Lm5hbWU7XG4gICAgfVxuICAgIC8vIE5PVEUgYXJyb3cgbmF2aWdhdGlvbnMgd29ya3Mgd2l0aCByYWRpbyBidXR0b25zIGluIGFsbCBicm93c2VycyBvbmx5IGJldHdlZW4gcmFkaW8gYnV0dG9ucyB3aXRoIHNhbWUgbmFtZXNcbiAgICAvLyBOYXZpZ2F0aW9uIGJldHdlZW4gcmFkaW8gYnV0dG9ucyB3aXRob3V0IG5hbWUganVzdCBtb3ZlcyBmb2N1cyBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMgaW4gQ2hyb21lXG4gICAgLy8gSW4gb3RoZXIgYnJvd3NlcnMgbmF2aWdhdGlvbiBiZXR3ZWVuIHJhZGlvIGJ1dHRvbnMgd2l0aG91dCBuYW1lIGRvZXMgbm90IHdvcmtcbiAgICBlbHNlIGlmIChzb3VyY2VFbGVtZW50Lm5hbWUgIT09ICcnKVxuICAgICAgICBmaWx0ZXIgPSBpdGVtID0+IGlzUmFkaW9CdXR0b25FbGVtZW50KGl0ZW0pICYmIGl0ZW0ubmFtZSA9PT0gc291cmNlRWxlbWVudC5uYW1lO1xuICAgIGVsc2UgaWYgKGJyb3dzZXJVdGlscy5pc0Nocm9tZSlcbiAgICAgICAgZmlsdGVyID0gaXRlbSA9PiBpc1JhZGlvQnV0dG9uRWxlbWVudChpdGVtKSAmJiAhaXRlbS5uYW1lO1xuXG4gICAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRm9jdXNhYmxlRWxlbWVudHMgKGVsZW1lbnRzLCBzb3VyY2VFbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBpZiAoIWlzUmFkaW9CdXR0b25FbGVtZW50KHNvdXJjZUVsZW1lbnQpKVxuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG5cbiAgICBpZiAoIXNraXBSYWRpb0dyb3VwcyAmJiAhc291cmNlRWxlbWVudC5uYW1lICYmICFicm93c2VyVXRpbHMuaXNDaHJvbWUpXG4gICAgICAgIHJldHVybiBbc291cmNlRWxlbWVudF07XG5cbiAgICBjb25zdCBmaWx0ZXJGbiA9IGdldEZvY3VzYWJsZUVsZW1lbnRzRmlsdGVyKHNvdXJjZUVsZW1lbnQsIHNraXBSYWRpb0dyb3Vwcyk7XG5cbiAgICBpZiAoZmlsdGVyRm4pXG4gICAgICAgIGVsZW1lbnRzID0gYXJyYXlVdGlscy5maWx0ZXIoZWxlbWVudHMsIGZpbHRlckZuKTtcblxuICAgIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gY29ycmVjdEZvY3VzYWJsZUVsZW1lbnQgKGVsZW1lbnRzLCBlbGVtZW50LCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBjb25zdCBpc05vdENoZWNrZWRSYWRpb0J1dHRvbkVsZW1lbnQgICAgICA9IGlzUmFkaW9CdXR0b25FbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQubmFtZSAmJiAhZWxlbWVudC5jaGVja2VkO1xuICAgIGxldCBjaGVja2VkUmFkaW9CdXR0b25FbGVtZW50V2l0aFNhbWVOYW1lID0gbnVsbDtcblxuICAgIGlmIChza2lwUmFkaW9Hcm91cHMgJiYgaXNOb3RDaGVja2VkUmFkaW9CdXR0b25FbGVtZW50KSB7XG4gICAgICAgIGNoZWNrZWRSYWRpb0J1dHRvbkVsZW1lbnRXaXRoU2FtZU5hbWUgPSBhcnJheVV0aWxzLmZpbmQoZWxlbWVudHMsIGVsID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpc1JhZGlvQnV0dG9uRWxlbWVudChlbCkgJiYgZWwubmFtZSA9PT0gZWxlbWVudC5uYW1lICYmIGVsLmNoZWNrZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaGVja2VkUmFkaW9CdXR0b25FbGVtZW50V2l0aFNhbWVOYW1lIHx8IGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsZW1lbnRIYXNOZWdhdGl2ZVRhYkluZGV4IChkb2MpIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ICAgICAgICAgPSBuYXRpdmVNZXRob2RzLmRvY3VtZW50QWN0aXZlRWxlbWVudEdldHRlci5jYWxsKGRvYyk7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudFRhYkluZGV4ID0gYWN0aXZlRWxlbWVudCAmJiBnZXRUYWJJbmRleEF0dHJpYnV0ZUludFZhbHVlKGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudFRhYkluZGV4IDwgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRGb2N1c2FibGVFbGVtZW50IChlbGVtZW50LCByZXZlcnNlLCBza2lwUmFkaW9Hcm91cHMpIHtcbiAgICBjb25zdCBvZmZzZXQgICAgID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgICBjb25zdCBkb2MgICAgICAgID0gZG9tVXRpbHMuZ2V0VG9wU2FtZURvbWFpbldpbmRvdyh3aW5kb3cpLmRvY3VtZW50O1xuICAgIGNvbnN0IHNvcnQgICAgICAgPSAhYWN0aXZlRWxlbWVudEhhc05lZ2F0aXZlVGFiSW5kZXgoZG9jKTtcbiAgICBsZXQgYWxsRm9jdXNhYmxlID0gZG9tVXRpbHMuZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZG9jLCBzb3J0KTtcblxuICAgIGFsbEZvY3VzYWJsZSA9IGZpbHRlckZvY3VzYWJsZUVsZW1lbnRzKGFsbEZvY3VzYWJsZSwgZWxlbWVudCwgc2tpcFJhZGlvR3JvdXBzKTtcblxuICAgIGNvbnN0IGlzUmFkaW9JbnB1dCAgICAgICAgID0gaXNSYWRpb0J1dHRvbkVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4ICAgICAgICAgPSBhcnJheVV0aWxzLmluZGV4T2YoYWxsRm9jdXNhYmxlLCBlbGVtZW50KTtcbiAgICBjb25zdCBpc0xhc3RFbGVtZW50Rm9jdXNlZCA9IHJldmVyc2UgPyBjdXJyZW50SW5kZXggPT09IDAgOiBjdXJyZW50SW5kZXggPT09IGFsbEZvY3VzYWJsZS5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGlzTGFzdEVsZW1lbnRGb2N1c2VkKSB7XG4gICAgICAgIGlmICghcmV2ZXJzZSAmJiBlbGVtZW50LnRhYkluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBhcnJheVV0aWxzLmZpbmQoYWxsRm9jdXNhYmxlLCBlbCA9PiBlbC50YWJJbmRleCA9PT0gMCk7XG5cbiAgICAgICAgcmV0dXJuIHNraXBSYWRpb0dyb3VwcyB8fCAhaXNSYWRpb0lucHV0ID8gZG9jdW1lbnQuYm9keSA6IGFsbEZvY3VzYWJsZVthbGxGb2N1c2FibGUubGVuZ3RoIC0gMSAtIGN1cnJlbnRJbmRleF07XG4gICAgfVxuXG4gICAgaWYgKHJldmVyc2UgJiYgY3VycmVudEluZGV4ID09PSAtMSlcbiAgICAgICAgcmV0dXJuIGFsbEZvY3VzYWJsZVthbGxGb2N1c2FibGUubGVuZ3RoIC0gMV07XG5cbiAgICByZXR1cm4gY29ycmVjdEZvY3VzYWJsZUVsZW1lbnQoYWxsRm9jdXNhYmxlLCBhbGxGb2N1c2FibGVbY3VycmVudEluZGV4ICsgb2Zmc2V0XSwgc2tpcFJhZGlvR3JvdXBzKTtcbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const testcafe_core_1 = require("../deps/testcafe-core");
7
+ const is_letter_1 = __importDefault(require("./is-letter"));
8
+ function default_1(char) {
9
+ if ((0, is_letter_1.default)(char))
10
+ return char.toUpperCase().charCodeAt(0);
11
+ const res = testcafe_core_1.KEY_MAPS.shiftMap[char] ? testcafe_core_1.KEY_MAPS.shiftMap[char].charCodeAt(0) : char.charCodeAt(0);
12
+ return testcafe_core_1.KEY_MAPS.symbolCharCodeToKeyCode[res] || res;
13
+ }
14
+ exports.default = default_1;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWtleS1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hdXRvbWF0aW9uL3V0aWxzL2dldC1rZXktY29kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlEQUFpRDtBQUNqRCw0REFBbUM7QUFFbkMsbUJBQXlCLElBQUk7SUFDekIsSUFBSSxJQUFBLG1CQUFRLEVBQUMsSUFBSSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE1BQU0sR0FBRyxHQUFHLHdCQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakcsT0FBTyx3QkFBUSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUN4RCxDQUFDO0FBUEQsNEJBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLRVlfTUFQUyB9IGZyb20gJy4uL2RlcHMvdGVzdGNhZmUtY29yZSc7XG5pbXBvcnQgaXNMZXR0ZXIgZnJvbSAnLi9pcy1sZXR0ZXInO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY2hhcikge1xuICAgIGlmIChpc0xldHRlcihjaGFyKSlcbiAgICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKS5jaGFyQ29kZUF0KDApO1xuXG4gICAgY29uc3QgcmVzID0gS0VZX01BUFMuc2hpZnRNYXBbY2hhcl0gPyBLRVlfTUFQUy5zaGlmdE1hcFtjaGFyXS5jaGFyQ29kZUF0KDApIDogY2hhci5jaGFyQ29kZUF0KDApO1xuXG4gICAgcmV0dXJuIEtFWV9NQVBTLnN5bWJvbENoYXJDb2RlVG9LZXlDb2RlW3Jlc10gfHwgcmVzO1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const key_identifier_maps_1 = __importDefault(require("./key-identifier-maps"));
7
+ const is_letter_1 = __importDefault(require("./is-letter"));
8
+ function getKeyIdentifier(char) {
9
+ if ((0, is_letter_1.default)(char))
10
+ return key_identifier_maps_1.default.LETTERS[char.toLowerCase()];
11
+ return key_identifier_maps_1.default.SYMBOLS[char] || key_identifier_maps_1.default.SPECIAL_KEYS[char] || char;
12
+ }
13
+ exports.default = getKeyIdentifier;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWtleS1pZGVudGlmaWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hdXRvbWF0aW9uL3V0aWxzL2dldC1rZXktaWRlbnRpZmllci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdGQUF3RDtBQUN4RCw0REFBbUM7QUFHbkMsU0FBd0IsZ0JBQWdCLENBQUUsSUFBSTtJQUMxQyxJQUFJLElBQUEsbUJBQVEsRUFBQyxJQUFJLENBQUM7UUFDZCxPQUFPLDZCQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUUzRCxPQUFPLDZCQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSw2QkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0FBQy9GLENBQUM7QUFMRCxtQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBLRVlfSURFTlRJRklFUl9NQVBTIGZyb20gJy4va2V5LWlkZW50aWZpZXItbWFwcyc7XG5pbXBvcnQgaXNMZXR0ZXIgZnJvbSAnLi9pcy1sZXR0ZXInO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEtleUlkZW50aWZpZXIgKGNoYXIpIHtcbiAgICBpZiAoaXNMZXR0ZXIoY2hhcikpXG4gICAgICAgIHJldHVybiBLRVlfSURFTlRJRklFUl9NQVBTLkxFVFRFUlNbY2hhci50b0xvd2VyQ2FzZSgpXTtcblxuICAgIHJldHVybiBLRVlfSURFTlRJRklFUl9NQVBTLlNZTUJPTFNbY2hhcl0gfHwgS0VZX0lERU5USUZJRVJfTUFQUy5TUEVDSUFMX0tFWVNbY2hhcl0gfHwgY2hhcjtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function default_1(key) {
4
+ return key.length === 1 && (key >= 'a' && key <= 'z' || key >= 'A' && key <= 'Z');
5
+ }
6
+ exports.default = default_1;
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbGV0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaWVudC9hdXRvbWF0aW9uL3V0aWxzL2lzLWxldHRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1CQUF5QixHQUFHO0lBQ3hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUZELDRCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXkubGVuZ3RoID09PSAxICYmIChrZXkgPj0gJ2EnICYmIGtleSA8PSAneicgfHwga2V5ID49ICdBJyAmJiBrZXkgPD0gJ1onKTtcbn1cbiJdfQ==
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ SPECIAL_KEYS: {
5
+ capslock: 'CapsLock',
6
+ delete: 'U+007F',
7
+ end: 'End',
8
+ enter: 'Enter',
9
+ esc: 'U+001B',
10
+ home: 'Home',
11
+ ins: 'Insert',
12
+ pagedown: 'PageDown',
13
+ pageup: 'PageUp',
14
+ space: 'U+0020',
15
+ tab: 'Tab',
16
+ alt: 'Alt',
17
+ ctrl: 'Control',
18
+ meta: 'Meta',
19
+ shift: 'Shift',
20
+ },
21
+ LETTERS: {
22
+ a: 'U+0041',
23
+ b: 'U+0042',
24
+ c: 'U+0043',
25
+ d: 'U+0044',
26
+ e: 'U+0045',
27
+ f: 'U+0046',
28
+ g: 'U+0047',
29
+ h: 'U+0048',
30
+ i: 'U+0049',
31
+ j: 'U+004A',
32
+ k: 'U+004B',
33
+ l: 'U+004C',
34
+ m: 'U+004D',
35
+ n: 'U+004E',
36
+ o: 'U+004F',
37
+ p: 'U+0050',
38
+ q: 'U+0051',
39
+ r: 'U+0052',
40
+ s: 'U+0053',
41
+ t: 'U+0054',
42
+ u: 'U+0055',
43
+ v: 'U+0056',
44
+ w: 'U+0057',
45
+ x: 'U+0058',
46
+ y: 'U+0059',
47
+ z: 'U+005A',
48
+ },
49
+ SYMBOLS: {
50
+ '0': 'U+0030',
51
+ '1': 'U+0031',
52
+ '2': 'U+0032',
53
+ '3': 'U+0033',
54
+ '4': 'U+0034',
55
+ '5': 'U+0035',
56
+ '6': 'U+0036',
57
+ '7': 'U+0037',
58
+ '8': 'U+0038',
59
+ '9': 'U+0039',
60
+ ' ': 'U+0020',
61
+ '!': 'U+0021',
62
+ '@': 'U+0040',
63
+ '#': 'U+0023',
64
+ '$': 'U+0024',
65
+ '%': 'U+0025',
66
+ '^': 'U+005E',
67
+ '*': 'U+002A',
68
+ '(': 'U+0028',
69
+ ')': 'U+0029',
70
+ '_': 'U+005F',
71
+ '|': 'U+007C',
72
+ '\\': 'U+005C',
73
+ '/': 'U+002F',
74
+ '?': 'U+003F',
75
+ '.': 'U+002E',
76
+ ',': 'U+002C',
77
+ '<': 'U+003C',
78
+ '>': 'U+003E',
79
+ '[': 'U+005B',
80
+ ']': 'U+005D',
81
+ '{': 'U+007B',
82
+ '}': 'U+007D',
83
+ '§': 'U+00A7',
84
+ '±': 'U+00B1',
85
+ '\'': 'U+0027',
86
+ '"': 'U+0022',
87
+ ':': 'U+003A',
88
+ ';': 'U+003B',
89
+ '`': 'U+0060',
90
+ '~': 'U+007E',
91
+ },
92
+ };
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWlkZW50aWZpZXItbWFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXV0b21hdGlvbi91dGlscy9rZXktaWRlbnRpZmllci1tYXBzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0JBQWU7SUFDWCxZQUFZLEVBQUU7UUFDVixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUksUUFBUTtRQUNsQixHQUFHLEVBQU8sS0FBSztRQUNmLEtBQUssRUFBSyxPQUFPO1FBQ2pCLEdBQUcsRUFBTyxRQUFRO1FBQ2xCLElBQUksRUFBTSxNQUFNO1FBQ2hCLEdBQUcsRUFBTyxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLE1BQU0sRUFBSSxRQUFRO1FBQ2xCLEtBQUssRUFBSyxRQUFRO1FBQ2xCLEdBQUcsRUFBTyxLQUFLO1FBQ2YsR0FBRyxFQUFPLEtBQUs7UUFDZixJQUFJLEVBQU0sU0FBUztRQUNuQixJQUFJLEVBQU0sTUFBTTtRQUNoQixLQUFLLEVBQUssT0FBTztLQUNwQjtJQUVELE9BQU8sRUFBRTtRQUNMLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7UUFDWCxDQUFDLEVBQUUsUUFBUTtRQUNYLENBQUMsRUFBRSxRQUFRO1FBQ1gsQ0FBQyxFQUFFLFFBQVE7S0FDZDtJQUVELE9BQU8sRUFBRTtRQUNMLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsSUFBSSxFQUFFLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxJQUFJLEVBQUUsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7UUFDZCxHQUFHLEVBQUcsUUFBUTtRQUNkLEdBQUcsRUFBRyxRQUFRO1FBQ2QsR0FBRyxFQUFHLFFBQVE7S0FDakI7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQge1xuICAgIFNQRUNJQUxfS0VZUzoge1xuICAgICAgICBjYXBzbG9jazogJ0NhcHNMb2NrJyxcbiAgICAgICAgZGVsZXRlOiAgICdVKzAwN0YnLFxuICAgICAgICBlbmQ6ICAgICAgJ0VuZCcsXG4gICAgICAgIGVudGVyOiAgICAnRW50ZXInLFxuICAgICAgICBlc2M6ICAgICAgJ1UrMDAxQicsXG4gICAgICAgIGhvbWU6ICAgICAnSG9tZScsXG4gICAgICAgIGluczogICAgICAnSW5zZXJ0JyxcbiAgICAgICAgcGFnZWRvd246ICdQYWdlRG93bicsXG4gICAgICAgIHBhZ2V1cDogICAnUGFnZVVwJyxcbiAgICAgICAgc3BhY2U6ICAgICdVKzAwMjAnLFxuICAgICAgICB0YWI6ICAgICAgJ1RhYicsXG4gICAgICAgIGFsdDogICAgICAnQWx0JyxcbiAgICAgICAgY3RybDogICAgICdDb250cm9sJyxcbiAgICAgICAgbWV0YTogICAgICdNZXRhJyxcbiAgICAgICAgc2hpZnQ6ICAgICdTaGlmdCcsXG4gICAgfSxcblxuICAgIExFVFRFUlM6IHtcbiAgICAgICAgYTogJ1UrMDA0MScsXG4gICAgICAgIGI6ICdVKzAwNDInLFxuICAgICAgICBjOiAnVSswMDQzJyxcbiAgICAgICAgZDogJ1UrMDA0NCcsXG4gICAgICAgIGU6ICdVKzAwNDUnLFxuICAgICAgICBmOiAnVSswMDQ2JyxcbiAgICAgICAgZzogJ1UrMDA0NycsXG4gICAgICAgIGg6ICdVKzAwNDgnLFxuICAgICAgICBpOiAnVSswMDQ5JyxcbiAgICAgICAgajogJ1UrMDA0QScsXG4gICAgICAgIGs6ICdVKzAwNEInLFxuICAgICAgICBsOiAnVSswMDRDJyxcbiAgICAgICAgbTogJ1UrMDA0RCcsXG4gICAgICAgIG46ICdVKzAwNEUnLFxuICAgICAgICBvOiAnVSswMDRGJyxcbiAgICAgICAgcDogJ1UrMDA1MCcsXG4gICAgICAgIHE6ICdVKzAwNTEnLFxuICAgICAgICByOiAnVSswMDUyJyxcbiAgICAgICAgczogJ1UrMDA1MycsXG4gICAgICAgIHQ6ICdVKzAwNTQnLFxuICAgICAgICB1OiAnVSswMDU1JyxcbiAgICAgICAgdjogJ1UrMDA1NicsXG4gICAgICAgIHc6ICdVKzAwNTcnLFxuICAgICAgICB4OiAnVSswMDU4JyxcbiAgICAgICAgeTogJ1UrMDA1OScsXG4gICAgICAgIHo6ICdVKzAwNUEnLFxuICAgIH0sXG5cbiAgICBTWU1CT0xTOiB7XG4gICAgICAgICcwJzogICdVKzAwMzAnLFxuICAgICAgICAnMSc6ICAnVSswMDMxJyxcbiAgICAgICAgJzInOiAgJ1UrMDAzMicsXG4gICAgICAgICczJzogICdVKzAwMzMnLFxuICAgICAgICAnNCc6ICAnVSswMDM0JyxcbiAgICAgICAgJzUnOiAgJ1UrMDAzNScsXG4gICAgICAgICc2JzogICdVKzAwMzYnLFxuICAgICAgICAnNyc6ICAnVSswMDM3JyxcbiAgICAgICAgJzgnOiAgJ1UrMDAzOCcsXG4gICAgICAgICc5JzogICdVKzAwMzknLFxuICAgICAgICAnICc6ICAnVSswMDIwJyxcbiAgICAgICAgJyEnOiAgJ1UrMDAyMScsXG4gICAgICAgICdAJzogICdVKzAwNDAnLFxuICAgICAgICAnIyc6ICAnVSswMDIzJyxcbiAgICAgICAgJyQnOiAgJ1UrMDAyNCcsXG4gICAgICAgICclJzogICdVKzAwMjUnLFxuICAgICAgICAnXic6ICAnVSswMDVFJyxcbiAgICAgICAgJyonOiAgJ1UrMDAyQScsXG4gICAgICAgICcoJzogICdVKzAwMjgnLFxuICAgICAgICAnKSc6ICAnVSswMDI5JyxcbiAgICAgICAgJ18nOiAgJ1UrMDA1RicsXG4gICAgICAgICd8JzogICdVKzAwN0MnLFxuICAgICAgICAnXFxcXCc6ICdVKzAwNUMnLFxuICAgICAgICAnLyc6ICAnVSswMDJGJyxcbiAgICAgICAgJz8nOiAgJ1UrMDAzRicsXG4gICAgICAgICcuJzogICdVKzAwMkUnLFxuICAgICAgICAnLCc6ICAnVSswMDJDJyxcbiAgICAgICAgJzwnOiAgJ1UrMDAzQycsXG4gICAgICAgICc+JzogICdVKzAwM0UnLFxuICAgICAgICAnWyc6ICAnVSswMDVCJyxcbiAgICAgICAgJ10nOiAgJ1UrMDA1RCcsXG4gICAgICAgICd7JzogICdVKzAwN0InLFxuICAgICAgICAnfSc6ICAnVSswMDdEJyxcbiAgICAgICAgJ8KnJzogICdVKzAwQTcnLFxuICAgICAgICAnwrEnOiAgJ1UrMDBCMScsXG4gICAgICAgICdcXCcnOiAnVSswMDI3JyxcbiAgICAgICAgJ1wiJzogICdVKzAwMjInLFxuICAgICAgICAnOic6ICAnVSswMDNBJyxcbiAgICAgICAgJzsnOiAgJ1UrMDAzQicsXG4gICAgICAgICdgJzogICdVKzAwNjAnLFxuICAgICAgICAnfic6ICAnVSswMDdFJyxcbiAgICB9LFxufTtcbiJdfQ==
@@ -34,8 +34,8 @@
34
34
  openFileProtocolUrl: '{{{openFileProtocolUrl}}}',
35
35
  },
36
36
  {
37
- retryTestPages: {{{retryTestPages}}},
38
- proxyless: {{{proxyless}}},
37
+ retryTestPages: {{{retryTestPages}}},
38
+ nativeAutomation: {{{nativeAutomation}}},
39
39
  });
40
40
 
41
41
  idlePage.start();
@@ -378,7 +378,9 @@
378
378
  closeWindow: '/browser/close-window',
379
379
  serviceWorker: '/service-worker.js',
380
380
  openFileProtocol: '/browser/open-file-protocol',
381
- dispatchProxylessEvent: '/browser/dispatch-proxyless-event',
381
+ dispatchNativeAutomationEvent: '/browser/dispatch-native-automation-event',
382
+ dispatchNativeAutomationEventSequence: '/browser/dispatch-native-automation-event-sequence',
383
+ parseSelector: '/parse-selector',
382
384
  assets: {
383
385
  index: '/browser/assets/index.js',
384
386
  styles: '/browser/assets/styles.css',
@@ -386,7 +388,7 @@
386
388
  },
387
389
  };
388
390
 
389
- var FILE_PROTOCOL = 'file:///';
391
+ var FILE_PROTOCOL = 'file://';
390
392
  function isFileProtocol(url) {
391
393
  if (url === void 0) { url = ''; }
392
394
  return url.indexOf(FILE_PROTOCOL) === 0;
@@ -465,14 +467,25 @@
465
467
  function stopInitScriptExecution() {
466
468
  allowInitScriptExecution = false;
467
469
  }
468
- function redirect(command, createXHR, openFileProtocolUrl) {
470
+ function redirectUsingCdp(command, _a) {
471
+ var openFileProtocolUrl = _a.openFileProtocolUrl, createXHR = _a.createXHR;
472
+ sendXHR(openFileProtocolUrl, createXHR, { method: 'POST', data: JSON.stringify({ url: command.url }) }); //eslint-disable-line no-restricted-globals
473
+ }
474
+ function redirect(command, opts) {
469
475
  stopInitScriptExecution();
470
476
  if (isFileProtocol(command.url))
471
- sendXHR(openFileProtocolUrl, createXHR, { method: 'POST', data: JSON.stringify({ url: command.url }) }); //eslint-disable-line no-restricted-globals
477
+ redirectUsingCdp(command, opts);
472
478
  else
473
- document.location = command.url;
479
+ setLocation(command, opts);
480
+ }
481
+ function setLocation(command, opts) {
482
+ var hashIndex = command.url.indexOf('#');
483
+ var onlyHashChanged = hashIndex !== -1 && command.url.slice(0, hashIndex) === LOCATION_HREF.slice(0, hashIndex);
484
+ document.location = command.url;
485
+ if (opts.nativeAutomation && onlyHashChanged)
486
+ document.location.reload();
474
487
  }
475
- function proxylessCheckRedirecting(_a) {
488
+ function nativeAutomationCheckRedirecting(_a) {
476
489
  var result = _a.result;
477
490
  if (result.cmd === COMMAND.idle)
478
491
  return regularCheckRedirecting(result);
@@ -486,7 +499,7 @@
486
499
  }
487
500
  function getStatus(_a, createXHR, _b) {
488
501
  var statusUrl = _a.statusUrl, openFileProtocolUrl = _a.openFileProtocolUrl;
489
- var _c = _b === void 0 ? {} : _b, manualRedirect = _c.manualRedirect, proxyless = _c.proxyless;
502
+ var _c = _b === void 0 ? {} : _b, manualRedirect = _c.manualRedirect, nativeAutomation = _c.nativeAutomation;
490
503
  return __awaiter(this, void 0, void 0, function () {
491
504
  var result, redirecting;
492
505
  return __generator(this, function (_d) {
@@ -494,9 +507,9 @@
494
507
  case 0: return [4 /*yield*/, sendXHR(statusUrl, createXHR)];
495
508
  case 1:
496
509
  result = _d.sent();
497
- redirecting = proxyless ? proxylessCheckRedirecting({ result: result }) : regularCheckRedirecting(result);
510
+ redirecting = nativeAutomation ? nativeAutomationCheckRedirecting({ result: result }) : regularCheckRedirecting(result);
498
511
  if (redirecting && !manualRedirect)
499
- redirect(result, createXHR, openFileProtocolUrl);
512
+ redirect(result, { createXHR: createXHR, openFileProtocolUrl: openFileProtocolUrl, nativeAutomation: nativeAutomation });
500
513
  return [2 /*return*/, { command: result, redirecting: redirecting }];
501
514
  }
502
515
  });
@@ -796,7 +809,7 @@
796
809
  statusUrl: this.communicationUrls.statusUrl,
797
810
  openFileProtocolUrl: this.communicationUrls.openFileProtocolUrl,
798
811
  };
799
- return [4 /*yield*/, checkStatus(urls, createXHR, { proxyless: this.options.proxyless })];
812
+ return [4 /*yield*/, checkStatus(urls, createXHR, { nativeAutomation: this.options.nativeAutomation })];
800
813
  case 1:
801
814
  command = (_a.sent()).command;
802
815
  _a.label = 2;
@@ -805,7 +818,7 @@
805
818
  return [4 /*yield*/, delay(CHECK_STATUS_DELAY)];
806
819
  case 3:
807
820
  _a.sent();
808
- return [4 /*yield*/, checkStatus(urls, createXHR, { proxyless: this.options.proxyless })];
821
+ return [4 /*yield*/, checkStatus(urls, createXHR, { nativeAutomation: this.options.nativeAutomation })];
809
822
  case 4:
810
823
  (command = (_a.sent()).command);
811
824
  return [3 /*break*/, 2];