#include "config.h"
#include "MIMETypeCache.h"
#include "ContentType.h"
namespace WebCore {
HashSet<String, ASCIICaseInsensitiveHash>& MIMETypeCache::supportedTypes()
{
if (!m_supportedTypes) {
m_supportedTypes = HashSet<String, ASCIICaseInsensitiveHash> { };
initializeCache(*m_supportedTypes);
}
return *m_supportedTypes;
}
bool MIMETypeCache::supportsContainerType(const String& containerType)
{
if (!isAvailable() || containerType.isEmpty())
return false;
if (isUnsupportedContainerType(containerType))
return false;
if (staticContainerTypeList().contains(containerType))
return true;
return supportedTypes().contains(containerType);
}
MediaPlayerEnums::SupportsType MIMETypeCache::canDecodeType(const String& mimeType)
{
if (mimeType.isEmpty())
return MediaPlayerEnums::SupportsType::IsNotSupported;
if (m_cachedResults) {
auto it = m_cachedResults->find(mimeType);
if (it != m_cachedResults->end())
return it->value;
}
auto result = MediaPlayerEnums::SupportsType::IsNotSupported;
do {
if (!isAvailable() || mimeType.isEmpty())
break;
auto contentType = ContentType { mimeType };
auto containerType = contentType.containerType();
if (!supportsContainerType(containerType))
break;
if (contentType.codecs().isEmpty()) {
result = MediaPlayerEnums::SupportsType::MayBeSupported;
break;
}
if (canDecodeExtendedType(contentType))
result = MediaPlayerEnums::SupportsType::IsSupported;
} while (0);
if (!m_cachedResults)
m_cachedResults = HashMap<String, MediaPlayerEnums::SupportsType, ASCIICaseInsensitiveHash>();
m_cachedResults->add(mimeType, result);
return result;
}
void MIMETypeCache::addSupportedTypes(const Vector<String>& newTypes)
{
if (!m_supportedTypes)
m_supportedTypes = HashSet<String, ASCIICaseInsensitiveHash> { };
for (auto& type : newTypes)
m_supportedTypes->add(type);
}
const HashSet<String, ASCIICaseInsensitiveHash>& MIMETypeCache::staticContainerTypeList()
{
static const auto cache = makeNeverDestroyed(HashSet<String, ASCIICaseInsensitiveHash> { });
return cache;
}
bool MIMETypeCache::isUnsupportedContainerType(const String&)
{
return false;
}
bool MIMETypeCache::isAvailable() const
{
return true;
}
bool MIMETypeCache::isEmpty() const
{
return m_supportedTypes && m_supportedTypes->isEmpty();
}
void MIMETypeCache::initializeCache(HashSet<String, ASCIICaseInsensitiveHash>&)
{
}
bool MIMETypeCache::canDecodeExtendedType(const ContentType&)
{
return false;
}
}