diff --git a/cjs/interface/document-fragment.js b/cjs/interface/document-fragment.js index ba45ac8a..09d9f96b 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 @@ -9,5 +10,16 @@ class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.data); + next = next[NEXT]; + } + return text.join(''); + } } exports.DocumentFragment = DocumentFragment diff --git a/esm/interface/document-fragment.js b/esm/interface/document-fragment.js index 2ea26ee0..bed4ed0a 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 @@ -8,4 +9,15 @@ export class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.data); + next = next[NEXT]; + } + return text.join(''); + } } 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..ad1e7588 100644 --- a/worker.js +++ b/worker.js @@ -7168,6 +7168,17 @@ let DocumentFragment$1 = class DocumentFragment extends NonElementParentNode { constructor(ownerDocument) { super(ownerDocument, '#document-fragment', DOCUMENT_FRAGMENT_NODE); } + + get textContent() { + const text = []; + let {[NEXT]: next, [END]: end} = this; + while (next !== end) { + if (next.nodeType === TEXT_NODE) + text.push(next.data); + next = next[NEXT]; + } + return text.join(''); + } }; /**