From d200764e7492d6a1a2defbb293d2c309290edc30 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 25 Jan 2022 17:02:51 +0100 Subject: [PATCH 1/5] Fix `Node.append` throwing `Illegal invocation` --- src/client/sandbox/node/element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/sandbox/node/element.ts b/src/client/sandbox/node/element.ts index 1dfed9259..0159f86f0 100644 --- a/src/client/sandbox/node/element.ts +++ b/src/client/sandbox/node/element.ts @@ -487,14 +487,14 @@ 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): void { const [start, end] = newNodesRange; for (let i = start; i < end; i++) { const node = args[i]; - if (typeof node === 'string') - args[i] = ElementSandbox._processTextContent(node, parentNode); + if (!(node instanceof Node)) + args[i] = ElementSandbox._processTextContent(node.toString(), parentNode); else if (domUtils.isTextNode(node)) node.data = ElementSandbox._processTextContent(node.data, parentNode); else From 4c02a367b76532864e621d53d5cd6deec116daff Mon Sep 17 00:00:00 2001 From: Daniel Troger Date: Thu, 3 Feb 2022 10:44:41 +0100 Subject: [PATCH 2/5] fix Element.append(null) case --- src/client/sandbox/node/element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/sandbox/node/element.ts b/src/client/sandbox/node/element.ts index 0159f86f0..482a49af8 100644 --- a/src/client/sandbox/node/element.ts +++ b/src/client/sandbox/node/element.ts @@ -494,7 +494,7 @@ export default class ElementSandbox extends SandboxBase { const node = args[i]; if (!(node instanceof Node)) - args[i] = ElementSandbox._processTextContent(node.toString(), parentNode); + args[i] = ElementSandbox._processTextContent(node + "", parentNode); else if (domUtils.isTextNode(node)) node.data = ElementSandbox._processTextContent(node.data, parentNode); else From a815acd6a2329775beac9d7df3088965323fc082 Mon Sep 17 00:00:00 2001 From: Daniel Troger Date: Thu, 3 Feb 2022 10:59:58 +0100 Subject: [PATCH 3/5] add tests --- test/client/fixtures/sandbox/node/dom-processor-test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/client/fixtures/sandbox/node/dom-processor-test.js b/test/client/fixtures/sandbox/node/dom-processor-test.js index 115506f3b..665187ae6 100644 --- a/test/client/fixtures/sandbox/node/dom-processor-test.js +++ b/test/client/fixtures/sandbox/node/dom-processor-test.js @@ -149,6 +149,14 @@ if (nativeMethods.append) { strictEqual(nativeMethods.nodeLastChildGetter.call(document.body), root); strictEqual(nativeMethods.nodePrevSiblingGetter.call(root).data, onlyText); + // tests for https://github.com/DevExpress/testcafe-hammerhead/pull/2730 + var container = document.createElement('div'); + + container.append(null); + container.append({ test: 'hi' }); + container.append(1234); + strictEqual(container.textContent, 'null[object Object]1234'); + document.body.removeChild(root.previousSibling); }); } From 5c6d904665aa4c72f162ac8094e446f5f5b07de3 Mon Sep 17 00:00:00 2001 From: MargaritaLoseva Date: Mon, 7 Feb 2022 17:06:18 +0300 Subject: [PATCH 4/5] refix --- src/client/sandbox/node/element.ts | 31 +++++++++++++------ .../sandbox/node/dom-processor-test.js | 10 ++++-- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/client/sandbox/node/element.ts b/src/client/sandbox/node/element.ts index 482a49af8..1661ed5a5 100644 --- a/src/client/sandbox/node/element.ts +++ b/src/client/sandbox/node/element.ts @@ -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]; @@ -451,9 +454,9 @@ export default class ElementSandbox extends SandboxBase { private _addNodeCore ( 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, stringifyObjects = false): K { - this._prepareNodesForInsertion(args, newNodesRange, parent); + this._prepareNodesForInsertion(args, newNodesRange, parent, stringifyObjects); let result = null; const childNodesArray = ElementSandbox._getChildNodesArray(args, newNodesRange); @@ -487,18 +490,28 @@ export default class ElementSandbox extends SandboxBase { return result; } - private _prepareNodesForInsertion (args: (string | Node | any)[], newNodesRange: [number, number], parentNode: Node): void { + private _prepareNodesForInsertion (args: (string | Node | any)[], newNodesRange: [number, number], parentNode: Node, stringifyObjects = 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 (!(node instanceof Node)) - 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 (stringifyObjects) + node = String(node); + + if (typeof node === 'string') + args[i] = ElementSandbox._processTextContent(node, parentNode); + } } } @@ -606,7 +619,7 @@ export default class ElementSandbox extends SandboxBase { }, append (this: Element, ...args: Parameters) { - 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) { diff --git a/test/client/fixtures/sandbox/node/dom-processor-test.js b/test/client/fixtures/sandbox/node/dom-processor-test.js index 665187ae6..9cb2b34ca 100644 --- a/test/client/fixtures/sandbox/node/dom-processor-test.js +++ b/test/client/fixtures/sandbox/node/dom-processor-test.js @@ -149,15 +149,19 @@ if (nativeMethods.append) { strictEqual(nativeMethods.nodeLastChildGetter.call(document.body), root); strictEqual(nativeMethods.nodePrevSiblingGetter.call(root).data, onlyText); - // tests for https://github.com/DevExpress/testcafe-hammerhead/pull/2730 + 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, 'null[object Object]1234'); - document.body.removeChild(root.previousSibling); + strictEqual(container.textContent, 'nullundefined[object Object]1234'); }); } From ea4b73a0558e56dc80d9ac500891bbb962f04651 Mon Sep 17 00:00:00 2001 From: miherlosev Date: Fri, 11 Feb 2022 12:34:27 +0300 Subject: [PATCH 5/5] renames --- src/client/sandbox/node/element.ts | 8 ++++---- test/client/fixtures/sandbox/node/dom-processor-test.js | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/client/sandbox/node/element.ts b/src/client/sandbox/node/element.ts index 1661ed5a5..e71b39dfd 100644 --- a/src/client/sandbox/node/element.ts +++ b/src/client/sandbox/node/element.ts @@ -454,9 +454,9 @@ export default class ElementSandbox extends SandboxBase { private _addNodeCore ( parent: Element | Node & ParentNode, context: Element | Node & ParentNode, - newNodesRange: [number, number], args: A, nativeFn: (...args: A) => K, checkBody = true, stringifyObjects = false): K { + newNodesRange: [number, number], args: A, nativeFn: (...args: A) => K, checkBody = true, stringifyNode = false): K { - this._prepareNodesForInsertion(args, newNodesRange, parent, stringifyObjects); + this._prepareNodesForInsertion(args, newNodesRange, parent, stringifyNode); let result = null; const childNodesArray = ElementSandbox._getChildNodesArray(args, newNodesRange); @@ -490,7 +490,7 @@ export default class ElementSandbox extends SandboxBase { return result; } - private _prepareNodesForInsertion (args: (string | Node | any)[], newNodesRange: [number, number], parentNode: Node, stringifyObjects = false): void { + private _prepareNodesForInsertion (args: (string | Node | any)[], newNodesRange: [number, number], parentNode: Node, stringifyNode = false): void { if (args.length === 0) return; @@ -506,7 +506,7 @@ export default class ElementSandbox extends SandboxBase { domUtils.isCommentNode(node)) this._nodeSandbox.processNodes(node as Element | DocumentFragment); else { - if (stringifyObjects) + if (stringifyNode) node = String(node); if (typeof node === 'string') diff --git a/test/client/fixtures/sandbox/node/dom-processor-test.js b/test/client/fixtures/sandbox/node/dom-processor-test.js index 9cb2b34ca..fce69c2b7 100644 --- a/test/client/fixtures/sandbox/node/dom-processor-test.js +++ b/test/client/fixtures/sandbox/node/dom-processor-test.js @@ -152,9 +152,10 @@ if (nativeMethods.append) { document.body.removeChild(root.previousSibling); }); - test('Element.prototype.append for objects(GH-2730)', function () { + test('Element.prototype.append for objects (GH-2730)', function () { var container = document.createElement('div'); + container.append(null); container.append(); container.append(void 0);