Index: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
index 466cd5fd72debf611190d034cc3de2d2db93091b..f0b87749979238b2104643cf58d6ff82cfaca0f5 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
@@ -84,6 +84,7 @@ |
#include "platform/graphics/GraphicsLayer.h" |
#include "platform/mediastream/MediaStreamDescriptor.h" |
#include "platform/network/NetworkStateNotifier.h" |
+#include "platform/network/ParsedContentType.h" |
#include "platform/network/mime/ContentType.h" |
#include "platform/network/mime/MIMETypeFromURL.h" |
#include "platform/weborigin/SecurityOrigin.h" |
@@ -142,6 +143,43 @@ enum MediaControlsShow { |
MediaControlsShowMax |
}; |
+// These values are used for the Media.MediaElement.ContentTypeResult histogram. |
+// Do not reorder. |
+enum ContentTypeParseableResult { |
+ IsSupportedParseable = 0, |
+ MayBeSupportedParseable, |
+ IsNotSupportedParseable, |
+ IsSupportedNotParseable, |
+ MayBeSupportedNotParseable, |
+ IsNotSupportedNotParseable, |
+ ContentTypeParseableMax |
+}; |
+ |
+void ReportContentTypeResultToUMA(String contentType, |
+ MIMETypeRegistry::SupportsType result) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL( |
+ EnumerationHistogram, contentTypeParseableHistogram, |
+ new EnumerationHistogram("Media.MediaElement.ContentTypeParseable", |
+ ContentTypeParseableMax)); |
+ ParsedContentType parsedContentType(contentType); |
+ ContentTypeParseableResult umaResult = IsNotSupportedNotParseable; |
+ switch (result) { |
+ case MIMETypeRegistry::IsSupported: |
+ umaResult = parsedContentType.isValid() ? IsSupportedParseable |
+ : IsSupportedNotParseable; |
+ break; |
+ case MIMETypeRegistry::MayBeSupported: |
+ umaResult = parsedContentType.isValid() ? MayBeSupportedParseable |
+ : MayBeSupportedNotParseable; |
+ break; |
+ case MIMETypeRegistry::IsNotSupported: |
+ umaResult = parsedContentType.isValid() ? IsNotSupportedParseable |
+ : IsNotSupportedNotParseable; |
+ break; |
+ } |
+ contentTypeParseableHistogram.count(umaResult); |
+} |
+ |
String urlForLoggingMedia(const KURL& url) { |
static const unsigned maximumURLLengthForLogging = 128; |
@@ -247,9 +285,10 @@ const AtomicString& VideoKindToString( |
return emptyAtom; |
} |
-bool canLoadURL(const KURL& url, const ContentType& contentType) { |
+bool canLoadURL(const KURL& url, const String& contentTypeStr) { |
DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); |
+ ContentType contentType(contentTypeStr); |
String contentMIMEType = contentType.type().lower(); |
String contentTypeCodecs = contentType.parameter(codecs); |
@@ -273,7 +312,8 @@ bool canLoadURL(const KURL& url, const ContentType& contentType) { |
if (contentMIMEType != "application/octet-stream" || |
contentTypeCodecs.isEmpty()) { |
return MIMETypeRegistry::supportsMediaMIMEType(contentMIMEType, |
- contentTypeCodecs); |
+ contentTypeCodecs) != |
+ MIMETypeRegistry::IsNotSupported; |
} |
return false; |
@@ -353,7 +393,13 @@ MIMETypeRegistry::SupportsType HTMLMediaElement::supportsType( |
if (type == "application/octet-stream") |
return MIMETypeRegistry::IsNotSupported; |
- return MIMETypeRegistry::supportsMediaMIMEType(type, typeCodecs); |
+ // Check if stricter parsing of |contentType| will cause problems. |
+ // TODO(jrummell): Either switch to ParsedContentType or remove this UMA, |
+ // depending on the results reported. |
+ MIMETypeRegistry::SupportsType result = |
+ MIMETypeRegistry::supportsMediaMIMEType(type, typeCodecs); |
+ ReportContentTypeResultToUMA(contentType.raw(), result); |
+ return result; |
} |
URLRegistry* HTMLMediaElement::s_mediaStreamRegistry = 0; |
@@ -1054,8 +1100,7 @@ void HTMLMediaElement::loadSourceFromObject() { |
// No type is available when the resource comes from the 'srcObject' |
// attribute. |
- loadResource(WebMediaPlayerSource(WebMediaStream(m_srcObject)), |
- ContentType((String()))); |
+ loadResource(WebMediaPlayerSource(WebMediaStream(m_srcObject)), String()); |
} |
void HTMLMediaElement::loadSourceFromAttribute() { |
@@ -1079,11 +1124,11 @@ void HTMLMediaElement::loadSourceFromAttribute() { |
// No type is available when the url comes from the 'src' attribute so |
// MediaPlayer will have to pick a media engine based on the file extension. |
- loadResource(WebMediaPlayerSource(WebURL(mediaURL)), ContentType((String()))); |
+ loadResource(WebMediaPlayerSource(WebURL(mediaURL)), String()); |
} |
void HTMLMediaElement::loadNextSourceChild() { |
- ContentType contentType((String())); |
+ String contentType; |
KURL mediaURL = selectNextSourceChild(&contentType, Complain); |
if (!mediaURL.isValid()) { |
waitForSourceChange(); |
@@ -1098,15 +1143,14 @@ void HTMLMediaElement::loadNextSourceChild() { |
} |
void HTMLMediaElement::loadResource(const WebMediaPlayerSource& source, |
- const ContentType& contentType) { |
+ const String& contentType) { |
DCHECK(isMainThread()); |
KURL url; |
if (source.isURL()) { |
url = source.getAsURL(); |
DCHECK(isSafeToLoadURL(url, Complain)); |
BLINK_MEDIA_LOG << "loadResource(" << (void*)this << ", " |
- << urlForLoggingMedia(url) << ", " << contentType.raw() |
- << ")"; |
+ << urlForLoggingMedia(url) << ", " << contentType << ")"; |
} |
LocalFrame* frame = document().frame(); |
@@ -2901,7 +2945,7 @@ bool HTMLMediaElement::havePotentialSourceChild() { |
HTMLSourceElement* currentSourceNode = m_currentSourceNode; |
Node* nextNode = m_nextChildNodeToConsider; |
- KURL nextURL = selectNextSourceChild(0, DoNothing); |
+ KURL nextURL = selectNextSourceChild(nullptr, DoNothing); |
m_currentSourceNode = currentSourceNode; |
m_nextChildNodeToConsider = nextNode; |
@@ -2909,7 +2953,7 @@ bool HTMLMediaElement::havePotentialSourceChild() { |
return nextURL.isValid(); |
} |
-KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, |
+KURL HTMLMediaElement::selectNextSourceChild(String* contentType, |
InvalidURLAction actionIfInvalid) { |
// Don't log if this was just called to find out if there are any valid |
// <source> elements. |
@@ -2993,7 +3037,7 @@ KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, |
if (canUseSourceElement) { |
if (contentType) |
- *contentType = ContentType(type); |
+ *contentType = type; |
m_currentSourceNode = source; |
m_nextChildNodeToConsider = source->nextSibling(); |
} else { |