Bug 1398102 - [Part1] canPlayType should return 'maybe' if the codec parameter is empty. r?gerald draft
authorJames Cheng <jacheng@mozilla.com>
Mon, 11 Sep 2017 17:17:55 +0800
changeset 662937 9506f47dd30785807d3b58d5be37b09efed90e13
parent 662843 12667b736684f4863efa7c7b31a8fc619fe7bbda
child 662938 65c6880822c1385d3deee7ff05901abeb105e19c
push id79246
push userbmo:jacheng@mozilla.com
push dateTue, 12 Sep 2017 09:30:32 +0000
reviewersgerald
bugs1398102
milestone57.0a1
Bug 1398102 - [Part1] canPlayType should return 'maybe' if the codec parameter is empty. r?gerald MozReview-Commit-ID: BmzIUOuaTj9
dom/html/HTMLMediaElement.cpp
testing/web-platform/meta/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html.ini
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -4642,16 +4642,27 @@ HTMLMediaElement::GetCanPlay(const nsASt
   if (status == CANPLAY_YES && IsVP9InMP4(*containerType)) {
     // We don't have a demuxer that can handle VP9 in non-fragmented MP4.
     // So special-case VP9 in MP4 here, as we assume canPlayType() implies
     // non-fragmented MP4 anyway. Note we report that we can play VP9
     // in MP4 in MediaSource.isTypeSupported(), as the fragmented MP4
     // demuxer can handle VP9 in fragmented MP4.
     return CANPLAY_NO;
   }
+  if (status == CANPLAY_YES &&
+      (*containerType).ExtendedType().Codecs().IsEmpty()) {
+    // Per spec: 'Generally, a user agent should never return "probably" for a
+    // type that allows the `codecs` parameter if that parameter is not present.'
+    // As all our currently-supported types allow for `codecs`, we can do this
+    // check here.
+    // TODO: Instead, missing `codecs` should be checked in each decoder's
+    // `IsSupportedType` call from `CanHandleCodecsType()`.
+    // See bug 1399023.
+    return CANPLAY_MAYBE;
+  }
   return status;
 }
 
 NS_IMETHODIMP
 HTMLMediaElement::CanPlayType(const nsAString& aType, nsAString& aResult)
 {
   DecoderDoctorDiagnostics diagnostics;
   CanPlayStatus canPlay = GetCanPlay(aType, &diagnostics);
@@ -4659,20 +4670,22 @@ HTMLMediaElement::CanPlayType(const nsAS
     OwnerDoc(), aType, canPlay != CANPLAY_NO, __func__);
   switch (canPlay) {
   case CANPLAY_NO:
     aResult.Truncate();
     break;
   case CANPLAY_YES:
     aResult.AssignLiteral("probably");
     break;
-  default:
   case CANPLAY_MAYBE:
     aResult.AssignLiteral("maybe");
     break;
+  default:
+    MOZ_ASSERT_UNREACHABLE("Unexpected case.");
+    break;
   }
 
   LOG(LogLevel::Debug, ("%p CanPlayType(%s) = \"%s\"", this,
                      NS_ConvertUTF16toUTF8(aType).get(),
                      NS_ConvertUTF16toUTF8(aResult).get()));
 
   return NS_OK;
 }
--- a/testing/web-platform/meta/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html.ini
+++ b/testing/web-platform/meta/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html.ini
@@ -1,34 +1,24 @@
 [canPlayType.html]
   type: testharness
-  [audio/mp4 (optional)]
-    expected:
-      if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
-      if debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
-
   [audio/mp4; codecs="mp4a.40.2" (optional)]
     expected:
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
 
   [video/3gpp (optional)]
     expected: FAIL
 
   [video/3gpp; codecs="samr" (optional)]
     expected: FAIL
 
   [video/3gpp; codecs="mp4v.20.8" (optional)]
     expected: FAIL
 
-  [video/mp4 (optional)]
-    expected:
-      if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
-      if debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
-
   [video/mp4; codecs="mp4a.40.2" (optional)]
     expected:
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
 
   [video/mp4; codecs="avc1.42E01E" (optional)]
     expected:
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL