diff --git a/src/dom/document.ts b/src/dom/document.ts index 8903962..08d4efb 100644 --- a/src/dom/document.ts +++ b/src/dom/document.ts @@ -152,6 +152,18 @@ export class Document extends Node { get title(): string { return this.querySelector("title")?.textContent || ""; } + set title(value: string) { + let titleElement = this.querySelector("title"); + if (!titleElement) { + const { head } = this; + if (!head) return; + + titleElement = this.createElement("title"); + head.appendChild(titleElement); + } + + titleElement.textContent = value; + } get cookie(): string { return ""; // TODO diff --git a/test/units/Document.ts b/test/units/Document.ts new file mode 100644 index 0000000..346447b --- /dev/null +++ b/test/units/Document.ts @@ -0,0 +1,36 @@ +import { DOMParser } from "../../deno-dom-wasm.ts"; +import { assertStrictEquals as assertEquals } from "assert"; + +Deno.test("Document.title sets title element value", () => { + const doc = new DOMParser().parseFromString( + `foo`, + "text/html", + ); + assertEquals(doc.title, "foo"); + doc.title = "bar"; + assertEquals(doc.title, "bar"); + assertEquals(doc.querySelector("title")?.textContent, "bar"); +}); + +Deno.test("Document.title adds missing title element", () => { + const doc = new DOMParser().parseFromString( + ``, + "text/html", + ); + assertEquals(doc.title, ""); + doc.title = "foo"; + assertEquals(doc.title, "foo"); + assertEquals(doc.querySelector("title")?.textContent, "foo"); +}); + +Deno.test("Document.title does not add title missing head element", () => { + const doc = new DOMParser().parseFromString( + ``, + "text/html", + ); + doc.head.remove(); + assertEquals(doc.title, ""); + doc.title = "foo"; + assertEquals(doc.title, ""); + assertEquals(doc.querySelector("title"), null); +});