diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index f4d6a0e6f8..9e2f5afb28 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -259,6 +259,27 @@ String Document::title() const return builder.to_string(); } +void Document::set_title(const String& title) +{ + auto* head_element = const_cast(head()); + if (!head_element) + return; + + RefPtr title_element = head_element->first_child_of_type(); + if (!title_element) { + title_element = static_ptr_cast(create_element(HTML::TagNames::title)); + head_element->append_child(*title_element); + } + + while (RefPtr child = title_element->first_child()) + title_element->remove_child(child.release_nonnull()); + + title_element->append_child(adopt(*new Text(*this, title))); + + if (auto* page = this->page()) + page->client().page_did_change_title(title); +} + void Document::attach_to_frame(Badge, Frame& frame) { m_frame = frame; diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 5c4d82b094..ae26b3defa 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -94,6 +94,7 @@ public: void set_body(HTML::HTMLElement& new_body); String title() const; + void set_title(const String&); void attach_to_frame(Badge, Frame&); void detach_from_frame(Badge, Frame&); diff --git a/Libraries/LibWeb/DOM/Document.idl b/Libraries/LibWeb/DOM/Document.idl index ff7cab8c2e..30983df125 100644 --- a/Libraries/LibWeb/DOM/Document.idl +++ b/Libraries/LibWeb/DOM/Document.idl @@ -32,4 +32,6 @@ interface Document : Node { readonly attribute DOMString readyState; + attribute DOMString title; + }