Pārlūkot izejas kodu

LibWeb: Add HTMLMediaElement.canPlayType()

For the time being, the answer is no, or rather: "" :^)
Linus Groh 3 gadi atpakaļ
vecāks
revīzija
a2e6abe159

+ 1 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -525,6 +525,7 @@ class XMLHttpRequestConstructor;
 class XMLHttpRequestEventTargetWrapper;
 class XMLHttpRequestPrototype;
 class XMLHttpRequestWrapper;
+enum class CanPlayTypeResult;
 enum class DOMParserSupportedType;
 enum class XMLHttpRequestResponseType;
 }

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

@@ -4,6 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <LibWeb/Bindings/HTMLMediaElementWrapper.h>
 #include <LibWeb/HTML/HTMLMediaElement.h>
 
 namespace Web::HTML {
@@ -17,4 +18,21 @@ HTMLMediaElement::~HTMLMediaElement()
 {
 }
 
+// https://html.spec.whatwg.org/multipage/media.html#dom-navigator-canplaytype
+Bindings::CanPlayTypeResult HTMLMediaElement::can_play_type(String const& type) const
+{
+    // The canPlayType(type) method must:
+    // - return the empty string if type is a type that the user agent knows it cannot render or is the type "application/octet-stream"
+    // - return "probably" if the user agent is confident that the type represents a media resource that it can render if used in with this audio or video element
+    // - return "maybe" otherwise. Implementers are encouraged to return "maybe" unless the type can be confidently established as being supported or not
+    // Generally, a user agent should never return "probably" for a type that allows the codecs parameter if that parameter is not present.
+    if (type == "application/octet-stream"sv)
+        return Bindings::CanPlayTypeResult::Empty;
+    // FIXME: Eventually we should return `Maybe` here, but for now `Empty` is our best bet :^)
+    //        Being honest here leads to some apps and frameworks skipping things like audio loading,
+    //        which for the time being would create more issues than it solves - e.g. endless waiting
+    //        for audio that will never load.
+    return Bindings::CanPlayTypeResult::Empty;
+}
+
 }

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

@@ -16,6 +16,8 @@ public:
 
     HTMLMediaElement(DOM::Document&, DOM::QualifiedName);
     virtual ~HTMLMediaElement() override;
+
+    Bindings::CanPlayTypeResult can_play_type(String const& type) const;
 };
 
 }

+ 7 - 0
Userland/Libraries/LibWeb/HTML/HTMLMediaElement.idl

@@ -1,5 +1,11 @@
 #import <HTML/HTMLElement.idl>
 
+enum CanPlayTypeResult {
+    "",
+    "maybe",
+    "probably"
+};
+
 interface HTMLMediaElement : HTMLElement {
 
     [Reflect] attribute DOMString src;
@@ -9,4 +15,5 @@ interface HTMLMediaElement : HTMLElement {
 
     [Reflect] attribute boolean controls;
 
+    CanPlayTypeResult canPlayType(DOMString type);
 };