@lwc/synthetic-shadow 2.6.2 → 2.6.3
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/synthetic-shadow.js +113 -13
- 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.6.
|
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.
|
@@ -899,6 +900,14 @@ function getNodeKey(node) {
|
|
899
900
|
function isNodeShadowed(node) {
|
900
901
|
return !isUndefined(getNodeOwnerKey(node));
|
901
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
|
+
}
|
902
911
|
|
903
912
|
/*
|
904
913
|
* Copyright (c) 2018, salesforce.com, inc.
|
@@ -1523,7 +1532,7 @@ if (!_globalThis.lwcRuntimeFlags) {
|
|
1523
1532
|
}
|
1524
1533
|
|
1525
1534
|
const runtimeFlags = _globalThis.lwcRuntimeFlags;
|
1526
|
-
/** version: 2.6.
|
1535
|
+
/** version: 2.6.3 */
|
1527
1536
|
|
1528
1537
|
/*
|
1529
1538
|
* Copyright (c) 2018, salesforce.com, inc.
|
@@ -1616,7 +1625,9 @@ function parentElementGetterPatched() {
|
|
1616
1625
|
}
|
1617
1626
|
|
1618
1627
|
function compareDocumentPositionPatched(otherNode) {
|
1619
|
-
if (this
|
1628
|
+
if (this === otherNode) {
|
1629
|
+
return 0;
|
1630
|
+
} else if (this.getRootNode() === otherNode) {
|
1620
1631
|
// "this" is in a shadow tree where the shadow root is the "otherNode".
|
1621
1632
|
return 10; // Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING
|
1622
1633
|
} else if (getNodeOwnerKey(this) !== getNodeOwnerKey(otherNode)) {
|
@@ -1662,7 +1673,7 @@ function cloneNodePatched(deep) {
|
|
1662
1673
|
function childNodesGetterPatched() {
|
1663
1674
|
if (isSyntheticShadowHost(this)) {
|
1664
1675
|
const owner = getNodeOwner(this);
|
1665
|
-
const childNodes = isNull(owner) ?
|
1676
|
+
const childNodes = isNull(owner) ? getFilteredChildNodes(this) : getAllMatches(owner, getFilteredChildNodes(this));
|
1666
1677
|
|
1667
1678
|
if (process.env.NODE_ENV !== 'production' && isFalse(hasNativeSymbolSupport) && isExternalChildNodeAccessorFlagOn()) {
|
1668
1679
|
// inserting a comment node as the first childNode to trick the IE11
|
@@ -1773,7 +1784,8 @@ defineProperties(_Node.prototype, {
|
|
1773
1784
|
textContent: {
|
1774
1785
|
get() {
|
1775
1786
|
if (!runtimeFlags.ENABLE_NODE_PATCH) {
|
1776
|
-
|
1787
|
+
// See note on get innerHTML in faux-shadow/element.ts
|
1788
|
+
if (isNodeOrDescendantsShadowed(this)) {
|
1777
1789
|
return textContentGetterPatched.call(this);
|
1778
1790
|
}
|
1779
1791
|
|
@@ -2007,7 +2019,22 @@ function getAllRootNodes(node) {
|
|
2007
2019
|
}
|
2008
2020
|
|
2009
2021
|
return rootNodes;
|
2010
|
-
}
|
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
|
+
};
|
2011
2038
|
|
2012
2039
|
function fauxElementsFromPoint(context, doc, left, top) {
|
2013
2040
|
const elements = elementsFromPoint.call(doc, left, top);
|
@@ -2021,8 +2048,28 @@ function fauxElementsFromPoint(context, doc, left, top) {
|
|
2021
2048
|
for (let i = 0; i < elements.length; i++) {
|
2022
2049
|
const element = elements[i];
|
2023
2050
|
|
2024
|
-
if (
|
2025
|
-
|
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);
|
2026
2073
|
}
|
2027
2074
|
}
|
2028
2075
|
}
|
@@ -2096,6 +2143,28 @@ function isSyntheticShadowHost(node) {
|
|
2096
2143
|
function isSyntheticShadowRoot(node) {
|
2097
2144
|
const shadowRootRecord = InternalSlot.get(node);
|
2098
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;
|
2099
2168
|
}
|
2100
2169
|
let uid = 0;
|
2101
2170
|
function attachShadow(elm, options) {
|
@@ -2143,6 +2212,12 @@ const SyntheticShadowRootDescriptors = {
|
|
2143
2212
|
return `[object ShadowRoot]`;
|
2144
2213
|
}
|
2145
2214
|
|
2215
|
+
},
|
2216
|
+
synthetic: {
|
2217
|
+
writable: false,
|
2218
|
+
enumerable: false,
|
2219
|
+
configurable: false,
|
2220
|
+
value: true
|
2146
2221
|
}
|
2147
2222
|
};
|
2148
2223
|
const ShadowRootDescriptors = {
|
@@ -3971,6 +4046,14 @@ retargetRelatedTarget(FocusEvent);
|
|
3971
4046
|
*/
|
3972
4047
|
retargetRelatedTarget(MouseEvent);
|
3973
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
|
+
|
3974
4057
|
/*
|
3975
4058
|
* Copyright (c) 2018, salesforce.com, inc.
|
3976
4059
|
* All rights reserved.
|
@@ -4024,10 +4107,22 @@ function getFilteredSlotFlattenNodes(slot) {
|
|
4024
4107
|
}
|
4025
4108
|
|
4026
4109
|
function assignedSlotGetterPatched() {
|
4027
|
-
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
|
+
}
|
4028
4123
|
/**
|
4029
4124
|
* The node is assigned to a slot if:
|
4030
|
-
* - it has a parent and
|
4125
|
+
* - it has a parent and its parent is a slot element
|
4031
4126
|
* - and if the slot owner key is different than the node owner key.
|
4032
4127
|
*
|
4033
4128
|
* When the slot and the slotted node are 2 different shadow trees, the owner keys will be
|
@@ -4036,6 +4131,7 @@ function assignedSlotGetterPatched() {
|
|
4036
4131
|
* different than the node owner key (always `undefined`).
|
4037
4132
|
*/
|
4038
4133
|
|
4134
|
+
|
4039
4135
|
if (!isNull(parentNode) && isSlotElement(parentNode) && getNodeOwnerKey(parentNode) !== getNodeOwnerKey(this)) {
|
4040
4136
|
return parentNode;
|
4041
4137
|
}
|
@@ -4252,7 +4348,10 @@ defineProperties(Element.prototype, {
|
|
4252
4348
|
innerHTML: {
|
4253
4349
|
get() {
|
4254
4350
|
if (!runtimeFlags.ENABLE_ELEMENT_PATCH) {
|
4255
|
-
|
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)) {
|
4256
4355
|
return innerHTMLGetterPatched.call(this);
|
4257
4356
|
}
|
4258
4357
|
|
@@ -4277,7 +4376,8 @@ defineProperties(Element.prototype, {
|
|
4277
4376
|
outerHTML: {
|
4278
4377
|
get() {
|
4279
4378
|
if (!runtimeFlags.ENABLE_ELEMENT_PATCH) {
|
4280
|
-
|
4379
|
+
// See notes above on get innerHTML
|
4380
|
+
if (isNodeOrDescendantsShadowed(this)) {
|
4281
4381
|
return outerHTMLGetterPatched.call(this);
|
4282
4382
|
}
|
4283
4383
|
|
@@ -5650,4 +5750,4 @@ defineProperty(Element.prototype, '$domManual$', {
|
|
5650
5750
|
|
5651
5751
|
configurable: true
|
5652
5752
|
});
|
5653
|
-
/** version: 2.6.
|
5753
|
+
/** version: 2.6.3 */
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lwc/synthetic-shadow",
|
3
|
-
"version": "2.6.
|
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.6.
|
40
|
-
"@lwc/shared": "2.6.
|
39
|
+
"@lwc/features": "2.6.3",
|
40
|
+
"@lwc/shared": "2.6.3"
|
41
41
|
},
|
42
|
-
"gitHead": "
|
42
|
+
"gitHead": "1fdd835243eed190b8ab9ca61ae7eae9f9a4073d"
|
43
43
|
}
|