@lwc/synthetic-shadow 2.5.11 → 2.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/synthetic-shadow.js +131 -138
- package/package.json +4 -4
package/dist/synthetic-shadow.js
CHANGED
@@ -194,7 +194,7 @@ const KEY__SYNTHETIC_MODE = '$$lwc-synthetic-mode';
|
|
194
194
|
|
195
195
|
|
196
196
|
const hasNativeSymbolSupport = /*@__PURE__*/(() => Symbol('x').toString() === 'Symbol(x)')();
|
197
|
-
/** version: 2.
|
197
|
+
/** version: 2.6.3 */
|
198
198
|
|
199
199
|
/*
|
200
200
|
* Copyright (c) 2018, salesforce.com, inc.
|
@@ -301,6 +301,7 @@ const {
|
|
301
301
|
getElementsByClassName: getElementsByClassName$1
|
302
302
|
} = HTMLElement.prototype;
|
303
303
|
const shadowRootGetter = hasOwnProperty.call(Element.prototype, 'shadowRoot') ? getOwnPropertyDescriptor(Element.prototype, 'shadowRoot').get : () => null;
|
304
|
+
const assignedSlotGetter$1 = hasOwnProperty.call(Element.prototype, 'assignedSlot') ? getOwnPropertyDescriptor(Element.prototype, 'assignedSlot').get : () => null;
|
304
305
|
|
305
306
|
/*
|
306
307
|
* Copyright (c) 2018, salesforce.com, inc.
|
@@ -515,19 +516,6 @@ function arrayFromCollection(collection) {
|
|
515
516
|
return cloned;
|
516
517
|
}
|
517
518
|
|
518
|
-
/**
|
519
|
-
* Copyright (C) 2018 salesforce.com, inc.
|
520
|
-
*/
|
521
|
-
|
522
|
-
if (!_globalThis.lwcRuntimeFlags) {
|
523
|
-
Object.defineProperty(_globalThis, 'lwcRuntimeFlags', {
|
524
|
-
value: create(null)
|
525
|
-
});
|
526
|
-
}
|
527
|
-
|
528
|
-
const runtimeFlags = _globalThis.lwcRuntimeFlags;
|
529
|
-
/** version: 2.5.11 */
|
530
|
-
|
531
519
|
/*
|
532
520
|
* Copyright (c) 2018, salesforce.com, inc.
|
533
521
|
* All rights reserved.
|
@@ -587,19 +575,9 @@ function getEventListenerWrapper(fnOrObj) {
|
|
587
575
|
assert.invariant(isFalse(isSyntheticShadowHost(currentTarget)), 'This routine should not be used to wrap event listeners for host elements and shadow roots.');
|
588
576
|
}
|
589
577
|
|
590
|
-
const
|
591
|
-
composed
|
592
|
-
} = event;
|
593
|
-
let shouldInvoke;
|
594
|
-
|
595
|
-
if (runtimeFlags.ENABLE_NON_COMPOSED_EVENTS_LEAKAGE) {
|
596
|
-
shouldInvoke = !(eventToShadowRootMap.has(event) && isFalse(composed));
|
597
|
-
} else {
|
598
|
-
const actualTarget = getActualTarget(event);
|
599
|
-
shouldInvoke = shouldInvokeListener(event, actualTarget, currentTarget);
|
600
|
-
}
|
578
|
+
const actualTarget = getActualTarget(event);
|
601
579
|
|
602
|
-
if (!
|
580
|
+
if (!shouldInvokeListener(event, actualTarget, currentTarget)) {
|
603
581
|
return;
|
604
582
|
}
|
605
583
|
|
@@ -619,25 +597,6 @@ function getEventListenerWrapper(fnOrObj) {
|
|
619
597
|
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
|
620
598
|
*/
|
621
599
|
const eventToContextMap = new WeakMap();
|
622
|
-
|
623
|
-
function isChildNode(root, node) {
|
624
|
-
return !!(compareDocumentPosition.call(root, node) & DOCUMENT_POSITION_CONTAINED_BY);
|
625
|
-
}
|
626
|
-
|
627
|
-
const GET_ROOT_NODE_CONFIG_FALSE = {
|
628
|
-
composed: false
|
629
|
-
};
|
630
|
-
|
631
|
-
function getRootNodeHost(node, options) {
|
632
|
-
let rootNode = node.getRootNode(options);
|
633
|
-
|
634
|
-
if (isSyntheticShadowRoot(rootNode)) {
|
635
|
-
rootNode = getHost(rootNode);
|
636
|
-
}
|
637
|
-
|
638
|
-
return rootNode;
|
639
|
-
}
|
640
|
-
|
641
600
|
const customElementToWrappedListeners = new WeakMap();
|
642
601
|
|
643
602
|
function getEventMap(elm) {
|
@@ -681,16 +640,9 @@ function getWrappedShadowRootListener(listener) {
|
|
681
640
|
currentTarget = getShadowRoot(currentTarget);
|
682
641
|
}
|
683
642
|
|
684
|
-
|
643
|
+
const actualTarget = getActualTarget(event);
|
685
644
|
|
686
|
-
if (
|
687
|
-
shouldInvoke = shouldInvokeShadowRootListener(event);
|
688
|
-
} else {
|
689
|
-
const actualTarget = getActualTarget(event);
|
690
|
-
shouldInvoke = shouldInvokeListener(event, actualTarget, currentTarget);
|
691
|
-
}
|
692
|
-
|
693
|
-
if (shouldInvoke) {
|
645
|
+
if (shouldInvokeListener(event, actualTarget, currentTarget)) {
|
694
646
|
listener.call(currentTarget, event);
|
695
647
|
}
|
696
648
|
};
|
@@ -717,16 +669,9 @@ function getWrappedCustomElementListener(listener) {
|
|
717
669
|
customElementWrappedListener = function (event) {
|
718
670
|
// currentTarget is always defined inside an event listener
|
719
671
|
const currentTarget = eventCurrentTargetGetter.call(event);
|
720
|
-
|
672
|
+
const actualTarget = getActualTarget(event);
|
721
673
|
|
722
|
-
if (
|
723
|
-
shouldInvoke = shouldInvokeCustomElementListener(event);
|
724
|
-
} else {
|
725
|
-
const actualTarget = getActualTarget(event);
|
726
|
-
shouldInvoke = shouldInvokeListener(event, actualTarget, currentTarget);
|
727
|
-
}
|
728
|
-
|
729
|
-
if (shouldInvoke) {
|
674
|
+
if (shouldInvokeListener(event, actualTarget, currentTarget)) {
|
730
675
|
listener.call(currentTarget, event);
|
731
676
|
}
|
732
677
|
};
|
@@ -847,70 +792,6 @@ function detachDOMListener(elm, type, wrappedListener) {
|
|
847
792
|
}
|
848
793
|
}
|
849
794
|
|
850
|
-
function shouldInvokeCustomElementListener(event) {
|
851
|
-
const {
|
852
|
-
composed
|
853
|
-
} = event;
|
854
|
-
|
855
|
-
if (isTrue(composed)) {
|
856
|
-
// Listeners on host elements should always be invoked for {composed: true} events.
|
857
|
-
return true;
|
858
|
-
} // If this {composed: false} event was dispatched on any root.
|
859
|
-
|
860
|
-
|
861
|
-
if (eventToShadowRootMap.has(event)) {
|
862
|
-
return false;
|
863
|
-
}
|
864
|
-
|
865
|
-
const target = eventTargetGetter.call(event);
|
866
|
-
const currentTarget = eventCurrentTargetGetter.call(event); // If this {composed: false} event was dispatched on the current target host.
|
867
|
-
|
868
|
-
if (target === currentTarget) {
|
869
|
-
return true;
|
870
|
-
} // At this point the event must be {bubbles: true, composed: false} and was dispatched from a
|
871
|
-
// shadow-excluding descendant node. In this case, we only invoke the listener if the target
|
872
|
-
// host was assigned to a slot in the composed subtree of the current target host.
|
873
|
-
|
874
|
-
|
875
|
-
const targetHost = getRootNodeHost(target, GET_ROOT_NODE_CONFIG_FALSE);
|
876
|
-
const currentTargetHost = currentTarget;
|
877
|
-
return isChildNode(targetHost, currentTargetHost);
|
878
|
-
}
|
879
|
-
|
880
|
-
function shouldInvokeShadowRootListener(event) {
|
881
|
-
const {
|
882
|
-
composed
|
883
|
-
} = event;
|
884
|
-
const target = eventTargetGetter.call(event);
|
885
|
-
const currentTarget = eventCurrentTargetGetter.call(event); // If the event was dispatched on the host or its root.
|
886
|
-
|
887
|
-
if (target === currentTarget) {
|
888
|
-
// Invoke the listener if the event was dispatched directly on the root.
|
889
|
-
return eventToShadowRootMap.get(event) === getShadowRoot(target);
|
890
|
-
} // At this point the event is {bubbles: true} and was dispatched from a shadow-including descendant node.
|
891
|
-
|
892
|
-
|
893
|
-
if (isTrue(composed)) {
|
894
|
-
// Invoke the listener if the event is {composed: true}.
|
895
|
-
return true;
|
896
|
-
} // At this point the event must be {bubbles: true, composed: false}.
|
897
|
-
|
898
|
-
|
899
|
-
if (isTrue(eventToShadowRootMap.has(event))) {
|
900
|
-
// Don't invoke the listener because the event was dispatched on a descendant root.
|
901
|
-
return false;
|
902
|
-
}
|
903
|
-
|
904
|
-
const targetHost = getRootNodeHost(target, GET_ROOT_NODE_CONFIG_FALSE);
|
905
|
-
const currentTargetHost = currentTarget;
|
906
|
-
const isCurrentTargetSlotted = isChildNode(targetHost, currentTargetHost); // At this point the event must be {bubbles: true, composed: false} and was dispatched from a
|
907
|
-
// shadow-excluding descendant node. In this case, we only invoke the listener if the target
|
908
|
-
// host was assigned to a slot in the composed subtree of the current target host, or the
|
909
|
-
// descendant node is in the shadow tree of the current root.
|
910
|
-
|
911
|
-
return isCurrentTargetSlotted || targetHost === currentTargetHost;
|
912
|
-
}
|
913
|
-
|
914
795
|
function addCustomElementEventListener(type, listener, _options) {
|
915
796
|
if (process.env.NODE_ENV !== 'production') {
|
916
797
|
if (!isFunction(listener)) {
|
@@ -1019,6 +900,14 @@ function getNodeKey(node) {
|
|
1019
900
|
function isNodeShadowed(node) {
|
1020
901
|
return !isUndefined(getNodeOwnerKey(node));
|
1021
902
|
}
|
903
|
+
/**
|
904
|
+
* Returns true if this node is a shadow host, is in a shadow host, or contains a shadow host
|
905
|
+
* anywhere in its tree.
|
906
|
+
*/
|
907
|
+
|
908
|
+
function isNodeOrDescendantsShadowed(node) {
|
909
|
+
return isNodeShadowed(node) || isSyntheticShadowHost(node) || containsHost(node);
|
910
|
+
}
|
1022
911
|
|
1023
912
|
/*
|
1024
913
|
* Copyright (c) 2018, salesforce.com, inc.
|
@@ -1632,6 +1521,19 @@ function getOuterHTML(node) {
|
|
1632
1521
|
}
|
1633
1522
|
}
|
1634
1523
|
|
1524
|
+
/**
|
1525
|
+
* Copyright (C) 2018 salesforce.com, inc.
|
1526
|
+
*/
|
1527
|
+
|
1528
|
+
if (!_globalThis.lwcRuntimeFlags) {
|
1529
|
+
Object.defineProperty(_globalThis, 'lwcRuntimeFlags', {
|
1530
|
+
value: create(null)
|
1531
|
+
});
|
1532
|
+
}
|
1533
|
+
|
1534
|
+
const runtimeFlags = _globalThis.lwcRuntimeFlags;
|
1535
|
+
/** version: 2.6.3 */
|
1536
|
+
|
1635
1537
|
/*
|
1636
1538
|
* Copyright (c) 2018, salesforce.com, inc.
|
1637
1539
|
* All rights reserved.
|
@@ -1723,7 +1625,9 @@ function parentElementGetterPatched() {
|
|
1723
1625
|
}
|
1724
1626
|
|
1725
1627
|
function compareDocumentPositionPatched(otherNode) {
|
1726
|
-
if (this
|
1628
|
+
if (this === otherNode) {
|
1629
|
+
return 0;
|
1630
|
+
} else if (this.getRootNode() === otherNode) {
|
1727
1631
|
// "this" is in a shadow tree where the shadow root is the "otherNode".
|
1728
1632
|
return 10; // Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING
|
1729
1633
|
} else if (getNodeOwnerKey(this) !== getNodeOwnerKey(otherNode)) {
|
@@ -1769,7 +1673,7 @@ function cloneNodePatched(deep) {
|
|
1769
1673
|
function childNodesGetterPatched() {
|
1770
1674
|
if (isSyntheticShadowHost(this)) {
|
1771
1675
|
const owner = getNodeOwner(this);
|
1772
|
-
const childNodes = isNull(owner) ?
|
1676
|
+
const childNodes = isNull(owner) ? getFilteredChildNodes(this) : getAllMatches(owner, getFilteredChildNodes(this));
|
1773
1677
|
|
1774
1678
|
if (process.env.NODE_ENV !== 'production' && isFalse(hasNativeSymbolSupport) && isExternalChildNodeAccessorFlagOn()) {
|
1775
1679
|
// inserting a comment node as the first childNode to trick the IE11
|
@@ -1880,7 +1784,8 @@ defineProperties(_Node.prototype, {
|
|
1880
1784
|
textContent: {
|
1881
1785
|
get() {
|
1882
1786
|
if (!runtimeFlags.ENABLE_NODE_PATCH) {
|
1883
|
-
|
1787
|
+
// See note on get innerHTML in faux-shadow/element.ts
|
1788
|
+
if (isNodeOrDescendantsShadowed(this)) {
|
1884
1789
|
return textContentGetterPatched.call(this);
|
1885
1790
|
}
|
1886
1791
|
|
@@ -2114,7 +2019,22 @@ function getAllRootNodes(node) {
|
|
2114
2019
|
}
|
2115
2020
|
|
2116
2021
|
return rootNodes;
|
2117
|
-
}
|
2022
|
+
} // Keep searching up the host tree until we find an element that is within the immediate shadow root
|
2023
|
+
|
2024
|
+
|
2025
|
+
const findAncestorHostInImmediateShadowRoot = (rootNode, targetRootNode) => {
|
2026
|
+
let host;
|
2027
|
+
|
2028
|
+
while (!isUndefined(host = rootNode.host)) {
|
2029
|
+
const thisRootNode = host.getRootNode();
|
2030
|
+
|
2031
|
+
if (thisRootNode === targetRootNode) {
|
2032
|
+
return host;
|
2033
|
+
}
|
2034
|
+
|
2035
|
+
rootNode = thisRootNode;
|
2036
|
+
}
|
2037
|
+
};
|
2118
2038
|
|
2119
2039
|
function fauxElementsFromPoint(context, doc, left, top) {
|
2120
2040
|
const elements = elementsFromPoint.call(doc, left, top);
|
@@ -2128,8 +2048,28 @@ function fauxElementsFromPoint(context, doc, left, top) {
|
|
2128
2048
|
for (let i = 0; i < elements.length; i++) {
|
2129
2049
|
const element = elements[i];
|
2130
2050
|
|
2131
|
-
if (
|
2132
|
-
|
2051
|
+
if (isSyntheticSlotElement(element)) {
|
2052
|
+
continue;
|
2053
|
+
}
|
2054
|
+
|
2055
|
+
const elementRootNode = element.getRootNode();
|
2056
|
+
|
2057
|
+
if (ArrayIndexOf.call(rootNodes, elementRootNode) !== -1) {
|
2058
|
+
ArrayPush.call(result, element);
|
2059
|
+
continue;
|
2060
|
+
} // In cases where the host element is not visible but its shadow descendants are, then
|
2061
|
+
// we may get the shadow descendant instead of the host element here. (The
|
2062
|
+
// browser doesn't know the difference in synthetic shadow DOM.)
|
2063
|
+
// In native shadow DOM, however, elementsFromPoint would return the host but not
|
2064
|
+
// the child. So we need to detect if this shadow element's host is accessible from
|
2065
|
+
// the context's shadow root. Note we also need to be careful not to add the host
|
2066
|
+
// multiple times.
|
2067
|
+
|
2068
|
+
|
2069
|
+
const ancestorHost = findAncestorHostInImmediateShadowRoot(elementRootNode, rootNodes[0]);
|
2070
|
+
|
2071
|
+
if (!isUndefined(ancestorHost) && ArrayIndexOf.call(elements, ancestorHost) === -1 && ArrayIndexOf.call(result, ancestorHost) === -1) {
|
2072
|
+
ArrayPush.call(result, ancestorHost);
|
2133
2073
|
}
|
2134
2074
|
}
|
2135
2075
|
}
|
@@ -2203,6 +2143,28 @@ function isSyntheticShadowHost(node) {
|
|
2203
2143
|
function isSyntheticShadowRoot(node) {
|
2204
2144
|
const shadowRootRecord = InternalSlot.get(node);
|
2205
2145
|
return !isUndefined(shadowRootRecord) && node === shadowRootRecord.shadowRoot;
|
2146
|
+
} // Return true if any descendant is a host element
|
2147
|
+
|
2148
|
+
function containsHost(node) {
|
2149
|
+
// IE11 complains with "Unexpected call to method or property access." when calling walker.nextNode().
|
2150
|
+
// The fix for this is to only walk trees for nodes that are Node.ELEMENT_NODE.
|
2151
|
+
if (node.nodeType !== _Node.ELEMENT_NODE) {
|
2152
|
+
return false;
|
2153
|
+
} // IE requires all four arguments, even though the fourth is deprecated
|
2154
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker#browser_compatibility
|
2155
|
+
// @ts-ignore
|
2156
|
+
|
2157
|
+
|
2158
|
+
const walker = document.createTreeWalker(node, NodeFilter.SHOW_ELEMENT, null, false);
|
2159
|
+
let descendant;
|
2160
|
+
|
2161
|
+
while (!isNull(descendant = walker.nextNode())) {
|
2162
|
+
if (isSyntheticShadowHost(descendant)) {
|
2163
|
+
return true;
|
2164
|
+
}
|
2165
|
+
}
|
2166
|
+
|
2167
|
+
return false;
|
2206
2168
|
}
|
2207
2169
|
let uid = 0;
|
2208
2170
|
function attachShadow(elm, options) {
|
@@ -2250,6 +2212,12 @@ const SyntheticShadowRootDescriptors = {
|
|
2250
2212
|
return `[object ShadowRoot]`;
|
2251
2213
|
}
|
2252
2214
|
|
2215
|
+
},
|
2216
|
+
synthetic: {
|
2217
|
+
writable: false,
|
2218
|
+
enumerable: false,
|
2219
|
+
configurable: false,
|
2220
|
+
value: true
|
2253
2221
|
}
|
2254
2222
|
};
|
2255
2223
|
const ShadowRootDescriptors = {
|
@@ -4078,6 +4046,14 @@ retargetRelatedTarget(FocusEvent);
|
|
4078
4046
|
*/
|
4079
4047
|
retargetRelatedTarget(MouseEvent);
|
4080
4048
|
|
4049
|
+
/*
|
4050
|
+
* Copyright (c) 2021, salesforce.com, inc.
|
4051
|
+
* All rights reserved.
|
4052
|
+
* SPDX-License-Identifier: MIT
|
4053
|
+
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
|
4054
|
+
*/
|
4055
|
+
const assignedSlotGetter = hasOwnProperty.call(Text.prototype, 'assignedSlot') ? getOwnPropertyDescriptor(Text.prototype, 'assignedSlot').get : () => null;
|
4056
|
+
|
4081
4057
|
/*
|
4082
4058
|
* Copyright (c) 2018, salesforce.com, inc.
|
4083
4059
|
* All rights reserved.
|
@@ -4131,10 +4107,22 @@ function getFilteredSlotFlattenNodes(slot) {
|
|
4131
4107
|
}
|
4132
4108
|
|
4133
4109
|
function assignedSlotGetterPatched() {
|
4134
|
-
const parentNode = parentNodeGetter.call(this);
|
4110
|
+
const parentNode = parentNodeGetter.call(this); // use original assignedSlot if parent has a native shdow root
|
4111
|
+
|
4112
|
+
if (parentNode instanceof Element) {
|
4113
|
+
const sr = shadowRootGetter.call(parentNode);
|
4114
|
+
|
4115
|
+
if (isInstanceOfNativeShadowRoot(sr)) {
|
4116
|
+
if (this instanceof Text) {
|
4117
|
+
return assignedSlotGetter.call(this);
|
4118
|
+
}
|
4119
|
+
|
4120
|
+
return assignedSlotGetter$1.call(this);
|
4121
|
+
}
|
4122
|
+
}
|
4135
4123
|
/**
|
4136
4124
|
* The node is assigned to a slot if:
|
4137
|
-
* - it has a parent and
|
4125
|
+
* - it has a parent and its parent is a slot element
|
4138
4126
|
* - and if the slot owner key is different than the node owner key.
|
4139
4127
|
*
|
4140
4128
|
* When the slot and the slotted node are 2 different shadow trees, the owner keys will be
|
@@ -4143,6 +4131,7 @@ function assignedSlotGetterPatched() {
|
|
4143
4131
|
* different than the node owner key (always `undefined`).
|
4144
4132
|
*/
|
4145
4133
|
|
4134
|
+
|
4146
4135
|
if (!isNull(parentNode) && isSlotElement(parentNode) && getNodeOwnerKey(parentNode) !== getNodeOwnerKey(this)) {
|
4147
4136
|
return parentNode;
|
4148
4137
|
}
|
@@ -4359,7 +4348,10 @@ defineProperties(Element.prototype, {
|
|
4359
4348
|
innerHTML: {
|
4360
4349
|
get() {
|
4361
4350
|
if (!runtimeFlags.ENABLE_ELEMENT_PATCH) {
|
4362
|
-
|
4351
|
+
// If this element is in synthetic shadow, if it's a synthetic shadow host,
|
4352
|
+
// or if any of its descendants are synthetic shadow hosts, then we can't
|
4353
|
+
// use the native innerHTML because it would expose private node internals.
|
4354
|
+
if (isNodeOrDescendantsShadowed(this)) {
|
4363
4355
|
return innerHTMLGetterPatched.call(this);
|
4364
4356
|
}
|
4365
4357
|
|
@@ -4384,7 +4376,8 @@ defineProperties(Element.prototype, {
|
|
4384
4376
|
outerHTML: {
|
4385
4377
|
get() {
|
4386
4378
|
if (!runtimeFlags.ENABLE_ELEMENT_PATCH) {
|
4387
|
-
|
4379
|
+
// See notes above on get innerHTML
|
4380
|
+
if (isNodeOrDescendantsShadowed(this)) {
|
4388
4381
|
return outerHTMLGetterPatched.call(this);
|
4389
4382
|
}
|
4390
4383
|
|
@@ -5757,4 +5750,4 @@ defineProperty(Element.prototype, '$domManual$', {
|
|
5757
5750
|
|
5758
5751
|
configurable: true
|
5759
5752
|
});
|
5760
|
-
/** version: 2.
|
5753
|
+
/** version: 2.6.3 */
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lwc/synthetic-shadow",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.6.3",
|
4
4
|
"description": "Synthetic Shadow Root for LWC",
|
5
5
|
"homepage": "https://lwc.dev/",
|
6
6
|
"repository": {
|
@@ -36,8 +36,8 @@
|
|
36
36
|
"access": "public"
|
37
37
|
},
|
38
38
|
"devDependencies": {
|
39
|
-
"@lwc/features": "2.
|
40
|
-
"@lwc/shared": "2.
|
39
|
+
"@lwc/features": "2.6.3",
|
40
|
+
"@lwc/shared": "2.6.3"
|
41
41
|
},
|
42
|
-
"gitHead": "
|
42
|
+
"gitHead": "1fdd835243eed190b8ab9ca61ae7eae9f9a4073d"
|
43
43
|
}
|