Skip to content

Commit

Permalink
Revert "Remove IE11 unmount hack"
Browse files Browse the repository at this point in the history
This reverts commit 0b30ecc.
  • Loading branch information
JoviDeCroock committed Feb 12, 2025
1 parent 1fc8b65 commit def0af5
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 37 deletions.
12 changes: 5 additions & 7 deletions src/diff/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { BaseComponent, getDomSibling } from '../component';
import { Fragment } from '../create-element';
import { diffChildren } from './children';
import { setProperty } from './props';
import { assign, isArray, slice } from '../util';
import { assign, isArray, removeNode, slice } from '../util';
import options from '../options';

/**
Expand Down Expand Up @@ -300,8 +300,7 @@ export function diff(
newVNode._dom = oldDom;
} else {
for (let i = excessDomChildren.length; i--; ) {
const child = excessDomChildren[i];
if (child) child.remove();
removeNode(excessDomChildren[i]);
}
}
} else {
Expand Down Expand Up @@ -543,8 +542,7 @@ function diffElementNodes(
// Remove children that are not part of any vnode.
if (excessDomChildren != null) {
for (i = excessDomChildren.length; i--; ) {
const child = excessDomChildren[i];
if (child) child.remove();
removeNode(excessDomChildren[i]);
}
}
}
Expand Down Expand Up @@ -643,8 +641,8 @@ export function unmount(vnode, parentVNode, skipRemove) {
}
}

if (!skipRemove && vnode._dom != null && vnode._dom.parentNode) {
vnode._dom.remove();
if (!skipRemove) {
removeNode(vnode._dom);
}

vnode._component = vnode._parent = vnode._dom = UNDEFINED;
Expand Down
16 changes: 7 additions & 9 deletions src/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,14 @@ import { EMPTY_ARR } from './constants';

export const isArray = Array.isArray;
export const slice = EMPTY_ARR.slice;
export const assign = Object.assign;

/**
* Assign properties from `props` to `obj`
* @template O, P The obj and props types
* @param {O} obj The object to copy properties to
* @param {P} props The object to copy properties from
* @returns {O & P}
* Remove a child node from its parent if attached. This is a workaround for
* IE11 which doesn't support `Element.prototype.remove()`. Using this function
* is smaller than including a dedicated polyfill.
* @param {import('./index').ContainerNode} node The node to remove
*/
export function assign(obj, props) {
// @ts-expect-error We change the type of `obj` to be `O & P`
for (let i in props) obj[i] = props[i];
return /** @type {O & P} */ (obj);
export function removeNode(node) {
if (node && node.parentNode) node.parentNode.removeChild(node);
}
4 changes: 4 additions & 0 deletions test/_util/logCall.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ export function logCall(obj, method) {

let operation;
switch (method) {
case 'removeChild': {
operation = `${serialize(c)}.remove()`;
break;
}
case 'insertBefore': {
if (args[1] === null && args.length === 2) {
operation = `${serialize(this)}.appendChild(${serialize(args[0])})`;
Expand Down
9 changes: 3 additions & 6 deletions test/browser/fragments.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,12 @@ describe('Fragment', () => {

let resetInsertBefore;
let resetAppendChild;
let resetRemove;
let resetRemoveText;
let resetRemoveChild;

before(() => {
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetRemove = logCall(Element.prototype, 'remove');
resetRemoveText = logCall(Text.prototype, 'remove');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
// logCall(CharacterData.prototype, 'remove');
// TODO: Consider logging setting set data
// ```
Expand All @@ -54,8 +52,7 @@ describe('Fragment', () => {
after(() => {
resetInsertBefore();
resetAppendChild();
resetRemove();
resetRemoveText();
resetRemoveChild();
});

beforeEach(() => {
Expand Down
9 changes: 3 additions & 6 deletions test/browser/hydrate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,31 +25,28 @@ describe('hydrate()', () => {

let resetAppendChild;
let resetInsertBefore;
let resetRemoveChild;
let resetRemove;
let resetRemoveText;
let resetRemoveComment;
let resetSetAttribute;
let resetRemoveAttribute;
let rerender;

before(() => {
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
resetRemove = logCall(Element.prototype, 'remove');
resetRemoveComment = logCall(Comment.prototype, 'remove');
resetRemoveText = logCall(Text.prototype, 'remove');
resetSetAttribute = logCall(Element.prototype, 'setAttribute');
resetRemoveAttribute = logCall(Element.prototype, 'removeAttribute');
});

after(() => {
resetAppendChild();
resetInsertBefore();
resetRemoveChild();
resetRemove();
resetRemoveText();
resetSetAttribute();
resetRemoveAttribute();
resetRemoveComment();
});

beforeEach(() => {
Expand Down
3 changes: 0 additions & 3 deletions test/browser/keys.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,22 +70,19 @@ describe('keys', () => {
let resetInsertBefore;
let resetRemoveChild;
let resetRemove;
let resetRemoveText;

before(() => {
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
resetRemove = logCall(Element.prototype, 'remove');
resetRemoveText = logCall(Text.prototype, 'remove');
});

after(() => {
resetAppendChild();
resetInsertBefore();
resetRemoveChild();
resetRemove();
resetRemoveText();
});

beforeEach(() => {
Expand Down
6 changes: 3 additions & 3 deletions test/browser/placeholders.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,20 @@ describe('null placeholders', () => {

let resetAppendChild;
let resetInsertBefore;
let resetRemoveText;
let resetRemoveChild;
let resetRemove;

before(() => {
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
resetRemove = logCall(Element.prototype, 'remove');
resetRemoveText = logCall(Text.prototype, 'remove');
});

after(() => {
resetAppendChild();
resetInsertBefore();
resetRemoveText();
resetRemoveChild();
resetRemove();
});

Expand Down
6 changes: 3 additions & 3 deletions test/browser/render.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ describe('render()', () => {

let resetAppendChild;
let resetInsertBefore;
let resetRemoveText;
let resetRemoveChild;
let resetRemove;

beforeEach(() => {
Expand All @@ -46,14 +46,14 @@ describe('render()', () => {
before(() => {
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetRemoveText = logCall(Text.prototype, 'remove');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
resetRemove = logCall(Element.prototype, 'remove');
});

after(() => {
resetAppendChild();
resetInsertBefore();
resetRemoveText();
resetRemoveChild();
resetRemove();
});

Expand Down

0 comments on commit def0af5

Please sign in to comment.