Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp | 
| diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp | 
| index 15c4761398dfd996f85385ff139212bbd6e84611..fc4297a5368f7c09abde5eee3c87d00590078fc0 100644 | 
| --- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp | 
| +++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp | 
| @@ -957,7 +957,7 @@ void CSPDirectiveList::Parse(const UChar* begin, const UChar* end) { | 
| skipUntil<UChar>(position, end, ';'); | 
| String name, value; | 
| - if (ParseDirective(directive_begin, position, name, value)) { | 
| + if (ParseDirective(directive_begin, position, name, value, policy_)) { | 
| DCHECK(!name.IsEmpty()); | 
| AddDirective(name, value); | 
| } | 
| @@ -967,14 +967,52 @@ void CSPDirectiveList::Parse(const UChar* begin, const UChar* end) { | 
| } | 
| } | 
| +// static | 
| +bool CSPDirectiveList::IsValid(const String& directive_list) { | 
| + Vector<UChar> characters; | 
| + directive_list.AppendTo(characters); | 
| + const UChar* begin = characters.data(); | 
| + const UChar* end = begin + characters.size(); | 
| + | 
| + return IsValid(begin, end); | 
| +} | 
| + | 
| +// static | 
| +bool CSPDirectiveList::IsValid(const UChar* begin, const UChar* end) { | 
| + if (begin == end) | 
| + return false; | 
| + | 
| + String name, value; | 
| + const UChar* position = begin; | 
| + while (position < end) { | 
| + const UChar* directive_begin = position; | 
| + skipUntil<UChar>(position, end, ';'); | 
| + | 
| + name = value = ""; | 
| 
 
Mike West
2017/05/23 19:21:36
I don't think you actually need two strings. Somet
 
andypaicu
2017/05/26 14:41:09
I've modified this whole bit.
 
 | 
| + if (!ParseDirective(directive_begin, position, name, value, nullptr)) | 
| 
 
Mike West
2017/05/23 19:21:36
This is doing to dump console messages that probab
 
andypaicu
2017/05/26 14:41:09
I've modified this whole bit.
 
 | 
| + return false; | 
| + | 
| + if (ContentSecurityPolicy::GetDirectiveType(name) == | 
| + ContentSecurityPolicy::DirectiveType::kUndefined) | 
| 
 
Mike West
2017/05/23 19:21:36
Style nit: {} after multi-line conditionals.
 
andypaicu
2017/05/26 14:41:09
I've modified this whole bit.
 
 | 
| + return false; | 
| + | 
| + DCHECK(position == end || *position == ';'); | 
| + skipExactly<UChar>(position, end, ';'); | 
| + } | 
| + | 
| + return true; | 
| +} | 
| + | 
| // directive = *WSP [ directive-name [ WSP directive-value ] ] | 
| // directive-name = 1*( ALPHA / DIGIT / "-" ) | 
| // directive-value = *( WSP / <VCHAR except ";"> ) | 
| -// | 
| + | 
| +// static | 
| bool CSPDirectiveList::ParseDirective(const UChar* begin, | 
| const UChar* end, | 
| String& name, | 
| - String& value) { | 
| + String& value, | 
| + ContentSecurityPolicy* policy) { | 
| DCHECK(name.IsEmpty()); | 
| DCHECK(value.IsEmpty()); | 
| @@ -991,8 +1029,10 @@ bool CSPDirectiveList::ParseDirective(const UChar* begin, | 
| // The directive-name must be non-empty. | 
| if (name_begin == position) { | 
| skipWhile<UChar, IsNotASCIISpace>(position, end); | 
| - policy_->ReportUnsupportedDirective( | 
| - String(name_begin, position - name_begin)); | 
| + if (policy) { | 
| + policy->ReportUnsupportedDirective( | 
| + String(name_begin, position - name_begin)); | 
| + } | 
| return false; | 
| } | 
| @@ -1003,8 +1043,10 @@ bool CSPDirectiveList::ParseDirective(const UChar* begin, | 
| if (!skipExactly<UChar, IsASCIISpace>(position, end)) { | 
| skipWhile<UChar, IsNotASCIISpace>(position, end); | 
| - policy_->ReportUnsupportedDirective( | 
| - String(name_begin, position - name_begin)); | 
| + if (policy) { | 
| + policy->ReportUnsupportedDirective( | 
| + String(name_begin, position - name_begin)); | 
| + } | 
| return false; | 
| } | 
| @@ -1014,8 +1056,10 @@ bool CSPDirectiveList::ParseDirective(const UChar* begin, | 
| skipWhile<UChar, IsCSPDirectiveValueCharacter>(position, end); | 
| if (position != end) { | 
| - policy_->ReportInvalidDirectiveValueCharacter( | 
| - name, String(value_begin, end - value_begin)); | 
| + if (policy) { | 
| + policy->ReportInvalidDirectiveValueCharacter( | 
| + name, String(value_begin, end - value_begin)); | 
| + } | 
| return false; | 
| } | 
| @@ -1225,9 +1269,7 @@ void CSPDirectiveList::AddDirective(const String& name, const String& value) { | 
| policy_->UsesScriptHashAlgorithms(script_src_->HashAlgorithmsUsed()); | 
| } else if (type == ContentSecurityPolicy::DirectiveType::kObjectSrc) { | 
| SetCSPDirective<SourceListDirective>(name, value, object_src_); | 
| - } else if (type == | 
| - | 
| - ContentSecurityPolicy::DirectiveType::kFrameAncestors) { | 
| + } else if (type == ContentSecurityPolicy::DirectiveType::kFrameAncestors) { | 
| SetCSPDirective<SourceListDirective>(name, value, frame_ancestors_); | 
| } else if (type == ContentSecurityPolicy::DirectiveType::kFrameSrc) { | 
| SetCSPDirective<SourceListDirective>(name, value, frame_src_); |