diff --git a/packages/happy-dom/src/nodes/element/Element.ts b/packages/happy-dom/src/nodes/element/Element.ts index 2cb1f56d4..6cba617cd 100644 --- a/packages/happy-dom/src/nodes/element/Element.ts +++ b/packages/happy-dom/src/nodes/element/Element.ts @@ -375,7 +375,7 @@ export default class Element * @returns HTML. */ public get outerHTML(): string { - return new XMLSerializer({ escapeEntities: false }).serializeToString(this); + return new XMLSerializer({ escapeEntities: true }).serializeToString(this); } /** @@ -448,6 +448,7 @@ export default class Element * * @see https://web.dev/declarative-shadow-dom/ * @see https://chromestatus.com/feature/5191745052606464 + * @see https://html.spec.whatwg.org/#serialising-html-fragments * @param [options] Options. * @param [options.includeShadowRoots] Set to "true" to include shadow roots. * @returns HTML. @@ -455,7 +456,7 @@ export default class Element public getInnerHTML(options?: { includeShadowRoots?: boolean }): string { const xmlSerializer = new XMLSerializer({ includeShadowRoots: options && options.includeShadowRoots, - escapeEntities: false + escapeEntities: true }); let xml = ''; for (const node of this[PropertySymbol.childNodes]) { diff --git a/packages/happy-dom/test/nodes/document/Document.test.ts b/packages/happy-dom/test/nodes/document/Document.test.ts index 0a726b051..19ce90aa9 100644 --- a/packages/happy-dom/test/nodes/document/Document.test.ts +++ b/packages/happy-dom/test/nodes/document/Document.test.ts @@ -873,7 +873,7 @@ describe('Document', () => { const html = `Test>`; document.write(html); expect(document.documentElement.outerHTML).toBe( - 'Test>' + 'Test>' ); }); }); diff --git a/packages/happy-dom/test/nodes/element/Element.test.ts b/packages/happy-dom/test/nodes/element/Element.test.ts index 0230cc9a2..f7356b5f7 100644 --- a/packages/happy-dom/test/nodes/element/Element.test.ts +++ b/packages/happy-dom/test/nodes/element/Element.test.ts @@ -201,21 +201,6 @@ describe('Element', () => { }); }); - describe('get innerHTML()', () => { - it('Returns HTML of children as a concatenated string.', () => { - const div = document.createElement('div'); - - element.appendChild(div); - - vi.spyOn(XMLSerializer.prototype, 'serializeToString').mockImplementation((rootElement) => { - expect(rootElement).toBe(div); - return 'EXPECTED_HTML'; - }); - - expect(element.innerHTML).toBe('EXPECTED_HTML'); - }); - }); - describe('set innerHTML()', () => { it('Creates child nodes from provided HTML.', () => { const div = document.createElement('div'); @@ -247,6 +232,29 @@ describe('Element', () => { expect(element.outerHTML).toBe('
text1
'); }); + + it('Returns HTML of children as a concatenated string.', () => { + const div = document.createElement('div'); + + element.appendChild(div); + + vi.spyOn(XMLSerializer.prototype, 'serializeToString').mockImplementation((rootElement) => { + expect(rootElement).toBe(div); + return 'EXPECTED_HTML'; + }); + + expect(element.innerHTML).toBe('EXPECTED_HTML'); + }); + + it('Returns encoded HTML string with setter innerText.', () => { + const div = document.createElement('div'); + + div.innerText = '&a'; + + element.appendChild(div); + + expect(element.innerHTML).toBe('
<b>&a</b>
'); + }); }); describe('get outerHTML()', () => {