瀏覽代碼

LibWeb: Implement the HTMLMediaElement "potentially playing" concept

Timothy Flynn 2 年之前
父節點
當前提交
12c15641c1

+ 29 - 0
Userland/Libraries/LibWeb/HTML/HTMLMediaElement.cpp

@@ -1211,6 +1211,35 @@ void HTMLMediaElement::set_paused(bool paused)
         on_paused();
 }
 
+// https://html.spec.whatwg.org/multipage/media.html#blocked-media-element
+bool HTMLMediaElement::blocked() const
+{
+    // A media element is a blocked media element if its readyState attribute is in the HAVE_NOTHING state, the HAVE_METADATA
+    // state, or the HAVE_CURRENT_DATA state, or if the element has paused for user interaction or paused for in-band content.
+    switch (m_ready_state) {
+    case ReadyState::HaveNothing:
+    case ReadyState::HaveMetadata:
+    case ReadyState::HaveCurrentData:
+        return true;
+    default:
+        break;
+    }
+
+    // FIXME: Implement "paused for user interaction" (namely "the user agent has reached a point in the media resource
+    //        where the user has to make a selection for the resource to continue").
+    // FIXME: Implement "paused for in-band content".
+    return false;
+}
+
+// https://html.spec.whatwg.org/multipage/media.html#potentially-playing
+bool HTMLMediaElement::potentially_playing() const
+{
+    // A media element is said to be potentially playing when its paused attribute is false, the element has not ended
+    // playback, playback has not stopped due to errors, and the element is not a blocked media element.
+    // FIXME: Implement "stopped due to errors".
+    return !paused() && !ended() && !blocked();
+}
+
 // https://html.spec.whatwg.org/multipage/media.html#eligible-for-autoplay
 bool HTMLMediaElement::is_eligible_for_autoplay() const
 {

+ 2 - 0
Userland/Libraries/LibWeb/HTML/HTMLMediaElement.h

@@ -70,6 +70,7 @@ public:
     double duration() const;
     bool paused() const { return m_paused; }
     bool ended() const;
+    bool potentially_playing() const;
     WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::Promise>> play();
     WebIDL::ExceptionOr<void> pause();
 
@@ -115,6 +116,7 @@ private:
     void set_paused(bool);
     void set_duration(double);
 
+    bool blocked() const;
     bool is_eligible_for_autoplay() const;
     bool has_ended_playback() const;
     WebIDL::ExceptionOr<void> reached_end_of_media_playback();