From 6612d19fa491cd296f4af0478b076de5063a1091 Mon Sep 17 00:00:00 2001 From: Whitewater Date: Fri, 13 Dec 2024 07:09:59 +0000 Subject: [PATCH 1/6] fix: unexpected special replacement patterns --- cjs/html/text-element.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cjs/html/text-element.js b/cjs/html/text-element.js index 83d4f376..00c16fae 100644 --- a/cjs/html/text-element.js +++ b/cjs/html/text-element.js @@ -10,7 +10,11 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/>${this.textContent}<`); + // Use `join` in here to prevent unexpected special replacement patterns + // See also + // https://github.com/WebReflection/linkedom/issues/292 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement + return outerHTML.split('><').join(`>${this.textContent}<`); } } exports.TextElement = TextElement From 579eb8dfb4362ae53164098d5dd1bf2ca98689ea Mon Sep 17 00:00:00 2001 From: Whitewater Date: Fri, 13 Dec 2024 07:13:07 +0000 Subject: [PATCH 2/6] chore: add test --- test/html/script-element.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/html/script-element.js b/test/html/script-element.js index 52be3a07..81af0211 100644 --- a/test/html/script-element.js +++ b/test/html/script-element.js @@ -140,3 +140,17 @@ assert(head.firstChild.innerHTML, 'html`

ok

`;', '') +} + +{ + const { document } = parseHTML(''); + assert(document.toString(), '') +} From 2c42ec68be54c2c4b6d7f3a725d1906cfc68b51f Mon Sep 17 00:00:00 2001 From: Whitewater Date: Fri, 13 Dec 2024 07:16:29 +0000 Subject: [PATCH 3/6] fix: other env --- esm/html/text-element.js | 2 +- worker.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esm/html/text-element.js b/esm/html/text-element.js index 76d944bb..39c1d1a5 100644 --- a/esm/html/text-element.js +++ b/esm/html/text-element.js @@ -9,6 +9,6 @@ export class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/>${this.textContent}<`); + return outerHTML.split('><').join(`>${this.textContent}<`); } } diff --git a/worker.js b/worker.js index 7850f17f..074c0079 100644 --- a/worker.js +++ b/worker.js @@ -8567,7 +8567,7 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/>${this.textContent}<`); + return outerHTML.split('><').join(`>${this.textContent}<`); } } From 86427ea95f3adcf1478377bb47fc3c75ed978202 Mon Sep 17 00:00:00 2001 From: Whitewater Date: Sat, 14 Dec 2024 10:35:10 +0000 Subject: [PATCH 4/6] chore: follow code review --- cjs/html/text-element.js | 6 +----- esm/html/text-element.js | 2 +- worker.js | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/cjs/html/text-element.js b/cjs/html/text-element.js index 00c16fae..8ca968ba 100644 --- a/cjs/html/text-element.js +++ b/cjs/html/text-element.js @@ -10,11 +10,7 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - // Use `join` in here to prevent unexpected special replacement patterns - // See also - // https://github.com/WebReflection/linkedom/issues/292 - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement - return outerHTML.split('><').join(`>${this.textContent}<`); + return outerHTML.replace(/> `>${this.textContent}<`); } } exports.TextElement = TextElement diff --git a/esm/html/text-element.js b/esm/html/text-element.js index 39c1d1a5..9e67dbf3 100644 --- a/esm/html/text-element.js +++ b/esm/html/text-element.js @@ -9,6 +9,6 @@ export class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.split('><').join(`>${this.textContent}<`); + return outerHTML.replace(/> `>${this.textContent}<`); } } diff --git a/worker.js b/worker.js index 074c0079..b2108478 100644 --- a/worker.js +++ b/worker.js @@ -8567,7 +8567,7 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.split('><').join(`>${this.textContent}<`); + return outerHTML.replace(/> `>${this.textContent}<`); } } From e40b6fa6471d4fce5492dbbf602b71ae86b2392a Mon Sep 17 00:00:00 2001 From: Whitewater Date: Sat, 14 Dec 2024 10:38:03 +0000 Subject: [PATCH 5/6] chore: tweak test --- test/html/script-element.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/html/script-element.js b/test/html/script-element.js index 81af0211..bb16c662 100644 --- a/test/html/script-element.js +++ b/test/html/script-element.js @@ -145,9 +145,9 @@ assert(head.firstChild.innerHTML, 'html`

ok

`;', '') + assert(document.toString(), '') } { From 8b4c10ec42bf0387d3bcb9381343dbef37722847 Mon Sep 17 00:00:00 2001 From: Whitewater Date: Sat, 14 Dec 2024 10:49:33 +0000 Subject: [PATCH 6/6] chore: replace with literal string for performance --- cjs/html/text-element.js | 2 +- esm/html/text-element.js | 2 +- worker.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cjs/html/text-element.js b/cjs/html/text-element.js index 8ca968ba..d55b5d3c 100644 --- a/cjs/html/text-element.js +++ b/cjs/html/text-element.js @@ -10,7 +10,7 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/> `>${this.textContent}<`); + return outerHTML.replace('><', () => `>${this.textContent}<`); } } exports.TextElement = TextElement diff --git a/esm/html/text-element.js b/esm/html/text-element.js index 9e67dbf3..ae231795 100644 --- a/esm/html/text-element.js +++ b/esm/html/text-element.js @@ -9,6 +9,6 @@ export class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/> `>${this.textContent}<`); + return outerHTML.replace('><', () => `>${this.textContent}<`); } } diff --git a/worker.js b/worker.js index b2108478..555d9919 100644 --- a/worker.js +++ b/worker.js @@ -8567,7 +8567,7 @@ class TextElement extends HTMLElement { toString() { const outerHTML = toString.call(this.cloneNode()); - return outerHTML.replace(/> `>${this.textContent}<`); + return outerHTML.replace('><', () => `>${this.textContent}<`); } }