Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(906)

Unified Diff: Source/core/page/ContentSecurityPolicy.cpp

Issue 23861003: Enable srcset support in HTMLImageElement (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rewrote HTMLSrcsetParser, making it more efficient and readable. Addressed abarth's review comments. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/page/ContentSecurityPolicy.cpp
diff --git a/Source/core/page/ContentSecurityPolicy.cpp b/Source/core/page/ContentSecurityPolicy.cpp
index 7f5d43417693f8f274b31e0117a981e36e911b63..3b3899606ecfba181b46b633908396bf56539bce 100644
--- a/Source/core/page/ContentSecurityPolicy.cpp
+++ b/Source/core/page/ContentSecurityPolicy.cpp
@@ -41,6 +41,7 @@
#include "core/page/Frame.h"
#include "core/page/UseCounter.h"
#include "core/platform/JSONValues.h"
+#include "core/platform/ParsingUtilities.h"
#include "core/platform/network/FormData.h"
#include "core/platform/network/ResourceResponse.h"
#include "weborigin/KURL.h"
@@ -165,48 +166,16 @@ UseCounter::Feature getUseCounterType(ContentSecurityPolicy::HeaderType type)
} // namespace
-static bool skipExactly(const UChar*& position, const UChar* end, UChar delimiter)
-{
- if (position < end && *position == delimiter) {
- ++position;
- return true;
- }
- return false;
-}
-
-template<bool characterPredicate(UChar)>
-static bool skipExactly(const UChar*& position, const UChar* end)
-{
- if (position < end && characterPredicate(*position)) {
- ++position;
- return true;
- }
- return false;
-}
-
-static void skipUntil(const UChar*& position, const UChar* end, UChar delimiter)
-{
- while (position < end && *position != delimiter)
- ++position;
-}
-
-template<bool characterPredicate(UChar)>
-static void skipWhile(const UChar*& position, const UChar* end)
-{
- while (position < end && characterPredicate(*position))
- ++position;
-}
-
static bool isSourceListNone(const UChar* begin, const UChar* end)
{
- skipWhile<isASCIISpace>(begin, end);
+ skipWhile<UChar, isASCIISpace>(begin, end);
const UChar* position = begin;
- skipWhile<isSourceCharacter>(position, end);
+ skipWhile<UChar, isSourceCharacter>(position, end);
if (!equalIgnoringCase("'none'", begin, position - begin))
return false;
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
if (position != end)
return false;
@@ -369,12 +338,12 @@ void CSPSourceList::parse(const UChar* begin, const UChar* end)
const UChar* position = begin;
while (position < end) {
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
if (position == end)
return;
const UChar* beginSource = position;
- skipWhile<isSourceCharacter>(position, end);
+ skipWhile<UChar, isSourceCharacter>(position, end);
String scheme, host, path;
int port = 0;
@@ -447,7 +416,7 @@ bool CSPSourceList::parseSource(const UChar* begin, const UChar* end,
const UChar* beginPath = end;
const UChar* beginPort = 0;
- skipWhile<isNotColonOrSlash>(position, end);
+ skipWhile<UChar, isNotColonOrSlash>(position, end);
if (position == end) {
// host
@@ -472,21 +441,21 @@ bool CSPSourceList::parseSource(const UChar* begin, const UChar* end,
// scheme://host || scheme://
// ^ ^
if (!parseScheme(begin, position, scheme)
- || !skipExactly(position, end, ':')
- || !skipExactly(position, end, '/')
- || !skipExactly(position, end, '/'))
+ || !skipExactly<UChar>(position, end, ':')
+ || !skipExactly<UChar>(position, end, '/')
+ || !skipExactly<UChar>(position, end, '/'))
return false;
if (position == end)
return true;
beginHost = position;
- skipWhile<isNotColonOrSlash>(position, end);
+ skipWhile<UChar, isNotColonOrSlash>(position, end);
}
if (position < end && *position == ':') {
// host:port || scheme://host:port
// ^ ^
beginPort = position;
- skipUntil(position, end, '/');
+ skipUntil<UChar>(position, end, '/');
}
}
@@ -529,7 +498,7 @@ bool CSPSourceList::parseNonce(const UChar* begin, const UChar* end, String& non
const UChar* position = begin + noncePrefix.length();
const UChar* nonceBegin = position;
- skipWhile<isNonceCharacter>(position, end);
+ skipWhile<UChar, isNonceCharacter>(position, end);
ASSERT(nonceBegin <= position);
if (((position + 1) != end && *position != '\'') || !(position - nonceBegin))
@@ -552,10 +521,10 @@ bool CSPSourceList::parseScheme(const UChar* begin, const UChar* end, String& sc
const UChar* position = begin;
- if (!skipExactly<isASCIIAlpha>(position, end))
+ if (!skipExactly<UChar, isASCIIAlpha>(position, end))
return false;
- skipWhile<isSchemeContinuationCharacter>(position, end);
+ skipWhile<UChar, isSchemeContinuationCharacter>(position, end);
if (position != end)
return false;
@@ -579,25 +548,25 @@ bool CSPSourceList::parseHost(const UChar* begin, const UChar* end, String& host
const UChar* position = begin;
- if (skipExactly(position, end, '*')) {
+ if (skipExactly<UChar>(position, end, '*')) {
hostHasWildcard = true;
if (position == end)
return true;
- if (!skipExactly(position, end, '.'))
+ if (!skipExactly<UChar>(position, end, '.'))
return false;
}
const UChar* hostBegin = position;
while (position < end) {
- if (!skipExactly<isHostCharacter>(position, end))
+ if (!skipExactly<UChar, isHostCharacter>(position, end))
return false;
- skipWhile<isHostCharacter>(position, end);
+ skipWhile<UChar, isHostCharacter>(position, end);
- if (position < end && !skipExactly(position, end, '.'))
+ if (position < end && !skipExactly<UChar>(position, end, '.'))
return false;
}
@@ -612,7 +581,7 @@ bool CSPSourceList::parsePath(const UChar* begin, const UChar* end, String& path
ASSERT(path.isEmpty());
const UChar* position = begin;
- skipWhile<isPathComponentCharacter>(position, end);
+ skipWhile<UChar, isPathComponentCharacter>(position, end);
// path/to/file.js?query=string || path/to/file.js#anchor
// ^ ^
if (position < end)
@@ -633,7 +602,7 @@ bool CSPSourceList::parsePort(const UChar* begin, const UChar* end, int& port, b
ASSERT(!port);
ASSERT(!portHasWildcard);
- if (!skipExactly(begin, end, ':'))
+ if (!skipExactly<UChar>(begin, end, ':'))
ASSERT_NOT_REACHED();
if (begin == end)
@@ -646,7 +615,7 @@ bool CSPSourceList::parsePort(const UChar* begin, const UChar* end, int& port, b
}
const UChar* position = begin;
- skipWhile<isASCIIDigit>(position, end);
+ skipWhile<UChar, isASCIIDigit>(position, end);
if (position != end)
return false;
@@ -730,41 +699,41 @@ private:
while (position < end) {
// _____ OR _____mime1/mime1
// ^ ^
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
if (position == end)
return;
// mime1/mime1 mime2/mime2
// ^
begin = position;
- if (!skipExactly<isMediaTypeCharacter>(position, end)) {
- skipWhile<isNotASCIISpace>(position, end);
+ if (!skipExactly<UChar, isMediaTypeCharacter>(position, end)) {
+ skipWhile<UChar, isNotASCIISpace>(position, end);
policy()->reportInvalidPluginTypes(String(begin, position - begin));
continue;
}
- skipWhile<isMediaTypeCharacter>(position, end);
+ skipWhile<UChar, isMediaTypeCharacter>(position, end);
// mime1/mime1 mime2/mime2
// ^
- if (!skipExactly(position, end, '/')) {
- skipWhile<isNotASCIISpace>(position, end);
+ if (!skipExactly<UChar>(position, end, '/')) {
+ skipWhile<UChar, isNotASCIISpace>(position, end);
policy()->reportInvalidPluginTypes(String(begin, position - begin));
continue;
}
// mime1/mime1 mime2/mime2
// ^
- if (!skipExactly<isMediaTypeCharacter>(position, end)) {
- skipWhile<isNotASCIISpace>(position, end);
+ if (!skipExactly<UChar, isMediaTypeCharacter>(position, end)) {
+ skipWhile<UChar, isNotASCIISpace>(position, end);
policy()->reportInvalidPluginTypes(String(begin, position - begin));
continue;
}
- skipWhile<isMediaTypeCharacter>(position, end);
+ skipWhile<UChar, isMediaTypeCharacter>(position, end);
// mime1/mime1 mime2/mime2 OR mime1/mime1 OR mime1/mime1/error
// ^ ^ ^
if (position < end && isNotASCIISpace(*position)) {
- skipWhile<isNotASCIISpace>(position, end);
+ skipWhile<UChar, isNotASCIISpace>(position, end);
policy()->reportInvalidPluginTypes(String(begin, position - begin));
continue;
}
@@ -1213,7 +1182,7 @@ void CSPDirectiveList::parse(const UChar* begin, const UChar* end)
const UChar* position = begin;
while (position < end) {
const UChar* directiveBegin = position;
- skipUntil(position, end, ';');
+ skipUntil<UChar>(position, end, ';');
String name, value;
if (parseDirective(directiveBegin, position, name, value)) {
@@ -1222,7 +1191,7 @@ void CSPDirectiveList::parse(const UChar* begin, const UChar* end)
}
ASSERT(position == end || *position == ';');
- skipExactly(position, end, ';');
+ skipExactly<UChar>(position, end, ';');
}
}
@@ -1236,18 +1205,18 @@ bool CSPDirectiveList::parseDirective(const UChar* begin, const UChar* end, Stri
ASSERT(value.isEmpty());
const UChar* position = begin;
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
// Empty directive (e.g. ";;;"). Exit early.
if (position == end)
return false;
const UChar* nameBegin = position;
- skipWhile<isDirectiveNameCharacter>(position, end);
+ skipWhile<UChar, isDirectiveNameCharacter>(position, end);
// The directive-name must be non-empty.
if (nameBegin == position) {
- skipWhile<isNotASCIISpace>(position, end);
+ skipWhile<UChar, isNotASCIISpace>(position, end);
m_policy->reportUnsupportedDirective(String(nameBegin, position - nameBegin));
return false;
}
@@ -1257,16 +1226,16 @@ bool CSPDirectiveList::parseDirective(const UChar* begin, const UChar* end, Stri
if (position == end)
return true;
- if (!skipExactly<isASCIISpace>(position, end)) {
- skipWhile<isNotASCIISpace>(position, end);
+ if (!skipExactly<UChar, isASCIISpace>(position, end)) {
+ skipWhile<UChar, isNotASCIISpace>(position, end);
m_policy->reportUnsupportedDirective(String(nameBegin, position - nameBegin));
return false;
}
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
const UChar* valueBegin = position;
- skipWhile<isDirectiveValueCharacter>(position, end);
+ skipWhile<UChar, isDirectiveValueCharacter>(position, end);
if (position != end) {
m_policy->reportInvalidDirectiveValueCharacter(name, String(valueBegin, end - valueBegin));
@@ -1295,10 +1264,10 @@ void CSPDirectiveList::parseReportURI(const String& name, const String& value)
const UChar* end = position + characters.size();
while (position < end) {
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
const UChar* urlBegin = position;
- skipWhile<isNotASCIISpace>(position, end);
+ skipWhile<UChar, isNotASCIISpace>(position, end);
if (urlBegin < position) {
String url = String(urlBegin, position - urlBegin);
@@ -1351,9 +1320,9 @@ void CSPDirectiveList::parseReflectedXSS(const String& name, const String& value
const UChar* position = characters.data();
const UChar* end = position + characters.size();
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
const UChar* begin = position;
- skipWhile<isNotASCIISpace>(position, end);
+ skipWhile<UChar, isNotASCIISpace>(position, end);
// value1
// ^
@@ -1369,7 +1338,7 @@ void CSPDirectiveList::parseReflectedXSS(const String& name, const String& value
return;
}
- skipWhile<isASCIISpace>(position, end);
+ skipWhile<UChar, isASCIISpace>(position, end);
if (position == end && m_reflectedXSSDisposition != ContentSecurityPolicy::ReflectedXSSUnset)
return;
@@ -1476,7 +1445,7 @@ void ContentSecurityPolicy::addPolicyFromHeaderValue(const String& header, Heade
// separated chunk as a separate header.
const UChar* position = begin;
while (position < end) {
- skipUntil(position, end, ',');
+ skipUntil<UChar>(position, end, ',');
// header1,header2 OR header1
// ^ ^
@@ -1490,7 +1459,7 @@ void ContentSecurityPolicy::addPolicyFromHeaderValue(const String& header, Heade
// Skip the comma, and begin the next header from the current position.
ASSERT(position == end || *position == ',');
- skipExactly(position, end, ',');
+ skipExactly<UChar>(position, end, ',');
begin = position;
}
}

Powered by Google App Engine
This is Rietveld 408576698