Browse Source

LibWeb: Partially implement HTMLSourceElement's insertion/removal steps

This implements the substeps which concern HTMLMediaElement parents.
Timothy Flynn 2 years ago
parent
commit
05019746d2

+ 1 - 1
Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h

@@ -40,6 +40,7 @@ public:
     WebIDL::ExceptionOr<void> set_decoder_error(String error_message);
     WebIDL::ExceptionOr<void> set_decoder_error(String error_message);
 
 
     String const& current_src() const { return m_current_src; }
     String const& current_src() const { return m_current_src; }
+    WebIDL::ExceptionOr<void> select_resource();
 
 
     enum class NetworkState : u16 {
     enum class NetworkState : u16 {
         Empty,
         Empty,
@@ -111,7 +112,6 @@ private:
     Task::Source media_element_event_task_source() const { return m_media_element_event_task_source.source; }
     Task::Source media_element_event_task_source() const { return m_media_element_event_task_source.source; }
 
 
     WebIDL::ExceptionOr<void> load_element();
     WebIDL::ExceptionOr<void> load_element();
-    WebIDL::ExceptionOr<void> select_resource();
     WebIDL::ExceptionOr<void> fetch_resource(AK::URL const&, Function<void(String)> failure_callback);
     WebIDL::ExceptionOr<void> fetch_resource(AK::URL const&, Function<void(String)> failure_callback);
     static bool verify_response(JS::NonnullGCPtr<Fetch::Infrastructure::Response>, ByteRange const&);
     static bool verify_response(JS::NonnullGCPtr<Fetch::Infrastructure::Response>, ByteRange const&);
     WebIDL::ExceptionOr<void> process_media_data(Function<void(String)> failure_callback);
     WebIDL::ExceptionOr<void> process_media_data(Function<void(String)> failure_callback);

+ 31 - 0
Userland/Libraries/LibWeb/HTML/HTMLSourceElement.cpp

@@ -5,6 +5,8 @@
  */
  */
 
 
 #include <LibWeb/Bindings/Intrinsics.h>
 #include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/HTML/AttributeNames.h>
+#include <LibWeb/HTML/HTMLMediaElement.h>
 #include <LibWeb/HTML/HTMLSourceElement.h>
 #include <LibWeb/HTML/HTMLSourceElement.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
@@ -24,4 +26,33 @@ JS::ThrowCompletionOr<void> HTMLSourceElement::initialize(JS::Realm& realm)
     return {};
     return {};
 }
 }
 
 
+// https://html.spec.whatwg.org/multipage/embedded-content.html#the-source-element:the-source-element-15
+void HTMLSourceElement::inserted()
+{
+    // The source HTML element insertion steps, given insertedNode, are:
+    Base::inserted();
+
+    // 1. If insertedNode's parent is a media element that has no src attribute and whose networkState has the value
+    //    NETWORK_EMPTY, then invoke that media element's resource selection algorithm.
+    if (is<HTMLMediaElement>(parent())) {
+        auto& media_element = static_cast<HTMLMediaElement&>(*parent());
+
+        if (!media_element.has_attribute(HTML::AttributeNames::src) && media_element.network_state() == HTMLMediaElement::NetworkState::Empty)
+            media_element.select_resource().release_value_but_fixme_should_propagate_errors();
+    }
+
+    // FIXME: 2. If insertedNode's next sibling is an img element and its parent is a picture element, then, count this as a
+    //           relevant mutation for the img element.
+}
+
+// https://html.spec.whatwg.org/multipage/embedded-content.html#the-source-element:the-source-element-16
+void HTMLSourceElement::removed_from(DOM::Node* old_parent)
+{
+    // The source HTML element removing steps, given removedNode and oldParent, are:
+    Base::removed_from(old_parent);
+
+    // FIXME: 1. If removedNode's next sibling was an img element and oldParent is a picture element, then, count this as a
+    //           relevant mutation for the img element.
+}
+
 }
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/HTMLSourceElement.h

@@ -20,6 +20,9 @@ private:
     HTMLSourceElement(DOM::Document&, DOM::QualifiedName);
     HTMLSourceElement(DOM::Document&, DOM::QualifiedName);
 
 
     virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
     virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
+
+    virtual void inserted() override;
+    virtual void removed_from(DOM::Node*) override;
 };
 };
 
 
 }
 }