ContentSecurityPolicyMediaListDirective.cpp [plain text]
#include "config.h"
#include "ContentSecurityPolicyMediaListDirective.h"
#include "ContentSecurityPolicy.h"
#include "ContentSecurityPolicyDirectiveList.h"
#include "ParsingUtilities.h"
#include <wtf/text/StringHash.h>
#include <wtf/text/StringParsingBuffer.h>
namespace WebCore {
template<typename CharacterType> static bool isMediaTypeCharacter(CharacterType c)
{
return !isASCIISpace(c) && c != '/';
}
ContentSecurityPolicyMediaListDirective::ContentSecurityPolicyMediaListDirective(const ContentSecurityPolicyDirectiveList& directiveList, const String& name, const String& value)
: ContentSecurityPolicyDirective(directiveList, name, value)
{
parse(value);
}
bool ContentSecurityPolicyMediaListDirective::allows(const String& type) const
{
return m_pluginTypes.contains(type);
}
void ContentSecurityPolicyMediaListDirective::parse(const String& value)
{
if (value.isEmpty()) {
directiveList().policy().reportInvalidPluginTypes(value);
return;
}
readCharactersForParsing(value, [&](auto buffer) {
while (buffer.hasCharactersRemaining()) {
skipWhile<isASCIISpace>(buffer);
if (buffer.atEnd())
return;
auto begin = buffer.position();
if (!skipExactly<isMediaTypeCharacter>(buffer)) {
skipWhile<isNotASCIISpace>(buffer);
directiveList().policy().reportInvalidPluginTypes(String(begin, buffer.position() - begin));
continue;
}
skipWhile<isMediaTypeCharacter>(buffer);
if (!skipExactly(buffer, '/')) {
skipWhile<isNotASCIISpace>(buffer);
directiveList().policy().reportInvalidPluginTypes(String(begin, buffer.position() - begin));
continue;
}
if (!skipExactly<isMediaTypeCharacter>(buffer)) {
skipWhile<isNotASCIISpace>(buffer);
directiveList().policy().reportInvalidPluginTypes(String(begin, buffer.position() - begin));
continue;
}
skipWhile<isMediaTypeCharacter>(buffer);
if (buffer.hasCharactersRemaining() && isNotASCIISpace(*buffer)) {
skipWhile<isNotASCIISpace>(buffer);
directiveList().policy().reportInvalidPluginTypes(String(begin, buffer.position() - begin));
continue;
}
m_pluginTypes.add(String(begin, buffer.position() - begin));
ASSERT(buffer.atEnd() || isASCIISpace(*buffer));
}
});
}
}