Selaa lähdekoodia

LibWeb: Use [Reflect] to implement `HTMLImageElement.decoding`

This ensures the correct behavior when the value of the `decoding`
attribute is changed with `setAttribute()`.
Tim Ledbetter 7 kuukautta sitten
vanhempi
commit
e176871fdf

+ 1 - 0
Libraries/LibWeb/HTML/AttributeNames.h

@@ -60,6 +60,7 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(data)                       \
     __ENUMERATE_HTML_ATTRIBUTE(datetime)                   \
     __ENUMERATE_HTML_ATTRIBUTE(declare)                    \
+    __ENUMERATE_HTML_ATTRIBUTE(decoding)                   \
     __ENUMERATE_HTML_ATTRIBUTE(default_)                   \
     __ENUMERATE_HTML_ATTRIBUTE(defaultchecked)             \
     __ENUMERATE_HTML_ATTRIBUTE(defaultselected)            \

+ 5 - 26
Libraries/LibWeb/HTML/HTMLImageElement.cpp

@@ -127,6 +127,11 @@ void HTMLImageElement::form_associated_element_attribute_changed(FlyString const
         if (layout_node())
             did_update_alt_text(verify_cast<Layout::ImageBox>(*layout_node()));
     }
+
+    if (name == HTML::AttributeNames::decoding) {
+        if (value.has_value() && (value->equals_ignoring_ascii_case("sync"sv) || value->equals_ignoring_ascii_case("async"sv)))
+            dbgln("FIXME: HTMLImageElement.decoding = '{}' is not implemented yet", value->to_ascii_lowercase());
+    }
 }
 
 GC::Ptr<Layout::Node> HTMLImageElement::create_layout_node(CSS::StyleProperties style)
@@ -1171,32 +1176,6 @@ void HTMLImageElement::animate()
         paintable()->set_needs_display();
 }
 
-StringView HTMLImageElement::decoding() const
-{
-    switch (m_decoding_hint) {
-    case ImageDecodingHint::Sync:
-        return "sync"sv;
-    case ImageDecodingHint::Async:
-        return "async"sv;
-    case ImageDecodingHint::Auto:
-        return "auto"sv;
-    default:
-        VERIFY_NOT_REACHED();
-    }
-}
-
-void HTMLImageElement::set_decoding(String decoding)
-{
-    if (decoding == "sync"sv) {
-        dbgln("FIXME: HTMLImageElement.decoding = 'sync' is not implemented yet");
-        m_decoding_hint = ImageDecodingHint::Sync;
-    } else if (decoding == "async"sv) {
-        dbgln("FIXME: HTMLImageElement.decoding = 'async' is not implemented yet");
-        m_decoding_hint = ImageDecodingHint::Async;
-    } else
-        m_decoding_hint = ImageDecodingHint::Auto;
-}
-
 bool HTMLImageElement::allows_auto_sizes() const
 {
     // An img element allows auto-sizes if:

+ 0 - 13
Libraries/LibWeb/HTML/HTMLImageElement.h

@@ -87,10 +87,6 @@ public:
     // https://html.spec.whatwg.org/multipage/images.html#select-an-image-source
     [[nodiscard]] Optional<ImageSourceAndPixelDensity> select_an_image_source();
 
-    StringView decoding() const;
-
-    void set_decoding(String);
-
     void set_source_set(SourceSet);
 
     ImageRequest& current_request() { return *m_current_request; }
@@ -162,15 +158,6 @@ private:
     SourceSet m_source_set;
 
     CSSPixelSize m_last_seen_viewport_size;
-
-    // https://html.spec.whatwg.org/multipage/images.html#image-decoding-hint
-    enum class ImageDecodingHint {
-        Auto,
-        Sync,
-        Async
-    };
-
-    ImageDecodingHint m_decoding_hint = ImageDecodingHint::Auto;
 };
 
 }

+ 9 - 1
Libraries/LibWeb/HTML/HTMLImageElement.idl

@@ -2,6 +2,14 @@
 #import <HTML/HTMLElement.idl>
 #import <HTML/Scripting/Fetching.idl>
 
+// https://html.spec.whatwg.org/multipage/images.html#image-decoding-hint
+[MissingValueDefault=auto, InvalidValueDefault=auto]
+enum Decoding {
+    "sync",
+    "async",
+    "auto"
+};
+
 // https://html.spec.whatwg.org/multipage/embedded-content.html#htmlimageelement
 [Exposed=Window, LegacyFactoryFunction=Image(optional unsigned long width, optional unsigned long height)]
 interface HTMLImageElement : HTMLElement {
@@ -22,7 +30,7 @@ interface HTMLImageElement : HTMLElement {
     readonly attribute boolean complete;
     readonly attribute USVString currentSrc;
     [CEReactions, Reflect=referrerpolicy, Enumerated=ReferrerPolicy] attribute DOMString referrerPolicy;
-    [CEReactions] attribute DOMString decoding;
+    [CEReactions, Enumerated=Decoding, Reflect] attribute DOMString decoding;
     [CEReactions, Enumerated=LazyLoadingAttribute, Reflect] attribute DOMString loading;
     [CEReactions, Enumerated=FetchPriorityAttribute, Reflect=fetchpriority] attribute DOMString fetchPriority;