From 67a9ebc8176e6dff4c3af3bc26ef3de829d87286 Mon Sep 17 00:00:00 2001 From: Max Wipfli Date: Wed, 12 May 2021 10:32:41 +0200 Subject: [PATCH] LibWeb: Change Document's m_encoding to Optional This modifies the Document class to use Optional for the encoding. If the encoding is unknown, the Optional will not have a value. It also implements the has_encoding() and encoding_or_default() instance methods, the latter of which will return "UTF-8" as a fallback if no encoding is present. The usage of Optional instead of the null string is part of an effort to explicitly indicate that a string could not have a value. This also modifies the former callers of encoding() to use encoding_or_default(). Furthermore, the encoding will now only be set if it is actually known, rather than just guessed by earlier code. --- Userland/Libraries/LibWeb/DOM/Document.h | 14 ++++++++------ Userland/Libraries/LibWeb/Loader/FrameLoader.cpp | 6 +++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 43195032d73..98b73fe919a 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -237,13 +237,15 @@ public: const String& content_type() const { return m_content_type; } void set_content_type(const String& content_type) { m_content_type = content_type; } - const String& encoding() const { return m_encoding; } - void set_encoding(const String& encoding) { m_encoding = encoding; } + bool has_encoding() const { return m_encoding.has_value(); } + const Optional& encoding() const { return m_encoding; } + String encoding_or_default() const { return m_encoding.value_or("UTF-8"); } + void set_encoding(const Optional& encoding) { m_encoding = encoding; } // NOTE: These are intended for the JS bindings - const String& character_set() const { return encoding(); } - const String& charset() const { return encoding(); } - const String& input_encoding() const { return encoding(); } + String character_set() const { return encoding_or_default(); } + String charset() const { return encoding_or_default(); } + String input_encoding() const { return encoding_or_default(); } bool ready_for_post_load_tasks() const { return m_ready_for_post_load_tasks; } void set_ready_for_post_load_tasks(bool ready) { m_ready_for_post_load_tasks = ready; } @@ -327,7 +329,7 @@ private: String m_ready_state { "loading" }; String m_content_type { "application/xml" }; - String m_encoding { "UTF-8" }; + Optional m_encoding; bool m_ready_for_post_load_tasks { false }; diff --git a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp index 00c7826f565..adaba8905e4 100644 --- a/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/FrameLoader.cpp @@ -113,7 +113,7 @@ bool FrameLoader::parse_document(DOM::Document& document, const ByteBuffer& data { auto& mime_type = document.content_type(); if (mime_type == "text/html" || mime_type == "image/svg+xml") { - HTML::HTMLDocumentParser parser(document, data, document.encoding()); + HTML::HTMLDocumentParser parser(document, data, document.encoding_or_default()); parser.run(document.url()); return true; } @@ -251,12 +251,12 @@ void FrameLoader::resource_did_load() if (resource()->has_encoding()) { dbgln("This content has MIME type '{}', encoding '{}'", resource()->mime_type(), resource()->encoding().value()); } else { - dbgln("This content has MIME type '{}', encoding unknown (defaulting to 'utf-8')", resource()->mime_type()); + dbgln("This content has MIME type '{}', encoding unknown", resource()->mime_type()); } auto document = DOM::Document::create(); document->set_url(url); - document->set_encoding(resource()->encoding().value_or("utf-8")); + document->set_encoding(resource()->encoding()); document->set_content_type(resource()->mime_type()); frame().set_document(document);