Skip to content
This repository was archived by the owner on Oct 26, 2021. It is now read-only.

Commit d912203

Browse files
committed
ChildNode, ParentNode: Fix cases where nodes that were already connected and then inserted elsewhere did not have their disconnectedCallback called.
1 parent 58045d0 commit d912203

2 files changed

Lines changed: 48 additions & 10 deletions

File tree

src/Patch/Interface/ChildNode.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,16 @@ export default function(internals, destination, builtIn) {
2121
* @param {...(!Node|string)} nodes
2222
*/
2323
destination['before'] = function(...nodes) {
24+
const connectedBefore = /** @type {!Array<!Node>} */ (nodes.filter(node => {
25+
return node instanceof Node && Utilities.isConnected(node);
26+
}));
27+
2428
builtIn.before.apply(this, nodes);
2529

30+
for (const node of connectedBefore) {
31+
internals.disconnectTree(node);
32+
}
33+
2634
if (Utilities.isConnected(this)) {
2735
for (const node of nodes) {
2836
if (node instanceof Element) {
@@ -36,8 +44,16 @@ export default function(internals, destination, builtIn) {
3644
* @param {...(!Node|string)} nodes
3745
*/
3846
destination['after'] = function(...nodes) {
47+
const connectedBefore = /** @type {!Array<!Node>} */ (nodes.filter(node => {
48+
return node instanceof Node && Utilities.isConnected(node);
49+
}));
50+
3951
builtIn.after.apply(this, nodes);
4052

53+
for (const node of connectedBefore) {
54+
internals.disconnectTree(node);
55+
}
56+
4157
if (Utilities.isConnected(this)) {
4258
for (const node of nodes) {
4359
if (node instanceof Element) {
@@ -51,10 +67,18 @@ export default function(internals, destination, builtIn) {
5167
* @param {...(!Node|string)} nodes
5268
*/
5369
destination['replaceWith'] = function(...nodes) {
70+
const connectedBefore = /** @type {!Array<!Node>} */ (nodes.filter(node => {
71+
return node instanceof Node && Utilities.isConnected(node);
72+
}));
73+
5474
const wasConnected = Utilities.isConnected(this);
5575

5676
builtIn.replaceWith.apply(this, nodes);
5777

78+
for (const node of connectedBefore) {
79+
internals.disconnectTree(node);
80+
}
81+
5882
if (wasConnected) {
5983
internals.disconnectTree(this);
6084
for (const node of nodes) {

src/Patch/Interface/ParentNode.js

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,21 @@ export default function(internals, destination, builtIn) {
2222
* @param {...(!Node|string)} nodes
2323
*/
2424
destination['prepend'] = function(...nodes) {
25+
const connectedBefore = /** @type {!Array<!Node>} */ (nodes.filter(node => {
26+
return node instanceof Node && Utilities.isConnected(node);
27+
}));
28+
2529
builtIn.prepend.apply(this, nodes);
2630

27-
const connected = Utilities.isConnected(this);
28-
if (connected) {
29-
for (const node of nodes) {
30-
if (!(node instanceof Element)) continue;
31+
for (const node of connectedBefore) {
32+
internals.disconnectTree(node);
33+
}
3134

32-
internals.connectTree(node);
35+
if (Utilities.isConnected(this)) {
36+
for (const node of nodes) {
37+
if (node instanceof Element) {
38+
internals.connectTree(node);
39+
}
3340
}
3441
}
3542
};
@@ -38,14 +45,21 @@ export default function(internals, destination, builtIn) {
3845
* @param {...(!Node|string)} nodes
3946
*/
4047
destination['append'] = function(...nodes) {
48+
const connectedBefore = /** @type {!Array<!Node>} */ (nodes.filter(node => {
49+
return node instanceof Node && Utilities.isConnected(node);
50+
}));
51+
4152
builtIn.append.apply(this, nodes);
4253

43-
const connected = Utilities.isConnected(this);
44-
if (connected) {
45-
for (const node of nodes) {
46-
if (!(node instanceof Element)) continue;
54+
for (const node of connectedBefore) {
55+
internals.disconnectTree(node);
56+
}
4757

48-
internals.connectTree(node);
58+
if (Utilities.isConnected(this)) {
59+
for (const node of nodes) {
60+
if (node instanceof Element) {
61+
internals.connectTree(node);
62+
}
4963
}
5064
}
5165
};

0 commit comments

Comments
 (0)