Explorar o código

LibWeb: Change Document's m_encoding to Optional<String>

This modifies the Document class to use Optional<String> 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<String> 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.
Max Wipfli %!s(int64=4) %!d(string=hai) anos
pai
achega
67a9ebc817

+ 8 - 6
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<String>& encoding() const { return m_encoding; }
+    String encoding_or_default() const { return m_encoding.value_or("UTF-8"); }
+    void set_encoding(const Optional<String>& 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<String> m_encoding;
 
     bool m_ready_for_post_load_tasks { false };
 

+ 3 - 3
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);