@lwc/synthetic-shadow 2.45.2 → 2.45.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. package/dist/3rdparty/polymer/inner-html.d.ts +10 -0
  2. package/dist/3rdparty/polymer/outer-html.d.ts +10 -0
  3. package/dist/3rdparty/polymer/path-composer.d.ts +1 -0
  4. package/dist/3rdparty/polymer/retarget.d.ts +10 -0
  5. package/dist/3rdparty/polymer/text-content.d.ts +10 -0
  6. package/dist/env/document.d.ts +24 -0
  7. package/dist/env/dom.d.ts +5 -0
  8. package/dist/env/element.d.ts +45 -0
  9. package/dist/env/event-target.d.ts +3 -0
  10. package/dist/env/mutation-observer.d.ts +6 -0
  11. package/dist/env/node.d.ts +35 -0
  12. package/dist/env/shadow-root.d.ts +2 -0
  13. package/dist/env/slot.d.ts +2 -0
  14. package/dist/env/text.d.ts +1 -0
  15. package/dist/env/window.d.ts +8 -0
  16. package/dist/faux-shadow/element.d.ts +1 -0
  17. package/dist/faux-shadow/events.d.ts +16 -0
  18. package/dist/faux-shadow/focus.d.ts +9 -0
  19. package/dist/faux-shadow/html-element.d.ts +1 -0
  20. package/dist/faux-shadow/no-patch-utils.d.ts +5 -0
  21. package/dist/faux-shadow/node.d.ts +15 -0
  22. package/dist/faux-shadow/portal.d.ts +1 -0
  23. package/dist/faux-shadow/shadow-root.d.ts +22 -0
  24. package/dist/faux-shadow/shadow-token.d.ts +2 -0
  25. package/dist/faux-shadow/slot.d.ts +1 -0
  26. package/dist/faux-shadow/text.d.ts +1 -0
  27. package/dist/faux-shadow/traverse.d.ts +13 -0
  28. package/dist/index.cjs.js +4759 -0
  29. package/dist/index.cjs.js.map +1 -0
  30. package/dist/index.d.ts +30 -0
  31. package/dist/index.js +4757 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/polyfills/HTMLSlotElement/detect.d.ts +1 -0
  34. package/dist/polyfills/HTMLSlotElement/main.d.ts +1 -0
  35. package/dist/polyfills/HTMLSlotElement/polyfill.d.ts +1 -0
  36. package/dist/polyfills/click-event-composed/detect.d.ts +1 -0
  37. package/dist/polyfills/click-event-composed/main.d.ts +1 -0
  38. package/dist/polyfills/click-event-composed/polyfill.d.ts +1 -0
  39. package/dist/polyfills/clipboard-event-composed/main.d.ts +1 -0
  40. package/dist/polyfills/custom-event-composed/main.d.ts +1 -0
  41. package/dist/polyfills/custom-event-composed/polyfill.d.ts +8 -0
  42. package/dist/polyfills/document-shadow/main.d.ts +1 -0
  43. package/dist/polyfills/document-shadow/polyfill.d.ts +1 -0
  44. package/dist/polyfills/event/main.d.ts +1 -0
  45. package/dist/polyfills/event/polyfill.d.ts +1 -0
  46. package/dist/polyfills/event-composed/detect.d.ts +1 -0
  47. package/dist/polyfills/event-composed/main.d.ts +1 -0
  48. package/dist/polyfills/event-composed/polyfill.d.ts +1 -0
  49. package/dist/polyfills/event-target/main.d.ts +1 -0
  50. package/dist/polyfills/event-target/polyfill.d.ts +1 -0
  51. package/dist/polyfills/focus-event/main.d.ts +1 -0
  52. package/dist/polyfills/focus-event/polyfill.d.ts +1 -0
  53. package/dist/polyfills/iframe-content-window/detect.d.ts +1 -0
  54. package/dist/polyfills/iframe-content-window/main.d.ts +1 -0
  55. package/dist/polyfills/iframe-content-window/patch.d.ts +1 -0
  56. package/dist/polyfills/mouse-event/main.d.ts +1 -0
  57. package/dist/polyfills/mouse-event/polyfill.d.ts +1 -0
  58. package/dist/polyfills/mutation-observer/main.d.ts +1 -0
  59. package/dist/polyfills/mutation-observer/polyfill.d.ts +1 -0
  60. package/dist/polyfills/shadow-root/main.d.ts +1 -0
  61. package/dist/polyfills/shadow-root/polyfill.d.ts +1 -0
  62. package/dist/polyfills/window-event-target/detect.d.ts +1 -0
  63. package/dist/polyfills/window-event-target/main.d.ts +1 -0
  64. package/dist/polyfills/window-event-target/polyfill.d.ts +1 -0
  65. package/dist/shared/event-target.d.ts +2 -0
  66. package/dist/shared/faux-element-from-point.d.ts +1 -0
  67. package/dist/shared/faux-elements-from-point.d.ts +1 -0
  68. package/dist/shared/node-ownership.d.ts +11 -0
  69. package/dist/shared/retarget-related-target.d.ts +1 -0
  70. package/dist/shared/static-html-collection.d.ts +1 -0
  71. package/dist/shared/static-node-list.d.ts +1 -0
  72. package/dist/shared/utils.d.ts +9 -0
  73. package/dist/synthetic-shadow.js +74 -12
  74. package/package.json +33 -25
  75. package/dist/synthetic-shadow.js.map +0 -1
  76. package/index.js +0 -8
