@angular/core 18.0.0-next.5 → 18.0.0-next.6

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 (82) hide show
  1. package/esm2022/primitives/event-dispatch/contract_binary.mjs +10 -0
  2. package/esm2022/primitives/event-dispatch/index.mjs +13 -0
  3. package/esm2022/primitives/event-dispatch/src/a11y_click.mjs +54 -0
  4. package/esm2022/primitives/event-dispatch/src/accessibility.mjs +35 -0
  5. package/esm2022/primitives/event-dispatch/src/attribute.mjs +72 -0
  6. package/esm2022/primitives/event-dispatch/src/base_dispatcher.mjs +196 -0
  7. package/esm2022/primitives/event-dispatch/src/cache.mjs +95 -0
  8. package/esm2022/primitives/event-dispatch/src/char.mjs +35 -0
  9. package/esm2022/primitives/event-dispatch/src/custom_events.mjs +63 -0
  10. package/esm2022/primitives/event-dispatch/src/dispatcher.mjs +254 -0
  11. package/esm2022/primitives/event-dispatch/src/dom.mjs +48 -0
  12. package/esm2022/primitives/event-dispatch/src/earlyeventcontract.mjs +36 -0
  13. package/esm2022/primitives/event-dispatch/src/event.mjs +638 -0
  14. package/esm2022/primitives/event-dispatch/src/event_contract_container.mjs +63 -0
  15. package/esm2022/primitives/event-dispatch/src/event_contract_defines.mjs +48 -0
  16. package/esm2022/primitives/event-dispatch/src/event_contract_multi_container.mjs +192 -0
  17. package/esm2022/primitives/event-dispatch/src/event_handler.mjs +9 -0
  18. package/esm2022/primitives/event-dispatch/src/event_info.mjs +199 -0
  19. package/esm2022/primitives/event-dispatch/src/event_type.mjs +244 -0
  20. package/esm2022/primitives/event-dispatch/src/eventcontract.mjs +675 -0
  21. package/esm2022/primitives/event-dispatch/src/key_code.mjs +21 -0
  22. package/esm2022/primitives/event-dispatch/src/legacy_dispatcher.mjs +9 -0
  23. package/esm2022/primitives/event-dispatch/src/property.mjs +35 -0
  24. package/esm2022/primitives/event-dispatch/src/register_events.mjs +32 -0
  25. package/esm2022/primitives/event-dispatch/src/replay.mjs +389 -0
  26. package/esm2022/primitives/event-dispatch/src/restriction.mjs +15 -0
  27. package/esm2022/primitives/signals/index.mjs +3 -3
  28. package/esm2022/primitives/signals/src/computed.mjs +5 -3
  29. package/esm2022/primitives/signals/src/graph.mjs +14 -9
  30. package/esm2022/primitives/signals/src/signal.mjs +2 -2
  31. package/esm2022/primitives/signals/src/watch.mjs +2 -2
  32. package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +50 -5
  33. package/esm2022/src/core.mjs +2 -1
  34. package/esm2022/src/core_private_export.mjs +2 -1
  35. package/esm2022/src/defer/instructions.mjs +31 -8
  36. package/esm2022/src/di/host_tag_name_token.mjs +65 -0
  37. package/esm2022/src/di/index.mjs +2 -1
  38. package/esm2022/src/errors.mjs +1 -1
  39. package/esm2022/src/hydration/annotate.mjs +15 -1
  40. package/esm2022/src/hydration/event_replay.mjs +181 -0
  41. package/esm2022/src/hydration/tokens.mjs +6 -1
  42. package/esm2022/src/pending_tasks.mjs +54 -11
  43. package/esm2022/src/render3/component_ref.mjs +1 -1
  44. package/esm2022/src/render3/context_discovery.mjs +15 -1
  45. package/esm2022/src/render3/instructions/control_flow.mjs +50 -3
  46. package/esm2022/src/render3/list_reconciliation.mjs +41 -1
  47. package/esm2022/src/util/callback_scheduler.mjs +13 -2
  48. package/esm2022/src/version.mjs +1 -1
  49. package/esm2022/src/zone/ng_zone.mjs +22 -6
  50. package/esm2022/testing/src/async.mjs +2 -10
  51. package/esm2022/testing/src/defer.mjs +1 -2
  52. package/esm2022/testing/src/logger.mjs +3 -3
  53. package/event-dispatch-contract.min.js +1 -1
  54. package/fesm2022/core.mjs +516 -39
  55. package/fesm2022/core.mjs.map +1 -1
  56. package/fesm2022/primitives/event-dispatch.mjs +3044 -0
  57. package/fesm2022/primitives/event-dispatch.mjs.map +1 -0
  58. package/fesm2022/primitives/signals.mjs +17 -10
  59. package/fesm2022/primitives/signals.mjs.map +1 -1
  60. package/fesm2022/rxjs-interop.mjs +1 -1
  61. package/fesm2022/testing.mjs +3 -12
  62. package/fesm2022/testing.mjs.map +1 -1
  63. package/index.d.ts +75 -13
  64. package/package.json +7 -1
  65. package/primitives/event-dispatch/index.d.ts +627 -0
  66. package/primitives/signals/index.d.ts +1 -1
  67. package/rxjs-interop/index.d.ts +1 -1
  68. package/schematics/migrations/{transfer-state → http-providers}/bundle.js +254 -68
  69. package/schematics/migrations/http-providers/bundle.js.map +7 -0
  70. package/schematics/migrations/invalid-two-way-bindings/bundle.js +659 -337
  71. package/schematics/migrations/invalid-two-way-bindings/bundle.js.map +2 -2
  72. package/schematics/migrations.json +6 -16
  73. package/schematics/ng-generate/control-flow-migration/bundle.js +667 -345
  74. package/schematics/ng-generate/control-flow-migration/bundle.js.map +2 -2
  75. package/schematics/ng-generate/standalone-migration/bundle.js +1030 -660
  76. package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
  77. package/testing/index.d.ts +2 -9
  78. package/schematics/migrations/block-template-entities/bundle.js +0 -22808
  79. package/schematics/migrations/block-template-entities/bundle.js.map +0 -7
  80. package/schematics/migrations/compiler-options/bundle.js +0 -582
  81. package/schematics/migrations/compiler-options/bundle.js.map +0 -7
  82. package/schematics/migrations/transfer-state/bundle.js.map +0 -7
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { EventType } from './/event_type';
9
+ /**
10
+ * Create a custom event with the specified data.
11
+ * @param type The type of the action, e.g., 'submit'.
12
+ * @param data An optional data payload.
13
+ * @param triggeringEvent The event that triggers this custom event. This can be
14
+ * accessed from the custom event's action flow like so:
15
+ * actionFlow.event().detail.triggeringEvent.
16
+ * @return The new custom event.
17
+ */
18
+ export function createCustomEvent(type, data, triggeringEvent) {
19
+ let event;
20
+ const unrenamedDetail = {
21
+ '_type': type,
22
+ };
23
+ const renamedDetail = {
24
+ type,
25
+ data,
26
+ triggeringEvent,
27
+ };
28
+ const detail = { ...unrenamedDetail, ...renamedDetail };
29
+ try {
30
+ // We don't use the CustomEvent constructor directly since it isn't
31
+ // supported in IE 9 or 10 and initCustomEvent below works just fine.
32
+ event = document.createEvent('CustomEvent');
33
+ event.initCustomEvent(EventType.CUSTOM, true, false, detail);
34
+ }
35
+ catch (e) {
36
+ // If custom events aren't supported, fall back to custom-named HTMLEvent.
37
+ // Fallback used by Android Gingerbread, FF4-5.
38
+ // Hack to emulate `CustomEvent`, `HTMLEvents` doesn't satisfy `CustomEvent`
39
+ // type.
40
+ // tslint:disable-next-line:no-any
41
+ event = document.createEvent('HTMLEvents');
42
+ event.initEvent(EventType.CUSTOM, true, false);
43
+ // Hack to emulate `CustomEvent`, `detail` is readonly on `CustomEvent`.
44
+ // tslint:disable-next-line:no-any
45
+ event['detail'] = detail;
46
+ }
47
+ return event;
48
+ }
49
+ /**
50
+ * Fires a custom event with an optional payload. Only intended to be consumed
51
+ * by jsaction itself. Supported in Firefox 6+, IE 9+, and all Chrome versions.
52
+ *
53
+ * @param target The target element.
54
+ * @param type The type of the action, e.g., 'submit'.
55
+ * @param data An optional data payload.
56
+ * @param triggeringEvent An optional data for the Event triggered this custom
57
+ * event.
58
+ */
59
+ export function fireCustomEvent(target, type, data, triggeringEvent) {
60
+ const event = createCustomEvent(type, data, triggeringEvent);
61
+ target.dispatchEvent(event);
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tX2V2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvcHJpbWl0aXZlcy9ldmVudC1kaXNwYXRjaC9zcmMvY3VzdG9tX2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBZXhDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFJLElBQVksRUFBRSxJQUFRLEVBQUUsZUFBdUI7SUFDbEYsSUFBSSxLQUFxRSxDQUFDO0lBQzFFLE1BQU0sZUFBZSxHQUErQjtRQUNsRCxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBeUI7UUFDMUMsSUFBSTtRQUNKLElBQUk7UUFDSixlQUFlO0tBQ2hCLENBQUM7SUFDRixNQUFNLE1BQU0sR0FBRyxFQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDO1FBQ0gsbUVBQW1FO1FBQ25FLHFFQUFxRTtRQUNyRSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLDBFQUEwRTtRQUMxRSwrQ0FBK0M7UUFFL0MsNEVBQTRFO1FBQzVFLFFBQVE7UUFDUixrQ0FBa0M7UUFDbEMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFRLENBQUM7UUFDbEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyx3RUFBd0U7UUFDeEUsa0NBQWtDO1FBQ2pDLEtBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLE1BQWUsRUFDZixJQUFZLEVBQ1osSUFBUSxFQUNSLGVBQXVCO0lBRXZCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RXZlbnRUeXBlfSBmcm9tICcuLy9ldmVudF90eXBlJztcblxuLy8gV2UgdXNlICdfdHlwZScgZm9yIHRoZSBldmVudCBjb250cmFjdCwgd2hpY2ggbGl2ZXMgaW4gYSBzZXBhcmF0ZVxuLy8gY29tcGlsYXRpb24gdW5pdC5cbmRlY2xhcmUgaW50ZXJmYWNlIFVucmVuYW1lZEN1c3RvbUV2ZW50RGV0YWlsIHtcbiAgX3R5cGU6IHN0cmluZztcbn1cblxuLyoqIFRoZSBkZXRhaWwgaW50ZXJmYWNlIHByb3ZpZGVkIGZvciBjdXN0b20gZXZlbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21FdmVudERldGFpbDxUPiB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YT86IFQ7XG4gIHRyaWdnZXJpbmdFdmVudD86IEV2ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YS5cbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBhY3Rpb24sIGUuZy4sICdzdWJtaXQnLlxuICogQHBhcmFtIGRhdGEgQW4gb3B0aW9uYWwgZGF0YSBwYXlsb2FkLlxuICogQHBhcmFtIHRyaWdnZXJpbmdFdmVudCBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VycyB0aGlzIGN1c3RvbSBldmVudC4gVGhpcyBjYW4gYmVcbiAqICAgICBhY2Nlc3NlZCBmcm9tIHRoZSBjdXN0b20gZXZlbnQncyBhY3Rpb24gZmxvdyBsaWtlIHNvOlxuICogICAgIGFjdGlvbkZsb3cuZXZlbnQoKS5kZXRhaWwudHJpZ2dlcmluZ0V2ZW50LlxuICogQHJldHVybiBUaGUgbmV3IGN1c3RvbSBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUV2ZW50PFQ+KHR5cGU6IHN0cmluZywgZGF0YT86IFQsIHRyaWdnZXJpbmdFdmVudD86IEV2ZW50KTogRXZlbnQge1xuICBsZXQgZXZlbnQ6IEN1c3RvbUV2ZW50PEN1c3RvbUV2ZW50RGV0YWlsPFQ+ICYgVW5yZW5hbWVkQ3VzdG9tRXZlbnREZXRhaWw+O1xuICBjb25zdCB1bnJlbmFtZWREZXRhaWw6IFVucmVuYW1lZEN1c3RvbUV2ZW50RGV0YWlsID0ge1xuICAgICdfdHlwZSc6IHR5cGUsXG4gIH07XG4gIGNvbnN0IHJlbmFtZWREZXRhaWw6IEN1c3RvbUV2ZW50RGV0YWlsPFQ+ID0ge1xuICAgIHR5cGUsXG4gICAgZGF0YSxcbiAgICB0cmlnZ2VyaW5nRXZlbnQsXG4gIH07XG4gIGNvbnN0IGRldGFpbCA9IHsuLi51bnJlbmFtZWREZXRhaWwsIC4uLnJlbmFtZWREZXRhaWx9O1xuICB0cnkge1xuICAgIC8vIFdlIGRvbid0IHVzZSB0aGUgQ3VzdG9tRXZlbnQgY29uc3RydWN0b3IgZGlyZWN0bHkgc2luY2UgaXQgaXNuJ3RcbiAgICAvLyBzdXBwb3J0ZWQgaW4gSUUgOSBvciAxMCBhbmQgaW5pdEN1c3RvbUV2ZW50IGJlbG93IHdvcmtzIGp1c3QgZmluZS5cbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgIGV2ZW50LmluaXRDdXN0b21FdmVudChFdmVudFR5cGUuQ1VTVE9NLCB0cnVlLCBmYWxzZSwgZGV0YWlsKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElmIGN1c3RvbSBldmVudHMgYXJlbid0IHN1cHBvcnRlZCwgZmFsbCBiYWNrIHRvIGN1c3RvbS1uYW1lZCBIVE1MRXZlbnQuXG4gICAgLy8gRmFsbGJhY2sgdXNlZCBieSBBbmRyb2lkIEdpbmdlcmJyZWFkLCBGRjQtNS5cblxuICAgIC8vIEhhY2sgdG8gZW11bGF0ZSBgQ3VzdG9tRXZlbnRgLCBgSFRNTEV2ZW50c2AgZG9lc24ndCBzYXRpc2Z5IGBDdXN0b21FdmVudGBcbiAgICAvLyB0eXBlLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJykgYXMgYW55O1xuICAgIGV2ZW50LmluaXRFdmVudChFdmVudFR5cGUuQ1VTVE9NLCB0cnVlLCBmYWxzZSk7XG4gICAgLy8gSGFjayB0byBlbXVsYXRlIGBDdXN0b21FdmVudGAsIGBkZXRhaWxgIGlzIHJlYWRvbmx5IG9uIGBDdXN0b21FdmVudGAuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIChldmVudCBhcyBhbnkpWydkZXRhaWwnXSA9IGRldGFpbDtcbiAgfVxuXG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBGaXJlcyBhIGN1c3RvbSBldmVudCB3aXRoIGFuIG9wdGlvbmFsIHBheWxvYWQuIE9ubHkgaW50ZW5kZWQgdG8gYmUgY29uc3VtZWRcbiAqIGJ5IGpzYWN0aW9uIGl0c2VsZi4gU3VwcG9ydGVkIGluIEZpcmVmb3ggNissIElFIDkrLCBhbmQgYWxsIENocm9tZSB2ZXJzaW9ucy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBhY3Rpb24sIGUuZy4sICdzdWJtaXQnLlxuICogQHBhcmFtIGRhdGEgQW4gb3B0aW9uYWwgZGF0YSBwYXlsb2FkLlxuICogQHBhcmFtIHRyaWdnZXJpbmdFdmVudCBBbiBvcHRpb25hbCBkYXRhIGZvciB0aGUgRXZlbnQgdHJpZ2dlcmVkIHRoaXMgY3VzdG9tXG4gKiAgICAgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXJlQ3VzdG9tRXZlbnQ8VD4oXG4gIHRhcmdldDogRWxlbWVudCxcbiAgdHlwZTogc3RyaW5nLFxuICBkYXRhPzogVCxcbiAgdHJpZ2dlcmluZ0V2ZW50PzogRXZlbnQsXG4pIHtcbiAgY29uc3QgZXZlbnQgPSBjcmVhdGVDdXN0b21FdmVudCh0eXBlLCBkYXRhLCB0cmlnZ2VyaW5nRXZlbnQpO1xuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG4iXX0=
@@ -0,0 +1,254 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { BaseDispatcher } from './base_dispatcher';
9
+ import { Char } from './char';
10
+ import * as eventLib from './event';
11
+ import { EventType } from './event_type';
12
+ import { Restriction } from './restriction';
13
+ /**
14
+ * Receives a DOM event, determines the jsaction associated with the source
15
+ * element of the DOM event, and invokes the handler associated with the
16
+ * jsaction.
17
+ */
18
+ export class Dispatcher {
19
+ /**
20
+ * Receives a DOM event, determines the jsaction associated with the source
21
+ * element of the DOM event, and invokes the handler associated with the
22
+ * jsaction.
23
+ *
24
+ * @param getHandler A function that knows how to get the handler for a
25
+ * given event info.
26
+ */
27
+ constructor(getHandler, { stopPropagation = false, eventReplayer = undefined, } = {}) {
28
+ this.getHandler = getHandler;
29
+ /**
30
+ * The actions that are registered for this Dispatcher instance.
31
+ * This should be the primary one used once migration off of registerHandlers
32
+ * is done.
33
+ */
34
+ this.actions = {};
35
+ /** A map of global event handlers, where each key is an event type. */
36
+ this.globalHandlers = new Map();
37
+ this.baseDispatcher = new BaseDispatcher((eventInfoWrapper, isGlobalDispatch) => {
38
+ this.dispatchToHandler(eventInfoWrapper, isGlobalDispatch);
39
+ }, {
40
+ eventReplayer: (eventInfoWrappers) => {
41
+ this.eventReplayer?.(eventInfoWrappers, this);
42
+ },
43
+ });
44
+ this.stopPropagation = stopPropagation;
45
+ }
46
+ /**
47
+ * Receives an event or the event queue from the EventContract. The event
48
+ * queue is copied and it attempts to replay.
49
+ * If event info is passed in it looks for an action handler that can handle
50
+ * the given event. If there is no handler registered queues the event and
51
+ * checks if a loader is registered for the given namespace. If so, calls it.
52
+ *
53
+ * Alternatively, if in global dispatch mode, calls all registered global
54
+ * handlers for the appropriate event type.
55
+ *
56
+ * The three functionalities of this call are deliberately not split into
57
+ * three methods (and then declared as an abstract interface), because the
58
+ * interface is used by EventContract, which lives in a different jsbinary.
59
+ * Therefore the interface between the three is defined entirely in terms that
60
+ * are invariant under jscompiler processing (Function and Array, as opposed
61
+ * to a custom type with method names).
62
+ *
63
+ * @param eventInfo The info for the event that triggered this call or the
64
+ * queue of events from EventContract.
65
+ * @param isGlobalDispatch If true, dispatches a global event instead of a
66
+ * regular jsaction handler.
67
+ * @return An `EventInfo` for the `EventContract` to handle again if the
68
+ * `Dispatcher` tried to resolve an a11y event as a click but failed.
69
+ */
70
+ dispatch(eventInfo, isGlobalDispatch) {
71
+ return this.baseDispatcher.dispatch(eventInfo, isGlobalDispatch);
72
+ }
73
+ /**
74
+ * Dispatches an `EventInfoWrapper`.
75
+ */
76
+ dispatchToHandler(eventInfoWrapper, isGlobalDispatch) {
77
+ if (isGlobalDispatch) {
78
+ // Skip everything related to jsaction handlers, and execute the global
79
+ // handlers.
80
+ const ev = eventInfoWrapper.getEvent();
81
+ const eventTypeHandlers = this.globalHandlers.get(eventInfoWrapper.getEventType());
82
+ let shouldPreventDefault = false;
83
+ if (eventTypeHandlers) {
84
+ for (const handler of eventTypeHandlers) {
85
+ if (handler(ev) === false) {
86
+ shouldPreventDefault = true;
87
+ }
88
+ }
89
+ }
90
+ if (shouldPreventDefault) {
91
+ eventLib.preventDefault(ev);
92
+ }
93
+ return;
94
+ }
95
+ if (this.stopPropagation) {
96
+ stopPropagation(eventInfoWrapper);
97
+ }
98
+ const action = eventInfoWrapper.getAction();
99
+ let handler = undefined;
100
+ if (this.getHandler) {
101
+ handler = this.getHandler(eventInfoWrapper);
102
+ }
103
+ if (!handler) {
104
+ handler = this.actions[action.name];
105
+ }
106
+ if (handler) {
107
+ handler(eventInfoWrapper);
108
+ return;
109
+ }
110
+ // No handler was found.
111
+ this.baseDispatcher.queueEventInfoWrapper(eventInfoWrapper);
112
+ }
113
+ /**
114
+ * Registers multiple methods all bound to the same object
115
+ * instance. This is a common case: an application module binds
116
+ * multiple of its methods under public names to the event contract of
117
+ * the application. So we provide a shortcut for it.
118
+ * Attempts to replay the queued events after registering the handlers.
119
+ *
120
+ * @param namespace The namespace of the jsaction name.
121
+ *
122
+ * @param instance The object to bind the methods to. If this is null, then
123
+ * the functions are not bound, but directly added under the public names.
124
+ *
125
+ * @param methods A map from public name to functions that will be bound to
126
+ * instance and registered as action under the public name. I.e. the
127
+ * property names are the public names. The property values are the
128
+ * methods of instance.
129
+ */
130
+ registerEventInfoHandlers(namespace, instance, methods) {
131
+ for (const [name, method] of Object.entries(methods)) {
132
+ const handler = instance ? method.bind(instance) : method;
133
+ if (namespace) {
134
+ // Include a '.' separator between namespace name and action name.
135
+ // In the case that no namespace name is provided, the jsaction name
136
+ // consists of the action name only (no period).
137
+ const fullName = namespace + Char.NAMESPACE_ACTION_SEPARATOR + name;
138
+ this.actions[fullName] = handler;
139
+ }
140
+ else {
141
+ this.actions[name] = handler;
142
+ }
143
+ }
144
+ this.baseDispatcher.scheduleEventReplay();
145
+ }
146
+ /**
147
+ * Unregisters an action. Provided as an easy way to reverse the effects of
148
+ * registerHandlers.
149
+ * @param namespace The namespace of the jsaction name.
150
+ * @param name The action name to unbind.
151
+ */
152
+ unregisterHandler(namespace, name) {
153
+ const fullName = namespace ? namespace + Char.NAMESPACE_ACTION_SEPARATOR + name : name;
154
+ delete this.actions[fullName];
155
+ }
156
+ /** Registers a global event handler. */
157
+ registerGlobalHandler(eventType, handler) {
158
+ if (!this.globalHandlers.has(eventType)) {
159
+ this.globalHandlers.set(eventType, new Set([handler]));
160
+ }
161
+ else {
162
+ this.globalHandlers.get(eventType).add(handler);
163
+ }
164
+ }
165
+ /** Unregisters a global event handler. */
166
+ unregisterGlobalHandler(eventType, handler) {
167
+ if (this.globalHandlers.has(eventType)) {
168
+ this.globalHandlers.get(eventType).delete(handler);
169
+ }
170
+ }
171
+ /**
172
+ * Checks whether there is an action registered under the given
173
+ * name. This returns true if there is a namespace handler, even
174
+ * if it can not yet handle the event.
175
+ *
176
+ * @param name Action name.
177
+ * @return Whether the name is registered.
178
+ * @see #canDispatch
179
+ */
180
+ hasAction(name) {
181
+ return this.actions.hasOwnProperty(name);
182
+ }
183
+ /**
184
+ * Whether this dispatcher can dispatch the event. This can be used by
185
+ * event replayer to check whether the dispatcher can replay an event.
186
+ */
187
+ canDispatch(eventInfoWrapper) {
188
+ const action = eventInfoWrapper.getAction();
189
+ if (!action) {
190
+ return false;
191
+ }
192
+ return this.hasAction(action.name);
193
+ }
194
+ /**
195
+ * Sets the event replayer, enabling queued events to be replayed when actions
196
+ * are bound. To replay events, you must register the dispatcher to the
197
+ * contract after setting the `EventReplayer`. The event replayer takes as
198
+ * parameters the queue of events and the dispatcher (used to check whether
199
+ * actions have handlers registered and can be replayed). The event replayer
200
+ * is also responsible for dequeuing events.
201
+ *
202
+ * Example: An event replayer that replays only the last event.
203
+ *
204
+ * const dispatcher = new Dispatcher();
205
+ * // ...
206
+ * dispatcher.setEventReplayer((queue, dispatcher) => {
207
+ * const lastEventInfoWrapper = queue[queue.length -1];
208
+ * if (dispatcher.canDispatch(lastEventInfoWrapper.getAction())) {
209
+ * jsaction.replay.replayEvent(
210
+ * lastEventInfoWrapper.getEvent(),
211
+ * lastEventInfoWrapper.getTargetElement(),
212
+ * lastEventInfoWrapper.getEventType(),
213
+ * );
214
+ * queue.length = 0;
215
+ * }
216
+ * });
217
+ *
218
+ * @param eventReplayer It allows elements to be replayed and dequeuing.
219
+ */
220
+ setEventReplayer(eventReplayer) {
221
+ this.eventReplayer = eventReplayer;
222
+ }
223
+ }
224
+ /** Stop propagation for an `EventInfo`. */
225
+ export function stopPropagation(eventInfoWrapper) {
226
+ if (eventLib.isGecko &&
227
+ (eventInfoWrapper.getTargetElement().tagName === 'INPUT' ||
228
+ eventInfoWrapper.getTargetElement().tagName === 'TEXTAREA') &&
229
+ eventInfoWrapper.getEventType() === EventType.FOCUS) {
230
+ /**
231
+ * Do nothing since stopping propagation on a focus event on an input
232
+ * element in Firefox makes the text cursor disappear:
233
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=509684
234
+ */
235
+ return;
236
+ }
237
+ const event = eventInfoWrapper.getEvent();
238
+ // There are some cases where users of the `Dispatcher` will call dispatch
239
+ // with a fake event that does not support `stopPropagation`.
240
+ if (!event.stopPropagation) {
241
+ return;
242
+ }
243
+ event.stopPropagation();
244
+ }
245
+ /**
246
+ * Registers deferred functionality for an EventContract and a Jsaction
247
+ * Dispatcher.
248
+ */
249
+ export function registerDispatcher(eventContract, dispatcher) {
250
+ eventContract.ecrd((eventInfo, globalDispatch) => {
251
+ return dispatcher.dispatch(eventInfo, globalDispatch);
252
+ }, Restriction.I_AM_THE_JSACTION_FRAMEWORK);
253
+ }
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvcHJpbWl0aXZlcy9ldmVudC1kaXNwYXRjaC9zcmMvZGlzcGF0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsY0FBYyxFQUEwQixNQUFNLG1CQUFtQixDQUFDO0FBQzFFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLFFBQVEsTUFBTSxTQUFTLENBQUM7QUFFcEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUV2QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBZ0IxQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFtQnJCOzs7Ozs7O09BT0c7SUFDSCxZQUNtQixVQUVrQixFQUNuQyxFQUNFLGVBQWUsR0FBRyxLQUFLLEVBQ3ZCLGFBQWEsR0FBRyxTQUFTLE1BQ2dDLEVBQUU7UUFONUMsZUFBVSxHQUFWLFVBQVUsQ0FFUTtRQXhCckM7Ozs7V0FJRztRQUNjLFlBQU8sR0FBNkMsRUFBRSxDQUFDO1FBRXhFLHVFQUF1RTtRQUN0RCxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBc0J0RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUN0QyxDQUFDLGdCQUFrQyxFQUFFLGdCQUEwQixFQUFFLEVBQUU7WUFDakUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsQ0FBQyxFQUNEO1lBQ0UsYUFBYSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7U0FDRixDQUNG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QUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxFQUFFLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtCYXNlRGlzcGF0Y2hlciwgRXZlbnRJbmZvV3JhcHBlckhhbmRsZXJ9IGZyb20gJy4vYmFzZV9kaXNwYXRjaGVyJztcbmltcG9ydCB7Q2hhcn0gZnJvbSAnLi9jaGFyJztcbmltcG9ydCAqIGFzIGV2ZW50TGliIGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHtFdmVudEluZm8sIEV2ZW50SW5mb1dyYXBwZXJ9IGZyb20gJy4vZXZlbnRfaW5mbyc7XG5pbXBvcnQge0V2ZW50VHlwZX0gZnJvbSAnLi9ldmVudF90eXBlJztcbmltcG9ydCB7VW5yZW5hbWVkRXZlbnRDb250cmFjdH0gZnJvbSAnLi9ldmVudGNvbnRyYWN0JztcbmltcG9ydCB7UmVzdHJpY3Rpb259IGZyb20gJy4vcmVzdHJpY3Rpb24nO1xuXG5leHBvcnQgdHlwZSB7RXZlbnRJbmZvV3JhcHBlckhhbmRsZXIgYXMgRXZlbnRJbmZvSGFuZGxlcn0gZnJvbSAnLi9iYXNlX2Rpc3BhdGNoZXInO1xuXG4vKipcbiAqIEEgZ2xvYmFsIGhhbmRsZXIgaXMgZGlzcGF0Y2hlZCB0byBiZWZvcmUgbm9ybWFsIGhhbmRsZXIgZGlzcGF0Y2guIFJldHVybmluZ1xuICogZmFsc2Ugd2lsbCBgcHJldmVudERlZmF1bHRgIG9uIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgR2xvYmFsSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IGJvb2xlYW4gfCB2b2lkO1xuXG4vKipcbiAqIEEgcmVwbGF5ZXIgaXMgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBxdWV1ZWQgZXZlbnRzLFxuICogZWl0aGVyIGZyb20gdGhlIGBFdmVudENvbnRyYWN0YCBvciB3aGVuIHRoZXJlIGFyZSBubyBkZXRlY3RlZCBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVwbGF5ZXIgPSAoZXZlbnRJbmZvV3JhcHBlcnM6IEV2ZW50SW5mb1dyYXBwZXJbXSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcikgPT4gdm9pZDtcblxuLyoqXG4gKiBSZWNlaXZlcyBhIERPTSBldmVudCwgZGV0ZXJtaW5lcyB0aGUganNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2VcbiAqIGVsZW1lbnQgb2YgdGhlIERPTSBldmVudCwgYW5kIGludm9rZXMgdGhlIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICoganNhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlRGlzcGF0Y2hlcjogQmFzZURpc3BhdGNoZXI7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc3RvcCBwcm9wYWdhdGlvbiBmb3IgYW4gYEV2ZW50SW5mb2AuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcFByb3BhZ2F0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIERpc3BhdGNoZXIgaW5zdGFuY2UuXG4gICAqIFRoaXMgc2hvdWxkIGJlIHRoZSBwcmltYXJ5IG9uZSB1c2VkIG9uY2UgbWlncmF0aW9uIG9mZiBvZiByZWdpc3RlckhhbmRsZXJzXG4gICAqIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbnM6IHtba2V5OiBzdHJpbmddOiBFdmVudEluZm9XcmFwcGVySGFuZGxlcn0gPSB7fTtcblxuICAvKiogQSBtYXAgb2YgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzLCB3aGVyZSBlYWNoIGtleSBpcyBhbiBldmVudCB0eXBlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxHbG9iYWxIYW5kbGVyPj4oKTtcblxuICAvKiogVGhlIGV2ZW50IHJlcGxheWVyLiAqL1xuICBwcml2YXRlIGV2ZW50UmVwbGF5ZXI/OiBSZXBsYXllcjtcblxuICAvKipcbiAgICogUmVjZWl2ZXMgYSBET00gZXZlbnQsIGRldGVybWluZXMgdGhlIGpzYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc291cmNlXG4gICAqIGVsZW1lbnQgb2YgdGhlIERPTSBldmVudCwgYW5kIGludm9rZXMgdGhlIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBqc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGdldEhhbmRsZXIgQSBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBnZXQgdGhlIGhhbmRsZXIgZm9yIGFcbiAgICogICAgIGdpdmVuIGV2ZW50IGluZm8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdldEhhbmRsZXI/OiAoXG4gICAgICBldmVudEluZm9XcmFwcGVyOiBFdmVudEluZm9XcmFwcGVyLFxuICAgICkgPT4gRXZlbnRJbmZvV3JhcHBlckhhbmRsZXIgfCB2b2lkLFxuICAgIHtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlLFxuICAgICAgZXZlbnRSZXBsYXllciA9IHVuZGVmaW5lZCxcbiAgICB9OiB7c3RvcFByb3BhZ2F0aW9uPzogYm9vbGVhbjsgZXZlbnRSZXBsYXllcj86IFJlcGxheWVyfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLmJhc2VEaXNwYXRjaGVyID0gbmV3IEJhc2VEaXNwYXRjaGVyKFxuICAgICAgKGV2ZW50SW5mb1dyYXBwZXI6IEV2ZW50SW5mb1dyYXBwZXIsIGlzR2xvYmFsRGlzcGF0Y2g/OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hUb0hhbmRsZXIoZXZlbnRJbmZvV3JhcHBlciwgaXNHbG9iYWxEaXNwYXRjaCk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBldmVudFJlcGxheWVyOiAoZXZlbnRJbmZvV3JhcHBlcnMpID0+IHtcbiAgICAgICAgICB0aGlzLmV2ZW50UmVwbGF5ZXI/LihldmVudEluZm9XcmFwcGVycywgdGhpcyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24gPSBzdG9wUHJvcGFnYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmVjZWl2ZXMgYW4gZXZlbnQgb3IgdGhlIGV2ZW50IHF1ZXVlIGZyb20gdGhlIEV2ZW50Q29udHJhY3QuIFRoZSBldmVudFxuICAgKiBxdWV1ZSBpcyBjb3BpZWQgYW5kIGl0IGF0dGVtcHRzIHRvIHJlcGxheS5cbiAgICogSWYgZXZlbnQgaW5mbyBpcyBwYXNzZWQgaW4gaXQgbG9va3MgZm9yIGFuIGFjdGlvbiBoYW5kbGVyIHRoYXQgY2FuIGhhbmRsZVxuICAgKiB0aGUgZ2l2ZW4gZXZlbnQuICBJZiB0aGVyZSBpcyBubyBoYW5kbGVyIHJlZ2lzdGVyZWQgcXVldWVzIHRoZSBldmVudCBhbmRcbiAgICogY2hlY2tzIGlmIGEgbG9hZGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UuIElmIHNvLCBjYWxscyBpdC5cbiAgICpcbiAgICogQWx0ZXJuYXRpdmVseSwgaWYgaW4gZ2xvYmFsIGRpc3BhdGNoIG1vZGUsIGNhbGxzIGFsbCByZWdpc3RlcmVkIGdsb2JhbFxuICAgKiBoYW5kbGVycyBmb3IgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IHR5cGUuXG4gICAqXG4gICAqIFRoZSB0aHJlZSBmdW5jdGlvbmFsaXRpZXMgb2YgdGhpcyBjYWxsIGFyZSBkZWxpYmVyYXRlbHkgbm90IHNwbGl0IGludG9cbiAgICogdGhyZWUgbWV0aG9kcyAoYW5kIHRoZW4gZGVjbGFyZWQgYXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlKSwgYmVjYXVzZSB0aGVcbiAgICogaW50ZXJmYWNlIGlzIHVzZWQgYnkgRXZlbnRDb250cmFjdCwgd2hpY2ggbGl2ZXMgaW4gYSBkaWZmZXJlbnQganNiaW5hcnkuXG4gICAqIFRoZXJlZm9yZSB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHRocmVlIGlzIGRlZmluZWQgZW50aXJlbHkgaW4gdGVybXMgdGhhdFxuICAgKiBhcmUgaW52YXJpYW50IHVuZGVyIGpzY29tcGlsZXIgcHJvY2Vzc2luZyAoRnVuY3Rpb24gYW5kIEFycmF5LCBhcyBvcHBvc2VkXG4gICAqIHRvIGEgY3VzdG9tIHR5cGUgd2l0aCBtZXRob2QgbmFtZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRJbmZvIFRoZSBpbmZvIGZvciB0aGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBjYWxsIG9yIHRoZVxuICAgKiAgICAgcXVldWUgb2YgZXZlbnRzIGZyb20gRXZlbnRDb250cmFjdC5cbiAgICogQHBhcmFtIGlzR2xvYmFsRGlzcGF0Y2ggSWYgdHJ1ZSwgZGlzcGF0Y2hlcyBhIGdsb2JhbCBldmVudCBpbnN0ZWFkIG9mIGFcbiAgICogICAgIHJlZ3VsYXIganNhY3Rpb24gaGFuZGxlci5cbiAgICogQHJldHVybiBBbiBgRXZlbnRJbmZvYCBmb3IgdGhlIGBFdmVudENvbnRyYWN0YCB0byBoYW5kbGUgYWdhaW4gaWYgdGhlXG4gICAqICAgIGBEaXNwYXRjaGVyYCB0cmllZCB0byByZXNvbHZlIGFuIGExMXkgZXZlbnQgYXMgYSBjbGljayBidXQgZmFpbGVkLlxuICAgKi9cbiAgZGlzcGF0Y2goZXZlbnRJbmZvOiBFdmVudEluZm8sIGlzR2xvYmFsRGlzcGF0Y2g/OiBib29sZWFuKTogRXZlbnRJbmZvIHwgdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZURpc3BhdGNoZXIuZGlzcGF0Y2goZXZlbnRJbmZvLCBpc0dsb2JhbERpc3BhdGNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGBFdmVudEluZm9XcmFwcGVyYC5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hUb0hhbmRsZXIoZXZlbnRJbmZvV3JhcHBlcjogRXZlbnRJbmZvV3JhcHBlciwgaXNHbG9iYWxEaXNwYXRjaD86IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNHbG9iYWxEaXNwYXRjaCkge1xuICAgICAgLy8gU2tpcCBldmVyeXRoaW5nIHJlbGF0ZWQgdG8ganNhY3Rpb24gaGFuZGxlcnMsIGFuZCBleGVjdXRlIHRoZSBnbG9iYWxcbiAgICAgIC8vIGhhbmRsZXJzLlxuICAgICAgY29uc3QgZXYgPSBldmVudEluZm9XcmFwcGVyLmdldEV2ZW50KCk7XG4gICAgICBjb25zdCBldmVudFR5cGVIYW5kbGVycyA9IHRoaXMuZ2xvYmFsSGFuZGxlcnMuZ2V0KGV2ZW50SW5mb1dyYXBwZXIuZ2V0RXZlbnRUeXBlKCkpO1xuICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgICBpZiAoZXZlbnRUeXBlSGFuZGxlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGV2ZW50VHlwZUhhbmRsZXJzKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIoZXYpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50TGliLnByZXZlbnREZWZhdWx0KGV2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudEluZm9XcmFwcGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBldmVudEluZm9XcmFwcGVyLmdldEFjdGlvbigpITtcblxuICAgIGxldCBoYW5kbGVyOiBFdmVudEluZm9XcmFwcGVySGFuZGxlciB8IHZvaWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuZ2V0SGFuZGxlcikge1xuICAgICAgaGFuZGxlciA9IHRoaXMuZ2V0SGFuZGxlcihldmVudEluZm9XcmFwcGVyKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIgPSB0aGlzLmFjdGlvbnNbYWN0aW9uLm5hbWVdO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICBoYW5kbGVyKGV2ZW50SW5mb1dyYXBwZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vIGhhbmRsZXIgd2FzIGZvdW5kLlxuICAgIHRoaXMuYmFzZURpc3BhdGNoZXIucXVldWVFdmVudEluZm9XcmFwcGVyKGV2ZW50SW5mb1dyYXBwZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBtdWx0aXBsZSBtZXRob2RzIGFsbCBib3VuZCB0byB0aGUgc2FtZSBvYmplY3RcbiAgICogaW5zdGFuY2UuIFRoaXMgaXMgYSBjb21tb24gY2FzZTogYW4gYXBwbGljYXRpb24gbW9kdWxlIGJpbmRzXG4gICAqIG11bHRpcGxlIG9mIGl0cyBtZXRob2RzIHVuZGVyIHB1YmxpYyBuYW1lcyB0byB0aGUgZXZlbnQgY29udHJhY3Qgb2ZcbiAgICogdGhlIGFwcGxpY2F0aW9uLiBTbyB3ZSBwcm92aWRlIGEgc2hvcnRjdXQgZm9yIGl0LlxuICAgKiBBdHRlbXB0cyB0byByZXBsYXkgdGhlIHF1ZXVlZCBldmVudHMgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGhhbmRsZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGpzYWN0aW9uIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgb2JqZWN0IHRvIGJpbmQgdGhlIG1ldGhvZHMgdG8uIElmIHRoaXMgaXMgbnVsbCwgdGhlblxuICAgKiAgICAgdGhlIGZ1bmN0aW9ucyBhcmUgbm90IGJvdW5kLCBidXQgZGlyZWN0bHkgYWRkZWQgdW5kZXIgdGhlIHB1YmxpYyBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZHMgQSBtYXAgZnJvbSBwdWJsaWMgbmFtZSB0byBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIGJvdW5kIHRvXG4gICAqICAgICBpbnN0YW5jZSBhbmQgcmVnaXN0ZXJlZCBhcyBhY3Rpb24gdW5kZXIgdGhlIHB1YmxpYyBuYW1lLiBJLmUuIHRoZVxuICAgKiAgICAgcHJvcGVydHkgbmFtZXMgYXJlIHRoZSBwdWJsaWMgbmFtZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMgYXJlIHRoZVxuICAgKiAgICAgbWV0aG9kcyBvZiBpbnN0YW5jZS5cbiAgICovXG4gIHJlZ2lzdGVyRXZlbnRJbmZvSGFuZGxlcnM8VD4oXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgaW5zdGFuY2U6IFQgfCBudWxsLFxuICAgIG1ldGhvZHM6IHtba2V5OiBzdHJpbmddOiBFdmVudEluZm9XcmFwcGVySGFuZGxlcn0sXG4gICkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIG1ldGhvZF0gb2YgT2JqZWN0LmVudHJpZXMobWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpbnN0YW5jZSA/IG1ldGhvZC5iaW5kKGluc3RhbmNlKSA6IG1ldGhvZDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgLy8gSW5jbHVkZSBhICcuJyBzZXBhcmF0b3IgYmV0d2VlbiBuYW1lc3BhY2UgbmFtZSBhbmQgYWN0aW9uIG5hbWUuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgbm8gbmFtZXNwYWNlIG5hbWUgaXMgcHJvdmlkZWQsIHRoZSBqc2FjdGlvbiBuYW1lXG4gICAgICAgIC8vIGNvbnNpc3RzIG9mIHRoZSBhY3Rpb24gbmFtZSBvbmx5IChubyBwZXJpb2QpLlxuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IG5hbWVzcGFjZSArIENoYXIuTkFNRVNQQUNFX0FDVElPTl9TRVBBUkFUT1IgKyBuYW1lO1xuICAgICAgICB0aGlzLmFjdGlvbnNbZnVsbE5hbWVdID0gaGFuZGxlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aW9uc1tuYW1lXSA9IGhhbmRsZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5iYXNlRGlzcGF0Y2hlci5zY2hlZHVsZUV2ZW50UmVwbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYW4gYWN0aW9uLiAgUHJvdmlkZWQgYXMgYW4gZWFzeSB3YXkgdG8gcmV2ZXJzZSB0aGUgZWZmZWN0cyBvZlxuICAgKiByZWdpc3RlckhhbmRsZXJzLlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGpzYWN0aW9uIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBhY3Rpb24gbmFtZSB0byB1bmJpbmQuXG4gICAqL1xuICB1bnJlZ2lzdGVySGFuZGxlcihuYW1lc3BhY2U6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSBuYW1lc3BhY2UgPyBuYW1lc3BhY2UgKyBDaGFyLk5BTUVTUEFDRV9BQ1RJT05fU0VQQVJBVE9SICsgbmFtZSA6IG5hbWU7XG4gICAgZGVsZXRlIHRoaXMuYWN0aW9uc1tmdWxsTmFtZV07XG4gIH1cblxuICAvKiogUmVnaXN0ZXJzIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuICovXG4gIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2xvYmFsSGFuZGxlcikge1xuICAgIGlmICghdGhpcy5nbG9iYWxIYW5kbGVycy5oYXMoZXZlbnRUeXBlKSkge1xuICAgICAgdGhpcy5nbG9iYWxIYW5kbGVycy5zZXQoZXZlbnRUeXBlLCBuZXcgU2V0PEdsb2JhbEhhbmRsZXI+KFtoYW5kbGVyXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdsb2JhbEhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVucmVnaXN0ZXJzIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuICovXG4gIHVucmVnaXN0ZXJHbG9iYWxIYW5kbGVyKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHbG9iYWxIYW5kbGVyKSB7XG4gICAgaWYgKHRoaXMuZ2xvYmFsSGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuZ2xvYmFsSGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSkhLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgaXMgYW4gYWN0aW9uIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGdpdmVuXG4gICAqIG5hbWUuIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgbmFtZXNwYWNlIGhhbmRsZXIsIGV2ZW5cbiAgICogaWYgaXQgY2FuIG5vdCB5ZXQgaGFuZGxlIHRoZSBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgQWN0aW9uIG5hbWUuXG4gICAqIEByZXR1cm4gV2hldGhlciB0aGUgbmFtZSBpcyByZWdpc3RlcmVkLlxuICAgKiBAc2VlICNjYW5EaXNwYXRjaFxuICAgKi9cbiAgaGFzQWN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGRpc3BhdGNoZXIgY2FuIGRpc3BhdGNoIHRoZSBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCBieVxuICAgKiBldmVudCByZXBsYXllciB0byBjaGVjayB3aGV0aGVyIHRoZSBkaXNwYXRjaGVyIGNhbiByZXBsYXkgYW4gZXZlbnQuXG4gICAqL1xuICBjYW5EaXNwYXRjaChldmVudEluZm9XcmFwcGVyOiBFdmVudEluZm9XcmFwcGVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWN0aW9uID0gZXZlbnRJbmZvV3JhcHBlci5nZXRBY3Rpb24oKTtcbiAgICBpZiAoIWFjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXNBY3Rpb24oYWN0aW9uLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV2ZW50IHJlcGxheWVyLCBlbmFibGluZyBxdWV1ZWQgZXZlbnRzIHRvIGJlIHJlcGxheWVkIHdoZW4gYWN0aW9uc1xuICAgKiBhcmUgYm91bmQuIFRvIHJlcGxheSBldmVudHMsIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBkaXNwYXRjaGVyIHRvIHRoZVxuICAgKiBjb250cmFjdCBhZnRlciBzZXR0aW5nIHRoZSBgRXZlbnRSZXBsYXllcmAuIFRoZSBldmVudCByZXBsYXllciB0YWtlcyBhc1xuICAgKiBwYXJhbWV0ZXJzIHRoZSBxdWV1ZSBvZiBldmVudHMgYW5kIHRoZSBkaXNwYXRjaGVyICh1c2VkIHRvIGNoZWNrIHdoZXRoZXJcbiAgICogYWN0aW9ucyBoYXZlIGhhbmRsZXJzIHJlZ2lzdGVyZWQgYW5kIGNhbiBiZSByZXBsYXllZCkuIFRoZSBldmVudCByZXBsYXllclxuICAgKiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBkZXF1ZXVpbmcgZXZlbnRzLlxuICAgKlxuICAgKiBFeGFtcGxlOiBBbiBldmVudCByZXBsYXllciB0aGF0IHJlcGxheXMgb25seSB0aGUgbGFzdCBldmVudC5cbiAgICpcbiAgICogICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoKTtcbiAgICogICAvLyAuLi5cbiAgICogICBkaXNwYXRjaGVyLnNldEV2ZW50UmVwbGF5ZXIoKHF1ZXVlLCBkaXNwYXRjaGVyKSA9PiB7XG4gICAqICAgICBjb25zdCBsYXN0RXZlbnRJbmZvV3JhcHBlciA9IHF1ZXVlW3F1ZXVlLmxlbmd0aCAtMV07XG4gICAqICAgICBpZiAoZGlzcGF0Y2hlci5jYW5EaXNwYXRjaChsYXN0RXZlbnRJbmZvV3JhcHBlci5nZXRBY3Rpb24oKSkpIHtcbiAgICogICAgICAganNhY3Rpb24ucmVwbGF5LnJlcGxheUV2ZW50KFxuICAgKiAgICAgICAgICAgbGFzdEV2ZW50SW5mb1dyYXBwZXIuZ2V0RXZlbnQoKSxcbiAgICogICAgICAgICAgIGxhc3RFdmVudEluZm9XcmFwcGVyLmdldFRhcmdldEVsZW1lbnQoKSxcbiAgICogICAgICAgICAgIGxhc3RFdmVudEluZm9XcmFwcGVyLmdldEV2ZW50VHlwZSgpLFxuICAgKiAgICAgICApO1xuICAgKiAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZXBsYXllciBJdCBhbGxvd3MgZWxlbWVudHMgdG8gYmUgcmVwbGF5ZWQgYW5kIGRlcXVldWluZy5cbiAgICovXG4gIHNldEV2ZW50UmVwbGF5ZXIoZXZlbnRSZXBsYXllcjogUmVwbGF5ZXIpIHtcbiAgICB0aGlzLmV2ZW50UmVwbGF5ZXIgPSBldmVudFJlcGxheWVyO1xuICB9XG59XG5cbi8qKiBTdG9wIHByb3BhZ2F0aW9uIGZvciBhbiBgRXZlbnRJbmZvYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZXZlbnRJbmZvV3JhcHBlcjogRXZlbnRJbmZvV3JhcHBlcikge1xuICBpZiAoXG4gICAgZXZlbnRMaWIuaXNHZWNrbyAmJlxuICAgIChldmVudEluZm9XcmFwcGVyLmdldFRhcmdldEVsZW1lbnQoKS50YWdOYW1lID09PSAnSU5QVVQnIHx8XG4gICAgICBldmVudEluZm9XcmFwcGVyLmdldFRhcmdldEVsZW1lbnQoKS50YWdOYW1lID09PSAnVEVYVEFSRUEnKSAmJlxuICAgIGV2ZW50SW5mb1dyYXBwZXIuZ2V0RXZlbnRUeXBlKCkgPT09IEV2ZW50VHlwZS5GT0NVU1xuICApIHtcbiAgICAvKipcbiAgICAgKiBEbyBub3RoaW5nIHNpbmNlIHN0b3BwaW5nIHByb3BhZ2F0aW9uIG9uIGEgZm9jdXMgZXZlbnQgb24gYW4gaW5wdXRcbiAgICAgKiBlbGVtZW50IGluIEZpcmVmb3ggbWFrZXMgdGhlIHRleHQgY3Vyc29yIGRpc2FwcGVhcjpcbiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01MDk2ODRcbiAgICAgKi9cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBldmVudCA9IGV2ZW50SW5mb1dyYXBwZXIuZ2V0RXZlbnQoKTtcbiAgLy8gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgdXNlcnMgb2YgdGhlIGBEaXNwYXRjaGVyYCB3aWxsIGNhbGwgZGlzcGF0Y2hcbiAgLy8gd2l0aCBhIGZha2UgZXZlbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGBzdG9wUHJvcGFnYXRpb25gLlxuICBpZiAoIWV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgZGVmZXJyZWQgZnVuY3Rpb25hbGl0eSBmb3IgYW4gRXZlbnRDb250cmFjdCBhbmQgYSBKc2FjdGlvblxuICogRGlzcGF0Y2hlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGlzcGF0Y2hlcihldmVudENvbnRyYWN0OiBVbnJlbmFtZWRFdmVudENvbnRyYWN0LCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyKSB7XG4gIGV2ZW50Q29udHJhY3QuZWNyZCgoZXZlbnRJbmZvOiBFdmVudEluZm8sIGdsb2JhbERpc3BhdGNoPzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBkaXNwYXRjaGVyLmRpc3BhdGNoKGV2ZW50SW5mbywgZ2xvYmFsRGlzcGF0Y2gpO1xuICB9LCBSZXN0cmljdGlvbi5JX0FNX1RIRV9KU0FDVElPTl9GUkFNRVdPUkspO1xufVxuIl19
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ /**
9
+ * Determines if one node is contained within another. Adapted from
10
+ * {@see goog.dom.contains}.
11
+ * @param node Node that should contain otherNode.
12
+ * @param otherNode Node being contained.
13
+ * @return True if otherNode is contained within node.
14
+ */
15
+ export function contains(node, otherNode) {
16
+ if (otherNode === null) {
17
+ return false;
18
+ }
19
+ // We use browser specific methods for this if available since it is faster
20
+ // that way.
21
+ // IE DOM
22
+ if ('contains' in node && otherNode.nodeType === 1) {
23
+ return node.contains(otherNode);
24
+ }
25
+ // W3C DOM Level 3
26
+ if ('compareDocumentPosition' in node) {
27
+ return node === otherNode || Boolean(node.compareDocumentPosition(otherNode) & 16);
28
+ }
29
+ // W3C DOM Level 1
30
+ while (otherNode && node !== otherNode) {
31
+ otherNode = otherNode.parentNode;
32
+ }
33
+ return otherNode === node;
34
+ }
35
+ /**
36
+ * Helper method for broadcastCustomEvent. Returns true if any member of
37
+ * the set is an ancestor of element.
38
+ */
39
+ export function hasAncestorInNodeList(element, nodeList) {
40
+ for (let idx = 0; idx < nodeList.length; ++idx) {
41
+ const member = nodeList[idx];
42
+ if (member !== element && contains(member, element)) {
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9wcmltaXRpdmVzL2V2ZW50LWRpc3BhdGNoL3NyYy9kb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFVLEVBQUUsU0FBc0I7SUFDekQsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLFlBQVk7SUFFWixTQUFTO0lBQ1QsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSx5QkFBeUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsT0FBTyxTQUFTLEtBQUssSUFBSSxDQUFDO0FBQzVCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBZ0IsRUFBRSxRQUFrQjtJQUN4RSxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLE1BQU0sS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIG9uZSBub2RlIGlzIGNvbnRhaW5lZCB3aXRoaW4gYW5vdGhlci4gQWRhcHRlZCBmcm9tXG4gKiB7QHNlZSBnb29nLmRvbS5jb250YWluc30uXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRoYXQgc2hvdWxkIGNvbnRhaW4gb3RoZXJOb2RlLlxuICogQHBhcmFtIG90aGVyTm9kZSBOb2RlIGJlaW5nIGNvbnRhaW5lZC5cbiAqIEByZXR1cm4gVHJ1ZSBpZiBvdGhlck5vZGUgaXMgY29udGFpbmVkIHdpdGhpbiBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnMobm9kZTogTm9kZSwgb3RoZXJOb2RlOiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAob3RoZXJOb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2UgdXNlIGJyb3dzZXIgc3BlY2lmaWMgbWV0aG9kcyBmb3IgdGhpcyBpZiBhdmFpbGFibGUgc2luY2UgaXQgaXMgZmFzdGVyXG4gIC8vIHRoYXQgd2F5LlxuXG4gIC8vIElFIERPTVxuICBpZiAoJ2NvbnRhaW5zJyBpbiBub2RlICYmIG90aGVyTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgIHJldHVybiBub2RlLmNvbnRhaW5zKG90aGVyTm9kZSk7XG4gIH1cblxuICAvLyBXM0MgRE9NIExldmVsIDNcbiAgaWYgKCdjb21wYXJlRG9jdW1lbnRQb3NpdGlvbicgaW4gbm9kZSkge1xuICAgIHJldHVybiBub2RlID09PSBvdGhlck5vZGUgfHwgQm9vbGVhbihub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG90aGVyTm9kZSkgJiAxNik7XG4gIH1cblxuICAvLyBXM0MgRE9NIExldmVsIDFcbiAgd2hpbGUgKG90aGVyTm9kZSAmJiBub2RlICE9PSBvdGhlck5vZGUpIHtcbiAgICBvdGhlck5vZGUgPSBvdGhlck5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gb3RoZXJOb2RlID09PSBub2RlO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIGJyb2FkY2FzdEN1c3RvbUV2ZW50LiBSZXR1cm5zIHRydWUgaWYgYW55IG1lbWJlciBvZlxuICogdGhlIHNldCBpcyBhbiBhbmNlc3RvciBvZiBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW5jZXN0b3JJbk5vZGVMaXN0KGVsZW1lbnQ6IEVsZW1lbnQsIG5vZGVMaXN0OiBOb2RlTGlzdCk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBub2RlTGlzdC5sZW5ndGg7ICsraWR4KSB7XG4gICAgY29uc3QgbWVtYmVyID0gbm9kZUxpc3RbaWR4XTtcbiAgICBpZiAobWVtYmVyICE9PSBlbGVtZW50ICYmIGNvbnRhaW5zKG1lbWJlciwgZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { createEventInfoFromParameters } from './event_info';
9
+ /**
10
+ * EarlyEventContract intercepts events in the bubbling phase at the
11
+ * boundary of the document body. This mapping will be passed to the
12
+ * late-loaded EventContract.
13
+ */
14
+ export class EarlyEventContract {
15
+ constructor() {
16
+ window._ejsa = {
17
+ q: [],
18
+ et: [],
19
+ h: (event) => {
20
+ const eventInfo = createEventInfoFromParameters(event.type, event, event.target, window.document.documentElement, Date.now());
21
+ window._ejsa.q.push(eventInfo);
22
+ },
23
+ };
24
+ }
25
+ /**
26
+ * Installs a list of event types for window.document.documentElement.
27
+ */
28
+ addEvents(types) {
29
+ for (let idx = 0; idx < types.length; idx++) {
30
+ const eventType = types[idx];
31
+ window._ejsa.et.push(eventType);
32
+ window.document.documentElement.addEventListener(eventType, window._ejsa.h);
33
+ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWFybHlldmVudGNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9wcmltaXRpdmVzL2V2ZW50LWRpc3BhdGNoL3NyYy9lYXJseWV2ZW50Y29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLDZCQUE2QixFQUFZLE1BQU0sY0FBYyxDQUFDO0FBc0J0RTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QjtRQUNFLE1BQU0sQ0FBQyxLQUFLLEdBQUc7WUFDYixDQUFDLEVBQUUsRUFBRTtZQUNMLEVBQUUsRUFBRSxFQUFFO1lBQ04sQ0FBQyxFQUFFLENBQUMsS0FBWSxFQUFFLEVBQUU7Z0JBQ2xCLE1BQU0sU0FBUyxHQUFHLDZCQUE2QixDQUM3QyxLQUFLLENBQUMsSUFBSSxFQUNWLEtBQUssRUFDTCxLQUFLLENBQUMsTUFBaUIsRUFDdkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQy9CLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDWCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxLQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFlO1FBQ3ZCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxLQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlRXZlbnRJbmZvRnJvbVBhcmFtZXRlcnMsIEV2ZW50SW5mb30gZnJvbSAnLi9ldmVudF9pbmZvJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfZWpzYT86IEVhcmx5SnNhY3Rpb25EYXRhO1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZWFybHkganNhY3Rpb24gZGF0YSB0eXBlcy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVhcmx5SnNhY3Rpb25EYXRhIHtcbiAgLy8gTGlzdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGVhcmx5IEpTQWN0aW9uIGV2ZW50IHR5cGVzLlxuICBldDogc3RyaW5nW107XG5cbiAgLy8gTGlzdCB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIEpTQWN0aW9uIGV2ZW50cyBpZiB1c2luZyBlYXJseWV2ZW50Y29udHJhY3QuXG4gIHE6IEV2ZW50SW5mb1tdO1xuXG4gIC8vIEVhcmx5IEpzYWN0aW9uIGhhbmRsZXJcbiAgaDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBFYXJseUV2ZW50Q29udHJhY3QgaW50ZXJjZXB0cyBldmVudHMgaW4gdGhlIGJ1YmJsaW5nIHBoYXNlIGF0IHRoZVxuICogYm91bmRhcnkgb2YgdGhlIGRvY3VtZW50IGJvZHkuIFRoaXMgbWFwcGluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIGxhdGUtbG9hZGVkIEV2ZW50Q29udHJhY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBFYXJseUV2ZW50Q29udHJhY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB3aW5kb3cuX2Vqc2EgPSB7XG4gICAgICBxOiBbXSxcbiAgICAgIGV0OiBbXSxcbiAgICAgIGg6IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnRJbmZvID0gY3JlYXRlRXZlbnRJbmZvRnJvbVBhcmFtZXRlcnMoXG4gICAgICAgICAgZXZlbnQudHlwZSxcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBldmVudC50YXJnZXQgYXMgRWxlbWVudCxcbiAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgICAgIERhdGUubm93KCksXG4gICAgICAgICk7XG4gICAgICAgIHdpbmRvdy5fZWpzYSEucS5wdXNoKGV2ZW50SW5mbyk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgYSBsaXN0IG9mIGV2ZW50IHR5cGVzIGZvciB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LlxuICAgKi9cbiAgYWRkRXZlbnRzKHR5cGVzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHR5cGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICB3aW5kb3cuX2Vqc2EhLmV0LnB1c2goZXZlbnRUeXBlKTtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIHdpbmRvdy5fZWpzYSEuaCk7XG4gICAgfVxuICB9XG59XG4iXX0=