From d3fda1d73dc13604ead2b8d42457d81a612d645b Mon Sep 17 00:00:00 2001 From: iacore Date: Sun, 9 Jun 2024 13:20:02 +0000 Subject: [PATCH 1/3] + DocumentFragment.textContent fix #231 --- cjs/interface/document-fragment.js | 10 ++++++++++ esm/interface/document-fragment.js | 10 ++++++++++ test/interface/document-fragment.js | 2 ++ types/esm/interface/document-fragment.d.ts | 1 + types/esm/mixin/parent-node.d.ts | 3 --- worker.js | 10 ++++++++++ 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/cjs/interface/document-fragment.js b/cjs/interface/document-fragment.js index ba45ac8a..20405e8b 100644 --- a/cjs/interface/document-fragment.js +++ b/cjs/interface/document-fragment.js @@ -9,5 +9,15 @@ class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + let r = "" + let curr = this.firstChild + while (curr) { + r += curr.textContent + curr = curr.nextSibling + } + return r; + } } exports.DocumentFragment = DocumentFragment diff --git a/esm/interface/document-fragment.js b/esm/interface/document-fragment.js index 2ea26ee0..69a941cf 100644 --- a/esm/interface/document-fragment.js +++ b/esm/interface/document-fragment.js @@ -8,4 +8,14 @@ export class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + let r = "" + let curr = this.firstChild + while (curr) { + r += curr.textContent + curr = curr.nextSibling + } + return r; + } } diff --git a/test/interface/document-fragment.js b/test/interface/document-fragment.js index 42862adc..e75e10be 100644 --- a/test/interface/document-fragment.js +++ b/test/interface/document-fragment.js @@ -39,8 +39,10 @@ assert(node.firstElementChild, node.lastElementChild, 'element child'); node.prepend('a'); node.append('b'); assert(node.toString(), '<#document-fragment>a
b', 'expected content'); +assert(node.textContent, 'ab', 'expected textContent'); node.replaceChildren('c', 'd'); assert(node.toString(), '<#document-fragment>cd', 'expected content'); +assert(node.textContent, 'cd', 'expected textContent'); node.normalize(); assert(node.childNodes.length, 1, 'normalize()'); node.replaceChild(document.createElement('input'), node.firstChild); diff --git a/types/esm/interface/document-fragment.d.ts b/types/esm/interface/document-fragment.d.ts index 38fe406b..e5debbf1 100644 --- a/types/esm/interface/document-fragment.d.ts +++ b/types/esm/interface/document-fragment.d.ts @@ -3,5 +3,6 @@ */ export class DocumentFragment extends NonElementParentNode implements globalThis.DocumentFragment { constructor(ownerDocument: any); + get textContent(): string; } import { NonElementParentNode } from '../mixin/non-element-parent-node.js'; diff --git a/types/esm/mixin/parent-node.d.ts b/types/esm/mixin/parent-node.d.ts index 6a0af465..dfdc1e74 100644 --- a/types/esm/mixin/parent-node.d.ts +++ b/types/esm/mixin/parent-node.d.ts @@ -45,9 +45,6 @@ import { Node } from '../interface/node.js'; import { NodeList } from '../interface/node-list.js'; import { PRIVATE } from '../shared/symbols.js'; import { END } from '../shared/symbols.js'; -import { NEXT } from '../shared/symbols.js'; -import { PREV } from '../shared/symbols.js'; -import { START } from '../shared/symbols.js'; import { ATTRIBUTE_NODE } from '../shared/constants.js'; import { DOCUMENT_FRAGMENT_NODE } from '../shared/constants.js'; import { ELEMENT_NODE } from '../shared/constants.js'; diff --git a/worker.js b/worker.js index b6e3eaed..0a5bf27b 100644 --- a/worker.js +++ b/worker.js @@ -7168,6 +7168,16 @@ let DocumentFragment$1 = class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + let r = ""; + let curr = this.firstChild; + while (curr) { + r += curr.textContent; + curr = curr.nextSibling; + } + return r; + } }; /** From 439d0fe39b02acfa5277d097bf712f642e1c93aa Mon Sep 17 00:00:00 2001 From: iacore Date: Sun, 9 Jun 2024 13:23:55 +0000 Subject: [PATCH 2/3] make it more efficient --- cjs/interface/document-fragment.js | 16 +++++++++------- esm/interface/document-fragment.js | 16 +++++++++------- worker.js | 13 +++++++------ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/cjs/interface/document-fragment.js b/cjs/interface/document-fragment.js index 20405e8b..7aab7e67 100644 --- a/cjs/interface/document-fragment.js +++ b/cjs/interface/document-fragment.js @@ -1,6 +1,7 @@ 'use strict'; -const {DOCUMENT_FRAGMENT_NODE} = require('../shared/constants.js'); +const {DOCUMENT_FRAGMENT_NODE, TEXT_NODE} = require('../shared/constants.js'); const {NonElementParentNode} = require('../mixin/non-element-parent-node.js'); +const {NEXT, END} = require('../shared/symbols.js') /** * @implements globalThis.DocumentFragment @@ -11,13 +12,14 @@ class DocumentFragment extends NonElementParentNode { } get textContent() { - let r = "" - let curr = this.firstChild - while (curr) { - r += curr.textContent - curr = curr.nextSibling + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.textContent); + next = next[NEXT]; } - return r; + return text.join(''); } } exports.DocumentFragment = DocumentFragment diff --git a/esm/interface/document-fragment.js b/esm/interface/document-fragment.js index 69a941cf..48092a9b 100644 --- a/esm/interface/document-fragment.js +++ b/esm/interface/document-fragment.js @@ -1,5 +1,6 @@ -import {DOCUMENT_FRAGMENT_NODE} from '../shared/constants.js'; +import {DOCUMENT_FRAGMENT_NODE, TEXT_NODE} from '../shared/constants.js'; import {NonElementParentNode} from '../mixin/non-element-parent-node.js'; +import {NEXT, END} from '../shared/symbols.js' /** * @implements globalThis.DocumentFragment @@ -10,12 +11,13 @@ export class DocumentFragment extends NonElementParentNode { } get textContent() { - let r = "" - let curr = this.firstChild - while (curr) { - r += curr.textContent - curr = curr.nextSibling + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.textContent); + next = next[NEXT]; } - return r; + return text.join(''); } } diff --git a/worker.js b/worker.js index 0a5bf27b..53ca5d1a 100644 --- a/worker.js +++ b/worker.js @@ -7170,13 +7170,14 @@ let DocumentFragment$1 = class DocumentFragment extends NonElementParentNode { } get textContent() { - let r = ""; - let curr = this.firstChild; - while (curr) { - r += curr.textContent; - curr = curr.nextSibling; + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.textContent); + next = next[NEXT]; } - return r; + return text.join(''); } }; From 16f8b801ccdaa15a2a839549c08563d1e1cc0941 Mon Sep 17 00:00:00 2001 From: iacore Date: Tue, 11 Jun 2024 15:50:28 +0000 Subject: [PATCH 3/3] use .data instead of .textContent DOM is complex. --- cjs/interface/document-fragment.js | 2 +- esm/interface/document-fragment.js | 2 +- worker.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cjs/interface/document-fragment.js b/cjs/interface/document-fragment.js index 7aab7e67..09d9f96b 100644 --- a/cjs/interface/document-fragment.js +++ b/cjs/interface/document-fragment.js @@ -16,7 +16,7 @@ class DocumentFragment extends NonElementParentNode { let {[NEXT]: next, [END]: end} = this; while (next !== end) { if (next.nodeType === TEXT_NODE) - text.push(next.textContent); + text.push(next.data); next = next[NEXT]; } return text.join(''); diff --git a/esm/interface/document-fragment.js b/esm/interface/document-fragment.js index 48092a9b..bed4ed0a 100644 --- a/esm/interface/document-fragment.js +++ b/esm/interface/document-fragment.js @@ -15,7 +15,7 @@ export class DocumentFragment extends NonElementParentNode { let {[NEXT]: next, [END]: end} = this; while (next !== end) { if (next.nodeType === TEXT_NODE) - text.push(next.textContent); + text.push(next.data); next = next[NEXT]; } return text.join(''); diff --git a/worker.js b/worker.js index 53ca5d1a..ad1e7588 100644 --- a/worker.js +++ b/worker.js @@ -7174,7 +7174,7 @@ let DocumentFragment$1 = class DocumentFragment extends NonElementParentNode { let {[NEXT]: next, [END]: end} = this; while (next !== end) { if (next.nodeType === TEXT_NODE) - text.push(next.textContent); + text.push(next.data); next = next[NEXT]; } return text.join('');