package/dist/index.js ADDED
@@ -0,0 +1,4757 @@
1
+ /* proxy-compat-disable */
2
+ /**
3
+ * Copyright (C) 2023 salesforce.com, inc.
4
+ */
5
+ /* proxy-compat-disable */
6
+ /**
7
+ * Copyright (C) 2023 salesforce.com, inc.
8
+ */
9
+ /*
10
+ * Copyright (c) 2018, salesforce.com, inc.
11
+ * All rights reserved.
12
+ * SPDX-License-Identifier: MIT
13
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
14
+ */
15
+ function invariant(value, msg) {
16
+ if (!value) {
17
+ throw new Error(`Invariant Violation: ${msg}`);
18
+ }
19
+ }
20
+ function isTrue$1(value, msg) {
21
+ if (!value) {
22
+ throw new Error(`Assert Violation: ${msg}`);
23
+ }
24
+ }
25
+ function isFalse$1(value, msg) {
26
+ if (value) {
27
+ throw new Error(`Assert Violation: ${msg}`);
28
+ }
29
+ }
30
+ function fail(msg) {
31
+ throw new Error(msg);
32
+ }
33
+
34
+ var assert = /*#__PURE__*/Object.freeze({
35
+ __proto__: null,
36
+ fail: fail,
37
+ invariant: invariant,
38
+ isFalse: isFalse$1,
39
+ isTrue: isTrue$1
40
+ });
41
+
42
+ /*
43
+ * Copyright (c) 2018, salesforce.com, inc.
44
+ * All rights reserved.
45
+ * SPDX-License-Identifier: MIT
46
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
47
+ */
48
+ const { assign, create, defineProperties, defineProperty, freeze, getOwnPropertyDescriptor, getOwnPropertyNames, getPrototypeOf, hasOwnProperty, isFrozen, keys, seal, setPrototypeOf, } = Object;
49
+ const { isArray } = Array;
50
+ const { concat: ArrayConcat, copyWithin: ArrayCopyWithin, every: ArrayEvery, fill: ArrayFill, filter: ArrayFilter, find: ArrayFind, findIndex: ArrayFindIndex, includes: ArrayIncludes, indexOf: ArrayIndexOf, join: ArrayJoin, map: ArrayMap, pop: ArrayPop, push: ArrayPush, reduce: ArrayReduce, reverse: ArrayReverse, shift: ArrayShift, slice: ArraySlice, some: ArraySome, sort: ArraySort, splice: ArraySplice, unshift: ArrayUnshift, forEach, } = Array.prototype;
51
+ const { charCodeAt: StringCharCodeAt, replace: StringReplace, split: StringSplit, slice: StringSlice, toLowerCase: StringToLowerCase, } = String.prototype;
52
+ function isUndefined(obj) {
53
+ return obj === undefined;
54
+ }
55
+ function isNull(obj) {
56
+ return obj === null;
57
+ }
58
+ function isTrue(obj) {
59
+ return obj === true;
60
+ }
61
+ function isFalse(obj) {
62
+ return obj === false;
63
+ }
64
+ function isFunction(obj) {
65
+ return typeof obj === 'function';
66
+ }
67
+ function isObject(obj) {
68
+ return typeof obj === 'object';
69
+ }
70
+ const OtS = {}.toString;
71
+ function toString(obj) {
72
+ if (obj && obj.toString) {
73
+ // Arrays might hold objects with "null" prototype So using
74
+ // Array.prototype.toString directly will cause an error Iterate through
75
+ // all the items and handle individually.
76
+ if (isArray(obj)) {
77
+ return ArrayJoin.call(ArrayMap.call(obj, toString), ',');
78
+ }
79
+ return obj.toString();
80
+ }
81
+ else if (typeof obj === 'object') {
82
+ return OtS.call(obj);
83
+ }
84
+ else {
85
+ return obj + '';
86
+ }
87
+ }
88
+
89
+ /*
90
+ * Copyright (c) 2018, salesforce.com, inc.
91
+ * All rights reserved.
92
+ * SPDX-License-Identifier: MIT
93
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
94
+ */
95
+ // See browser support for globalThis:
96
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis#browser_compatibility
97
+ /* istanbul ignore next */
98
+ // @ts-ignore
99
+ const _globalThis = typeof globalThis === 'object' ? globalThis : window;
100
+
101
+ /*
102
+ * Copyright (c) 2018, salesforce.com, inc.
103
+ * All rights reserved.
104
+ * SPDX-License-Identifier: MIT
105
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
106
+ */
107
+ const KEY__IS_NATIVE_SHADOW_ROOT_DEFINED = '$isNativeShadowRootDefined$';
108
+ const KEY__SHADOW_RESOLVER = '$shadowResolver$';
109
+ const KEY__SHADOW_RESOLVER_PRIVATE = '$$ShadowResolverKey$$';
110
+ const KEY__SHADOW_STATIC = '$shadowStaticNode$';
111
+ const KEY__SHADOW_STATIC_PRIVATE = '$shadowStaticNodeKey$';
112
+ const KEY__SHADOW_TOKEN = '$shadowToken$';
113
+ const KEY__SHADOW_TOKEN_PRIVATE = '$$ShadowTokenKey$$';
114
+ const KEY__SYNTHETIC_MODE = '$$lwc-synthetic-mode';
115
+ const KEY__NATIVE_GET_ELEMENT_BY_ID = '$nativeGetElementById$';
116
+ const KEY__NATIVE_QUERY_SELECTOR_ALL = '$nativeQuerySelectorAll$';
117
+
118
+ /*
119
+ * Copyright (c) 2018, salesforce.com, inc.
120
+ * All rights reserved.
121
+ * SPDX-License-Identifier: MIT
122
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
123
+ */
124
+ // We use this to detect symbol support in order to avoid the expensive symbol polyfill. Note that
125
+ // we can't use typeof since it will fail when transpiling.
126
+ const hasNativeSymbolSupport = /*@__PURE__*/ (() => Symbol('x').toString() === 'Symbol(x)')();
127
+ /** version: 2.45.4 */
128
+
129
+ /* proxy-compat-disable */
130
+ /**
131
+ * Copyright (C) 2023 salesforce.com, inc.
132
+ */
133
+ // eslint-disable-next-line no-restricted-properties
134
+ if (!_globalThis.lwcRuntimeFlags) {
135
+ Object.defineProperty(_globalThis, 'lwcRuntimeFlags', { value: create(null) });
136
+ }
137
+ /** version: 2.45.4 */
138
+
139
+ /*
140
+ * Copyright (c) 2018, salesforce.com, inc.
141
+ * All rights reserved.
142
+ * SPDX-License-Identifier: MIT
143
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
144
+ */
145
+ // TODO [#2472]: Remove this workaround when appropriate.
146
+ // eslint-disable-next-line @lwc/lwc-internal/no-global-node
147
+ const _Node = Node;
148
+ const nodePrototype = _Node.prototype;
149
+ const { DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, ELEMENT_NODE, TEXT_NODE, CDATA_SECTION_NODE, PROCESSING_INSTRUCTION_NODE, COMMENT_NODE, DOCUMENT_FRAGMENT_NODE, } = _Node;
150
+ const { appendChild, cloneNode, compareDocumentPosition, insertBefore, removeChild, replaceChild, hasChildNodes, } = nodePrototype;
151
+ const { contains } = HTMLElement.prototype;
152
+ const firstChildGetter = getOwnPropertyDescriptor(nodePrototype, 'firstChild').get;
153
+ const lastChildGetter = getOwnPropertyDescriptor(nodePrototype, 'lastChild').get;
154
+ const textContentGetter = getOwnPropertyDescriptor(nodePrototype, 'textContent').get;
155
+ const parentNodeGetter = getOwnPropertyDescriptor(nodePrototype, 'parentNode').get;
156
+ const ownerDocumentGetter = getOwnPropertyDescriptor(nodePrototype, 'ownerDocument').get;
157
+ const parentElementGetter = hasOwnProperty.call(nodePrototype, 'parentElement')
158
+ ? getOwnPropertyDescriptor(nodePrototype, 'parentElement').get
159
+ : getOwnPropertyDescriptor(HTMLElement.prototype, 'parentElement').get; // IE11
160
+ const textContextSetter = getOwnPropertyDescriptor(nodePrototype, 'textContent').set;
161
+ const childNodesGetter = hasOwnProperty.call(nodePrototype, 'childNodes')
162
+ ? getOwnPropertyDescriptor(nodePrototype, 'childNodes').get
163
+ : getOwnPropertyDescriptor(HTMLElement.prototype, 'childNodes').get; // IE11
164
+ const isConnected = hasOwnProperty.call(nodePrototype, 'isConnected')
165
+ ? getOwnPropertyDescriptor(nodePrototype, 'isConnected').get
166
+ : function () {
167
+ const doc = ownerDocumentGetter.call(this);
168
+ // IE11
169
+ return (
170
+ // if doc is null, it means `this` is actually a document instance which
171
+ // is always connected
172
+ doc === null ||
173
+ (compareDocumentPosition.call(doc, this) & DOCUMENT_POSITION_CONTAINED_BY) !== 0);
174
+ };
175
+
176
+ /*
177
+ * Copyright (c) 2018, salesforce.com, inc.
178
+ * All rights reserved.
179
+ * SPDX-License-Identifier: MIT
180
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
181
+ */
182
+ const { getAttribute, getBoundingClientRect, getElementsByTagName: getElementsByTagName$1, getElementsByTagNameNS: getElementsByTagNameNS$1, hasAttribute, querySelector, querySelectorAll: querySelectorAll$1, removeAttribute, setAttribute, } = Element.prototype;
183
+ const attachShadow$1 = hasOwnProperty.call(Element.prototype, 'attachShadow')
184
+ ? Element.prototype.attachShadow
185
+ : () => {
186
+ throw new TypeError('attachShadow() is not supported in current browser. Load the @lwc/synthetic-shadow polyfill and use Lightning Web Components');
187
+ };
188
+ const childElementCountGetter = getOwnPropertyDescriptor(Element.prototype, 'childElementCount').get;
189
+ const firstElementChildGetter = getOwnPropertyDescriptor(Element.prototype, 'firstElementChild').get;
190
+ const lastElementChildGetter = getOwnPropertyDescriptor(Element.prototype, 'lastElementChild').get;
191
+ const innerTextDescriptor = getOwnPropertyDescriptor(HTMLElement.prototype, 'innerText');
192
+ const innerTextGetter = innerTextDescriptor
193
+ ? innerTextDescriptor.get
194
+ : null;
195
+ const innerTextSetter = innerTextDescriptor
196
+ ? innerTextDescriptor.set
197
+ : null;
198
+ // Note: Firefox does not have outerText, https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/outerText
199
+ const outerTextDescriptor = getOwnPropertyDescriptor(HTMLElement.prototype, 'outerText');
200
+ const outerTextGetter = outerTextDescriptor
201
+ ? outerTextDescriptor.get
202
+ : null;
203
+ const outerTextSetter = outerTextDescriptor
204
+ ? outerTextDescriptor.set
205
+ : null;
206
+ const innerHTMLDescriptor = hasOwnProperty.call(Element.prototype, 'innerHTML')
207
+ ? getOwnPropertyDescriptor(Element.prototype, 'innerHTML')
208
+ : getOwnPropertyDescriptor(HTMLElement.prototype, 'innerHTML'); // IE11
209
+ const innerHTMLGetter = innerHTMLDescriptor.get;
210
+ const innerHTMLSetter = innerHTMLDescriptor.set;
211
+ const outerHTMLDescriptor = hasOwnProperty.call(Element.prototype, 'outerHTML')
212
+ ? getOwnPropertyDescriptor(Element.prototype, 'outerHTML')
213
+ : getOwnPropertyDescriptor(HTMLElement.prototype, 'outerHTML'); // IE11
214
+ const outerHTMLGetter = outerHTMLDescriptor.get;
215
+ const outerHTMLSetter = outerHTMLDescriptor.set;
216
+ const tagNameGetter = getOwnPropertyDescriptor(Element.prototype, 'tagName').get;
217
+ const tabIndexDescriptor = getOwnPropertyDescriptor(HTMLElement.prototype, 'tabIndex');
218
+ const tabIndexGetter = tabIndexDescriptor.get;
219
+ const tabIndexSetter = tabIndexDescriptor.set;
220
+ const matches = hasOwnProperty.call(Element.prototype, 'matches')
221
+ ? Element.prototype.matches
222
+ : Element.prototype.msMatchesSelector; // IE11
223
+ const childrenGetter = hasOwnProperty.call(Element.prototype, 'children')
224
+ ? getOwnPropertyDescriptor(Element.prototype, 'children').get
225
+ : getOwnPropertyDescriptor(HTMLElement.prototype, 'children').get; // IE11
226
+ // for IE11, access from HTMLElement
227
+ // for all other browsers access the method from the parent Element interface
228
+ const { getElementsByClassName: getElementsByClassName$1 } = HTMLElement.prototype;
229
+ const shadowRootGetter = hasOwnProperty.call(Element.prototype, 'shadowRoot')
230
+ ? getOwnPropertyDescriptor(Element.prototype, 'shadowRoot').get
231
+ : () => null;
232
+ const assignedSlotGetter$1 = hasOwnProperty.call(Element.prototype, 'assignedSlot')
233
+ ? getOwnPropertyDescriptor(Element.prototype, 'assignedSlot').get
234
+ : () => null;
235
+
236
+ /*
237
+ * Copyright (c) 2018, salesforce.com, inc.
238
+ * All rights reserved.
239
+ * SPDX-License-Identifier: MIT
240
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
241
+ */
242
+ let assignedNodes, assignedElements;
243
+ if (typeof HTMLSlotElement !== 'undefined') {
244
+ assignedNodes = HTMLSlotElement.prototype.assignedNodes;
245
+ assignedElements = HTMLSlotElement.prototype.assignedElements;
246
+ }
247
+ else {
248
+ assignedNodes = () => {
249
+ throw new TypeError("assignedNodes() is not supported in current browser. Load the @lwc/synthetic-shadow polyfill to start using <slot> elements in your Lightning Web Component's template");
250
+ };
251
+ assignedElements = () => {
252
+ throw new TypeError("assignedElements() is not supported in current browser. Load the @lwc/synthetic-shadow polyfill to start using <slot> elements in your Lightning Web Component's template");
253
+ };
254
+ }
255
+
256
+ /*
257
+ * Copyright (c) 2018, salesforce.com, inc.
258
+ * All rights reserved.
259
+ * SPDX-License-Identifier: MIT
260
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
261
+ */
262
+ const eventTargetGetter = getOwnPropertyDescriptor(Event.prototype, 'target').get;
263
+ const eventCurrentTargetGetter = getOwnPropertyDescriptor(Event.prototype, 'currentTarget').get;
264
+ const focusEventRelatedTargetGetter = getOwnPropertyDescriptor(FocusEvent.prototype, 'relatedTarget').get;
265
+ // IE does not implement composedPath() but that's ok because we only use this instead of our
266
+ // composedPath() polyfill when dealing with native shadow DOM components in mixed mode. Defaulting
267
+ // to a NOOP just to be safe, even though this is almost guaranteed to be defined such a scenario.
268
+ const composedPath = hasOwnProperty.call(Event.prototype, 'composedPath')
269
+ ? Event.prototype.composedPath
270
+ : () => [];
271
+
272
+ /*
273
+ * Copyright (c) 2018, salesforce.com, inc.
274
+ * All rights reserved.
275
+ * SPDX-License-Identifier: MIT
276
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
277
+ */
278
+ const DocumentPrototypeActiveElement = getOwnPropertyDescriptor(Document.prototype, 'activeElement').get;
279
+ const elementFromPoint = hasOwnProperty.call(Document.prototype, 'elementFromPoint')
280
+ ? Document.prototype.elementFromPoint
281
+ : Document.prototype.msElementFromPoint; // IE11
282
+ const elementsFromPoint = hasOwnProperty.call(Document.prototype, 'elementsFromPoint')
283
+ ? Document.prototype.elementsFromPoint
284
+ : Document.prototype.msElementsFromPoint; // IE11
285
+ // defaultView can be null when a document has no browsing context. For example, the owner document
286
+ // of a node in a template doesn't have a default view: https://jsfiddle.net/hv9z0q5a/
287
+ const defaultViewGetter = getOwnPropertyDescriptor(Document.prototype, 'defaultView').get;
288
+ const { createComment, querySelectorAll, getElementById, getElementsByClassName, getElementsByTagName, getElementsByTagNameNS, } = Document.prototype;
289
+ // In Firefox v57 and lower, getElementsByName is defined on HTMLDocument.prototype
290
+ // In all other browsers have the method on Document.prototype
291
+ const { getElementsByName } = HTMLDocument.prototype;
292
+
293
+ /*
294
+ * Copyright (c) 2018, salesforce.com, inc.
295
+ * All rights reserved.
296
+ * SPDX-License-Identifier: MIT
297
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
298
+ */
299
+ const { addEventListener: windowAddEventListener, removeEventListener: windowRemoveEventListener, getComputedStyle: windowGetComputedStyle, getSelection: windowGetSelection, } = window;
300
+
301
+ /*
302
+ * Copyright (c) 2018, salesforce.com, inc.
303
+ * All rights reserved.
304
+ * SPDX-License-Identifier: MIT
305
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
306
+ */
307
+ // There is code in the polyfills that requires access to the unpatched
308
+ // Mutation Observer constructor, this the code for that.
309
+ // Eventually, the polyfill should uses the patched version, and this file can be removed.
310
+ const MO = MutationObserver;
311
+ const MutationObserverObserve = MO.prototype.observe;
312
+
313
+ /*
314
+ * Copyright (c) 2018, salesforce.com, inc.
315
+ * All rights reserved.
316
+ * SPDX-License-Identifier: MIT
317
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
318
+ */
319
+ let NativeShadowRoot = null;
320
+ if (typeof ShadowRoot !== 'undefined') {
321
+ NativeShadowRoot = ShadowRoot;
322
+ }
323
+ const isNativeShadowRootDefined = !isNull(NativeShadowRoot);
324
+ const isInstanceOfNativeShadowRoot = isNull(NativeShadowRoot)
325
+ ? () => false
326
+ : (node) => node instanceof NativeShadowRoot;
327
+
328
+ /*
329
+ * Copyright (c) 2018, salesforce.com, inc.
330
+ * All rights reserved.
331
+ * SPDX-License-Identifier: MIT
332
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
333
+ */
334
+ function detect$4 () {
335
+ return typeof HTMLSlotElement === 'undefined';
336
+ }
337
+
338
+ /*
339
+ * Copyright (c) 2018, salesforce.com, inc.
340
+ * All rights reserved.
341
+ * SPDX-License-Identifier: MIT
342
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
343
+ */
344
+ const { createElement } = Document.prototype;
345
+ const CHAR_S = 115;
346
+ const CHAR_L = 108;
347
+ const CHAR_O = 111;
348
+ const CHAR_T = 116;
349
+ function apply$4() {
350
+ // IE11 does not have this element definition
351
+ // we don't care much about the construction phase, just the prototype
352
+ class HTMLSlotElement {
353
+ }
354
+ // prototype inheritance dance
355
+ setPrototypeOf(HTMLSlotElement, HTMLElement.constructor);
356
+ setPrototypeOf(HTMLSlotElement.prototype, HTMLElement.prototype);
357
+ Window.prototype.HTMLSlotElement = HTMLSlotElement;
358
+ // IE11 doesn't have HTMLSlotElement, in which case we
359
+ // need to patch Document.prototype.createElement to remap `slot`
360
+ // elements to the right prototype
361
+ defineProperty(Document.prototype, 'createElement', {
362
+ value: function (tagName, _options) {
363
+ const elm = createElement.apply(this, ArraySlice.call(arguments));
364
+ if (tagName.length === 4 &&
365
+ StringCharCodeAt.call(tagName, 0) === CHAR_S &&
366
+ StringCharCodeAt.call(tagName, 1) === CHAR_L &&
367
+ StringCharCodeAt.call(tagName, 2) === CHAR_O &&
368
+ StringCharCodeAt.call(tagName, 3) === CHAR_T) {
369
+ // the new element is the `slot`, resetting the proto chain
370
+ // the new newly created global HTMLSlotElement.prototype
371
+ setPrototypeOf(elm, HTMLSlotElement.prototype);
372
+ }
373
+ return elm;
374
+ },
375
+ });
376
+ }
377
+
378
+ /*
379
+ * Copyright (c) 2018, salesforce.com, inc.
380
+ * All rights reserved.
381
+ * SPDX-License-Identifier: MIT
382
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
383
+ */
384
+ if (detect$4()) {
385
+ apply$4();
386
+ }
387
+
388
+ /*
389
+ * Copyright (c) 2018, salesforce.com, inc.
390
+ * All rights reserved.
391
+ * SPDX-License-Identifier: MIT
392
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
393
+ */
394
+ // Helpful for tests running with jsdom
395
+ function getOwnerDocument(node) {
396
+ const doc = ownerDocumentGetter.call(node);
397
+ // if doc is null, it means `this` is actually a document instance
398
+ return doc === null ? node : doc;
399
+ }
400
+ function getOwnerWindow(node) {
401
+ const doc = getOwnerDocument(node);
402
+ const win = defaultViewGetter.call(doc);
403
+ if (win === null) {
404
+ // this method should never be called with a node that is not part
405
+ // of a qualifying connected node.
406
+ throw new TypeError();
407
+ }
408
+ return win;
409
+ }
410
+ let skipGlobalPatching;
411
+ // Note: we deviate from native shadow here, but are not fixing
412
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
413
+ function isGlobalPatchingSkipped(node) {
414
+ // we lazily compute this value instead of doing it during evaluation, this helps
415
+ // for apps that are setting this after the engine code is evaluated.
416
+ if (isUndefined(skipGlobalPatching)) {
417
+ const ownerDocument = getOwnerDocument(node);
418
+ skipGlobalPatching =
419
+ ownerDocument.body &&
420
+ getAttribute.call(ownerDocument.body, 'data-global-patching-bypass') ===
421
+ 'temporary-bypass';
422
+ }
423
+ return isTrue(skipGlobalPatching);
424
+ }
425
+ function arrayFromCollection(collection) {
426
+ const size = collection.length;
427
+ const cloned = [];
428
+ if (size > 0) {
429
+ for (let i = 0; i < size; i++) {
430
+ cloned[i] = collection[i];
431
+ }
432
+ }
433
+ return cloned;
434
+ }
435
+
436
+ /*
437
+ * Copyright (c) 2018, salesforce.com, inc.
438
+ * All rights reserved.
439
+ * SPDX-License-Identifier: MIT
440
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
441
+ */
442
+ const eventTargetPrototype = typeof EventTarget !== 'undefined' ? EventTarget.prototype : _Node.prototype;
443
+ const { addEventListener, dispatchEvent, removeEventListener } = eventTargetPrototype;
444
+
445
+ /*
446
+ * Copyright (c) 2018, salesforce.com, inc.
447
+ * All rights reserved.
448
+ * SPDX-License-Identifier: MIT
449
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
450
+ */
451
+ // Used as a back reference to identify the host element
452
+ const HostElementKey = '$$HostElementKey$$';
453
+ const ShadowedNodeKey = '$$ShadowedNodeKey$$';
454
+ function fastDefineProperty(node, propName, config) {
455
+ const shadowedNode = node;
456
+ if (process.env.NODE_ENV !== 'production') {
457
+ // in dev, we are more restrictive
458
+ defineProperty(shadowedNode, propName, config);
459
+ }
460
+ else {
461
+ const { value } = config;
462
+ // in prod, we prioritize performance
463
+ shadowedNode[propName] = value;
464
+ }
465
+ }
466
+ function setNodeOwnerKey(node, value) {
467
+ fastDefineProperty(node, HostElementKey, { value, configurable: true });
468
+ }
469
+ function setNodeKey(node, value) {
470
+ fastDefineProperty(node, ShadowedNodeKey, { value });
471
+ }
472
+ function getNodeOwnerKey(node) {
473
+ return node[HostElementKey];
474
+ }
475
+ function getNodeNearestOwnerKey(node) {
476
+ let host = node;
477
+ let hostKey;
478
+ // search for the first element with owner identity
479
+ // in case of manually inserted elements and elements slotted from Light DOM
480
+ while (!isNull(host)) {
481
+ hostKey = getNodeOwnerKey(host);
482
+ if (!isUndefined(hostKey)) {
483
+ return hostKey;
484
+ }
485
+ host = parentNodeGetter.call(host);
486
+ if (!isNull(host) && isSyntheticSlotElement(host)) {
487
+ return undefined;
488
+ }
489
+ }
490
+ }
491
+ function getNodeKey(node) {
492
+ return node[ShadowedNodeKey];
493
+ }
494
+ /**
495
+ * This function does not traverse up for performance reasons, but is sufficient for most use
496
+ * cases. If we need to traverse up and verify those nodes that don't have owner key, use
497
+ * isNodeDeepShadowed instead.
498
+ */
499
+ function isNodeShadowed(node) {
500
+ return !isUndefined(getNodeOwnerKey(node));
501
+ }
502
+
503
+ /*
504
+ * Copyright (c) 2018, salesforce.com, inc.
505
+ * All rights reserved.
506
+ * SPDX-License-Identifier: MIT
507
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
508
+ */
509
+ // when finding a slot in the DOM, we can fold it if it is contained
510
+ // inside another slot.
511
+ function foldSlotElement(slot) {
512
+ let parent = parentElementGetter.call(slot);
513
+ while (!isNull(parent) && isSlotElement(parent)) {
514
+ slot = parent;
515
+ parent = parentElementGetter.call(slot);
516
+ }
517
+ return slot;
518
+ }
519
+ function isNodeSlotted(host, node) {
520
+ if (process.env.NODE_ENV !== 'production') {
521
+ if (!(host instanceof HTMLElement)) {
522
+ // eslint-disable-next-line no-console
523
+ console.error(`isNodeSlotted() should be called with a host as the first argument`);
524
+ }
525
+ if (!(node instanceof _Node)) {
526
+ // eslint-disable-next-line no-console
527
+ console.error(`isNodeSlotted() should be called with a node as the second argument`);
528
+ }
529
+ if (!(compareDocumentPosition.call(node, host) & DOCUMENT_POSITION_CONTAINS)) {
530
+ // eslint-disable-next-line no-console
531
+ console.error(`isNodeSlotted() should never be called with a node that is not a child node of the given host`);
532
+ }
533
+ }
534
+ const hostKey = getNodeKey(host);
535
+ // this routine assumes that the node is coming from a different shadow (it is not owned by the host)
536
+ // just in case the provided node is not an element
537
+ let currentElement = node instanceof Element ? node : parentElementGetter.call(node);
538
+ while (!isNull(currentElement) && currentElement !== host) {
539
+ const elmOwnerKey = getNodeNearestOwnerKey(currentElement);
540
+ const parent = parentElementGetter.call(currentElement);
541
+ if (elmOwnerKey === hostKey) {
542
+ // we have reached an element inside the host's template, and only if
543
+ // that element is an slot, then the node is considered slotted
544
+ return isSlotElement(currentElement);
545
+ }
546
+ else if (parent === host) {
547
+ return false;
548
+ }
549
+ else if (!isNull(parent) && getNodeNearestOwnerKey(parent) !== elmOwnerKey) {
550
+ // we are crossing a boundary of some sort since the elm and its parent
551
+ // have different owner key. for slotted elements, this is possible
552
+ // if the parent happens to be a slot.
553
+ if (isSlotElement(parent)) {
554
+ /**
555
+ * the slot parent might be allocated inside another slot, think of:
556
+ * <x-root> (<--- root element)
557
+ * <x-parent> (<--- own by x-root)
558
+ * <x-child> (<--- own by x-root)
559
+ * <slot> (<--- own by x-child)
560
+ * <slot> (<--- own by x-parent)
561
+ * <div> (<--- own by x-root)
562
+ *
563
+ * while checking if x-parent has the div slotted, we need to traverse
564
+ * up, but when finding the first slot, we skip that one in favor of the
565
+ * most outer slot parent before jumping into its corresponding host.
566
+ */
567
+ currentElement = getNodeOwner(foldSlotElement(parent));
568
+ if (!isNull(currentElement)) {
569
+ if (currentElement === host) {
570
+ // the slot element is a top level element inside the shadow
571
+ // of a host that was allocated into host in question
572
+ return true;
573
+ }
574
+ else if (getNodeNearestOwnerKey(currentElement) === hostKey) {
575
+ // the slot element is an element inside the shadow
576
+ // of a host that was allocated into host in question
577
+ return true;
578
+ }
579
+ }
580
+ }
581
+ else {
582
+ return false;
583
+ }
584
+ }
585
+ else {
586
+ currentElement = parent;
587
+ }
588
+ }
589
+ return false;
590
+ }
591
+ function getNodeOwner(node) {
592
+ if (!(node instanceof _Node)) {
593
+ return null;
594
+ }
595
+ const ownerKey = getNodeNearestOwnerKey(node);
596
+ if (isUndefined(ownerKey)) {
597
+ return null;
598
+ }
599
+ let nodeOwner = node;
600
+ // At this point, node is a valid node with owner identity, now we need to find the owner node
601
+ // search for a custom element with a VM that owns the first element with owner identity attached to it
602
+ while (!isNull(nodeOwner) && getNodeKey(nodeOwner) !== ownerKey) {
603
+ nodeOwner = parentNodeGetter.call(nodeOwner);
604
+ }
605
+ if (isNull(nodeOwner)) {
606
+ return null;
607
+ }
608
+ return nodeOwner;
609
+ }
610
+ function isSyntheticSlotElement(node) {
611
+ return isSlotElement(node) && isNodeShadowed(node);
612
+ }
613
+ function isSlotElement(node) {
614
+ return node instanceof HTMLSlotElement;
615
+ }
616
+ function isNodeOwnedBy(owner, node) {
617
+ if (process.env.NODE_ENV !== 'production') {
618
+ if (!(owner instanceof HTMLElement)) {
619
+ // eslint-disable-next-line no-console
620
+ console.error(`isNodeOwnedBy() should be called with an element as the first argument`);
621
+ }
622
+ if (!(node instanceof _Node)) {
623
+ // eslint-disable-next-line no-console
624
+ console.error(`isNodeOwnedBy() should be called with a node as the second argument`);
625
+ }
626
+ if (!(compareDocumentPosition.call(node, owner) & DOCUMENT_POSITION_CONTAINS)) {
627
+ // eslint-disable-next-line no-console
628
+ console.error(`isNodeOwnedBy() should never be called with a node that is not a child node of of the given owner`);
629
+ }
630
+ }
631
+ const ownerKey = getNodeNearestOwnerKey(node);
632
+ if (isUndefined(ownerKey)) {
633
+ // in case of root level light DOM element slotting into a synthetic shadow
634
+ const host = parentNodeGetter.call(node);
635
+ if (!isNull(host) && isSyntheticSlotElement(host)) {
636
+ return false;
637
+ }
638
+ // in case of manually inserted elements
639
+ return true;
640
+ }
641
+ return getNodeKey(owner) === ownerKey;
642
+ }
643
+ function shadowRootChildNodes(root) {
644
+ const elm = getHost(root);
645
+ return getAllMatches(elm, arrayFromCollection(childNodesGetter.call(elm)));
646
+ }
647
+ function getAllSlottedMatches(host, nodeList) {
648
+ const filteredAndPatched = [];
649
+ for (let i = 0, len = nodeList.length; i < len; i += 1) {
650
+ const node = nodeList[i];
651
+ if (!isNodeOwnedBy(host, node) && isNodeSlotted(host, node)) {
652
+ ArrayPush.call(filteredAndPatched, node);
653
+ }
654
+ }
655
+ return filteredAndPatched;
656
+ }
657
+ function getFirstSlottedMatch(host, nodeList) {
658
+ for (let i = 0, len = nodeList.length; i < len; i += 1) {
659
+ const node = nodeList[i];
660
+ if (!isNodeOwnedBy(host, node) && isNodeSlotted(host, node)) {
661
+ return node;
662
+ }
663
+ }
664
+ return null;
665
+ }
666
+ function getAllMatches(owner, nodeList) {
667
+ const filteredAndPatched = [];
668
+ for (let i = 0, len = nodeList.length; i < len; i += 1) {
669
+ const node = nodeList[i];
670
+ const isOwned = isNodeOwnedBy(owner, node);
671
+ if (isOwned) {
672
+ // Patch querySelector, querySelectorAll, etc
673
+ // if element is owned by VM
674
+ ArrayPush.call(filteredAndPatched, node);
675
+ }
676
+ }
677
+ return filteredAndPatched;
678
+ }
679
+ function getFirstMatch(owner, nodeList) {
680
+ for (let i = 0, len = nodeList.length; i < len; i += 1) {
681
+ if (isNodeOwnedBy(owner, nodeList[i])) {
682
+ return nodeList[i];
683
+ }
684
+ }
685
+ return null;
686
+ }
687
+ function shadowRootQuerySelector(root, selector) {
688
+ const elm = getHost(root);
689
+ const nodeList = arrayFromCollection(querySelectorAll$1.call(elm, selector));
690
+ return getFirstMatch(elm, nodeList);
691
+ }
692
+ function shadowRootQuerySelectorAll(root, selector) {
693
+ const elm = getHost(root);
694
+ const nodeList = querySelectorAll$1.call(elm, selector);
695
+ return getAllMatches(elm, arrayFromCollection(nodeList));
696
+ }
697
+ function getFilteredChildNodes(node) {
698
+ if (!isSyntheticShadowHost(node) && !isSlotElement(node)) {
699
+ // regular element - fast path
700
+ const children = childNodesGetter.call(node);
701
+ return arrayFromCollection(children);
702
+ }
703
+ if (isSyntheticShadowHost(node)) {
704
+ // we need to get only the nodes that were slotted
705
+ const slots = arrayFromCollection(querySelectorAll$1.call(node, 'slot'));
706
+ const resolver = getShadowRootResolver(getShadowRoot(node));
707
+ // Typescript is inferring the wrong function type for this particular
708
+ // overloaded method: https://github.com/Microsoft/TypeScript/issues/27972
709
+ // @ts-ignore type-mismatch
710
+ return ArrayReduce.call(slots, (seed, slot) => {
711
+ if (resolver === getShadowRootResolver(slot)) {
712
+ ArrayPush.apply(seed, getFilteredSlotAssignedNodes(slot));
713
+ }
714
+ return seed;
715
+ }, []);
716
+ }
717
+ else {
718
+ // slot element
719
+ const children = arrayFromCollection(childNodesGetter.call(node));
720
+ const resolver = getShadowRootResolver(node);
721
+ return ArrayFilter.call(children, (child) => resolver === getShadowRootResolver(child));
722
+ }
723
+ }
724
+ function getFilteredSlotAssignedNodes(slot) {
725
+ const owner = getNodeOwner(slot);
726
+ if (isNull(owner)) {
727
+ return [];
728
+ }
729
+ const childNodes = arrayFromCollection(childNodesGetter.call(slot));
730
+ return ArrayFilter.call(childNodes, (child) => !isNodeShadowed(child) || !isNodeOwnedBy(owner, child));
731
+ }
732
+
733
+ /*
734
+ * Copyright (c) 2018, salesforce.com, inc.
735
+ * All rights reserved.
736
+ * SPDX-License-Identifier: MIT
737
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
738
+ */
739
+ /**
740
+ @license
741
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
742
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
743
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
744
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
745
+ Code distributed by Google as part of the polymer project is also
746
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
747
+ */
748
+ // This code is inspired by Polymer ShadyDOM Polyfill
749
+ function getInnerHTML(node) {
750
+ let s = '';
751
+ const childNodes = getFilteredChildNodes(node);
752
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
753
+ s += getOuterHTML(childNodes[i]);
754
+ }
755
+ return s;
756
+ }
757
+
758
+ /*
759
+ * Copyright (c) 2018, salesforce.com, inc.
760
+ * All rights reserved.
761
+ * SPDX-License-Identifier: MIT
762
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
763
+ */
764
+ /**
765
+ @license
766
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
767
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
768
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
769
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
770
+ Code distributed by Google as part of the polymer project is also
771
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
772
+ */
773
+ // This code is inspired by Polymer ShadyDOM Polyfill
774
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
775
+ const escapeAttrRegExp = /[&\u00A0"]/g;
776
+ const escapeDataRegExp = /[&\u00A0<>]/g;
777
+ const { replace, toLowerCase } = String.prototype;
778
+ function escapeReplace(c) {
779
+ switch (c) {
780
+ case '&':
781
+ return '&amp;';
782
+ case '<':
783
+ return '&lt;';
784
+ case '>':
785
+ return '&gt;';
786
+ case '"':
787
+ return '&quot;';
788
+ case '\u00A0':
789
+ return '&nbsp;';
790
+ default:
791
+ return '';
792
+ }
793
+ }
794
+ function escapeAttr(s) {
795
+ return replace.call(s, escapeAttrRegExp, escapeReplace);
796
+ }
797
+ function escapeData(s) {
798
+ return replace.call(s, escapeDataRegExp, escapeReplace);
799
+ }
800
+ // http://www.whatwg.org/specs/web-apps/current-work/#void-elements
801
+ const voidElements = new Set([
802
+ 'AREA',
803
+ 'BASE',
804
+ 'BR',
805
+ 'COL',
806
+ 'COMMAND',
807
+ 'EMBED',
808
+ 'HR',
809
+ 'IMG',
810
+ 'INPUT',
811
+ 'KEYGEN',
812
+ 'LINK',
813
+ 'META',
814
+ 'PARAM',
815
+ 'SOURCE',
816
+ 'TRACK',
817
+ 'WBR',
818
+ ]);
819
+ const plaintextParents = new Set([
820
+ 'STYLE',
821
+ 'SCRIPT',
822
+ 'XMP',
823
+ 'IFRAME',
824
+ 'NOEMBED',
825
+ 'NOFRAMES',
826
+ 'PLAINTEXT',
827
+ 'NOSCRIPT',
828
+ ]);
829
+ function getOuterHTML(node) {
830
+ switch (node.nodeType) {
831
+ case ELEMENT_NODE: {
832
+ const { attributes: attrs } = node;
833
+ const tagName = tagNameGetter.call(node);
834
+ let s = '<' + toLowerCase.call(tagName);
835
+ for (let i = 0, attr; (attr = attrs[i]); i++) {
836
+ s += ' ' + attr.name + '="' + escapeAttr(attr.value) + '"';
837
+ }
838
+ s += '>';
839
+ if (voidElements.has(tagName)) {
840
+ return s;
841
+ }
842
+ return s + getInnerHTML(node) + '</' + toLowerCase.call(tagName) + '>';
843
+ }
844
+ case TEXT_NODE: {
845
+ const { data, parentNode } = node;
846
+ if (parentNode instanceof Element &&
847
+ plaintextParents.has(tagNameGetter.call(parentNode))) {
848
+ return data;
849
+ }
850
+ return escapeData(data);
851
+ }
852
+ case CDATA_SECTION_NODE: {
853
+ return `<!CDATA[[${node.data}]]>`;
854
+ }
855
+ case PROCESSING_INSTRUCTION_NODE: {
856
+ return `<?${node.target} ${node.data}?>`;
857
+ }
858
+ case COMMENT_NODE: {
859
+ return `<!--${node.data}-->`;
860
+ }
861
+ default: {
862
+ // intentionally ignoring unknown node types
863
+ // Note: since this routine is always invoked for childNodes
864
+ // we can safety ignore type 9, 10 and 99 (document, fragment and doctype)
865
+ return '';
866
+ }
867
+ }
868
+ }
869
+
870
+ /*
871
+ * Copyright (c) 2018, salesforce.com, inc.
872
+ * All rights reserved.
873
+ * SPDX-License-Identifier: MIT
874
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
875
+ */
876
+ /**
877
+ @license
878
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
879
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
880
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
881
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
882
+ Code distributed by Google as part of the polymer project is also
883
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
884
+ */
885
+ // This code is inspired by Polymer ShadyDOM Polyfill
886
+ function getTextContent(node) {
887
+ switch (node.nodeType) {
888
+ case ELEMENT_NODE: {
889
+ const childNodes = getFilteredChildNodes(node);
890
+ let content = '';
891
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
892
+ const currentNode = childNodes[i];
893
+ if (currentNode.nodeType !== COMMENT_NODE) {
894
+ content += getTextContent(currentNode);
895
+ }
896
+ }
897
+ return content;
898
+ }
899
+ default:
900
+ return node.nodeValue;
901
+ }
902
+ }
903
+
904
+ /*
905
+ * Copyright (c) 2018, salesforce.com, inc.
906
+ * All rights reserved.
907
+ * SPDX-License-Identifier: MIT
908
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
909
+ */
910
+ const Items$1 = new WeakMap();
911
+ function StaticNodeList() {
912
+ throw new TypeError('Illegal constructor');
913
+ }
914
+ StaticNodeList.prototype = create(NodeList.prototype, {
915
+ constructor: {
916
+ writable: true,
917
+ configurable: true,
918
+ value: StaticNodeList,
919
+ },
920
+ item: {
921
+ writable: true,
922
+ enumerable: true,
923
+ configurable: true,
924
+ value(index) {
925
+ return this[index];
926
+ },
927
+ },
928
+ length: {
929
+ enumerable: true,
930
+ configurable: true,
931
+ get() {
932
+ return Items$1.get(this).length;
933
+ },
934
+ },
935
+ // Iterator protocol
936
+ forEach: {
937
+ writable: true,
938
+ enumerable: true,
939
+ configurable: true,
940
+ value(cb, thisArg) {
941
+ forEach.call(Items$1.get(this), cb, thisArg);
942
+ },
943
+ },
944
+ entries: {
945
+ writable: true,
946
+ enumerable: true,
947
+ configurable: true,
948
+ value() {
949
+ return ArrayMap.call(Items$1.get(this), (v, i) => [i, v]);
950
+ },
951
+ },
952
+ keys: {
953
+ writable: true,
954
+ enumerable: true,
955
+ configurable: true,
956
+ value() {
957
+ return ArrayMap.call(Items$1.get(this), (_v, i) => i);
958
+ },
959
+ },
960
+ values: {
961
+ writable: true,
962
+ enumerable: true,
963
+ configurable: true,
964
+ value() {
965
+ return Items$1.get(this);
966
+ },
967
+ },
968
+ [Symbol.iterator]: {
969
+ writable: true,
970
+ configurable: true,
971
+ value() {
972
+ let nextIndex = 0;
973
+ return {
974
+ next: () => {
975
+ const items = Items$1.get(this);
976
+ return nextIndex < items.length
977
+ ? {
978
+ value: items[nextIndex++],
979
+ done: false,
980
+ }
981
+ : {
982
+ done: true,
983
+ };
984
+ },
985
+ };
986
+ },
987
+ },
988
+ [Symbol.toStringTag]: {
989
+ configurable: true,
990
+ get() {
991
+ return 'NodeList';
992
+ },
993
+ },
994
+ // IE11 doesn't support Symbol.toStringTag, in which case we
995
+ // provide the regular toString method.
996
+ toString: {
997
+ writable: true,
998
+ configurable: true,
999
+ value() {
1000
+ return '[object NodeList]';
1001
+ },
1002
+ },
1003
+ });
1004
+ // prototype inheritance dance
1005
+ setPrototypeOf(StaticNodeList, NodeList);
1006
+ function createStaticNodeList(items) {
1007
+ const nodeList = create(StaticNodeList.prototype);
1008
+ Items$1.set(nodeList, items);
1009
+ // setting static indexes
1010
+ forEach.call(items, (item, index) => {
1011
+ defineProperty(nodeList, index, {
1012
+ value: item,
1013
+ enumerable: true,
1014
+ configurable: true,
1015
+ });
1016
+ });
1017
+ return nodeList;
1018
+ }
1019
+
1020
+ /*
1021
+ * Copyright (c) 2018, salesforce.com, inc.
1022
+ * All rights reserved.
1023
+ * SPDX-License-Identifier: MIT
1024
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1025
+ */
1026
+ // Walk up the DOM tree, collecting all shadow roots plus the document root
1027
+ function getAllRootNodes(node) {
1028
+ var _a;
1029
+ const rootNodes = [];
1030
+ let currentRootNode = node.getRootNode();
1031
+ while (!isUndefined(currentRootNode)) {
1032
+ rootNodes.push(currentRootNode);
1033
+ currentRootNode = (_a = currentRootNode.host) === null || _a === void 0 ? void 0 : _a.getRootNode();
1034
+ }
1035
+ return rootNodes;
1036
+ }
1037
+ // Keep searching up the host tree until we find an element that is within the immediate shadow root
1038
+ const findAncestorHostInImmediateShadowRoot = (rootNode, targetRootNode) => {
1039
+ let host;
1040
+ while (!isUndefined((host = rootNode.host))) {
1041
+ const thisRootNode = host.getRootNode();
1042
+ if (thisRootNode === targetRootNode) {
1043
+ return host;
1044
+ }
1045
+ rootNode = thisRootNode;
1046
+ }
1047
+ };
1048
+ function fauxElementsFromPoint(context, doc, left, top) {
1049
+ const elements = elementsFromPoint.call(doc, left, top);
1050
+ const result = [];
1051
+ const rootNodes = getAllRootNodes(context);
1052
+ // Filter the elements array to only include those elements that are in this shadow root or in one of its
1053
+ // ancestor roots. This matches Chrome and Safari's implementation (but not Firefox's, which only includes
1054
+ // elements in the immediate shadow root: https://crbug.com/1207863#c4).
1055
+ if (!isNull(elements)) {
1056
+ // can be null in IE https://developer.mozilla.org/en-US/docs/Web/API/Document/elementsFromPoint#browser_compatibility
1057
+ for (let i = 0; i < elements.length; i++) {
1058
+ const element = elements[i];
1059
+ if (isSyntheticSlotElement(element)) {
1060
+ continue;
1061
+ }
1062
+ const elementRootNode = element.getRootNode();
1063
+ if (ArrayIndexOf.call(rootNodes, elementRootNode) !== -1) {
1064
+ ArrayPush.call(result, element);
1065
+ continue;
1066
+ }
1067
+ // In cases where the host element is not visible but its shadow descendants are, then
1068
+ // we may get the shadow descendant instead of the host element here. (The
1069
+ // browser doesn't know the difference in synthetic shadow DOM.)
1070
+ // In native shadow DOM, however, elementsFromPoint would return the host but not
1071
+ // the child. So we need to detect if this shadow element's host is accessible from
1072
+ // the context's shadow root. Note we also need to be careful not to add the host
1073
+ // multiple times.
1074
+ const ancestorHost = findAncestorHostInImmediateShadowRoot(elementRootNode, rootNodes[0]);
1075
+ if (!isUndefined(ancestorHost) &&
1076
+ ArrayIndexOf.call(elements, ancestorHost) === -1 &&
1077
+ ArrayIndexOf.call(result, ancestorHost) === -1) {
1078
+ ArrayPush.call(result, ancestorHost);
1079
+ }
1080
+ }
1081
+ }
1082
+ return result;
1083
+ }
1084
+
1085
+ /*
1086
+ * Copyright (c) 2018, salesforce.com, inc.
1087
+ * All rights reserved.
1088
+ * SPDX-License-Identifier: MIT
1089
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1090
+ */
1091
+ const Items = new WeakMap();
1092
+ function StaticHTMLCollection() {
1093
+ throw new TypeError('Illegal constructor');
1094
+ }
1095
+ StaticHTMLCollection.prototype = create(HTMLCollection.prototype, {
1096
+ constructor: {
1097
+ writable: true,
1098
+ configurable: true,
1099
+ value: StaticHTMLCollection,
1100
+ },
1101
+ item: {
1102
+ writable: true,
1103
+ enumerable: true,
1104
+ configurable: true,
1105
+ value(index) {
1106
+ return this[index];
1107
+ },
1108
+ },
1109
+ length: {
1110
+ enumerable: true,
1111
+ configurable: true,
1112
+ get() {
1113
+ return Items.get(this).length;
1114
+ },
1115
+ },
1116
+ // https://dom.spec.whatwg.org/#dom-htmlcollection-nameditem-key
1117
+ namedItem: {
1118
+ writable: true,
1119
+ enumerable: true,
1120
+ configurable: true,
1121
+ value(name) {
1122
+ if (name === '') {
1123
+ return null;
1124
+ }
1125
+ const items = Items.get(this);
1126
+ for (let i = 0, len = items.length; i < len; i++) {
1127
+ const item = items[len];
1128
+ if (name === getAttribute.call(item, 'id') ||
1129
+ name === getAttribute.call(item, 'name')) {
1130
+ return item;
1131
+ }
1132
+ }
1133
+ return null;
1134
+ },
1135
+ },
1136
+ [Symbol.toStringTag]: {
1137
+ configurable: true,
1138
+ get() {
1139
+ return 'HTMLCollection';
1140
+ },
1141
+ },
1142
+ // IE11 doesn't support Symbol.toStringTag, in which case we
1143
+ // provide the regular toString method.
1144
+ toString: {
1145
+ writable: true,
1146
+ configurable: true,
1147
+ value() {
1148
+ return '[object HTMLCollection]';
1149
+ },
1150
+ },
1151
+ });
1152
+ // prototype inheritance dance
1153
+ setPrototypeOf(StaticHTMLCollection, HTMLCollection);
1154
+ function createStaticHTMLCollection(items) {
1155
+ const collection = create(StaticHTMLCollection.prototype);
1156
+ Items.set(collection, items);
1157
+ // setting static indexes
1158
+ forEach.call(items, (item, index) => {
1159
+ defineProperty(collection, index, {
1160
+ value: item,
1161
+ enumerable: true,
1162
+ configurable: true,
1163
+ });
1164
+ });
1165
+ return collection;
1166
+ }
1167
+
1168
+ /*
1169
+ * Copyright (c) 2018, salesforce.com, inc.
1170
+ * All rights reserved.
1171
+ * SPDX-License-Identifier: MIT
1172
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1173
+ */
1174
+ /**
1175
+ * This method checks whether or not the content of the node is computed
1176
+ * based on the light-dom slotting mechanism. This applies to synthetic slot elements
1177
+ * and elements with shadow dom attached to them. It doesn't apply to native slot elements
1178
+ * because we don't want to patch the children getters for those elements.
1179
+ */
1180
+ function hasMountedChildren(node) {
1181
+ return isSyntheticSlotElement(node) || isSyntheticShadowHost(node);
1182
+ }
1183
+ function getShadowParent(node, value) {
1184
+ const owner = getNodeOwner(node);
1185
+ if (value === owner) {
1186
+ // walking up via parent chain might end up in the shadow root element
1187
+ return getShadowRoot(owner);
1188
+ }
1189
+ else if (value instanceof Element) {
1190
+ if (getNodeNearestOwnerKey(node) === getNodeNearestOwnerKey(value)) {
1191
+ // the element and its parent node belong to the same shadow root
1192
+ return value;
1193
+ }
1194
+ else if (!isNull(owner) && isSlotElement(value)) {
1195
+ // slotted elements must be top level childNodes of the slot element
1196
+ // where they slotted into, but its shadowed parent is always the
1197
+ // owner of the slot.
1198
+ const slotOwner = getNodeOwner(value);
1199
+ if (!isNull(slotOwner) && isNodeOwnedBy(owner, slotOwner)) {
1200
+ // it is a slotted element, and therefore its parent is always going to be the host of the slot
1201
+ return slotOwner;
1202
+ }
1203
+ }
1204
+ }
1205
+ return null;
1206
+ }
1207
+ function hasChildNodesPatched() {
1208
+ return getInternalChildNodes(this).length > 0;
1209
+ }
1210
+ function firstChildGetterPatched() {
1211
+ const childNodes = getInternalChildNodes(this);
1212
+ return childNodes[0] || null;
1213
+ }
1214
+ function lastChildGetterPatched() {
1215
+ const childNodes = getInternalChildNodes(this);
1216
+ return childNodes[childNodes.length - 1] || null;
1217
+ }
1218
+ function textContentGetterPatched() {
1219
+ return getTextContent(this);
1220
+ }
1221
+ function textContentSetterPatched(value) {
1222
+ textContextSetter.call(this, value);
1223
+ }
1224
+ function parentNodeGetterPatched() {
1225
+ const value = parentNodeGetter.call(this);
1226
+ if (isNull(value)) {
1227
+ return value;
1228
+ }
1229
+ // TODO [#1635]: this needs optimization, maybe implementing it based on this.assignedSlot
1230
+ return getShadowParent(this, value);
1231
+ }
1232
+ function parentElementGetterPatched() {
1233
+ const value = parentNodeGetter.call(this);
1234
+ if (isNull(value)) {
1235
+ return null;
1236
+ }
1237
+ const parentNode = getShadowParent(this, value);
1238
+ // it could be that the parentNode is the shadowRoot, in which case
1239
+ // we need to return null.
1240
+ // TODO [#1635]: this needs optimization, maybe implementing it based on this.assignedSlot
1241
+ return parentNode instanceof Element ? parentNode : null;
1242
+ }
1243
+ function compareDocumentPositionPatched(otherNode) {
1244
+ if (this === otherNode) {
1245
+ return 0;
1246
+ }
1247
+ else if (this.getRootNode() === otherNode) {
1248
+ // "this" is in a shadow tree where the shadow root is the "otherNode".
1249
+ return 10; // Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING
1250
+ }
1251
+ else if (getNodeOwnerKey(this) !== getNodeOwnerKey(otherNode)) {
1252
+ // "this" and "otherNode" belongs to 2 different shadow tree.
1253
+ return 35; // Node.DOCUMENT_POSITION_DISCONNECTED | Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | Node.DOCUMENT_POSITION_PRECEDING
1254
+ }
1255
+ // Since "this" and "otherNode" are part of the same shadow tree we can safely rely to the native
1256
+ // Node.compareDocumentPosition implementation.
1257
+ return compareDocumentPosition.call(this, otherNode);
1258
+ }
1259
+ function containsPatched(otherNode) {
1260
+ if (otherNode == null || getNodeOwnerKey(this) !== getNodeOwnerKey(otherNode)) {
1261
+ // it is from another shadow
1262
+ return false;
1263
+ }
1264
+ return (compareDocumentPosition.call(this, otherNode) & DOCUMENT_POSITION_CONTAINED_BY) !== 0;
1265
+ }
1266
+ function cloneNodePatched(deep) {
1267
+ const clone = cloneNode.call(this, false);
1268
+ // Per spec, browsers only care about truthy values
1269
+ // Not strict true or false
1270
+ if (!deep) {
1271
+ return clone;
1272
+ }
1273
+ const childNodes = getInternalChildNodes(this);
1274
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
1275
+ clone.appendChild(childNodes[i].cloneNode(true));
1276
+ }
1277
+ return clone;
1278
+ }
1279
+ /**
1280
+ * This method only applies to elements with a shadow or slots
1281
+ */
1282
+ function childNodesGetterPatched() {
1283
+ if (isSyntheticShadowHost(this)) {
1284
+ const owner = getNodeOwner(this);
1285
+ const childNodes = isNull(owner) ? [] : getAllMatches(owner, getFilteredChildNodes(this));
1286
+ if (process.env.NODE_ENV !== 'production' &&
1287
+ isFalse(hasNativeSymbolSupport) &&
1288
+ isExternalChildNodeAccessorFlagOn()) {
1289
+ // inserting a comment node as the first childNode to trick the IE11
1290
+ // DevTool to show the content of the shadowRoot, this should only happen
1291
+ // in dev-mode and in IE11 (which we detect by looking at the symbol).
1292
+ // Plus it should only be in place if we know it is an external invoker.
1293
+ ArrayUnshift.call(childNodes, getIE11FakeShadowRootPlaceholder(this));
1294
+ }
1295
+ return createStaticNodeList(childNodes);
1296
+ }
1297
+ // nothing to do here since this does not have a synthetic shadow attached to it
1298
+ // TODO [#1636]: what about slot elements?
1299
+ return childNodesGetter.call(this);
1300
+ }
1301
+ const nativeGetRootNode = _Node.prototype.getRootNode;
1302
+ /**
1303
+ * Get the root by climbing up the dom tree, beyond the shadow root
1304
+ * If Node.prototype.getRootNode is supported, use it
1305
+ * else, assume we are working in non-native shadow mode and climb using parentNode
1306
+ */
1307
+ const getDocumentOrRootNode = !isUndefined(nativeGetRootNode)
1308
+ ? nativeGetRootNode
1309
+ : function () {
1310
+ let node = this;
1311
+ let nodeParent;
1312
+ while (!isNull((nodeParent = parentNodeGetter.call(node)))) {
1313
+ node = nodeParent;
1314
+ }
1315
+ return node;
1316
+ };
1317
+ /**
1318
+ * Get the shadow root
1319
+ * getNodeOwner() returns the host element that owns the given node
1320
+ * Note: getNodeOwner() returns null when running in native-shadow mode.
1321
+ * Fallback to using the native getRootNode() to discover the root node.
1322
+ * This is because, it is not possible to inspect the node and decide if it is part
1323
+ * of a native shadow or the synthetic shadow.
1324
+ * @param {Node} node
1325
+ */
1326
+ function getNearestRoot(node) {
1327
+ const ownerNode = getNodeOwner(node);
1328
+ if (isNull(ownerNode)) {
1329
+ // we hit a wall, either we are in native shadow mode or the node is not in lwc boundary.
1330
+ return getDocumentOrRootNode.call(node);
1331
+ }
1332
+ return getShadowRoot(ownerNode);
1333
+ }
1334
+ /**
1335
+ * If looking for a root node beyond shadow root by calling `node.getRootNode({composed: true})`, use the original `Node.prototype.getRootNode` method
1336
+ * to return the root of the dom tree. In IE11 and Edge, Node.prototype.getRootNode is
1337
+ * [not supported](https://developer.mozilla.org/en-US/docs/Web/API/Node/getRootNode#Browser_compatibility). The root node is discovered by manually
1338
+ * climbing up the dom tree.
1339
+ *
1340
+ * If looking for a shadow root of a node by calling `node.getRootNode({composed: false})` or `node.getRootNode()`,
1341
+ *
1342
+ * 1. Try to identify the host element that owns the give node.
1343
+ * i. Identify the shadow tree that the node belongs to
1344
+ * ii. If the node belongs to a shadow tree created by engine, return the shadowRoot of the host element that owns the shadow tree
1345
+ * 2. The host identification logic returns null in two cases:
1346
+ * i. The node does not belong to a shadow tree created by engine
1347
+ * ii. The engine is running in native shadow dom mode
1348
+ * If so, use the original Node.prototype.getRootNode to fetch the root node(or manually climb up the dom tree where getRootNode() is unsupported)
1349
+ *
1350
+ * _Spec_: https://dom.spec.whatwg.org/#dom-node-getrootnode
1351
+ *
1352
+ **/
1353
+ function getRootNodePatched(options) {
1354
+ const composed = isUndefined(options) ? false : !!options.composed;
1355
+ return isTrue(composed) ? getDocumentOrRootNode.call(this, options) : getNearestRoot(this);
1356
+ }
1357
+ // Non-deep-traversing patches: this descriptor map includes all descriptors that
1358
+ // do not give access to nodes beyond the immediate children.
1359
+ defineProperties(_Node.prototype, {
1360
+ firstChild: {
1361
+ get() {
1362
+ if (hasMountedChildren(this)) {
1363
+ return firstChildGetterPatched.call(this);
1364
+ }
1365
+ return firstChildGetter.call(this);
1366
+ },
1367
+ enumerable: true,
1368
+ configurable: true,
1369
+ },
1370
+ lastChild: {
1371
+ get() {
1372
+ if (hasMountedChildren(this)) {
1373
+ return lastChildGetterPatched.call(this);
1374
+ }
1375
+ return lastChildGetter.call(this);
1376
+ },
1377
+ enumerable: true,
1378
+ configurable: true,
1379
+ },
1380
+ textContent: {
1381
+ get() {
1382
+ // Note: we deviate from native shadow here, but are not fixing
1383
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
1384
+ if (isNodeShadowed(this) || isSyntheticShadowHost(this)) {
1385
+ return textContentGetterPatched.call(this);
1386
+ }
1387
+ return textContentGetter.call(this);
1388
+ },
1389
+ set: textContentSetterPatched,
1390
+ enumerable: true,
1391
+ configurable: true,
1392
+ },
1393
+ parentNode: {
1394
+ get() {
1395
+ if (isNodeShadowed(this)) {
1396
+ return parentNodeGetterPatched.call(this);
1397
+ }
1398
+ const parentNode = parentNodeGetter.call(this);
1399
+ // Handle the case where a top level light DOM element is slotted into a synthetic
1400
+ // shadow slot.
1401
+ if (!isNull(parentNode) && isSyntheticSlotElement(parentNode)) {
1402
+ return getNodeOwner(parentNode);
1403
+ }
1404
+ return parentNode;
1405
+ },
1406
+ enumerable: true,
1407
+ configurable: true,
1408
+ },
1409
+ parentElement: {
1410
+ get() {
1411
+ if (isNodeShadowed(this)) {
1412
+ return parentElementGetterPatched.call(this);
1413
+ }
1414
+ const parentElement = parentElementGetter.call(this);
1415
+ // Handle the case where a top level light DOM element is slotted into a synthetic
1416
+ // shadow slot.
1417
+ if (!isNull(parentElement) && isSyntheticSlotElement(parentElement)) {
1418
+ return getNodeOwner(parentElement);
1419
+ }
1420
+ return parentElement;
1421
+ },
1422
+ enumerable: true,
1423
+ configurable: true,
1424
+ },
1425
+ childNodes: {
1426
+ get() {
1427
+ if (hasMountedChildren(this)) {
1428
+ return childNodesGetterPatched.call(this);
1429
+ }
1430
+ return childNodesGetter.call(this);
1431
+ },
1432
+ enumerable: true,
1433
+ configurable: true,
1434
+ },
1435
+ hasChildNodes: {
1436
+ value() {
1437
+ if (hasMountedChildren(this)) {
1438
+ return hasChildNodesPatched.call(this);
1439
+ }
1440
+ return hasChildNodes.call(this);
1441
+ },
1442
+ enumerable: true,
1443
+ writable: true,
1444
+ configurable: true,
1445
+ },
1446
+ compareDocumentPosition: {
1447
+ value(otherNode) {
1448
+ // Note: we deviate from native shadow here, but are not fixing
1449
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
1450
+ if (isGlobalPatchingSkipped(this)) {
1451
+ return compareDocumentPosition.call(this, otherNode);
1452
+ }
1453
+ return compareDocumentPositionPatched.call(this, otherNode);
1454
+ },
1455
+ enumerable: true,
1456
+ writable: true,
1457
+ configurable: true,
1458
+ },
1459
+ contains: {
1460
+ value(otherNode) {
1461
+ // 1. Node.prototype.contains() returns true if otherNode is an inclusive descendant
1462
+ // spec: https://dom.spec.whatwg.org/#dom-node-contains
1463
+ // 2. This normalizes the behavior of this api across all browsers.
1464
+ // In IE11, a disconnected dom element without children invoking contains() on self, returns false
1465
+ if (this === otherNode) {
1466
+ return true;
1467
+ }
1468
+ // Note: we deviate from native shadow here, but are not fixing
1469
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
1470
+ if (otherNode == null) {
1471
+ return false;
1472
+ }
1473
+ if (isNodeShadowed(this) || isSyntheticShadowHost(this)) {
1474
+ return containsPatched.call(this, otherNode);
1475
+ }
1476
+ return contains.call(this, otherNode);
1477
+ },
1478
+ enumerable: true,
1479
+ writable: true,
1480
+ configurable: true,
1481
+ },
1482
+ cloneNode: {
1483
+ value(deep) {
1484
+ // Note: we deviate from native shadow here, but are not fixing
1485
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
1486
+ if (isNodeShadowed(this) || isSyntheticShadowHost(this)) {
1487
+ return cloneNodePatched.call(this, deep);
1488
+ }
1489
+ return cloneNode.call(this, deep);
1490
+ },
1491
+ enumerable: true,
1492
+ writable: true,
1493
+ configurable: true,
1494
+ },
1495
+ getRootNode: {
1496
+ value: getRootNodePatched,
1497
+ enumerable: true,
1498
+ configurable: true,
1499
+ writable: true,
1500
+ },
1501
+ isConnected: {
1502
+ enumerable: true,
1503
+ configurable: true,
1504
+ get() {
1505
+ return isConnected.call(this);
1506
+ },
1507
+ },
1508
+ });
1509
+ let internalChildNodeAccessorFlag = false;
1510
+ /**
1511
+ * These 2 methods are providing a machinery to understand who is accessing the
1512
+ * .childNodes member property of a node. If it is used from inside the synthetic shadow
1513
+ * or from an external invoker. This helps to produce the right output in one very peculiar
1514
+ * case, the IE11 debugging comment for shadowRoot representation on the devtool.
1515
+ */
1516
+ function isExternalChildNodeAccessorFlagOn() {
1517
+ return !internalChildNodeAccessorFlag;
1518
+ }
1519
+ const getInternalChildNodes = process.env.NODE_ENV !== 'production' && isFalse(hasNativeSymbolSupport)
1520
+ ? function (node) {
1521
+ internalChildNodeAccessorFlag = true;
1522
+ let childNodes;
1523
+ let error = null;
1524
+ try {
1525
+ childNodes = node.childNodes;
1526
+ }
1527
+ catch (e) {
1528
+ // childNodes accessor should never throw, but just in case!
1529
+ error = e;
1530
+ }
1531
+ finally {
1532
+ internalChildNodeAccessorFlag = false;
1533
+ if (!isNull(error)) {
1534
+ // re-throwing after restoring the state machinery for setInternalChildNodeAccessorFlag
1535
+ throw error; // eslint-disable-line no-unsafe-finally
1536
+ }
1537
+ }
1538
+ return childNodes;
1539
+ }
1540
+ : function (node) {
1541
+ return node.childNodes;
1542
+ };
1543
+ // IE11 extra patches for wrong prototypes
1544
+ if (hasOwnProperty.call(HTMLElement.prototype, 'contains')) {
1545
+ defineProperty(HTMLElement.prototype, 'contains', getOwnPropertyDescriptor(_Node.prototype, 'contains'));
1546
+ }
1547
+ if (hasOwnProperty.call(HTMLElement.prototype, 'parentElement')) {
1548
+ defineProperty(HTMLElement.prototype, 'parentElement', getOwnPropertyDescriptor(_Node.prototype, 'parentElement'));
1549
+ }
1550
+
1551
+ /*
1552
+ * Copyright (c) 2018, salesforce.com, inc.
1553
+ * All rights reserved.
1554
+ * SPDX-License-Identifier: MIT
1555
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1556
+ */
1557
+ const EventListenerMap = new WeakMap();
1558
+ const ComposedPathMap = new WeakMap();
1559
+ function isEventListenerOrEventListenerObject$1(fnOrObj) {
1560
+ return (isFunction(fnOrObj) ||
1561
+ (isObject(fnOrObj) &&
1562
+ !isNull(fnOrObj) &&
1563
+ isFunction(fnOrObj.handleEvent)));
1564
+ }
1565
+ function shouldInvokeListener(event, target, currentTarget) {
1566
+ // Subsequent logic assumes that `currentTarget` must be contained in the composed path for the listener to be
1567
+ // invoked, but this is not always the case. `composedPath()` will sometimes return an empty array, even when the
1568
+ // listener should be invoked (e.g., a disconnected instance of EventTarget, an instance of XMLHttpRequest, etc).
1569
+ if (target === currentTarget) {
1570
+ return true;
1571
+ }
1572
+ let composedPath = ComposedPathMap.get(event);
1573
+ if (isUndefined(composedPath)) {
1574
+ composedPath = event.composedPath();
1575
+ ComposedPathMap.set(event, composedPath);
1576
+ }
1577
+ return composedPath.includes(currentTarget);
1578
+ }
1579
+ function getEventListenerWrapper(fnOrObj) {
1580
+ if (!isEventListenerOrEventListenerObject$1(fnOrObj)) {
1581
+ return fnOrObj;
1582
+ }
1583
+ let wrapperFn = EventListenerMap.get(fnOrObj);
1584
+ if (isUndefined(wrapperFn)) {
1585
+ wrapperFn = function (event) {
1586
+ // This function is invoked from an event listener and currentTarget is always defined.
1587
+ const currentTarget = eventCurrentTargetGetter.call(event);
1588
+ if (process.env.NODE_ENV !== 'production') {
1589
+ assert.invariant(isFalse(isSyntheticShadowHost(currentTarget)), 'This routine should not be used to wrap event listeners for host elements and shadow roots.');
1590
+ }
1591
+ const actualTarget = getActualTarget(event);
1592
+ if (!shouldInvokeListener(event, actualTarget, currentTarget)) {
1593
+ return;
1594
+ }
1595
+ return isFunction(fnOrObj)
1596
+ ? fnOrObj.call(this, event)
1597
+ : fnOrObj.handleEvent && fnOrObj.handleEvent(event);
1598
+ };
1599
+ EventListenerMap.set(fnOrObj, wrapperFn);
1600
+ }
1601
+ return wrapperFn;
1602
+ }
1603
+
1604
+ /*
1605
+ * Copyright (c) 2018, salesforce.com, inc.
1606
+ * All rights reserved.
1607
+ * SPDX-License-Identifier: MIT
1608
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1609
+ */
1610
+ const eventToContextMap = new WeakMap();
1611
+ function getEventHandler(listener) {
1612
+ if (isFunction(listener)) {
1613
+ return listener;
1614
+ }
1615
+ else {
1616
+ return listener.handleEvent;
1617
+ }
1618
+ }
1619
+ function isEventListenerOrEventListenerObject(listener) {
1620
+ return isFunction(listener) || isFunction(listener === null || listener === void 0 ? void 0 : listener.handleEvent);
1621
+ }
1622
+ const customElementToWrappedListeners = new WeakMap();
1623
+ function getEventMap(elm) {
1624
+ let listenerInfo = customElementToWrappedListeners.get(elm);
1625
+ if (isUndefined(listenerInfo)) {
1626
+ listenerInfo = create(null);
1627
+ customElementToWrappedListeners.set(elm, listenerInfo);
1628
+ }
1629
+ return listenerInfo;
1630
+ }
1631
+ /**
1632
+ * Events dispatched on shadow roots actually end up being dispatched on their hosts. This means that the event.target
1633
+ * property of events dispatched on shadow roots always resolve to their host. This function understands this
1634
+ * abstraction and properly returns a reference to the shadow root when appropriate.
1635
+ */
1636
+ function getActualTarget(event) {
1637
+ var _a;
1638
+ return (_a = eventToShadowRootMap.get(event)) !== null && _a !== void 0 ? _a : eventTargetGetter.call(event);
1639
+ }
1640
+ const shadowRootEventListenerMap = new WeakMap();
1641
+ function getManagedShadowRootListener(listener) {
1642
+ if (!isEventListenerOrEventListenerObject(listener)) {
1643
+ throw new TypeError(); // avoiding problems with non-valid listeners
1644
+ }
1645
+ let managedListener = shadowRootEventListenerMap.get(listener);
1646
+ if (isUndefined(managedListener)) {
1647
+ managedListener = {
1648
+ identity: listener,
1649
+ placement: 1 /* EventListenerContext.SHADOW_ROOT_LISTENER */,
1650
+ handleEvent(event) {
1651
+ // currentTarget is always defined inside an event listener
1652
+ let currentTarget = eventCurrentTargetGetter.call(event);
1653
+ // If currentTarget is not an instance of a native shadow root then we're dealing with a
1654
+ // host element whose synthetic shadow root must be accessed via getShadowRoot().
1655
+ if (!isInstanceOfNativeShadowRoot(currentTarget)) {
1656
+ currentTarget = getShadowRoot(currentTarget);
1657
+ }
1658
+ const actualTarget = getActualTarget(event);
1659
+ if (shouldInvokeListener(event, actualTarget, currentTarget)) {
1660
+ getEventHandler(listener).call(currentTarget, event);
1661
+ }
1662
+ },
1663
+ };
1664
+ shadowRootEventListenerMap.set(listener, managedListener);
1665
+ }
1666
+ return managedListener;
1667
+ }
1668
+ const customElementEventListenerMap = new WeakMap();
1669
+ function getManagedCustomElementListener(listener) {
1670
+ if (!isEventListenerOrEventListenerObject(listener)) {
1671
+ throw new TypeError(); // avoiding problems with non-valid listeners
1672
+ }
1673
+ let managedListener = customElementEventListenerMap.get(listener);
1674
+ if (isUndefined(managedListener)) {
1675
+ managedListener = {
1676
+ identity: listener,
1677
+ placement: 0 /* EventListenerContext.CUSTOM_ELEMENT_LISTENER */,
1678
+ handleEvent(event) {
1679
+ // currentTarget is always defined inside an event listener
1680
+ const currentTarget = eventCurrentTargetGetter.call(event);
1681
+ const actualTarget = getActualTarget(event);
1682
+ if (shouldInvokeListener(event, actualTarget, currentTarget)) {
1683
+ getEventHandler(listener).call(currentTarget, event);
1684
+ }
1685
+ },
1686
+ };
1687
+ customElementEventListenerMap.set(listener, managedListener);
1688
+ }
1689
+ return managedListener;
1690
+ }
1691
+ function indexOfManagedListener(listeners, listener) {
1692
+ return ArrayFindIndex.call(listeners, (l) => l.identity === listener.identity);
1693
+ }
1694
+ function domListener(evt) {
1695
+ let immediatePropagationStopped = false;
1696
+ let propagationStopped = false;
1697
+ const { type, stopImmediatePropagation, stopPropagation } = evt;
1698
+ // currentTarget is always defined
1699
+ const currentTarget = eventCurrentTargetGetter.call(evt);
1700
+ const listenerMap = getEventMap(currentTarget);
1701
+ const listeners = listenerMap[type]; // it must have listeners at this point
1702
+ defineProperty(evt, 'stopImmediatePropagation', {
1703
+ value() {
1704
+ immediatePropagationStopped = true;
1705
+ stopImmediatePropagation.call(evt);
1706
+ },
1707
+ writable: true,
1708
+ enumerable: true,
1709
+ configurable: true,
1710
+ });
1711
+ defineProperty(evt, 'stopPropagation', {
1712
+ value() {
1713
+ propagationStopped = true;
1714
+ stopPropagation.call(evt);
1715
+ },
1716
+ writable: true,
1717
+ enumerable: true,
1718
+ configurable: true,
1719
+ });
1720
+ // in case a listener adds or removes other listeners during invocation
1721
+ const bookkeeping = ArraySlice.call(listeners);
1722
+ function invokeListenersByPlacement(placement) {
1723
+ forEach.call(bookkeeping, (listener) => {
1724
+ if (isFalse(immediatePropagationStopped) && listener.placement === placement) {
1725
+ // making sure that the listener was not removed from the original listener queue
1726
+ if (indexOfManagedListener(listeners, listener) !== -1) {
1727
+ // all handlers on the custom element should be called with undefined 'this'
1728
+ listener.handleEvent.call(undefined, evt);
1729
+ }
1730
+ }
1731
+ });
1732
+ }
1733
+ eventToContextMap.set(evt, 1 /* EventListenerContext.SHADOW_ROOT_LISTENER */);
1734
+ invokeListenersByPlacement(1 /* EventListenerContext.SHADOW_ROOT_LISTENER */);
1735
+ if (isFalse(immediatePropagationStopped) && isFalse(propagationStopped)) {
1736
+ // doing the second iteration only if the first one didn't interrupt the event propagation
1737
+ eventToContextMap.set(evt, 0 /* EventListenerContext.CUSTOM_ELEMENT_LISTENER */);
1738
+ invokeListenersByPlacement(0 /* EventListenerContext.CUSTOM_ELEMENT_LISTENER */);
1739
+ }
1740
+ eventToContextMap.set(evt, 2 /* EventListenerContext.UNKNOWN_LISTENER */);
1741
+ }
1742
+ function attachDOMListener(elm, type, managedListener) {
1743
+ const listenerMap = getEventMap(elm);
1744
+ let listeners = listenerMap[type];
1745
+ if (isUndefined(listeners)) {
1746
+ listeners = listenerMap[type] = [];
1747
+ }
1748
+ // Prevent identical listeners from subscribing to the same event type.
1749
+ // TODO [#1824]: Options will also play a factor in deduping if we introduce options support
1750
+ if (indexOfManagedListener(listeners, managedListener) !== -1) {
1751
+ return;
1752
+ }
1753
+ // only add to DOM if there is no other listener on the same placement yet
1754
+ if (listeners.length === 0) {
1755
+ addEventListener.call(elm, type, domListener);
1756
+ }
1757
+ ArrayPush.call(listeners, managedListener);
1758
+ }
1759
+ function detachDOMListener(elm, type, managedListener) {
1760
+ const listenerMap = getEventMap(elm);
1761
+ let index;
1762
+ let listeners;
1763
+ if (!isUndefined((listeners = listenerMap[type])) &&
1764
+ (index = indexOfManagedListener(listeners, managedListener)) !== -1) {
1765
+ ArraySplice.call(listeners, index, 1);
1766
+ // only remove from DOM if there is no other listener on the same placement
1767
+ if (listeners.length === 0) {
1768
+ removeEventListener.call(elm, type, domListener);
1769
+ }
1770
+ }
1771
+ }
1772
+ function addCustomElementEventListener(type, listener, _options) {
1773
+ if (process.env.NODE_ENV !== 'production') {
1774
+ if (!isEventListenerOrEventListenerObject(listener)) {
1775
+ throw new TypeError(`Invalid second argument for Element.addEventListener() in ${toString(this)} for event "${type}". Expected EventListener or EventListenerObject but received ${listener}.`);
1776
+ }
1777
+ }
1778
+ if (isEventListenerOrEventListenerObject(listener)) {
1779
+ const managedListener = getManagedCustomElementListener(listener);
1780
+ attachDOMListener(this, type, managedListener);
1781
+ }
1782
+ }
1783
+ function removeCustomElementEventListener(type, listener, _options) {
1784
+ if (isEventListenerOrEventListenerObject(listener)) {
1785
+ const managedListener = getManagedCustomElementListener(listener);
1786
+ detachDOMListener(this, type, managedListener);
1787
+ }
1788
+ }
1789
+ function addShadowRootEventListener(sr, type, listener, _options) {
1790
+ if (process.env.NODE_ENV !== 'production') {
1791
+ if (!isEventListenerOrEventListenerObject(listener)) {
1792
+ throw new TypeError(`Invalid second argument for ShadowRoot.addEventListener() in ${toString(sr)} for event "${type}". Expected EventListener or EventListenerObject but received ${listener}.`);
1793
+ }
1794
+ }
1795
+ if (isEventListenerOrEventListenerObject(listener)) {
1796
+ const elm = getHost(sr);
1797
+ const managedListener = getManagedShadowRootListener(listener);
1798
+ attachDOMListener(elm, type, managedListener);
1799
+ }
1800
+ }
1801
+ function removeShadowRootEventListener(sr, type, listener, _options) {
1802
+ if (isEventListenerOrEventListenerObject(listener)) {
1803
+ const elm = getHost(sr);
1804
+ const managedListener = getManagedShadowRootListener(listener);
1805
+ detachDOMListener(elm, type, managedListener);
1806
+ }
1807
+ }
1808
+
1809
+ /*
1810
+ * Copyright (c) 2018, salesforce.com, inc.
1811
+ * All rights reserved.
1812
+ * SPDX-License-Identifier: MIT
1813
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1814
+ */
1815
+ const InternalSlot = new WeakMap();
1816
+ const { createDocumentFragment } = document;
1817
+ function hasInternalSlot(root) {
1818
+ return InternalSlot.has(root);
1819
+ }
1820
+ function getInternalSlot(root) {
1821
+ const record = InternalSlot.get(root);
1822
+ if (isUndefined(record)) {
1823
+ throw new TypeError();
1824
+ }
1825
+ return record;
1826
+ }
1827
+ defineProperty(_Node.prototype, KEY__SHADOW_RESOLVER, {
1828
+ set(fn) {
1829
+ if (isUndefined(fn))
1830
+ return;
1831
+ this[KEY__SHADOW_RESOLVER_PRIVATE] = fn;
1832
+ // TODO [#1164]: temporary propagation of the key
1833
+ setNodeOwnerKey(this, fn.nodeKey);
1834
+ },
1835
+ get() {
1836
+ return this[KEY__SHADOW_RESOLVER_PRIVATE];
1837
+ },
1838
+ configurable: true,
1839
+ enumerable: true,
1840
+ });
1841
+ defineProperty(_globalThis, KEY__IS_NATIVE_SHADOW_ROOT_DEFINED, {
1842
+ value: isNativeShadowRootDefined,
1843
+ });
1844
+ // The isUndefined check is because two copies of synthetic shadow may be loaded on the same page, and this
1845
+ // would throw an error if we tried to redefine it. Plus the whole point is to expose the native method.
1846
+ if (isUndefined(_globalThis[KEY__NATIVE_GET_ELEMENT_BY_ID])) {
1847
+ defineProperty(_globalThis, KEY__NATIVE_GET_ELEMENT_BY_ID, {
1848
+ value: getElementById,
1849
+ configurable: true,
1850
+ });
1851
+ }
1852
+ // See note above.
1853
+ if (isUndefined(_globalThis[KEY__NATIVE_QUERY_SELECTOR_ALL])) {
1854
+ defineProperty(_globalThis, KEY__NATIVE_QUERY_SELECTOR_ALL, {
1855
+ value: querySelectorAll,
1856
+ configurable: true,
1857
+ });
1858
+ }
1859
+ function getShadowRootResolver(node) {
1860
+ return node[KEY__SHADOW_RESOLVER];
1861
+ }
1862
+ function setShadowRootResolver(node, fn) {
1863
+ node[KEY__SHADOW_RESOLVER] = fn;
1864
+ }
1865
+ function isDelegatingFocus(host) {
1866
+ return getInternalSlot(host).delegatesFocus;
1867
+ }
1868
+ function getHost(root) {
1869
+ return getInternalSlot(root).host;
1870
+ }
1871
+ function getShadowRoot(elm) {
1872
+ return getInternalSlot(elm).shadowRoot;
1873
+ }
1874
+ // Intentionally adding `Node` here in addition to `Element` since this check is harmless for nodes
1875
+ // and we can avoid having to cast the type before calling this method in a few places.
1876
+ function isSyntheticShadowHost(node) {
1877
+ const shadowRootRecord = InternalSlot.get(node);
1878
+ return !isUndefined(shadowRootRecord) && node === shadowRootRecord.host;
1879
+ }
1880
+ function isSyntheticShadowRoot(node) {
1881
+ const shadowRootRecord = InternalSlot.get(node);
1882
+ return !isUndefined(shadowRootRecord) && node === shadowRootRecord.shadowRoot;
1883
+ }
1884
+ let uid = 0;
1885
+ function attachShadow(elm, options) {
1886
+ if (InternalSlot.has(elm)) {
1887
+ throw new Error(`Failed to execute 'attachShadow' on 'Element': Shadow root cannot be created on a host which already hosts a shadow tree.`);
1888
+ }
1889
+ const { mode, delegatesFocus } = options;
1890
+ // creating a real fragment for shadowRoot instance
1891
+ const doc = getOwnerDocument(elm);
1892
+ const sr = createDocumentFragment.call(doc);
1893
+ // creating shadow internal record
1894
+ const record = {
1895
+ mode,
1896
+ delegatesFocus: !!delegatesFocus,
1897
+ host: elm,
1898
+ shadowRoot: sr,
1899
+ };
1900
+ InternalSlot.set(sr, record);
1901
+ InternalSlot.set(elm, record);
1902
+ const shadowResolver = () => sr;
1903
+ const x = (shadowResolver.nodeKey = uid++);
1904
+ setNodeKey(elm, x);
1905
+ setShadowRootResolver(sr, shadowResolver);
1906
+ // correcting the proto chain
1907
+ setPrototypeOf(sr, SyntheticShadowRoot.prototype);
1908
+ return sr;
1909
+ }
1910
+ const SyntheticShadowRootDescriptors = {
1911
+ constructor: {
1912
+ writable: true,
1913
+ configurable: true,
1914
+ value: SyntheticShadowRoot,
1915
+ },
1916
+ toString: {
1917
+ writable: true,
1918
+ configurable: true,
1919
+ value() {
1920
+ return `[object ShadowRoot]`;
1921
+ },
1922
+ },
1923
+ synthetic: {
1924
+ writable: false,
1925
+ enumerable: false,
1926
+ configurable: false,
1927
+ value: true,
1928
+ },
1929
+ };
1930
+ const ShadowRootDescriptors = {
1931
+ activeElement: {
1932
+ enumerable: true,
1933
+ configurable: true,
1934
+ get() {
1935
+ const host = getHost(this);
1936
+ const doc = getOwnerDocument(host);
1937
+ const activeElement = DocumentPrototypeActiveElement.call(doc);
1938
+ if (isNull(activeElement)) {
1939
+ return activeElement;
1940
+ }
1941
+ if ((compareDocumentPosition.call(host, activeElement) &
1942
+ DOCUMENT_POSITION_CONTAINED_BY) ===
1943
+ 0) {
1944
+ return null;
1945
+ }
1946
+ // activeElement must be child of the host and owned by it
1947
+ let node = activeElement;
1948
+ while (!isNodeOwnedBy(host, node)) {
1949
+ // parentElement is always an element because we are talking up the tree knowing
1950
+ // that it is a child of the host.
1951
+ node = parentElementGetter.call(node);
1952
+ }
1953
+ // If we have a slot element here that means that we were dealing
1954
+ // with an element that was passed to one of our slots. In this
1955
+ // case, activeElement returns null.
1956
+ if (isSlotElement(node)) {
1957
+ return null;
1958
+ }
1959
+ return node;
1960
+ },
1961
+ },
1962
+ delegatesFocus: {
1963
+ configurable: true,
1964
+ get() {
1965
+ return getInternalSlot(this).delegatesFocus;
1966
+ },
1967
+ },
1968
+ elementFromPoint: {
1969
+ writable: true,
1970
+ enumerable: true,
1971
+ configurable: true,
1972
+ value(left, top) {
1973
+ const host = getHost(this);
1974
+ const doc = getOwnerDocument(host);
1975
+ return fauxElementFromPoint(this, doc, left, top);
1976
+ },
1977
+ },
1978
+ elementsFromPoint: {
1979
+ writable: true,
1980
+ enumerable: true,
1981
+ configurable: true,
1982
+ value(left, top) {
1983
+ const host = getHost(this);
1984
+ const doc = getOwnerDocument(host);
1985
+ return fauxElementsFromPoint(this, doc, left, top);
1986
+ },
1987
+ },
1988
+ getSelection: {
1989
+ writable: true,
1990
+ enumerable: true,
1991
+ configurable: true,
1992
+ value() {
1993
+ throw new Error('Disallowed method "getSelection" on ShadowRoot.');
1994
+ },
1995
+ },
1996
+ host: {
1997
+ enumerable: true,
1998
+ configurable: true,
1999
+ get() {
2000
+ return getHost(this);
2001
+ },
2002
+ },
2003
+ mode: {
2004
+ configurable: true,
2005
+ get() {
2006
+ return getInternalSlot(this).mode;
2007
+ },
2008
+ },
2009
+ styleSheets: {
2010
+ enumerable: true,
2011
+ configurable: true,
2012
+ get() {
2013
+ throw new Error();
2014
+ },
2015
+ },
2016
+ };
2017
+ const eventToShadowRootMap = new WeakMap();
2018
+ const NodePatchDescriptors = {
2019
+ insertBefore: {
2020
+ writable: true,
2021
+ enumerable: true,
2022
+ configurable: true,
2023
+ value(newChild, refChild) {
2024
+ insertBefore.call(getHost(this), newChild, refChild);
2025
+ return newChild;
2026
+ },
2027
+ },
2028
+ removeChild: {
2029
+ writable: true,
2030
+ enumerable: true,
2031
+ configurable: true,
2032
+ value(oldChild) {
2033
+ removeChild.call(getHost(this), oldChild);
2034
+ return oldChild;
2035
+ },
2036
+ },
2037
+ appendChild: {
2038
+ writable: true,
2039
+ enumerable: true,
2040
+ configurable: true,
2041
+ value(newChild) {
2042
+ appendChild.call(getHost(this), newChild);
2043
+ return newChild;
2044
+ },
2045
+ },
2046
+ replaceChild: {
2047
+ writable: true,
2048
+ enumerable: true,
2049
+ configurable: true,
2050
+ value(newChild, oldChild) {
2051
+ replaceChild.call(getHost(this), newChild, oldChild);
2052
+ return oldChild;
2053
+ },
2054
+ },
2055
+ addEventListener: {
2056
+ writable: true,
2057
+ enumerable: true,
2058
+ configurable: true,
2059
+ value(type, listener, options) {
2060
+ addShadowRootEventListener(this, type, listener);
2061
+ },
2062
+ },
2063
+ dispatchEvent: {
2064
+ writable: true,
2065
+ enumerable: true,
2066
+ configurable: true,
2067
+ value(evt) {
2068
+ eventToShadowRootMap.set(evt, this);
2069
+ // Typescript does not like it when you treat the `arguments` object as an array
2070
+ // @ts-ignore type-mismatch
2071
+ return dispatchEvent.apply(getHost(this), arguments);
2072
+ },
2073
+ },
2074
+ removeEventListener: {
2075
+ writable: true,
2076
+ enumerable: true,
2077
+ configurable: true,
2078
+ value(type, listener, options) {
2079
+ removeShadowRootEventListener(this, type, listener);
2080
+ },
2081
+ },
2082
+ baseURI: {
2083
+ enumerable: true,
2084
+ configurable: true,
2085
+ get() {
2086
+ return getHost(this).baseURI;
2087
+ },
2088
+ },
2089
+ childNodes: {
2090
+ enumerable: true,
2091
+ configurable: true,
2092
+ get() {
2093
+ return createStaticNodeList(shadowRootChildNodes(this));
2094
+ },
2095
+ },
2096
+ cloneNode: {
2097
+ writable: true,
2098
+ enumerable: true,
2099
+ configurable: true,
2100
+ value() {
2101
+ throw new Error('Disallowed method "cloneNode" on ShadowRoot.');
2102
+ },
2103
+ },
2104
+ compareDocumentPosition: {
2105
+ writable: true,
2106
+ enumerable: true,
2107
+ configurable: true,
2108
+ value(otherNode) {
2109
+ const host = getHost(this);
2110
+ if (this === otherNode) {
2111
+ // "this" and "otherNode" are the same shadow root.
2112
+ return 0;
2113
+ }
2114
+ else if (this.contains(otherNode)) {
2115
+ // "otherNode" belongs to the shadow tree where "this" is the shadow root.
2116
+ return 20; // Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING
2117
+ }
2118
+ else if (compareDocumentPosition.call(host, otherNode) & DOCUMENT_POSITION_CONTAINED_BY) {
2119
+ // "otherNode" is in a different shadow tree contained by the shadow tree where "this" is the shadow root.
2120
+ return 37; // Node.DOCUMENT_POSITION_DISCONNECTED | Node.DOCUMENT_POSITION_FOLLOWING | Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
2121
+ }
2122
+ else {
2123
+ // "otherNode" is in a different shadow tree that is not contained by the shadow tree where "this" is the shadow root.
2124
+ return 35; // Node.DOCUMENT_POSITION_DISCONNECTED | Node.DOCUMENT_POSITION_PRECEDING | Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
2125
+ }
2126
+ },
2127
+ },
2128
+ contains: {
2129
+ writable: true,
2130
+ enumerable: true,
2131
+ configurable: true,
2132
+ value(otherNode) {
2133
+ if (this === otherNode) {
2134
+ return true;
2135
+ }
2136
+ const host = getHost(this);
2137
+ // must be child of the host and owned by it.
2138
+ return ((compareDocumentPosition.call(host, otherNode) & DOCUMENT_POSITION_CONTAINED_BY) !==
2139
+ 0 && isNodeOwnedBy(host, otherNode));
2140
+ },
2141
+ },
2142
+ firstChild: {
2143
+ enumerable: true,
2144
+ configurable: true,
2145
+ get() {
2146
+ const childNodes = getInternalChildNodes(this);
2147
+ return childNodes[0] || null;
2148
+ },
2149
+ },
2150
+ lastChild: {
2151
+ enumerable: true,
2152
+ configurable: true,
2153
+ get() {
2154
+ const childNodes = getInternalChildNodes(this);
2155
+ return childNodes[childNodes.length - 1] || null;
2156
+ },
2157
+ },
2158
+ hasChildNodes: {
2159
+ writable: true,
2160
+ enumerable: true,
2161
+ configurable: true,
2162
+ value() {
2163
+ const childNodes = getInternalChildNodes(this);
2164
+ return childNodes.length > 0;
2165
+ },
2166
+ },
2167
+ isConnected: {
2168
+ enumerable: true,
2169
+ configurable: true,
2170
+ get() {
2171
+ return isConnected.call(getHost(this));
2172
+ },
2173
+ },
2174
+ nextSibling: {
2175
+ enumerable: true,
2176
+ configurable: true,
2177
+ get() {
2178
+ return null;
2179
+ },
2180
+ },
2181
+ previousSibling: {
2182
+ enumerable: true,
2183
+ configurable: true,
2184
+ get() {
2185
+ return null;
2186
+ },
2187
+ },
2188
+ nodeName: {
2189
+ enumerable: true,
2190
+ configurable: true,
2191
+ get() {
2192
+ return '#document-fragment';
2193
+ },
2194
+ },
2195
+ nodeType: {
2196
+ enumerable: true,
2197
+ configurable: true,
2198
+ get() {
2199
+ return 11; // Node.DOCUMENT_FRAGMENT_NODE
2200
+ },
2201
+ },
2202
+ nodeValue: {
2203
+ enumerable: true,
2204
+ configurable: true,
2205
+ get() {
2206
+ return null;
2207
+ },
2208
+ },
2209
+ ownerDocument: {
2210
+ enumerable: true,
2211
+ configurable: true,
2212
+ get() {
2213
+ return getHost(this).ownerDocument;
2214
+ },
2215
+ },
2216
+ parentElement: {
2217
+ enumerable: true,
2218
+ configurable: true,
2219
+ get() {
2220
+ return null;
2221
+ },
2222
+ },
2223
+ parentNode: {
2224
+ enumerable: true,
2225
+ configurable: true,
2226
+ get() {
2227
+ return null;
2228
+ },
2229
+ },
2230
+ textContent: {
2231
+ enumerable: true,
2232
+ configurable: true,
2233
+ get() {
2234
+ const childNodes = getInternalChildNodes(this);
2235
+ let textContent = '';
2236
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
2237
+ const currentNode = childNodes[i];
2238
+ if (currentNode.nodeType !== COMMENT_NODE) {
2239
+ textContent += getTextContent(currentNode);
2240
+ }
2241
+ }
2242
+ return textContent;
2243
+ },
2244
+ set(v) {
2245
+ const host = getHost(this);
2246
+ textContextSetter.call(host, v);
2247
+ },
2248
+ },
2249
+ // Since the synthetic shadow root is a detached DocumentFragment, short-circuit the getRootNode behavior
2250
+ getRootNode: {
2251
+ writable: true,
2252
+ enumerable: true,
2253
+ configurable: true,
2254
+ value(options) {
2255
+ return !isUndefined(options) && isTrue(options.composed)
2256
+ ? getHost(this).getRootNode(options)
2257
+ : this;
2258
+ },
2259
+ },
2260
+ };
2261
+ const ElementPatchDescriptors = {
2262
+ innerHTML: {
2263
+ enumerable: true,
2264
+ configurable: true,
2265
+ get() {
2266
+ const childNodes = getInternalChildNodes(this);
2267
+ let innerHTML = '';
2268
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
2269
+ innerHTML += getOuterHTML(childNodes[i]);
2270
+ }
2271
+ return innerHTML;
2272
+ },
2273
+ set(v) {
2274
+ const host = getHost(this);
2275
+ innerHTMLSetter.call(host, v);
2276
+ },
2277
+ },
2278
+ };
2279
+ const ParentNodePatchDescriptors = {
2280
+ childElementCount: {
2281
+ enumerable: true,
2282
+ configurable: true,
2283
+ get() {
2284
+ return this.children.length;
2285
+ },
2286
+ },
2287
+ children: {
2288
+ enumerable: true,
2289
+ configurable: true,
2290
+ get() {
2291
+ return createStaticHTMLCollection(ArrayFilter.call(shadowRootChildNodes(this), (elm) => elm instanceof Element));
2292
+ },
2293
+ },
2294
+ firstElementChild: {
2295
+ enumerable: true,
2296
+ configurable: true,
2297
+ get() {
2298
+ return this.children[0] || null;
2299
+ },
2300
+ },
2301
+ lastElementChild: {
2302
+ enumerable: true,
2303
+ configurable: true,
2304
+ get() {
2305
+ const { children } = this;
2306
+ return children.item(children.length - 1) || null;
2307
+ },
2308
+ },
2309
+ getElementById: {
2310
+ writable: true,
2311
+ enumerable: true,
2312
+ configurable: true,
2313
+ value() {
2314
+ throw new Error('Disallowed method "getElementById" on ShadowRoot.');
2315
+ },
2316
+ },
2317
+ querySelector: {
2318
+ writable: true,
2319
+ enumerable: true,
2320
+ configurable: true,
2321
+ value(selectors) {
2322
+ return shadowRootQuerySelector(this, selectors);
2323
+ },
2324
+ },
2325
+ querySelectorAll: {
2326
+ writable: true,
2327
+ enumerable: true,
2328
+ configurable: true,
2329
+ value(selectors) {
2330
+ return createStaticNodeList(shadowRootQuerySelectorAll(this, selectors));
2331
+ },
2332
+ },
2333
+ };
2334
+ assign(SyntheticShadowRootDescriptors, NodePatchDescriptors, ParentNodePatchDescriptors, ElementPatchDescriptors, ShadowRootDescriptors);
2335
+ function SyntheticShadowRoot() {
2336
+ throw new TypeError('Illegal constructor');
2337
+ }
2338
+ SyntheticShadowRoot.prototype = create(DocumentFragment.prototype, SyntheticShadowRootDescriptors);
2339
+ // `this.shadowRoot instanceof ShadowRoot` should evaluate to true even for synthetic shadow
2340
+ defineProperty(SyntheticShadowRoot, Symbol.hasInstance, {
2341
+ value: function (object) {
2342
+ // Technically we should walk up the entire prototype chain, but with SyntheticShadowRoot
2343
+ // it's reasonable to assume that no one is doing any deep subclasses here.
2344
+ return (isObject(object) &&
2345
+ !isNull(object) &&
2346
+ (isInstanceOfNativeShadowRoot(object) ||
2347
+ getPrototypeOf(object) === SyntheticShadowRoot.prototype));
2348
+ },
2349
+ });
2350
+ /**
2351
+ * This method is only intended to be used in non-production mode in IE11
2352
+ * and its role is to produce a 1-1 mapping between a shadowRoot instance
2353
+ * and a comment node that is intended to use to trick the IE11 DevTools
2354
+ * to show the content of the shadowRoot in the DOM Explorer.
2355
+ */
2356
+ function getIE11FakeShadowRootPlaceholder(host) {
2357
+ const shadowRoot = getShadowRoot(host);
2358
+ // @ts-ignore this $$placeholder$$ is not a security issue because you must
2359
+ // have access to the shadowRoot in order to extract the fake node, which give
2360
+ // you access to the same childNodes of the shadowRoot, so, who cares.
2361
+ let c = shadowRoot.$$placeholder$$;
2362
+ if (!isUndefined(c)) {
2363
+ return c;
2364
+ }
2365
+ const doc = getOwnerDocument(host);
2366
+ // @ts-ignore $$placeholder$$ is fine, read the node above.
2367
+ c = shadowRoot.$$placeholder$$ = createComment.call(doc, '');
2368
+ defineProperties(c, {
2369
+ childNodes: {
2370
+ get() {
2371
+ return shadowRoot.childNodes;
2372
+ },
2373
+ enumerable: true,
2374
+ configurable: true,
2375
+ },
2376
+ tagName: {
2377
+ get() {
2378
+ return `#shadow-root (${shadowRoot.mode})`;
2379
+ },
2380
+ enumerable: true,
2381
+ configurable: true,
2382
+ },
2383
+ });
2384
+ return c;
2385
+ }
2386
+
2387
+ /*
2388
+ * Copyright (c) 2018, salesforce.com, inc.
2389
+ * All rights reserved.
2390
+ * SPDX-License-Identifier: MIT
2391
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2392
+ */
2393
+ /**
2394
+ @license
2395
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
2396
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
2397
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
2398
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
2399
+ Code distributed by Google as part of the polymer project is also
2400
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
2401
+ */
2402
+ function pathComposer(startNode, composed) {
2403
+ const composedPath = [];
2404
+ let startRoot;
2405
+ if (startNode instanceof Window) {
2406
+ startRoot = startNode;
2407
+ }
2408
+ else if (startNode instanceof _Node) {
2409
+ startRoot = startNode.getRootNode();
2410
+ }
2411
+ else {
2412
+ return composedPath;
2413
+ }
2414
+ let current = startNode;
2415
+ while (!isNull(current)) {
2416
+ composedPath.push(current);
2417
+ if (current instanceof Element || current instanceof Text) {
2418
+ const assignedSlot = current.assignedSlot;
2419
+ if (!isNull(assignedSlot)) {
2420
+ current = assignedSlot;
2421
+ }
2422
+ else {
2423
+ current = current.parentNode;
2424
+ }
2425
+ }
2426
+ else if ((isSyntheticShadowRoot(current) || isInstanceOfNativeShadowRoot(current)) &&
2427
+ (composed || current !== startRoot)) {
2428
+ current = current.host;
2429
+ }
2430
+ else if (current instanceof _Node) {
2431
+ current = current.parentNode;
2432
+ }
2433
+ else {
2434
+ // could be Window
2435
+ current = null;
2436
+ }
2437
+ }
2438
+ let doc;
2439
+ if (startNode instanceof Window) {
2440
+ doc = startNode.document;
2441
+ }
2442
+ else {
2443
+ doc = getOwnerDocument(startNode);
2444
+ }
2445
+ // event composedPath includes window when startNode's ownerRoot is document
2446
+ if (composedPath[composedPath.length - 1] === doc) {
2447
+ composedPath.push(window);
2448
+ }
2449
+ return composedPath;
2450
+ }
2451
+
2452
+ /*
2453
+ * Copyright (c) 2018, salesforce.com, inc.
2454
+ * All rights reserved.
2455
+ * SPDX-License-Identifier: MIT
2456
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2457
+ */
2458
+ /**
2459
+ @license
2460
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
2461
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
2462
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
2463
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
2464
+ Code distributed by Google as part of the polymer project is also
2465
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
2466
+ */
2467
+ function retarget(refNode, path) {
2468
+ if (isNull(refNode)) {
2469
+ return null;
2470
+ }
2471
+ // If ANCESTOR's root is not a shadow root or ANCESTOR's root is BASE's
2472
+ // shadow-including inclusive ancestor, return ANCESTOR.
2473
+ const refNodePath = pathComposer(refNode, true);
2474
+ const p$ = path;
2475
+ for (let i = 0, ancestor, lastRoot, root, rootIdx; i < p$.length; i++) {
2476
+ ancestor = p$[i];
2477
+ root = ancestor instanceof Window ? ancestor : ancestor.getRootNode();
2478
+ if (root !== lastRoot) {
2479
+ rootIdx = refNodePath.indexOf(root);
2480
+ lastRoot = root;
2481
+ }
2482
+ if (!isSyntheticShadowRoot(root) || (!isUndefined(rootIdx) && rootIdx > -1)) {
2483
+ return ancestor;
2484
+ }
2485
+ }
2486
+ return null;
2487
+ }
2488
+
2489
+ /*
2490
+ * Copyright (c) 2018, salesforce.com, inc.
2491
+ * All rights reserved.
2492
+ * SPDX-License-Identifier: MIT
2493
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2494
+ */
2495
+ function fauxElementFromPoint(context, doc, left, top) {
2496
+ const element = elementFromPoint.call(doc, left, top);
2497
+ if (isNull(element)) {
2498
+ return element;
2499
+ }
2500
+ return retarget(context, pathComposer(element, true));
2501
+ }
2502
+
2503
+ /*
2504
+ * Copyright (c) 2018, salesforce.com, inc.
2505
+ * All rights reserved.
2506
+ * SPDX-License-Identifier: MIT
2507
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2508
+ */
2509
+ function elemFromPoint(left, top) {
2510
+ return fauxElementFromPoint(this, this, left, top);
2511
+ }
2512
+ Document.prototype.elementFromPoint = elemFromPoint;
2513
+ function elemsFromPoint(left, top) {
2514
+ return fauxElementsFromPoint(this, this, left, top);
2515
+ }
2516
+ Document.prototype.elementsFromPoint = elemsFromPoint;
2517
+ // Go until we reach to top of the LWC tree
2518
+ defineProperty(Document.prototype, 'activeElement', {
2519
+ get() {
2520
+ let node = DocumentPrototypeActiveElement.call(this);
2521
+ if (isNull(node)) {
2522
+ return node;
2523
+ }
2524
+ while (!isUndefined(getNodeOwnerKey(node))) {
2525
+ node = parentElementGetter.call(node);
2526
+ if (isNull(node)) {
2527
+ return null;
2528
+ }
2529
+ }
2530
+ if (node.tagName === 'HTML') {
2531
+ // IE 11. Active element should never be html element
2532
+ node = this.body;
2533
+ }
2534
+ return node;
2535
+ },
2536
+ enumerable: true,
2537
+ configurable: true,
2538
+ });
2539
+ // The following patched methods hide shadowed elements from global
2540
+ // traversing mechanisms. They are simplified for performance reasons to
2541
+ // filter by ownership and do not account for slotted elements. This
2542
+ // compromise is fine for our synthetic shadow dom because root elements
2543
+ // cannot have slotted elements.
2544
+ // Another compromise here is that all these traversing methods will return
2545
+ // static HTMLCollection or static NodeList. We decided that this compromise
2546
+ // is not a big problem considering the amount of code that is relying on
2547
+ // the liveliness of these results are rare.
2548
+ defineProperty(Document.prototype, 'getElementById', {
2549
+ value() {
2550
+ const elm = getElementById.apply(this, ArraySlice.call(arguments));
2551
+ if (isNull(elm)) {
2552
+ return null;
2553
+ }
2554
+ // Note: we deviate from native shadow here, but are not fixing
2555
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2556
+ return isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm) ? elm : null;
2557
+ },
2558
+ writable: true,
2559
+ enumerable: true,
2560
+ configurable: true,
2561
+ });
2562
+ defineProperty(Document.prototype, 'querySelector', {
2563
+ value() {
2564
+ const elements = arrayFromCollection(querySelectorAll.apply(this, ArraySlice.call(arguments)));
2565
+ const filtered = ArrayFind.call(elements,
2566
+ // Note: we deviate from native shadow here, but are not fixing
2567
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2568
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2569
+ return !isUndefined(filtered) ? filtered : null;
2570
+ },
2571
+ writable: true,
2572
+ enumerable: true,
2573
+ configurable: true,
2574
+ });
2575
+ defineProperty(Document.prototype, 'querySelectorAll', {
2576
+ value() {
2577
+ const elements = arrayFromCollection(querySelectorAll.apply(this, ArraySlice.call(arguments)));
2578
+ const filtered = ArrayFilter.call(elements,
2579
+ // Note: we deviate from native shadow here, but are not fixing
2580
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2581
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2582
+ return createStaticNodeList(filtered);
2583
+ },
2584
+ writable: true,
2585
+ enumerable: true,
2586
+ configurable: true,
2587
+ });
2588
+ defineProperty(Document.prototype, 'getElementsByClassName', {
2589
+ value() {
2590
+ const elements = arrayFromCollection(getElementsByClassName.apply(this, ArraySlice.call(arguments)));
2591
+ const filtered = ArrayFilter.call(elements,
2592
+ // Note: we deviate from native shadow here, but are not fixing
2593
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2594
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2595
+ return createStaticHTMLCollection(filtered);
2596
+ },
2597
+ writable: true,
2598
+ enumerable: true,
2599
+ configurable: true,
2600
+ });
2601
+ defineProperty(Document.prototype, 'getElementsByTagName', {
2602
+ value() {
2603
+ const elements = arrayFromCollection(getElementsByTagName.apply(this, ArraySlice.call(arguments)));
2604
+ const filtered = ArrayFilter.call(elements,
2605
+ // Note: we deviate from native shadow here, but are not fixing
2606
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2607
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2608
+ return createStaticHTMLCollection(filtered);
2609
+ },
2610
+ writable: true,
2611
+ enumerable: true,
2612
+ configurable: true,
2613
+ });
2614
+ defineProperty(Document.prototype, 'getElementsByTagNameNS', {
2615
+ value() {
2616
+ const elements = arrayFromCollection(getElementsByTagNameNS.apply(this, ArraySlice.call(arguments)));
2617
+ const filtered = ArrayFilter.call(elements,
2618
+ // Note: we deviate from native shadow here, but are not fixing
2619
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2620
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2621
+ return createStaticHTMLCollection(filtered);
2622
+ },
2623
+ writable: true,
2624
+ enumerable: true,
2625
+ configurable: true,
2626
+ });
2627
+ defineProperty(
2628
+ // In Firefox v57 and lower, getElementsByName is defined on HTMLDocument.prototype
2629
+ getOwnPropertyDescriptor(HTMLDocument.prototype, 'getElementsByName')
2630
+ ? HTMLDocument.prototype
2631
+ : Document.prototype, 'getElementsByName', {
2632
+ value() {
2633
+ const elements = arrayFromCollection(getElementsByName.apply(this, ArraySlice.call(arguments)));
2634
+ const filtered = ArrayFilter.call(elements,
2635
+ // Note: we deviate from native shadow here, but are not fixing
2636
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
2637
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(elm));
2638
+ return createStaticNodeList(filtered);
2639
+ },
2640
+ writable: true,
2641
+ enumerable: true,
2642
+ configurable: true,
2643
+ });
2644
+
2645
+ /*
2646
+ * Copyright (c) 2018, salesforce.com, inc.
2647
+ * All rights reserved.
2648
+ * SPDX-License-Identifier: MIT
2649
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2650
+ */
2651
+ Object.defineProperty(window, 'ShadowRoot', {
2652
+ value: SyntheticShadowRoot,
2653
+ configurable: true,
2654
+ writable: true,
2655
+ });
2656
+
2657
+ /*
2658
+ * Copyright (c) 2018, salesforce.com, inc.
2659
+ * All rights reserved.
2660
+ * SPDX-License-Identifier: MIT
2661
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2662
+ */
2663
+ const composedDescriptor = Object.getOwnPropertyDescriptor(Event.prototype, 'composed');
2664
+ function detect$3() {
2665
+ if (!composedDescriptor) {
2666
+ // No need to apply this polyfill if this client completely lacks
2667
+ // support for the composed property.
2668
+ return false;
2669
+ }
2670
+ // Assigning a throwaway click event here to suppress a ts error when we
2671
+ // pass clickEvent into the composed getter below. The error is:
2672
+ // [ts] Variable 'clickEvent' is used before being assigned.
2673
+ let clickEvent = new Event('click');
2674
+ const button = document.createElement('button');
2675
+ button.addEventListener('click', (event) => (clickEvent = event));
2676
+ button.click();
2677
+ return !composedDescriptor.get.call(clickEvent);
2678
+ }
2679
+
2680
+ /*
2681
+ * Copyright (c) 2018, salesforce.com, inc.
2682
+ * All rights reserved.
2683
+ * SPDX-License-Identifier: MIT
2684
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2685
+ */
2686
+ const originalClickDescriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'click');
2687
+ function handleClick(event) {
2688
+ Object.defineProperty(event, 'composed', {
2689
+ configurable: true,
2690
+ enumerable: true,
2691
+ get() {
2692
+ return true;
2693
+ },
2694
+ });
2695
+ }
2696
+ function apply$3() {
2697
+ HTMLElement.prototype.click = function () {
2698
+ addEventListener.call(this, 'click', handleClick);
2699
+ try {
2700
+ originalClickDescriptor.value.call(this);
2701
+ }
2702
+ finally {
2703
+ removeEventListener.call(this, 'click', handleClick);
2704
+ }
2705
+ };
2706
+ }
2707
+
2708
+ /*
2709
+ * Copyright (c) 2018, salesforce.com, inc.
2710
+ * All rights reserved.
2711
+ * SPDX-License-Identifier: MIT
2712
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2713
+ */
2714
+ if (detect$3()) {
2715
+ apply$3();
2716
+ }
2717
+
2718
+ /*
2719
+ * Copyright (c) 2018, salesforce.com, inc.
2720
+ * All rights reserved.
2721
+ * SPDX-License-Identifier: MIT
2722
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2723
+ */
2724
+ function detect$2() {
2725
+ return new Event('test', { composed: true }).composed !== true;
2726
+ }
2727
+
2728
+ /*
2729
+ * Copyright (c) 2018, salesforce.com, inc.
2730
+ * All rights reserved.
2731
+ * SPDX-License-Identifier: MIT
2732
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2733
+ */
2734
+ function apply$2() {
2735
+ // https://github.com/w3c/webcomponents/issues/513#issuecomment-224183937
2736
+ const composedEvents = assign(create(null), {
2737
+ beforeinput: 1,
2738
+ blur: 1,
2739
+ click: 1,
2740
+ compositionend: 1,
2741
+ compositionstart: 1,
2742
+ compositionupdate: 1,
2743
+ copy: 1,
2744
+ cut: 1,
2745
+ dblclick: 1,
2746
+ DOMActivate: 1,
2747
+ DOMFocusIn: 1,
2748
+ DOMFocusOut: 1,
2749
+ drag: 1,
2750
+ dragend: 1,
2751
+ dragenter: 1,
2752
+ dragleave: 1,
2753
+ dragover: 1,
2754
+ dragstart: 1,
2755
+ drop: 1,
2756
+ focus: 1,
2757
+ focusin: 1,
2758
+ focusout: 1,
2759
+ gotpointercapture: 1,
2760
+ input: 1,
2761
+ keydown: 1,
2762
+ keypress: 1,
2763
+ keyup: 1,
2764
+ lostpointercapture: 1,
2765
+ mousedown: 1,
2766
+ mouseenter: 1,
2767
+ mouseleave: 1,
2768
+ mousemove: 1,
2769
+ mouseout: 1,
2770
+ mouseover: 1,
2771
+ mouseup: 1,
2772
+ paste: 1,
2773
+ pointercancel: 1,
2774
+ pointerdown: 1,
2775
+ pointerenter: 1,
2776
+ pointerleave: 1,
2777
+ pointermove: 1,
2778
+ pointerout: 1,
2779
+ pointerover: 1,
2780
+ pointerup: 1,
2781
+ touchcancel: 1,
2782
+ touchend: 1,
2783
+ touchmove: 1,
2784
+ touchstart: 1,
2785
+ wheel: 1,
2786
+ });
2787
+ const EventConstructor = Event;
2788
+ // Patch Event constructor to add the composed property on events created via new Event.
2789
+ function PatchedEvent(type, eventInitDict) {
2790
+ const event = new EventConstructor(type, eventInitDict);
2791
+ const isComposed = !!(eventInitDict && eventInitDict.composed);
2792
+ Object.defineProperties(event, {
2793
+ composed: {
2794
+ get() {
2795
+ return isComposed;
2796
+ },
2797
+ configurable: true,
2798
+ enumerable: true,
2799
+ },
2800
+ });
2801
+ return event;
2802
+ }
2803
+ PatchedEvent.prototype = EventConstructor.prototype;
2804
+ PatchedEvent.AT_TARGET = EventConstructor.AT_TARGET;
2805
+ PatchedEvent.BUBBLING_PHASE = EventConstructor.BUBBLING_PHASE;
2806
+ PatchedEvent.CAPTURING_PHASE = EventConstructor.CAPTURING_PHASE;
2807
+ PatchedEvent.NONE = EventConstructor.NONE;
2808
+ window.Event = PatchedEvent;
2809
+ // Patch the Event prototype to add the composed property on user agent dispatched event.
2810
+ Object.defineProperties(Event.prototype, {
2811
+ composed: {
2812
+ get() {
2813
+ const { type } = this;
2814
+ return composedEvents[type] === 1;
2815
+ },
2816
+ configurable: true,
2817
+ enumerable: true,
2818
+ },
2819
+ });
2820
+ }
2821
+
2822
+ /*
2823
+ * Copyright (c) 2018, salesforce.com, inc.
2824
+ * All rights reserved.
2825
+ * SPDX-License-Identifier: MIT
2826
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2827
+ */
2828
+ if (detect$2()) {
2829
+ apply$2();
2830
+ }
2831
+
2832
+ /*
2833
+ * Copyright (c) 2018, salesforce.com, inc.
2834
+ * All rights reserved.
2835
+ * SPDX-License-Identifier: MIT
2836
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2837
+ */
2838
+ const CustomEventConstructor = CustomEvent;
2839
+ function PatchedCustomEvent(type, eventInitDict) {
2840
+ const event = new CustomEventConstructor(type, eventInitDict);
2841
+ const isComposed = !!(eventInitDict && eventInitDict.composed);
2842
+ Object.defineProperties(event, {
2843
+ composed: {
2844
+ get() {
2845
+ return isComposed;
2846
+ },
2847
+ configurable: true,
2848
+ enumerable: true,
2849
+ },
2850
+ });
2851
+ return event;
2852
+ }
2853
+ PatchedCustomEvent.prototype = CustomEventConstructor.prototype;
2854
+ window.CustomEvent = PatchedCustomEvent;
2855
+
2856
+ /*
2857
+ * Copyright (c) 2018, salesforce.com, inc.
2858
+ * All rights reserved.
2859
+ * SPDX-License-Identifier: MIT
2860
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2861
+ */
2862
+ if (typeof ClipboardEvent !== 'undefined') {
2863
+ const isComposedType = assign(create(null), {
2864
+ copy: 1,
2865
+ cut: 1,
2866
+ paste: 1,
2867
+ });
2868
+ // Patch the prototype to override the composed property on user-agent dispatched events
2869
+ defineProperties(ClipboardEvent.prototype, {
2870
+ composed: {
2871
+ get() {
2872
+ const { type } = this;
2873
+ return isComposedType[type] === 1;
2874
+ },
2875
+ configurable: true,
2876
+ enumerable: true,
2877
+ },
2878
+ });
2879
+ }
2880
+
2881
+ /*
2882
+ * Copyright (c) 2018, salesforce.com, inc.
2883
+ * All rights reserved.
2884
+ * SPDX-License-Identifier: MIT
2885
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2886
+ */
2887
+ function detect$1() {
2888
+ // Note: when using this in mobile apps, we might have a DOM that does not support iframes.
2889
+ const hasIframe = typeof HTMLIFrameElement !== 'undefined';
2890
+ // This polyfill should only apply in compat mode; see https://github.com/salesforce/lwc/issues/1513
2891
+ const isCompat = typeof Proxy !== 'undefined' && isTrue(Proxy.isCompat);
2892
+ return hasIframe && isCompat;
2893
+ }
2894
+
2895
+ /*
2896
+ * Copyright (c) 2018, salesforce.com, inc.
2897
+ * All rights reserved.
2898
+ * SPDX-License-Identifier: MIT
2899
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2900
+ */
2901
+ function apply$1() {
2902
+ // the iframe property descriptor for `contentWindow` should always be available, otherwise this method should never be called
2903
+ const desc = getOwnPropertyDescriptor(HTMLIFrameElement.prototype, 'contentWindow');
2904
+ const { get: originalGetter } = desc;
2905
+ desc.get = function () {
2906
+ const original = originalGetter.call(this);
2907
+ // If the original iframe element is not a keyed node, then do not wrap it
2908
+ if (isNull(original) || isUndefined(getNodeOwnerKey(this))) {
2909
+ return original;
2910
+ }
2911
+ // only if the element is an iframe inside a shadowRoot, we care about this problem
2912
+ // because in that case, the code that is accessing the iframe, is very likely code
2913
+ // compiled with proxy-compat transformation. It is true that other code without those
2914
+ // transformations might also access an iframe from within a shadowRoot, but in that,
2915
+ // case, which is more rare, we still return the wrapper, and it should work the same,
2916
+ // this part is just an optimization.
2917
+ return wrapIframeWindow(original);
2918
+ };
2919
+ defineProperty(HTMLIFrameElement.prototype, 'contentWindow', desc);
2920
+ }
2921
+ function wrapIframeWindow(win) {
2922
+ return {
2923
+ addEventListener() {
2924
+ // Typescript does not like it when you treat the `arguments` object as an array
2925
+ // @ts-ignore type-mismatch
2926
+ return win.addEventListener.apply(win, arguments);
2927
+ },
2928
+ blur() {
2929
+ // Typescript does not like it when you treat the `arguments` object as an array
2930
+ // @ts-ignore type-mismatch
2931
+ return win.blur.apply(win, arguments);
2932
+ },
2933
+ close() {
2934
+ // Typescript does not like it when you treat the `arguments` object as an array
2935
+ // @ts-ignore type-mismatch
2936
+ return win.close.apply(win, arguments);
2937
+ },
2938
+ focus() {
2939
+ // Typescript does not like it when you treat the `arguments` object as an array
2940
+ // @ts-ignore type-mismatch
2941
+ return win.focus.apply(win, arguments);
2942
+ },
2943
+ postMessage() {
2944
+ // Typescript does not like it when you treat the `arguments` object as an array
2945
+ // @ts-ignore type-mismatch
2946
+ return win.postMessage.apply(win, arguments);
2947
+ },
2948
+ removeEventListener() {
2949
+ // Typescript does not like it when you treat the `arguments` object as an array
2950
+ // @ts-ignore type-mismatch
2951
+ return win.removeEventListener.apply(win, arguments);
2952
+ },
2953
+ get closed() {
2954
+ return win.closed;
2955
+ },
2956
+ get frames() {
2957
+ return win.frames;
2958
+ },
2959
+ get length() {
2960
+ return win.length;
2961
+ },
2962
+ get location() {
2963
+ return win.location;
2964
+ },
2965
+ set location(value) {
2966
+ win.location = value;
2967
+ },
2968
+ get opener() {
2969
+ return win.opener;
2970
+ },
2971
+ get parent() {
2972
+ return win.parent;
2973
+ },
2974
+ get self() {
2975
+ return win.self;
2976
+ },
2977
+ get top() {
2978
+ return win.top;
2979
+ },
2980
+ get window() {
2981
+ return win.window;
2982
+ },
2983
+ }; // this is limited
2984
+ }
2985
+
2986
+ /*
2987
+ * Copyright (c) 2018, salesforce.com, inc.
2988
+ * All rights reserved.
2989
+ * SPDX-License-Identifier: MIT
2990
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
2991
+ */
2992
+ if (detect$1()) {
2993
+ apply$1();
2994
+ }
2995
+
2996
+ /*
2997
+ * Copyright (c) 2018, salesforce.com, inc.
2998
+ * All rights reserved.
2999
+ * SPDX-License-Identifier: MIT
3000
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3001
+ */
3002
+ const OriginalMutationObserver = MutationObserver;
3003
+ const { disconnect: originalDisconnect, observe: originalObserve, takeRecords: originalTakeRecords, } = OriginalMutationObserver.prototype;
3004
+ // Internal fields to maintain relationships
3005
+ const wrapperLookupField = '$$lwcObserverCallbackWrapper$$';
3006
+ const observerLookupField = '$$lwcNodeObservers$$';
3007
+ const observerToNodesMap = new WeakMap();
3008
+ function getNodeObservers(node) {
3009
+ return node[observerLookupField];
3010
+ }
3011
+ function setNodeObservers(node, observers) {
3012
+ node[observerLookupField] = observers;
3013
+ }
3014
+ /**
3015
+ * Retarget the mutation record's target value to its shadowRoot
3016
+ * @param {MutationRecord} originalRecord
3017
+ */
3018
+ function retargetMutationRecord(originalRecord) {
3019
+ const { addedNodes, removedNodes, target, type } = originalRecord;
3020
+ const retargetedRecord = create(MutationRecord.prototype);
3021
+ defineProperties(retargetedRecord, {
3022
+ addedNodes: {
3023
+ get() {
3024
+ return addedNodes;
3025
+ },
3026
+ enumerable: true,
3027
+ configurable: true,
3028
+ },
3029
+ removedNodes: {
3030
+ get() {
3031
+ return removedNodes;
3032
+ },
3033
+ enumerable: true,
3034
+ configurable: true,
3035
+ },
3036
+ type: {
3037
+ get() {
3038
+ return type;
3039
+ },
3040
+ enumerable: true,
3041
+ configurable: true,
3042
+ },
3043
+ target: {
3044
+ get() {
3045
+ return target.shadowRoot;
3046
+ },
3047
+ enumerable: true,
3048
+ configurable: true,
3049
+ },
3050
+ });
3051
+ return retargetedRecord;
3052
+ }
3053
+ /**
3054
+ * Utility to identify if a target node is being observed by the given observer
3055
+ * Start at the current node, if the observer is registered to observe the current node, the mutation qualifies
3056
+ * @param {MutationObserver} observer
3057
+ * @param {Node} target
3058
+ */
3059
+ function isQualifiedObserver(observer, target) {
3060
+ let parentNode = target;
3061
+ while (!isNull(parentNode)) {
3062
+ const parentNodeObservers = getNodeObservers(parentNode);
3063
+ if (!isUndefined(parentNodeObservers) &&
3064
+ (parentNodeObservers[0] === observer || // perf optimization to check for the first item is a match
3065
+ ArrayIndexOf.call(parentNodeObservers, observer) !== -1)) {
3066
+ return true;
3067
+ }
3068
+ parentNode = parentNode.parentNode;
3069
+ }
3070
+ return false;
3071
+ }
3072
+ /**
3073
+ * This function provides a shadow dom compliant filtered view of mutation records for a given observer.
3074
+ *
3075
+ * The key logic here is to determine if a given observer has been registered to observe any nodes
3076
+ * between the target node of a mutation record to the target's root node.
3077
+ * This function also retargets records when mutations occur directly under the shadow root
3078
+ * @param {MutationRecords[]} mutations
3079
+ * @param {MutationObserver} observer
3080
+ */
3081
+ function filterMutationRecords(mutations, observer) {
3082
+ return ArrayReduce.call(mutations, (filteredSet, record) => {
3083
+ const { target, addedNodes, removedNodes, type } = record;
3084
+ // If target is an lwc host,
3085
+ // Determine if the mutations affected the host or the shadowRoot
3086
+ // Mutations affecting host: changes to slot content
3087
+ // Mutations affecting shadowRoot: changes to template content
3088
+ if (type === 'childList' && !isUndefined(getNodeKey(target))) {
3089
+ // In case of added nodes, we can climb up the tree and determine eligibility
3090
+ if (addedNodes.length > 0) {
3091
+ // Optimization: Peek in and test one node to decide if the MutationRecord qualifies
3092
+ // The remaining nodes in this MutationRecord will have the same ownerKey
3093
+ const sampleNode = addedNodes[0];
3094
+ if (isQualifiedObserver(observer, sampleNode)) {
3095
+ // If the target was being observed, then return record as-is
3096
+ // this will be the case for slot content
3097
+ const nodeObservers = getNodeObservers(target);
3098
+ if (nodeObservers &&
3099
+ (nodeObservers[0] === observer ||
3100
+ ArrayIndexOf.call(nodeObservers, observer) !== -1)) {
3101
+ ArrayPush.call(filteredSet, record);
3102
+ }
3103
+ else {
3104
+ // else, must be observing the shadowRoot
3105
+ ArrayPush.call(filteredSet, retargetMutationRecord(record));
3106
+ }
3107
+ }
3108
+ }
3109
+ else {
3110
+ // In the case of removed nodes, climbing the tree is not an option as the nodes are disconnected
3111
+ // We can only check if either the host or shadow root was observed and qualify the record
3112
+ const shadowRoot = target.shadowRoot;
3113
+ const sampleNode = removedNodes[0];
3114
+ if (getNodeNearestOwnerKey(target) === getNodeNearestOwnerKey(sampleNode) && // trickery: sampleNode is slot content
3115
+ isQualifiedObserver(observer, target) // use target as a close enough reference to climb up
3116
+ ) {
3117
+ ArrayPush.call(filteredSet, record);
3118
+ }
3119
+ else if (shadowRoot) {
3120
+ const shadowRootObservers = getNodeObservers(shadowRoot);
3121
+ if (shadowRootObservers &&
3122
+ (shadowRootObservers[0] === observer ||
3123
+ ArrayIndexOf.call(shadowRootObservers, observer) !== -1)) {
3124
+ ArrayPush.call(filteredSet, retargetMutationRecord(record));
3125
+ }
3126
+ }
3127
+ }
3128
+ }
3129
+ else {
3130
+ // Mutation happened under a root node(shadow root or document) and the decision is straighforward
3131
+ // Ascend the tree starting from target and check if observer is qualified
3132
+ if (isQualifiedObserver(observer, target)) {
3133
+ ArrayPush.call(filteredSet, record);
3134
+ }
3135
+ }
3136
+ return filteredSet;
3137
+ }, []);
3138
+ }
3139
+ function getWrappedCallback(callback) {
3140
+ let wrappedCallback = callback[wrapperLookupField];
3141
+ if (isUndefined(wrappedCallback)) {
3142
+ wrappedCallback = callback[wrapperLookupField] = (mutations, observer) => {
3143
+ // Filter mutation records
3144
+ const filteredRecords = filterMutationRecords(mutations, observer);
3145
+ // If not records are eligible for the observer, do not invoke callback
3146
+ if (filteredRecords.length === 0) {
3147
+ return;
3148
+ }
3149
+ callback.call(observer, filteredRecords, observer);
3150
+ };
3151
+ }
3152
+ return wrappedCallback;
3153
+ }
3154
+ /**
3155
+ * Patched MutationObserver constructor.
3156
+ * 1. Wrap the callback to filter out MutationRecords based on dom ownership
3157
+ * 2. Add a property field to track all observed targets of the observer instance
3158
+ * @param {MutationCallback} callback
3159
+ */
3160
+ function PatchedMutationObserver(callback) {
3161
+ const wrappedCallback = getWrappedCallback(callback);
3162
+ const observer = new OriginalMutationObserver(wrappedCallback);
3163
+ return observer;
3164
+ }
3165
+ function patchedDisconnect() {
3166
+ originalDisconnect.call(this);
3167
+ // Clear the node to observer reference which is a strong references
3168
+ const observedNodes = observerToNodesMap.get(this);
3169
+ if (!isUndefined(observedNodes)) {
3170
+ forEach.call(observedNodes, (observedNode) => {
3171
+ const observers = observedNode[observerLookupField];
3172
+ if (!isUndefined(observers)) {
3173
+ const index = ArrayIndexOf.call(observers, this);
3174
+ if (index !== -1) {
3175
+ ArraySplice.call(observers, index, 1);
3176
+ }
3177
+ }
3178
+ });
3179
+ observedNodes.length = 0;
3180
+ }
3181
+ }
3182
+ /**
3183
+ * A single mutation observer can observe multiple nodes(target).
3184
+ * Maintain a list of all targets that the observer chooses to observe
3185
+ * @param {Node} target
3186
+ * @param {Object} options
3187
+ */
3188
+ function patchedObserve(target, options) {
3189
+ let targetObservers = getNodeObservers(target);
3190
+ // Maintain a list of all observers that want to observe a node
3191
+ if (isUndefined(targetObservers)) {
3192
+ targetObservers = [];
3193
+ setNodeObservers(target, targetObservers);
3194
+ }
3195
+ // Same observer trying to observe the same node
3196
+ if (ArrayIndexOf.call(targetObservers, this) === -1) {
3197
+ ArrayPush.call(targetObservers, this);
3198
+ } // else There is more bookkeeping to do here https://dom.spec.whatwg.org/#dom-mutationobserver-observe Step #7
3199
+ // SyntheticShadowRoot instances are not actually a part of the DOM so observe the host instead.
3200
+ if (isSyntheticShadowRoot(target)) {
3201
+ target = target.host;
3202
+ }
3203
+ // maintain a list of all nodes observed by this observer
3204
+ if (observerToNodesMap.has(this)) {
3205
+ const observedNodes = observerToNodesMap.get(this);
3206
+ if (ArrayIndexOf.call(observedNodes, target) === -1) {
3207
+ ArrayPush.call(observedNodes, target);
3208
+ }
3209
+ }
3210
+ else {
3211
+ observerToNodesMap.set(this, [target]);
3212
+ }
3213
+ return originalObserve.call(this, target, options);
3214
+ }
3215
+ /**
3216
+ * Patch the takeRecords() api to filter MutationRecords based on the observed targets
3217
+ */
3218
+ function patchedTakeRecords() {
3219
+ return filterMutationRecords(originalTakeRecords.call(this), this);
3220
+ }
3221
+ PatchedMutationObserver.prototype = OriginalMutationObserver.prototype;
3222
+ PatchedMutationObserver.prototype.disconnect = patchedDisconnect;
3223
+ PatchedMutationObserver.prototype.observe = patchedObserve;
3224
+ PatchedMutationObserver.prototype.takeRecords = patchedTakeRecords;
3225
+ defineProperty(window, 'MutationObserver', {
3226
+ value: PatchedMutationObserver,
3227
+ configurable: true,
3228
+ writable: true,
3229
+ });
3230
+
3231
+ /*
3232
+ * Copyright (c) 2018, salesforce.com, inc.
3233
+ * All rights reserved.
3234
+ * SPDX-License-Identifier: MIT
3235
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3236
+ */
3237
+ function patchedAddEventListener$1(type, listener, optionsOrCapture) {
3238
+ if (isSyntheticShadowHost(this)) {
3239
+ // Typescript does not like it when you treat the `arguments` object as an array
3240
+ // @ts-ignore type-mismatch
3241
+ return addCustomElementEventListener.apply(this, arguments);
3242
+ }
3243
+ if (arguments.length < 2) {
3244
+ // Slow path, unlikely to be called frequently. We expect modern browsers to throw:
3245
+ // https://googlechrome.github.io/samples/event-listeners-mandatory-arguments/
3246
+ const args = ArraySlice.call(arguments);
3247
+ if (args.length > 1) {
3248
+ args[1] = getEventListenerWrapper(args[1]);
3249
+ }
3250
+ // Ignore types because we're passing through to native method
3251
+ // @ts-ignore type-mismatch
3252
+ return addEventListener.apply(this, args);
3253
+ }
3254
+ // Fast path. This function is optimized to avoid ArraySlice because addEventListener is called
3255
+ // very frequently, and it provides a measurable perf boost to avoid so much array cloning.
3256
+ const wrappedListener = getEventListenerWrapper(listener);
3257
+ // The third argument is optional, so passing in `undefined` for `optionsOrCapture` gives capture=false
3258
+ return addEventListener.call(this, type, wrappedListener, optionsOrCapture);
3259
+ }
3260
+ function patchedRemoveEventListener$1(_type, _listener, _optionsOrCapture) {
3261
+ if (isSyntheticShadowHost(this)) {
3262
+ // Typescript does not like it when you treat the `arguments` object as an array
3263
+ // @ts-ignore type-mismatch
3264
+ return removeCustomElementEventListener.apply(this, arguments);
3265
+ }
3266
+ const args = ArraySlice.call(arguments);
3267
+ if (arguments.length > 1) {
3268
+ args[1] = getEventListenerWrapper(args[1]);
3269
+ }
3270
+ // Ignore types because we're passing through to native method
3271
+ // @ts-ignore type-mismatch
3272
+ removeEventListener.apply(this, args);
3273
+ // Account for listeners that were added before this polyfill was applied
3274
+ // Typescript does not like it when you treat the `arguments` object as an array
3275
+ // @ts-ignore type-mismatch
3276
+ removeEventListener.apply(this, arguments);
3277
+ }
3278
+ defineProperties(eventTargetPrototype, {
3279
+ addEventListener: {
3280
+ value: patchedAddEventListener$1,
3281
+ enumerable: true,
3282
+ writable: true,
3283
+ configurable: true,
3284
+ },
3285
+ removeEventListener: {
3286
+ value: patchedRemoveEventListener$1,
3287
+ enumerable: true,
3288
+ writable: true,
3289
+ configurable: true,
3290
+ },
3291
+ });
3292
+
3293
+ /*
3294
+ * Copyright (c) 2018, salesforce.com, inc.
3295
+ * All rights reserved.
3296
+ * SPDX-License-Identifier: MIT
3297
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3298
+ */
3299
+ function detect() {
3300
+ return typeof EventTarget === 'undefined';
3301
+ }
3302
+
3303
+ /*
3304
+ * Copyright (c) 2018, salesforce.com, inc.
3305
+ * All rights reserved.
3306
+ * SPDX-License-Identifier: MIT
3307
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3308
+ */
3309
+ function patchedAddEventListener(_type, _listener, _options) {
3310
+ if (arguments.length > 1) {
3311
+ const args = ArraySlice.call(arguments);
3312
+ args[1] = getEventListenerWrapper(args[1]);
3313
+ // Ignore types because we're passing through to native method
3314
+ // @ts-ignore type-mismatch
3315
+ return windowAddEventListener.apply(this, args);
3316
+ }
3317
+ // Typescript does not like it when you treat the `arguments` object as an array
3318
+ // @ts-ignore type-mismatch
3319
+ return windowAddEventListener.apply(this, arguments);
3320
+ }
3321
+ function patchedRemoveEventListener(_type, _listener, _options) {
3322
+ if (arguments.length > 1) {
3323
+ const args = ArraySlice.call(arguments);
3324
+ args[1] = getEventListenerWrapper(args[1]);
3325
+ // Ignore types because we're passing through to native method
3326
+ // @ts-ignore type-mismatch
3327
+ windowRemoveEventListener.apply(this, args);
3328
+ }
3329
+ // Account for listeners that were added before this polyfill was applied
3330
+ // Typescript does not like it when you treat the `arguments` object as an array
3331
+ // @ts-ignore type-mismatch
3332
+ windowRemoveEventListener.apply(this, arguments);
3333
+ }
3334
+ function apply() {
3335
+ defineProperties(Window.prototype, {
3336
+ addEventListener: {
3337
+ value: patchedAddEventListener,
3338
+ enumerable: true,
3339
+ writable: true,
3340
+ configurable: true,
3341
+ },
3342
+ removeEventListener: {
3343
+ value: patchedRemoveEventListener,
3344
+ enumerable: true,
3345
+ writable: true,
3346
+ configurable: true,
3347
+ },
3348
+ });
3349
+ }
3350
+
3351
+ /*
3352
+ * Copyright (c) 2018, salesforce.com, inc.
3353
+ * All rights reserved.
3354
+ * SPDX-License-Identifier: MIT
3355
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3356
+ */
3357
+ if (detect()) {
3358
+ apply();
3359
+ }
3360
+
3361
+ /*
3362
+ * Copyright (c) 2018, salesforce.com, inc.
3363
+ * All rights reserved.
3364
+ * SPDX-License-Identifier: MIT
3365
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3366
+ */
3367
+ function patchedCurrentTargetGetter() {
3368
+ const currentTarget = eventCurrentTargetGetter.call(this);
3369
+ if (isNull(currentTarget)) {
3370
+ return null;
3371
+ }
3372
+ if (eventToContextMap.get(this) === 1 /* EventListenerContext.SHADOW_ROOT_LISTENER */) {
3373
+ return getShadowRoot(currentTarget);
3374
+ }
3375
+ return currentTarget;
3376
+ }
3377
+ function patchedTargetGetter() {
3378
+ const originalTarget = eventTargetGetter.call(this);
3379
+ if (!(originalTarget instanceof _Node)) {
3380
+ return originalTarget;
3381
+ }
3382
+ const doc = getOwnerDocument(originalTarget);
3383
+ const composedPath = pathComposer(originalTarget, this.composed);
3384
+ const originalCurrentTarget = eventCurrentTargetGetter.call(this);
3385
+ // Handle cases where the currentTarget is null (for async events), and when an event has been
3386
+ // added to Window
3387
+ if (!(originalCurrentTarget instanceof _Node)) {
3388
+ // TODO [#1511]: Special escape hatch to support legacy behavior. Should be fixed.
3389
+ // If the event's target is being accessed async and originalTarget is not a keyed element, do not retarget
3390
+ if (isNull(originalCurrentTarget) && isUndefined(getNodeOwnerKey(originalTarget))) {
3391
+ return originalTarget;
3392
+ }
3393
+ return retarget(doc, composedPath);
3394
+ }
3395
+ else if (originalCurrentTarget === doc || originalCurrentTarget === doc.body) {
3396
+ // TODO [#1530]: If currentTarget is document or document.body (Third party libraries that have global event listeners)
3397
+ // and the originalTarget is not a keyed element, do not retarget
3398
+ if (isUndefined(getNodeOwnerKey(originalTarget))) {
3399
+ return originalTarget;
3400
+ }
3401
+ return retarget(doc, composedPath);
3402
+ }
3403
+ let actualCurrentTarget = originalCurrentTarget;
3404
+ let actualPath = composedPath;
3405
+ // Address the possibility that `currentTarget` is a shadow root
3406
+ if (isSyntheticShadowHost(originalCurrentTarget)) {
3407
+ const context = eventToContextMap.get(this);
3408
+ if (context === 1 /* EventListenerContext.SHADOW_ROOT_LISTENER */) {
3409
+ actualCurrentTarget = getShadowRoot(originalCurrentTarget);
3410
+ }
3411
+ }
3412
+ // Address the possibility that `target` is a shadow root
3413
+ if (isSyntheticShadowHost(originalTarget) && eventToShadowRootMap.has(this)) {
3414
+ actualPath = pathComposer(getShadowRoot(originalTarget), this.composed);
3415
+ }
3416
+ return retarget(actualCurrentTarget, actualPath);
3417
+ }
3418
+ function patchedComposedPathValue() {
3419
+ const originalTarget = eventTargetGetter.call(this);
3420
+ // Account for events with targets that are not instances of Node (e.g., when a readystatechange
3421
+ // handler is listening on an instance of XMLHttpRequest).
3422
+ if (!(originalTarget instanceof _Node)) {
3423
+ return [];
3424
+ }
3425
+ // If the original target is inside a native shadow root, then just call the native
3426
+ // composePath() method. The event is already retargeted and this causes our composedPath()
3427
+ // polyfill to compute the wrong value. This is only an issue when you have a native web
3428
+ // component inside an LWC component (see test in same commit) but this scenario is unlikely
3429
+ // because we don't yet support that. Workaround specifically for W-9846457. Mixed mode solution
3430
+ // will likely be more involved.
3431
+ const hasShadowRoot = Boolean(originalTarget.shadowRoot);
3432
+ const hasSyntheticShadowRootAttached = hasInternalSlot(originalTarget);
3433
+ if (hasShadowRoot && !hasSyntheticShadowRootAttached) {
3434
+ return composedPath.call(this);
3435
+ }
3436
+ const originalCurrentTarget = eventCurrentTargetGetter.call(this);
3437
+ // If the event has completed propagation, the composedPath should be an empty array.
3438
+ if (isNull(originalCurrentTarget)) {
3439
+ return [];
3440
+ }
3441
+ // Address the possibility that `target` is a shadow root
3442
+ let actualTarget = originalTarget;
3443
+ if (isSyntheticShadowHost(originalTarget) && eventToShadowRootMap.has(this)) {
3444
+ actualTarget = getShadowRoot(originalTarget);
3445
+ }
3446
+ return pathComposer(actualTarget, this.composed);
3447
+ }
3448
+ defineProperties(Event.prototype, {
3449
+ target: {
3450
+ get: patchedTargetGetter,
3451
+ enumerable: true,
3452
+ configurable: true,
3453
+ },
3454
+ currentTarget: {
3455
+ get: patchedCurrentTargetGetter,
3456
+ enumerable: true,
3457
+ configurable: true,
3458
+ },
3459
+ composedPath: {
3460
+ value: patchedComposedPathValue,
3461
+ writable: true,
3462
+ enumerable: true,
3463
+ configurable: true,
3464
+ },
3465
+ // Non-standard but widely supported for backwards-compatibility
3466
+ srcElement: {
3467
+ get: patchedTargetGetter,
3468
+ enumerable: true,
3469
+ configurable: true,
3470
+ },
3471
+ // Non-standard but implemented in Chrome and continues to exist for backwards-compatibility
3472
+ // https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/renderer/core/dom/events/event.idl;l=58?q=event.idl&ss=chromium
3473
+ path: {
3474
+ get: patchedComposedPathValue,
3475
+ enumerable: true,
3476
+ configurable: true,
3477
+ },
3478
+ });
3479
+
3480
+ /*
3481
+ * Copyright (c) 2018, salesforce.com, inc.
3482
+ * All rights reserved.
3483
+ * SPDX-License-Identifier: MIT
3484
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3485
+ */
3486
+ function retargetRelatedTarget(Ctor) {
3487
+ const relatedTargetGetter = getOwnPropertyDescriptor(Ctor.prototype, 'relatedTarget')
3488
+ .get;
3489
+ defineProperty(Ctor.prototype, 'relatedTarget', {
3490
+ get() {
3491
+ const relatedTarget = relatedTargetGetter.call(this);
3492
+ if (isNull(relatedTarget)) {
3493
+ return null;
3494
+ }
3495
+ if (!(relatedTarget instanceof _Node) || !isNodeShadowed(relatedTarget)) {
3496
+ return relatedTarget;
3497
+ }
3498
+ let pointOfReference = eventCurrentTargetGetter.call(this);
3499
+ if (isNull(pointOfReference)) {
3500
+ pointOfReference = getOwnerDocument(relatedTarget);
3501
+ }
3502
+ return retarget(pointOfReference, pathComposer(relatedTarget, true));
3503
+ },
3504
+ enumerable: true,
3505
+ configurable: true,
3506
+ });
3507
+ }
3508
+
3509
+ /*
3510
+ * Copyright (c) 2018, salesforce.com, inc.
3511
+ * All rights reserved.
3512
+ * SPDX-License-Identifier: MIT
3513
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3514
+ */
3515
+ retargetRelatedTarget(FocusEvent);
3516
+
3517
+ /*
3518
+ * Copyright (c) 2018, salesforce.com, inc.
3519
+ * All rights reserved.
3520
+ * SPDX-License-Identifier: MIT
3521
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3522
+ */
3523
+ retargetRelatedTarget(MouseEvent);
3524
+
3525
+ /*
3526
+ * Copyright (c) 2021, salesforce.com, inc.
3527
+ * All rights reserved.
3528
+ * SPDX-License-Identifier: MIT
3529
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3530
+ */
3531
+ const assignedSlotGetter = hasOwnProperty.call(Text.prototype, 'assignedSlot')
3532
+ ? getOwnPropertyDescriptor(Text.prototype, 'assignedSlot').get
3533
+ : () => null;
3534
+
3535
+ /*
3536
+ * Copyright (c) 2018, salesforce.com, inc.
3537
+ * All rights reserved.
3538
+ * SPDX-License-Identifier: MIT
3539
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3540
+ */
3541
+ // We can use a single observer without having to worry about leaking because
3542
+ // "Registered observers in a node’s registered observer list have a weak
3543
+ // reference to the node."
3544
+ // https://dom.spec.whatwg.org/#garbage-collection
3545
+ let observer;
3546
+ const observerConfig = { childList: true };
3547
+ const SlotChangeKey = new WeakMap();
3548
+ function initSlotObserver() {
3549
+ return new MO((mutations) => {
3550
+ const slots = [];
3551
+ forEach.call(mutations, (mutation) => {
3552
+ if (process.env.NODE_ENV !== 'production') {
3553
+ assert.invariant(mutation.type === 'childList', `Invalid mutation type: ${mutation.type}. This mutation handler for slots should only handle "childList" mutations.`);
3554
+ }
3555
+ const { target: slot } = mutation;
3556
+ if (ArrayIndexOf.call(slots, slot) === -1) {
3557
+ ArrayPush.call(slots, slot);
3558
+ dispatchEvent.call(slot, new CustomEvent('slotchange'));
3559
+ }
3560
+ });
3561
+ });
3562
+ }
3563
+ function getFilteredSlotFlattenNodes(slot) {
3564
+ const childNodes = arrayFromCollection(childNodesGetter.call(slot));
3565
+ // Typescript is inferring the wrong function type for this particular
3566
+ // overloaded method: https://github.com/Microsoft/TypeScript/issues/27972
3567
+ // @ts-ignore type-mismatch
3568
+ return ArrayReduce.call(childNodes, (seed, child) => {
3569
+ if (child instanceof Element && isSlotElement(child)) {
3570
+ ArrayPush.apply(seed, getFilteredSlotFlattenNodes(child));
3571
+ }
3572
+ else {
3573
+ ArrayPush.call(seed, child);
3574
+ }
3575
+ return seed;
3576
+ }, []);
3577
+ }
3578
+ function assignedSlotGetterPatched() {
3579
+ const parentNode = parentNodeGetter.call(this);
3580
+ // use original assignedSlot if parent has a native shdow root
3581
+ if (parentNode instanceof Element) {
3582
+ const sr = shadowRootGetter.call(parentNode);
3583
+ if (isInstanceOfNativeShadowRoot(sr)) {
3584
+ if (this instanceof Text) {
3585
+ return assignedSlotGetter.call(this);
3586
+ }
3587
+ return assignedSlotGetter$1.call(this);
3588
+ }
3589
+ }
3590
+ /**
3591
+ * The node is assigned to a slot if:
3592
+ * - it has a parent and its parent is a slot element
3593
+ * - and if the slot owner key is different than the node owner key.
3594
+ *
3595
+ * When the slot and the slotted node are 2 different shadow trees, the owner keys will be
3596
+ * different. When the slot is in a shadow tree and the slotted content is a light DOM node,
3597
+ * the light DOM node doesn't have an owner key and therefor the slot owner key will be
3598
+ * different than the node owner key (always `undefined`).
3599
+ */
3600
+ if (!isNull(parentNode) &&
3601
+ isSlotElement(parentNode) &&
3602
+ getNodeOwnerKey(parentNode) !== getNodeOwnerKey(this)) {
3603
+ return parentNode;
3604
+ }
3605
+ return null;
3606
+ }
3607
+ defineProperties(HTMLSlotElement.prototype, {
3608
+ addEventListener: {
3609
+ value(type, listener, options) {
3610
+ // super.addEventListener - but that doesn't work with typescript
3611
+ HTMLElement.prototype.addEventListener.call(this, type, listener, options);
3612
+ if (type === 'slotchange' && !SlotChangeKey.get(this)) {
3613
+ SlotChangeKey.set(this, true);
3614
+ if (!observer) {
3615
+ observer = initSlotObserver();
3616
+ }
3617
+ MutationObserverObserve.call(observer, this, observerConfig);
3618
+ }
3619
+ },
3620
+ writable: true,
3621
+ enumerable: true,
3622
+ configurable: true,
3623
+ },
3624
+ assignedElements: {
3625
+ value(options) {
3626
+ if (isNodeShadowed(this)) {
3627
+ const flatten = !isUndefined(options) && isTrue(options.flatten);
3628
+ const nodes = flatten
3629
+ ? getFilteredSlotFlattenNodes(this)
3630
+ : getFilteredSlotAssignedNodes(this);
3631
+ return ArrayFilter.call(nodes, (node) => node instanceof Element);
3632
+ }
3633
+ else {
3634
+ return assignedElements.apply(this, ArraySlice.call(arguments));
3635
+ }
3636
+ },
3637
+ writable: true,
3638
+ enumerable: true,
3639
+ configurable: true,
3640
+ },
3641
+ assignedNodes: {
3642
+ value(options) {
3643
+ if (isNodeShadowed(this)) {
3644
+ const flatten = !isUndefined(options) && isTrue(options.flatten);
3645
+ return flatten
3646
+ ? getFilteredSlotFlattenNodes(this)
3647
+ : getFilteredSlotAssignedNodes(this);
3648
+ }
3649
+ else {
3650
+ return assignedNodes.apply(this, ArraySlice.call(arguments));
3651
+ }
3652
+ },
3653
+ writable: true,
3654
+ enumerable: true,
3655
+ configurable: true,
3656
+ },
3657
+ name: {
3658
+ get() {
3659
+ const name = getAttribute.call(this, 'name');
3660
+ return isNull(name) ? '' : name;
3661
+ },
3662
+ set(value) {
3663
+ setAttribute.call(this, 'name', value);
3664
+ },
3665
+ enumerable: true,
3666
+ configurable: true,
3667
+ },
3668
+ childNodes: {
3669
+ get() {
3670
+ if (isNodeShadowed(this)) {
3671
+ const owner = getNodeOwner(this);
3672
+ const childNodes = isNull(owner)
3673
+ ? []
3674
+ : getAllMatches(owner, getFilteredChildNodes(this));
3675
+ return createStaticNodeList(childNodes);
3676
+ }
3677
+ return childNodesGetter.call(this);
3678
+ },
3679
+ enumerable: true,
3680
+ configurable: true,
3681
+ },
3682
+ });
3683
+
3684
+ /*
3685
+ * Copyright (c) 2018, salesforce.com, inc.
3686
+ * All rights reserved.
3687
+ * SPDX-License-Identifier: MIT
3688
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3689
+ */
3690
+ // Non-deep-traversing patches: this descriptor map includes all descriptors that
3691
+ // do not five access to nodes beyond the immediate children.
3692
+ defineProperties(Text.prototype, {
3693
+ assignedSlot: {
3694
+ get: assignedSlotGetterPatched,
3695
+ enumerable: true,
3696
+ configurable: true,
3697
+ },
3698
+ });
3699
+
3700
+ /*
3701
+ * Copyright (c) 2018, salesforce.com, inc.
3702
+ * All rights reserved.
3703
+ * SPDX-License-Identifier: MIT
3704
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3705
+ */
3706
+ /**
3707
+ * This methods filters out elements that are not in the same shadow root of context.
3708
+ * It does not enforce shadow dom semantics if $context is not managed by LWC
3709
+ */
3710
+ function getNonPatchedFilteredArrayOfNodes(context, unfilteredNodes) {
3711
+ let filtered;
3712
+ const ownerKey = getNodeOwnerKey(context);
3713
+ // a node inside a shadow.
3714
+ if (!isUndefined(ownerKey)) {
3715
+ if (isSyntheticShadowHost(context)) {
3716
+ // element with shadowRoot attached
3717
+ const owner = getNodeOwner(context);
3718
+ if (isNull(owner)) {
3719
+ filtered = [];
3720
+ }
3721
+ else if (getNodeKey(context)) {
3722
+ // it is a custom element, and we should then filter by slotted elements
3723
+ filtered = getAllSlottedMatches(context, unfilteredNodes);
3724
+ }
3725
+ else {
3726
+ // regular element, we should then filter by ownership
3727
+ filtered = getAllMatches(owner, unfilteredNodes);
3728
+ }
3729
+ }
3730
+ else {
3731
+ // context is handled by lwc, using getNodeNearestOwnerKey to include manually inserted elements in the same shadow.
3732
+ filtered = ArrayFilter.call(unfilteredNodes, (elm) => getNodeNearestOwnerKey(elm) === ownerKey);
3733
+ }
3734
+ }
3735
+ else if (context instanceof HTMLBodyElement) {
3736
+ // `context` is document.body which is already patched.
3737
+ filtered = ArrayFilter.call(unfilteredNodes,
3738
+ // Note: we deviate from native shadow here, but are not fixing
3739
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
3740
+ (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(context));
3741
+ }
3742
+ else {
3743
+ // `context` is outside the lwc boundary, return unfiltered list.
3744
+ filtered = ArraySlice.call(unfilteredNodes);
3745
+ }
3746
+ return filtered;
3747
+ }
3748
+
3749
+ /*
3750
+ * Copyright (c) 2018, salesforce.com, inc.
3751
+ * All rights reserved.
3752
+ * SPDX-License-Identifier: MIT
3753
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3754
+ */
3755
+ function innerHTMLGetterPatched() {
3756
+ const childNodes = getInternalChildNodes(this);
3757
+ let innerHTML = '';
3758
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
3759
+ innerHTML += getOuterHTML(childNodes[i]);
3760
+ }
3761
+ return innerHTML;
3762
+ }
3763
+ function outerHTMLGetterPatched() {
3764
+ return getOuterHTML(this);
3765
+ }
3766
+ function attachShadowPatched(options) {
3767
+ // To retain native behavior of the API, provide synthetic shadowRoot only when specified
3768
+ if (options[KEY__SYNTHETIC_MODE]) {
3769
+ return attachShadow(this, options);
3770
+ }
3771
+ return attachShadow$1.call(this, options);
3772
+ }
3773
+ function shadowRootGetterPatched() {
3774
+ if (isSyntheticShadowHost(this)) {
3775
+ const shadow = getShadowRoot(this);
3776
+ if (shadow.mode === 'open') {
3777
+ return shadow;
3778
+ }
3779
+ }
3780
+ return shadowRootGetter.call(this);
3781
+ }
3782
+ function childrenGetterPatched() {
3783
+ const owner = getNodeOwner(this);
3784
+ const childNodes = isNull(owner) ? [] : getAllMatches(owner, getFilteredChildNodes(this));
3785
+ return createStaticHTMLCollection(ArrayFilter.call(childNodes, (node) => node instanceof Element));
3786
+ }
3787
+ function childElementCountGetterPatched() {
3788
+ return this.children.length;
3789
+ }
3790
+ function firstElementChildGetterPatched() {
3791
+ return this.children[0] || null;
3792
+ }
3793
+ function lastElementChildGetterPatched() {
3794
+ const { children } = this;
3795
+ return children.item(children.length - 1) || null;
3796
+ }
3797
+ // Non-deep-traversing patches: this descriptor map includes all descriptors that
3798
+ // do not five access to nodes beyond the immediate children.
3799
+ defineProperties(Element.prototype, {
3800
+ innerHTML: {
3801
+ get() {
3802
+ // Note: we deviate from native shadow here, but are not fixing
3803
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
3804
+ if (isNodeShadowed(this) || isSyntheticShadowHost(this)) {
3805
+ return innerHTMLGetterPatched.call(this);
3806
+ }
3807
+ return innerHTMLGetter.call(this);
3808
+ },
3809
+ set(v) {
3810
+ innerHTMLSetter.call(this, v);
3811
+ },
3812
+ enumerable: true,
3813
+ configurable: true,
3814
+ },
3815
+ outerHTML: {
3816
+ get() {
3817
+ // Note: we deviate from native shadow here, but are not fixing
3818
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
3819
+ if (isNodeShadowed(this) || isSyntheticShadowHost(this)) {
3820
+ return outerHTMLGetterPatched.call(this);
3821
+ }
3822
+ return outerHTMLGetter.call(this);
3823
+ },
3824
+ set(v) {
3825
+ outerHTMLSetter.call(this, v);
3826
+ },
3827
+ enumerable: true,
3828
+ configurable: true,
3829
+ },
3830
+ attachShadow: {
3831
+ value: attachShadowPatched,
3832
+ enumerable: true,
3833
+ writable: true,
3834
+ configurable: true,
3835
+ },
3836
+ shadowRoot: {
3837
+ get: shadowRootGetterPatched,
3838
+ enumerable: true,
3839
+ configurable: true,
3840
+ },
3841
+ // patched in HTMLElement if exists (IE11 is the one off here)
3842
+ children: {
3843
+ get() {
3844
+ if (hasMountedChildren(this)) {
3845
+ return childrenGetterPatched.call(this);
3846
+ }
3847
+ return childrenGetter.call(this);
3848
+ },
3849
+ enumerable: true,
3850
+ configurable: true,
3851
+ },
3852
+ childElementCount: {
3853
+ get() {
3854
+ if (hasMountedChildren(this)) {
3855
+ return childElementCountGetterPatched.call(this);
3856
+ }
3857
+ return childElementCountGetter.call(this);
3858
+ },
3859
+ enumerable: true,
3860
+ configurable: true,
3861
+ },
3862
+ firstElementChild: {
3863
+ get() {
3864
+ if (hasMountedChildren(this)) {
3865
+ return firstElementChildGetterPatched.call(this);
3866
+ }
3867
+ return firstElementChildGetter.call(this);
3868
+ },
3869
+ enumerable: true,
3870
+ configurable: true,
3871
+ },
3872
+ lastElementChild: {
3873
+ get() {
3874
+ if (hasMountedChildren(this)) {
3875
+ return lastElementChildGetterPatched.call(this);
3876
+ }
3877
+ return lastElementChildGetter.call(this);
3878
+ },
3879
+ enumerable: true,
3880
+ configurable: true,
3881
+ },
3882
+ assignedSlot: {
3883
+ get: assignedSlotGetterPatched,
3884
+ enumerable: true,
3885
+ configurable: true,
3886
+ },
3887
+ });
3888
+ // IE11 extra patches for wrong prototypes
3889
+ if (hasOwnProperty.call(HTMLElement.prototype, 'innerHTML')) {
3890
+ defineProperty(HTMLElement.prototype, 'innerHTML', getOwnPropertyDescriptor(Element.prototype, 'innerHTML'));
3891
+ }
3892
+ if (hasOwnProperty.call(HTMLElement.prototype, 'outerHTML')) {
3893
+ defineProperty(HTMLElement.prototype, 'outerHTML', getOwnPropertyDescriptor(Element.prototype, 'outerHTML'));
3894
+ }
3895
+ if (hasOwnProperty.call(HTMLElement.prototype, 'children')) {
3896
+ defineProperty(HTMLElement.prototype, 'children', getOwnPropertyDescriptor(Element.prototype, 'children'));
3897
+ }
3898
+ // Deep-traversing patches from this point on:
3899
+ function querySelectorPatched() {
3900
+ const nodeList = arrayFromCollection(querySelectorAll$1.apply(this, ArraySlice.call(arguments)));
3901
+ if (isSyntheticShadowHost(this)) {
3902
+ // element with shadowRoot attached
3903
+ const owner = getNodeOwner(this);
3904
+ if (!isUndefined(getNodeKey(this))) {
3905
+ // it is a custom element, and we should then filter by slotted elements
3906
+ return getFirstSlottedMatch(this, nodeList);
3907
+ }
3908
+ else if (isNull(owner)) {
3909
+ return null;
3910
+ }
3911
+ else {
3912
+ // regular element, we should then filter by ownership
3913
+ return getFirstMatch(owner, nodeList);
3914
+ }
3915
+ }
3916
+ else if (isNodeShadowed(this)) {
3917
+ // element inside a shadowRoot
3918
+ const ownerKey = getNodeOwnerKey(this);
3919
+ if (!isUndefined(ownerKey)) {
3920
+ // `this` is handled by lwc, using getNodeNearestOwnerKey to include manually inserted elements in the same shadow.
3921
+ const elm = ArrayFind.call(nodeList, (elm) => getNodeNearestOwnerKey(elm) === ownerKey);
3922
+ return isUndefined(elm) ? null : elm;
3923
+ }
3924
+ else {
3925
+ // Note: we deviate from native shadow here, but are not fixing
3926
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
3927
+ // `this` is a manually inserted element inside a shadowRoot, return the first element.
3928
+ return nodeList.length === 0 ? null : nodeList[0];
3929
+ }
3930
+ }
3931
+ else {
3932
+ if (!(this instanceof HTMLBodyElement)) {
3933
+ const elm = nodeList[0];
3934
+ return isUndefined(elm) ? null : elm;
3935
+ }
3936
+ // element belonging to the document
3937
+ const elm = ArrayFind.call(nodeList, (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(this));
3938
+ return isUndefined(elm) ? null : elm;
3939
+ }
3940
+ }
3941
+ function getFilteredArrayOfNodes(context, unfilteredNodes) {
3942
+ let filtered;
3943
+ if (isSyntheticShadowHost(context)) {
3944
+ // element with shadowRoot attached
3945
+ const owner = getNodeOwner(context);
3946
+ if (!isUndefined(getNodeKey(context))) {
3947
+ // it is a custom element, and we should then filter by slotted elements
3948
+ filtered = getAllSlottedMatches(context, unfilteredNodes);
3949
+ }
3950
+ else if (isNull(owner)) {
3951
+ filtered = [];
3952
+ }
3953
+ else {
3954
+ // regular element, we should then filter by ownership
3955
+ filtered = getAllMatches(owner, unfilteredNodes);
3956
+ }
3957
+ }
3958
+ else if (isNodeShadowed(context)) {
3959
+ // element inside a shadowRoot
3960
+ const ownerKey = getNodeOwnerKey(context);
3961
+ if (!isUndefined(ownerKey)) {
3962
+ // context is handled by lwc, using getNodeNearestOwnerKey to include manually inserted elements in the same shadow.
3963
+ filtered = ArrayFilter.call(unfilteredNodes, (elm) => getNodeNearestOwnerKey(elm) === ownerKey);
3964
+ }
3965
+ else {
3966
+ // Note: we deviate from native shadow here, but are not fixing
3967
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
3968
+ // context is manually inserted without lwc:dom-manual, return everything
3969
+ filtered = ArraySlice.call(unfilteredNodes);
3970
+ }
3971
+ }
3972
+ else {
3973
+ if (context instanceof HTMLBodyElement) {
3974
+ // `context` is document.body or element belonging to the document with the patch enabled
3975
+ filtered = ArrayFilter.call(unfilteredNodes, (elm) => isUndefined(getNodeOwnerKey(elm)) || isGlobalPatchingSkipped(context));
3976
+ }
3977
+ else {
3978
+ // `context` is outside the lwc boundary and patch is not enabled.
3979
+ filtered = ArraySlice.call(unfilteredNodes);
3980
+ }
3981
+ }
3982
+ return filtered;
3983
+ }
3984
+ // The following patched methods hide shadowed elements from global
3985
+ // traversing mechanisms. They are simplified for performance reasons to
3986
+ // filter by ownership and do not account for slotted elements. This
3987
+ // compromise is fine for our synthetic shadow dom because root elements
3988
+ // cannot have slotted elements.
3989
+ // Another compromise here is that all these traversing methods will return
3990
+ // static HTMLCollection or static NodeList. We decided that this compromise
3991
+ // is not a big problem considering the amount of code that is relying on
3992
+ // the liveliness of these results are rare.
3993
+ defineProperties(Element.prototype, {
3994
+ querySelector: {
3995
+ value: querySelectorPatched,
3996
+ writable: true,
3997
+ enumerable: true,
3998
+ configurable: true,
3999
+ },
4000
+ querySelectorAll: {
4001
+ value() {
4002
+ const nodeList = arrayFromCollection(querySelectorAll$1.apply(this, ArraySlice.call(arguments)));
4003
+ // Note: we deviate from native shadow here, but are not fixing
4004
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4005
+ const filteredResults = getFilteredArrayOfNodes(this, nodeList);
4006
+ return createStaticNodeList(filteredResults);
4007
+ },
4008
+ writable: true,
4009
+ enumerable: true,
4010
+ configurable: true,
4011
+ },
4012
+ });
4013
+ // The following APIs are used directly by Jest internally so we avoid patching them during testing.
4014
+ if (process.env.NODE_ENV !== 'test') {
4015
+ defineProperties(Element.prototype, {
4016
+ getElementsByClassName: {
4017
+ value() {
4018
+ const elements = arrayFromCollection(getElementsByClassName$1.apply(this, ArraySlice.call(arguments)));
4019
+ // Note: we deviate from native shadow here, but are not fixing
4020
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4021
+ return createStaticHTMLCollection(getNonPatchedFilteredArrayOfNodes(this, elements));
4022
+ },
4023
+ writable: true,
4024
+ enumerable: true,
4025
+ configurable: true,
4026
+ },
4027
+ getElementsByTagName: {
4028
+ value() {
4029
+ const elements = arrayFromCollection(getElementsByTagName$1.apply(this, ArraySlice.call(arguments)));
4030
+ // Note: we deviate from native shadow here, but are not fixing
4031
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4032
+ return createStaticHTMLCollection(getNonPatchedFilteredArrayOfNodes(this, elements));
4033
+ },
4034
+ writable: true,
4035
+ enumerable: true,
4036
+ configurable: true,
4037
+ },
4038
+ getElementsByTagNameNS: {
4039
+ value() {
4040
+ const elements = arrayFromCollection(getElementsByTagNameNS$1.apply(this, ArraySlice.call(arguments)));
4041
+ // Note: we deviate from native shadow here, but are not fixing
4042
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4043
+ return createStaticHTMLCollection(getNonPatchedFilteredArrayOfNodes(this, elements));
4044
+ },
4045
+ writable: true,
4046
+ enumerable: true,
4047
+ configurable: true,
4048
+ },
4049
+ });
4050
+ }
4051
+ // IE11 extra patches for wrong prototypes
4052
+ if (hasOwnProperty.call(HTMLElement.prototype, 'getElementsByClassName')) {
4053
+ defineProperty(HTMLElement.prototype, 'getElementsByClassName', getOwnPropertyDescriptor(Element.prototype, 'getElementsByClassName'));
4054
+ }
4055
+
4056
+ /*
4057
+ * Copyright (c) 2018, salesforce.com, inc.
4058
+ * All rights reserved.
4059
+ * SPDX-License-Identifier: MIT
4060
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4061
+ */
4062
+ const FocusableSelector = `
4063
+ [contenteditable],
4064
+ [tabindex],
4065
+ a[href],
4066
+ area[href],
4067
+ audio[controls],
4068
+ button,
4069
+ iframe,
4070
+ input,
4071
+ select,
4072
+ textarea,
4073
+ video[controls]
4074
+ `;
4075
+ const formElementTagNames = new Set(['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']);
4076
+ function filterSequentiallyFocusableElements(elements) {
4077
+ return elements.filter((element) => {
4078
+ if (hasAttribute.call(element, 'tabindex')) {
4079
+ // Even though LWC only supports tabindex values of 0 or -1,
4080
+ // passing through elements with tabindex="0" is a tighter criteria
4081
+ // than filtering out elements based on tabindex="-1".
4082
+ return getAttribute.call(element, 'tabindex') === '0';
4083
+ }
4084
+ if (formElementTagNames.has(tagNameGetter.call(element))) {
4085
+ return !hasAttribute.call(element, 'disabled');
4086
+ }
4087
+ return true;
4088
+ });
4089
+ }
4090
+ const DidAddMouseEventListeners = new WeakMap();
4091
+ // Due to browser differences, it is impossible to know what is focusable until
4092
+ // we actually try to focus it. We need to refactor our focus delegation logic
4093
+ // to verify whether or not the target was actually focused instead of trying
4094
+ // to predict focusability like we do here.
4095
+ function isVisible(element) {
4096
+ const { width, height } = getBoundingClientRect.call(element);
4097
+ const noZeroSize = width > 0 || height > 0;
4098
+ // The area element can be 0x0 and focusable. Hardcoding this is not ideal
4099
+ // but it will minimize changes in the current behavior.
4100
+ const isAreaElement = element.tagName === 'AREA';
4101
+ return (noZeroSize || isAreaElement) && getComputedStyle(element).visibility !== 'hidden';
4102
+ }
4103
+ // This function based on https://allyjs.io/data-tables/focusable.html
4104
+ // It won't catch everything, but should be good enough
4105
+ // There are a lot of edge cases here that we can't realistically handle
4106
+ // Determines if a particular element is tabbable, as opposed to simply focusable
4107
+ function isTabbable(element) {
4108
+ if (isSyntheticShadowHost(element) && isDelegatingFocus(element)) {
4109
+ return false;
4110
+ }
4111
+ return matches.call(element, FocusableSelector) && isVisible(element);
4112
+ }
4113
+ function hostElementFocus() {
4114
+ const _rootNode = this.getRootNode();
4115
+ if (_rootNode === this) {
4116
+ // We invoke the focus() method even if the host is disconnected in order to eliminate
4117
+ // observable differences for component authors between synthetic and native.
4118
+ const focusable = querySelector.call(this, FocusableSelector);
4119
+ if (!isNull(focusable)) {
4120
+ // @ts-ignore type-mismatch
4121
+ focusable.focus.apply(focusable, arguments);
4122
+ }
4123
+ return;
4124
+ }
4125
+ // If the root node is not the host element then it's either the document or a shadow root.
4126
+ const rootNode = _rootNode;
4127
+ if (rootNode.activeElement === this) {
4128
+ // The focused element should not change if the focus method is invoked
4129
+ // on the shadow-including ancestor of the currently focused element.
4130
+ return;
4131
+ }
4132
+ const focusables = arrayFromCollection(querySelectorAll$1.call(this, FocusableSelector));
4133
+ let didFocus = false;
4134
+ while (!didFocus && focusables.length !== 0) {
4135
+ const focusable = focusables.shift();
4136
+ // @ts-ignore type-mismatch
4137
+ focusable.focus.apply(focusable, arguments);
4138
+ // Get the root node of the current focusable in case it was slotted.
4139
+ const currentRootNode = focusable.getRootNode();
4140
+ didFocus = currentRootNode.activeElement === focusable;
4141
+ }
4142
+ }
4143
+ function getTabbableSegments(host) {
4144
+ const doc = getOwnerDocument(host);
4145
+ const all = filterSequentiallyFocusableElements(arrayFromCollection(querySelectorAll.call(doc, FocusableSelector)));
4146
+ const inner = filterSequentiallyFocusableElements(arrayFromCollection(querySelectorAll$1.call(host, FocusableSelector)));
4147
+ if (process.env.NODE_ENV !== 'production') {
4148
+ assert.invariant(getAttribute.call(host, 'tabindex') === '-1' || isDelegatingFocus(host), `The focusin event is only relevant when the tabIndex property is -1 on the host.`);
4149
+ }
4150
+ const firstChild = inner[0];
4151
+ const lastChild = inner[inner.length - 1];
4152
+ const hostIndex = ArrayIndexOf.call(all, host);
4153
+ // Host element can show up in our "previous" section if its tabindex is 0
4154
+ // We want to filter that out here
4155
+ const firstChildIndex = hostIndex > -1 ? hostIndex : ArrayIndexOf.call(all, firstChild);
4156
+ // Account for an empty inner list
4157
+ const lastChildIndex = inner.length === 0 ? firstChildIndex + 1 : ArrayIndexOf.call(all, lastChild) + 1;
4158
+ const prev = ArraySlice.call(all, 0, firstChildIndex);
4159
+ const next = ArraySlice.call(all, lastChildIndex);
4160
+ return {
4161
+ prev,
4162
+ inner,
4163
+ next,
4164
+ };
4165
+ }
4166
+ function getActiveElement(host) {
4167
+ const doc = getOwnerDocument(host);
4168
+ const activeElement = DocumentPrototypeActiveElement.call(doc);
4169
+ if (isNull(activeElement)) {
4170
+ return activeElement;
4171
+ }
4172
+ // activeElement must be child of the host and owned by it
4173
+ return (compareDocumentPosition.call(host, activeElement) & DOCUMENT_POSITION_CONTAINED_BY) !==
4174
+ 0
4175
+ ? activeElement
4176
+ : null;
4177
+ }
4178
+ function relatedTargetPosition(host, relatedTarget) {
4179
+ // assert: target must be child of host
4180
+ const pos = compareDocumentPosition.call(host, relatedTarget);
4181
+ if (pos & DOCUMENT_POSITION_CONTAINED_BY) {
4182
+ // focus remains inside the host
4183
+ return 0;
4184
+ }
4185
+ else if (pos & DOCUMENT_POSITION_PRECEDING) {
4186
+ // focus is coming from above
4187
+ return 1;
4188
+ }
4189
+ else if (pos & DOCUMENT_POSITION_FOLLOWING) {
4190
+ // focus is coming from below
4191
+ return 2;
4192
+ }
4193
+ // we don't know what's going on.
4194
+ return -1;
4195
+ }
4196
+ function muteEvent(event) {
4197
+ event.preventDefault();
4198
+ event.stopPropagation();
4199
+ }
4200
+ function muteFocusEventsDuringExecution(win, func) {
4201
+ windowAddEventListener.call(win, 'focusin', muteEvent, true);
4202
+ windowAddEventListener.call(win, 'focusout', muteEvent, true);
4203
+ func();
4204
+ windowRemoveEventListener.call(win, 'focusin', muteEvent, true);
4205
+ windowRemoveEventListener.call(win, 'focusout', muteEvent, true);
4206
+ }
4207
+ function focusOnNextOrBlur(segment, target, relatedTarget) {
4208
+ const win = getOwnerWindow(relatedTarget);
4209
+ const next = getNextTabbable(segment, relatedTarget);
4210
+ if (isNull(next)) {
4211
+ // nothing to focus on, blur to invalidate the operation
4212
+ muteFocusEventsDuringExecution(win, () => {
4213
+ target.blur();
4214
+ });
4215
+ }
4216
+ else {
4217
+ muteFocusEventsDuringExecution(win, () => {
4218
+ next.focus();
4219
+ });
4220
+ }
4221
+ }
4222
+ let letBrowserHandleFocus = false;
4223
+ function disableKeyboardFocusNavigationRoutines() {
4224
+ letBrowserHandleFocus = true;
4225
+ }
4226
+ function enableKeyboardFocusNavigationRoutines() {
4227
+ letBrowserHandleFocus = false;
4228
+ }
4229
+ function isKeyboardFocusNavigationRoutineEnabled() {
4230
+ return !letBrowserHandleFocus;
4231
+ }
4232
+ function skipHostHandler(event) {
4233
+ if (letBrowserHandleFocus) {
4234
+ return;
4235
+ }
4236
+ const host = eventCurrentTargetGetter.call(event);
4237
+ const target = eventTargetGetter.call(event);
4238
+ // If the host delegating focus with tabindex=0 is not the target, we know
4239
+ // that the event was dispatched on a descendant node of the host. This
4240
+ // means the focus is coming from below and we don't need to do anything.
4241
+ if (host !== target) {
4242
+ // Focus is coming from above
4243
+ return;
4244
+ }
4245
+ const relatedTarget = focusEventRelatedTargetGetter.call(event);
4246
+ if (isNull(relatedTarget)) {
4247
+ // If relatedTarget is null, the user is most likely tabbing into the document from the
4248
+ // browser chrome. We could probably deduce whether focus is coming in from the top or the
4249
+ // bottom by comparing the position of the target to all tabbable elements. This is an edge
4250
+ // case and only comes up if the custom element is the first or last tabbable element in the
4251
+ // document.
4252
+ return;
4253
+ }
4254
+ const segments = getTabbableSegments(host);
4255
+ const position = relatedTargetPosition(host, relatedTarget);
4256
+ if (position === 1) {
4257
+ // Focus is coming from above
4258
+ const findTabbableElms = isTabbableFrom.bind(null, host.getRootNode());
4259
+ const first = ArrayFind.call(segments.inner, findTabbableElms);
4260
+ if (!isUndefined(first)) {
4261
+ const win = getOwnerWindow(first);
4262
+ muteFocusEventsDuringExecution(win, () => {
4263
+ first.focus();
4264
+ });
4265
+ }
4266
+ else {
4267
+ focusOnNextOrBlur(segments.next, target, relatedTarget);
4268
+ }
4269
+ }
4270
+ else if (host === target) {
4271
+ // Host is receiving focus from below, either from its shadow or from a sibling
4272
+ focusOnNextOrBlur(ArrayReverse.call(segments.prev), target, relatedTarget);
4273
+ }
4274
+ }
4275
+ function skipShadowHandler(event) {
4276
+ if (letBrowserHandleFocus) {
4277
+ return;
4278
+ }
4279
+ const relatedTarget = focusEventRelatedTargetGetter.call(event);
4280
+ if (isNull(relatedTarget)) {
4281
+ // If relatedTarget is null, the user is most likely tabbing into the document from the
4282
+ // browser chrome. We could probably deduce whether focus is coming in from the top or the
4283
+ // bottom by comparing the position of the target to all tabbable elements. This is an edge
4284
+ // case and only comes up if the custom element is the first or last tabbable element in the
4285
+ // document.
4286
+ return;
4287
+ }
4288
+ const host = eventCurrentTargetGetter.call(event);
4289
+ const segments = getTabbableSegments(host);
4290
+ if (ArrayIndexOf.call(segments.inner, relatedTarget) !== -1) {
4291
+ // If relatedTarget is contained by the host's subtree we can assume that the user is
4292
+ // tabbing between elements inside of the shadow. Do nothing.
4293
+ return;
4294
+ }
4295
+ const target = eventTargetGetter.call(event);
4296
+ // Determine where the focus is coming from (Tab or Shift+Tab)
4297
+ const position = relatedTargetPosition(host, relatedTarget);
4298
+ if (position === 1) {
4299
+ // Focus is coming from above
4300
+ focusOnNextOrBlur(segments.next, target, relatedTarget);
4301
+ }
4302
+ if (position === 2) {
4303
+ // Focus is coming from below
4304
+ focusOnNextOrBlur(ArrayReverse.call(segments.prev), target, relatedTarget);
4305
+ }
4306
+ }
4307
+ // Use this function to determine whether you can start from one root and end up
4308
+ // at another element via tabbing.
4309
+ function isTabbableFrom(fromRoot, toElm) {
4310
+ if (!isTabbable(toElm)) {
4311
+ return false;
4312
+ }
4313
+ const ownerDocument = getOwnerDocument(toElm);
4314
+ let root = toElm.getRootNode();
4315
+ while (root !== ownerDocument && root !== fromRoot) {
4316
+ const sr = root;
4317
+ const host = sr.host;
4318
+ if (getAttribute.call(host, 'tabindex') === '-1') {
4319
+ return false;
4320
+ }
4321
+ root = host && host.getRootNode();
4322
+ }
4323
+ return true;
4324
+ }
4325
+ function getNextTabbable(tabbables, relatedTarget) {
4326
+ const len = tabbables.length;
4327
+ if (len > 0) {
4328
+ for (let i = 0; i < len; i += 1) {
4329
+ const next = tabbables[i];
4330
+ if (isTabbableFrom(relatedTarget.getRootNode(), next)) {
4331
+ return next;
4332
+ }
4333
+ }
4334
+ }
4335
+ return null;
4336
+ }
4337
+ // Skips the host element
4338
+ function handleFocus(elm) {
4339
+ if (process.env.NODE_ENV !== 'production') {
4340
+ assert.invariant(isDelegatingFocus(elm), `Invalid attempt to handle focus event for ${toString(elm)}. ${toString(elm)} should have delegates focus true, but is not delegating focus`);
4341
+ }
4342
+ bindDocumentMousedownMouseupHandlers(elm);
4343
+ // Unbind any focusin listeners we may have going on
4344
+ ignoreFocusIn(elm);
4345
+ addEventListener.call(elm, 'focusin', skipHostHandler, true);
4346
+ }
4347
+ function ignoreFocus(elm) {
4348
+ removeEventListener.call(elm, 'focusin', skipHostHandler, true);
4349
+ }
4350
+ function bindDocumentMousedownMouseupHandlers(elm) {
4351
+ const ownerDocument = getOwnerDocument(elm);
4352
+ if (!DidAddMouseEventListeners.get(ownerDocument)) {
4353
+ DidAddMouseEventListeners.set(ownerDocument, true);
4354
+ addEventListener.call(ownerDocument, 'mousedown', disableKeyboardFocusNavigationRoutines, true);
4355
+ addEventListener.call(ownerDocument, 'mouseup', () => {
4356
+ // We schedule this as an async task in the mouseup handler (as
4357
+ // opposed to the mousedown handler) because we want to guarantee
4358
+ // that it will never run before the focusin handler:
4359
+ //
4360
+ // Click form element | Click form element label
4361
+ // ==================================================
4362
+ // mousedown | mousedown
4363
+ // FOCUSIN | mousedown-setTimeout
4364
+ // mousedown-setTimeout | mouseup
4365
+ // mouseup | FOCUSIN
4366
+ // mouseup-setTimeout | mouseup-setTimeout
4367
+ setTimeout(enableKeyboardFocusNavigationRoutines);
4368
+ }, true);
4369
+ // [W-7824445] If the element is draggable, the mousedown event is dispatched before the
4370
+ // element is starting to be dragged, which disable the keyboard focus navigation routine.
4371
+ // But by specification, the mouseup event is never dispatched once the element is dropped.
4372
+ //
4373
+ // For all draggable element, we need to add an event listener to re-enable the keyboard
4374
+ // navigation routine after dragging starts.
4375
+ addEventListener.call(ownerDocument, 'dragstart', enableKeyboardFocusNavigationRoutines, true);
4376
+ }
4377
+ }
4378
+ // Skips the shadow tree
4379
+ function handleFocusIn(elm) {
4380
+ if (process.env.NODE_ENV !== 'production') {
4381
+ assert.invariant(tabIndexGetter.call(elm) === -1, `Invalid attempt to handle focus in ${toString(elm)}. ${toString(elm)} should have tabIndex -1, but has tabIndex ${tabIndexGetter.call(elm)}`);
4382
+ }
4383
+ bindDocumentMousedownMouseupHandlers(elm);
4384
+ // Unbind any focus listeners we may have going on
4385
+ ignoreFocus(elm);
4386
+ // This focusin listener is to catch focusin events from keyboard interactions
4387
+ // A better solution would perhaps be to listen for keydown events, but
4388
+ // the keydown event happens on whatever element already has focus (or no element
4389
+ // at all in the case of the location bar. So, instead we have to assume that focusin
4390
+ // without a mousedown means keyboard navigation
4391
+ addEventListener.call(elm, 'focusin', skipShadowHandler, true);
4392
+ }
4393
+ function ignoreFocusIn(elm) {
4394
+ removeEventListener.call(elm, 'focusin', skipShadowHandler, true);
4395
+ }
4396
+
4397
+ /*
4398
+ * Copyright (c) 2018, salesforce.com, inc.
4399
+ * All rights reserved.
4400
+ * SPDX-License-Identifier: MIT
4401
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4402
+ */
4403
+ const { blur, focus } = HTMLElement.prototype;
4404
+ /**
4405
+ * This method only applies to elements with a shadow attached to them
4406
+ */
4407
+ function tabIndexGetterPatched() {
4408
+ if (isDelegatingFocus(this) && isFalse(hasAttribute.call(this, 'tabindex'))) {
4409
+ // this covers the case where the default tabindex should be 0 because the
4410
+ // custom element is delegating its focus
4411
+ return 0;
4412
+ }
4413
+ return tabIndexGetter.call(this);
4414
+ }
4415
+ /**
4416
+ * This method only applies to elements with a shadow attached to them
4417
+ */
4418
+ function tabIndexSetterPatched(value) {
4419
+ // This tabIndex setter might be confusing unless it is understood that HTML
4420
+ // elements have default tabIndex property values. Natively focusable elements have
4421
+ // a default tabIndex value of 0 and all other elements have a default tabIndex
4422
+ // value of -1. For example, the tabIndex property value is -1 for both <x-foo> and
4423
+ // <x-foo tabindex="-1">, but our delegatesFocus polyfill should only kick in for
4424
+ // the latter case when the value of the tabindex attribute is -1.
4425
+ const delegatesFocus = isDelegatingFocus(this);
4426
+ // Record the state of things before invoking component setter.
4427
+ const prevValue = tabIndexGetter.call(this);
4428
+ const prevHasAttr = hasAttribute.call(this, 'tabindex');
4429
+ tabIndexSetter.call(this, value);
4430
+ // Record the state of things after invoking component setter.
4431
+ const currValue = tabIndexGetter.call(this);
4432
+ const currHasAttr = hasAttribute.call(this, 'tabindex');
4433
+ const didValueChange = prevValue !== currValue;
4434
+ // If the tabindex attribute is initially rendered, we can assume that this setter has
4435
+ // previously executed and a listener has been added. We must remove that listener if
4436
+ // the tabIndex property value has changed or if the component no longer renders a
4437
+ // tabindex attribute.
4438
+ if (prevHasAttr && (didValueChange || isFalse(currHasAttr))) {
4439
+ if (prevValue === -1) {
4440
+ ignoreFocusIn(this);
4441
+ }
4442
+ if (prevValue === 0 && delegatesFocus) {
4443
+ ignoreFocus(this);
4444
+ }
4445
+ }
4446
+ // If a tabindex attribute was not rendered after invoking its setter, it means the
4447
+ // component is taking control. Do nothing.
4448
+ if (isFalse(currHasAttr)) {
4449
+ return;
4450
+ }
4451
+ // If the tabindex attribute is initially rendered, we can assume that this setter has
4452
+ // previously executed and a listener has been added. If the tabindex attribute is still
4453
+ // rendered after invoking the setter AND the tabIndex property value has not changed,
4454
+ // we don't need to do any work.
4455
+ if (prevHasAttr && currHasAttr && isFalse(didValueChange)) {
4456
+ return;
4457
+ }
4458
+ // At this point we know that a tabindex attribute was rendered after invoking the
4459
+ // setter and that either:
4460
+ // 1) This is the first time this setter is being invoked.
4461
+ // 2) This is not the first time this setter is being invoked and the value is changing.
4462
+ // We need to add the appropriate listeners in either case.
4463
+ if (currValue === -1) {
4464
+ // Add the magic to skip the shadow tree
4465
+ handleFocusIn(this);
4466
+ }
4467
+ if (currValue === 0 && delegatesFocus) {
4468
+ // Add the magic to skip the host element
4469
+ handleFocus(this);
4470
+ }
4471
+ }
4472
+ /**
4473
+ * This method only applies to elements with a shadow attached to them
4474
+ */
4475
+ function blurPatched() {
4476
+ if (isDelegatingFocus(this)) {
4477
+ const currentActiveElement = getActiveElement(this);
4478
+ if (!isNull(currentActiveElement)) {
4479
+ // if there is an active element, blur it (intentionally using the dot notation in case the user defines the blur routine)
4480
+ currentActiveElement.blur();
4481
+ return;
4482
+ }
4483
+ }
4484
+ return blur.call(this);
4485
+ }
4486
+ function focusPatched() {
4487
+ // Save enabled state
4488
+ const originallyEnabled = isKeyboardFocusNavigationRoutineEnabled();
4489
+ // Change state by disabling if originally enabled
4490
+ if (originallyEnabled) {
4491
+ disableKeyboardFocusNavigationRoutines();
4492
+ }
4493
+ if (isSyntheticShadowHost(this) && isDelegatingFocus(this)) {
4494
+ hostElementFocus.call(this);
4495
+ return;
4496
+ }
4497
+ // Typescript does not like it when you treat the `arguments` object as an array
4498
+ // @ts-ignore type-mismatch
4499
+ focus.apply(this, arguments);
4500
+ // Restore state by enabling if originally enabled
4501
+ if (originallyEnabled) {
4502
+ enableKeyboardFocusNavigationRoutines();
4503
+ }
4504
+ }
4505
+ // Non-deep-traversing patches: this descriptor map includes all descriptors that
4506
+ // do not five access to nodes beyond the immediate children.
4507
+ defineProperties(HTMLElement.prototype, {
4508
+ tabIndex: {
4509
+ get() {
4510
+ if (isSyntheticShadowHost(this)) {
4511
+ return tabIndexGetterPatched.call(this);
4512
+ }
4513
+ return tabIndexGetter.call(this);
4514
+ },
4515
+ set(v) {
4516
+ if (isSyntheticShadowHost(this)) {
4517
+ return tabIndexSetterPatched.call(this, v);
4518
+ }
4519
+ return tabIndexSetter.call(this, v);
4520
+ },
4521
+ enumerable: true,
4522
+ configurable: true,
4523
+ },
4524
+ blur: {
4525
+ value() {
4526
+ if (isSyntheticShadowHost(this)) {
4527
+ return blurPatched.call(this);
4528
+ }
4529
+ blur.call(this);
4530
+ },
4531
+ enumerable: true,
4532
+ writable: true,
4533
+ configurable: true,
4534
+ },
4535
+ focus: {
4536
+ value() {
4537
+ // Typescript does not like it when you treat the `arguments` object as an array
4538
+ // @ts-ignore type-mismatch
4539
+ focusPatched.apply(this, arguments);
4540
+ },
4541
+ enumerable: true,
4542
+ writable: true,
4543
+ configurable: true,
4544
+ },
4545
+ });
4546
+ // Note: In JSDOM innerText is not implemented: https://github.com/jsdom/jsdom/issues/1245
4547
+ if (innerTextGetter !== null && innerTextSetter !== null) {
4548
+ defineProperty(HTMLElement.prototype, 'innerText', {
4549
+ get() {
4550
+ // Note: we deviate from native shadow here, but are not fixing
4551
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4552
+ return innerTextGetter.call(this);
4553
+ },
4554
+ set(v) {
4555
+ innerTextSetter.call(this, v);
4556
+ },
4557
+ enumerable: true,
4558
+ configurable: true,
4559
+ });
4560
+ }
4561
+ // Note: Firefox does not have outerText, https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/outerText
4562
+ if (outerTextGetter !== null && outerTextSetter !== null) {
4563
+ // From https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/outerText :
4564
+ // HTMLElement.outerText is a non-standard property. As a getter, it returns the same value as Node.innerText.
4565
+ // As a setter, it removes the current node and replaces it with the given text.
4566
+ defineProperty(HTMLElement.prototype, 'outerText', {
4567
+ get() {
4568
+ // Note: we deviate from native shadow here, but are not fixing
4569
+ // due to backwards compat: https://github.com/salesforce/lwc/pull/3103
4570
+ return outerTextGetter.call(this);
4571
+ },
4572
+ set(v) {
4573
+ // Invoking the `outerText` setter on a host element should trigger its disconnection, but until we merge node reactions, it will not work.
4574
+ // We could reimplement the outerText setter in JavaScript ([blink implementation](https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/renderer/core/html/html_element.cc;l=841-879;drc=6e8b402a6231405b753919029c9027404325ea00;bpv=0;bpt=1))
4575
+ // but the benefits don't worth the efforts.
4576
+ outerTextSetter.call(this, v);
4577
+ },
4578
+ enumerable: true,
4579
+ configurable: true,
4580
+ });
4581
+ }
4582
+
4583
+ /*
4584
+ * Copyright (c) 2018, salesforce.com, inc.
4585
+ * All rights reserved.
4586
+ * SPDX-License-Identifier: MIT
4587
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4588
+ */
4589
+ function getShadowToken(node) {
4590
+ return node[KEY__SHADOW_TOKEN];
4591
+ }
4592
+ function setShadowToken(node, shadowToken) {
4593
+ node[KEY__SHADOW_TOKEN] = shadowToken;
4594
+ }
4595
+ /**
4596
+ * Patching Element.prototype.$shadowToken$ to mark elements a portal:
4597
+ *
4598
+ * - we use a property to allow engines to set a custom attribute that should be
4599
+ * placed into the element to sandbox the css rules defined for the template.
4600
+ *
4601
+ * - this custom attribute must be unique.
4602
+ *
4603
+ **/
4604
+ defineProperty(Element.prototype, KEY__SHADOW_TOKEN, {
4605
+ set(shadowToken) {
4606
+ const oldShadowToken = this[KEY__SHADOW_TOKEN_PRIVATE];
4607
+ if (!isUndefined(oldShadowToken) && oldShadowToken !== shadowToken) {
4608
+ removeAttribute.call(this, oldShadowToken);
4609
+ }
4610
+ if (!isUndefined(shadowToken)) {
4611
+ setAttribute.call(this, shadowToken, '');
4612
+ }
4613
+ this[KEY__SHADOW_TOKEN_PRIVATE] = shadowToken;
4614
+ },
4615
+ get() {
4616
+ return this[KEY__SHADOW_TOKEN_PRIVATE];
4617
+ },
4618
+ configurable: true,
4619
+ });
4620
+ function recursivelySetShadowResolver(node, fn) {
4621
+ node[KEY__SHADOW_RESOLVER] = fn;
4622
+ const childNodes = childNodesGetter.call(node);
4623
+ for (let i = 0, n = childNodes.length; i < n; i++) {
4624
+ recursivelySetShadowResolver(childNodes[i], fn);
4625
+ }
4626
+ }
4627
+ defineProperty(Element.prototype, KEY__SHADOW_STATIC, {
4628
+ set(v) {
4629
+ // Marking an element as static will propagate the shadow resolver to the children.
4630
+ if (v) {
4631
+ const fn = this[KEY__SHADOW_RESOLVER];
4632
+ recursivelySetShadowResolver(this, fn);
4633
+ }
4634
+ this[KEY__SHADOW_STATIC_PRIVATE] = v;
4635
+ },
4636
+ get() {
4637
+ return this[KEY__SHADOW_STATIC_PRIVATE];
4638
+ },
4639
+ configurable: true,
4640
+ });
4641
+
4642
+ /*
4643
+ * Copyright (c) 2018, salesforce.com, inc.
4644
+ * All rights reserved.
4645
+ * SPDX-License-Identifier: MIT
4646
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4647
+ */
4648
+ const DomManualPrivateKey = '$$DomManualKey$$';
4649
+ // Resolver function used when a node is removed from within a portal
4650
+ const DocumentResolverFn = function () { };
4651
+ // We can use a single observer without having to worry about leaking because
4652
+ // "Registered observers in a node’s registered observer list have a weak
4653
+ // reference to the node."
4654
+ // https://dom.spec.whatwg.org/#garbage-collection
4655
+ let portalObserver;
4656
+ const portalObserverConfig = {
4657
+ childList: true,
4658
+ };
4659
+ function adoptChildNode(node, fn, shadowToken) {
4660
+ const previousNodeShadowResolver = getShadowRootResolver(node);
4661
+ if (previousNodeShadowResolver === fn) {
4662
+ return; // nothing to do here, it is already correctly patched
4663
+ }
4664
+ setShadowRootResolver(node, fn);
4665
+ if (node instanceof Element) {
4666
+ setShadowToken(node, shadowToken);
4667
+ if (isSyntheticShadowHost(node)) {
4668
+ // Root LWC elements can't get content slotted into them, therefore we don't observe their children.
4669
+ return;
4670
+ }
4671
+ if (isUndefined(previousNodeShadowResolver)) {
4672
+ // we only care about Element without shadowResolver (no MO.observe has been called)
4673
+ MutationObserverObserve.call(portalObserver, node, portalObserverConfig);
4674
+ }
4675
+ // recursively patching all children as well
4676
+ const childNodes = childNodesGetter.call(node);
4677
+ for (let i = 0, len = childNodes.length; i < len; i += 1) {
4678
+ adoptChildNode(childNodes[i], fn, shadowToken);
4679
+ }
4680
+ }
4681
+ }
4682
+ function initPortalObserver() {
4683
+ return new MO((mutations) => {
4684
+ forEach.call(mutations, (mutation) => {
4685
+ /**
4686
+ * This routine will process all nodes added or removed from elm (which is marked as a portal)
4687
+ * When adding a node to the portal element, we should add the ownership.
4688
+ * When removing a node from the portal element, this ownership should be removed.
4689
+ *
4690
+ * There is some special cases in which MutationObserver may call with stacked mutations (the same node
4691
+ * will be in addedNodes and removedNodes) or with false positives (a node that is removed and re-appended
4692
+ * in the same tick) for those cases, we cover by checking that the node is contained
4693
+ * (or not in the case of removal) by the element.
4694
+ */
4695
+ const { target: elm, addedNodes, removedNodes } = mutation;
4696
+ // the target of the mutation should always have a ShadowRootResolver attached to it
4697
+ const fn = getShadowRootResolver(elm);
4698
+ const shadowToken = getShadowToken(elm);
4699
+ // Process removals first to handle the case where an element is removed and reinserted
4700
+ for (let i = 0, len = removedNodes.length; i < len; i += 1) {
4701
+ const node = removedNodes[i];
4702
+ if (!(compareDocumentPosition.call(elm, node) & _Node.DOCUMENT_POSITION_CONTAINED_BY)) {
4703
+ adoptChildNode(node, DocumentResolverFn, undefined);
4704
+ }
4705
+ }
4706
+ for (let i = 0, len = addedNodes.length; i < len; i += 1) {
4707
+ const node = addedNodes[i];
4708
+ if (compareDocumentPosition.call(elm, node) & _Node.DOCUMENT_POSITION_CONTAINED_BY) {
4709
+ adoptChildNode(node, fn, shadowToken);
4710
+ }
4711
+ }
4712
+ });
4713
+ });
4714
+ }
4715
+ function markElementAsPortal(elm) {
4716
+ if (isUndefined(portalObserver)) {
4717
+ portalObserver = initPortalObserver();
4718
+ }
4719
+ if (isUndefined(getShadowRootResolver(elm))) {
4720
+ // only an element from a within a shadowRoot should be used here
4721
+ throw new Error(`Invalid Element`);
4722
+ }
4723
+ // install mutation observer for portals
4724
+ MutationObserverObserve.call(portalObserver, elm, portalObserverConfig);
4725
+ // TODO [#1253]: optimization to synchronously adopt new child nodes added
4726
+ // to this elm, we can do that by patching the most common operations
4727
+ // on the node itself
4728
+ }
4729
+ /**
4730
+ * Patching Element.prototype.$domManual$ to mark elements as portal:
4731
+ *
4732
+ * - we use a property to allow engines to signal that a particular element in
4733
+ * a shadow supports manual insertion of child nodes.
4734
+ *
4735
+ * - this signal comes as a boolean value, and we use it to install the MO instance
4736
+ * onto the element, to propagate the $ownerKey$ and $shadowToken$ to all new
4737
+ * child nodes.
4738
+ *
4739
+ * - at the moment, there is no way to undo this operation, once the element is
4740
+ * marked as $domManual$, setting it to false does nothing.
4741
+ *
4742
+ **/
4743
+ // TODO [#1306]: rename this to $observerConnection$
4744
+ defineProperty(Element.prototype, '$domManual$', {
4745
+ set(v) {
4746
+ this[DomManualPrivateKey] = v;
4747
+ if (isTrue(v)) {
4748
+ markElementAsPortal(this);
4749
+ }
4750
+ },
4751
+ get() {
4752
+ return this[DomManualPrivateKey];
4753
+ },
4754
+ configurable: true,
4755
+ });
4756
+ /** version: 2.45.4 */
4757
+ //# sourceMappingURL=index.js.map