Bug 1398102 - [Part1] canPlayType should return 'maybe' if the codec parameter is empty. r?gerald
MozReview-Commit-ID: BmzIUOuaTj9
--- 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