Skip to content

Commit

Permalink
Fix Node.append throwing Illegal invocation (#2730)
Browse files Browse the repository at this point in the history
* Fix `Node.append` throwing `Illegal invocation`

* fix Element.append(null) case

* add tests

* refix

* renames

Co-authored-by: MargaritaLoseva <margarita.loseva@devexpress.com>
Co-authored-by: miherlosev <miherlosev@mail.ru>
  • Loading branch information
3 people committed Feb 11, 2022
1 parent fd3fb15 commit 726a911
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 9 deletions.
31 changes: 22 additions & 9 deletions src/client/sandbox/node/element.ts
Expand Up @@ -434,6 +434,9 @@ export default class ElementSandbox extends SandboxBase {
const result = [] as Node[];
const [start, end] = range;

if (args.length === 0)
return result;

for (let i = start; i < end; i++) {
const node = args[i];

Expand All @@ -451,9 +454,9 @@ export default class ElementSandbox extends SandboxBase {

private _addNodeCore<K, A extends (string | Node)[]> (
parent: Element | Node & ParentNode, context: Element | Node & ParentNode,
newNodesRange: [number, number], args: A, nativeFn: (...args: A) => K, checkBody = true): K {
newNodesRange: [number, number], args: A, nativeFn: (...args: A) => K, checkBody = true, stringifyNode = false): K {

this._prepareNodesForInsertion(args, newNodesRange, parent);
this._prepareNodesForInsertion(args, newNodesRange, parent, stringifyNode);

let result = null;
const childNodesArray = ElementSandbox._getChildNodesArray(args, newNodesRange);
Expand Down Expand Up @@ -487,18 +490,28 @@ export default class ElementSandbox extends SandboxBase {
return result;
}

private _prepareNodesForInsertion (args: (string | Node)[], newNodesRange: [number, number], parentNode: Node): void {
private _prepareNodesForInsertion (args: (string | Node | any)[], newNodesRange: [number, number], parentNode: Node, stringifyNode = false): void {
if (args.length === 0)
return;

const [start, end] = newNodesRange;

for (let i = start; i < end; i++) {
const node = args[i];
let node = args[i];

if (typeof node === 'string')
args[i] = ElementSandbox._processTextContent(node, parentNode);
else if (domUtils.isTextNode(node))
if (domUtils.isTextNode(node))
node.data = ElementSandbox._processTextContent(node.data, parentNode);
else
else if (domUtils.isDomElement(node) ||
domUtils.isDocumentFragmentNode(node) ||
domUtils.isCommentNode(node))
this._nodeSandbox.processNodes(node as Element | DocumentFragment);
else {
if (stringifyNode)
node = String(node);

if (typeof node === 'string')
args[i] = ElementSandbox._processTextContent(node, parentNode);
}
}
}

Expand Down Expand Up @@ -606,7 +619,7 @@ export default class ElementSandbox extends SandboxBase {
},

append (this: Element, ...args: Parameters<Element['append']>) {
return sandbox._addNodeCore(this, this, [0, args.length], args, nativeMethods.append);
return sandbox._addNodeCore(this, this, [0, args.length], args, nativeMethods.append, true, true);
},

prepend (this: Element, ...args: Parameters<Element['prepend']>) {
Expand Down
13 changes: 13 additions & 0 deletions test/client/fixtures/sandbox/node/dom-processor-test.js
Expand Up @@ -151,6 +151,19 @@ if (nativeMethods.append) {

document.body.removeChild(root.previousSibling);
});

test('Element.prototype.append for objects (GH-2730)', function () {
var container = document.createElement('div');


container.append(null);
container.append();
container.append(void 0);
container.append({ test: 'hi' });
container.append(1234);

strictEqual(container.textContent, 'nullundefined[object Object]1234');
});
}

if (nativeMethods.prepend) {
Expand Down

0 comments on commit 726a911

Please sign in to comment.