Modified: trunk/Source/WebCore/contentextensions/URLFilterParser.cpp (181761 => 181762)
--- trunk/Source/WebCore/contentextensions/URLFilterParser.cpp 2015-03-19 22:36:43 UTC (rev 181761)
+++ trunk/Source/WebCore/contentextensions/URLFilterParser.cpp 2015-03-19 22:37:35 UTC (rev 181762)
@@ -477,15 +477,10 @@
m_subtreeEnd = m_lastPrefixTreeEntry->nfaNode;
}
- if (!m_openGroups.isEmpty()) {
- fail(URLFilterParser::UnclosedGroups);
- return;
- }
-
- if (m_subtreeStart != m_subtreeEnd)
- m_nfa.setFinal(m_subtreeEnd, m_patternId);
- else
- fail(URLFilterParser::CannotMatchAnything);
+ ASSERT_WITH_MESSAGE(m_openGroups.isEmpty(), "An unclosed group should be a parsing error in YARR.");
+ ASSERT_WITH_MESSAGE(m_subtreeStart != m_subtreeEnd, "This regex cannot match anything");
+
+ m_nfa.setFinal(m_subtreeEnd, m_patternId);
}
URLFilterParser::ParseStatus parseStatus() const
@@ -529,8 +524,7 @@
if (hasError())
return;
- if (!m_floatingTerm.isValid())
- fail(URLFilterParser::MisplacedQuantifier);
+ ASSERT(m_floatingTerm.isValid());
if (!minimum && maximum == 1)
m_floatingTerm.quantify(AtomQuantifier::ZeroOrOne);
@@ -723,8 +717,6 @@
{
if (!pattern.containsOnlyASCII())
return NonASCII;
- ASSERT(!pattern.isEmpty());
-
if (pattern.isEmpty())
return EmptyPattern;
@@ -754,16 +746,10 @@
return "Ok";
case MatchesEverything:
return "Matches everything.";
- case UnclosedGroups:
- return "The _expression_ has unclosed groups.";
- case CannotMatchAnything:
- return "The pattern cannot match anything.";
case NonASCII:
return "Only ASCII characters are supported in pattern.";
case UnsupportedCharacterClass:
return "Character class is not supported.";
- case MisplacedQuantifier:
- return "Quantifier without corresponding term to quantify.";
case BackReference:
return "Patterns cannot contain backreferences.";
case MisplacedStartOfLine:
Modified: trunk/Source/WebCore/contentextensions/URLFilterParser.h (181761 => 181762)
--- trunk/Source/WebCore/contentextensions/URLFilterParser.h 2015-03-19 22:36:43 UTC (rev 181761)
+++ trunk/Source/WebCore/contentextensions/URLFilterParser.h 2015-03-19 22:37:35 UTC (rev 181762)
@@ -44,11 +44,8 @@
enum ParseStatus {
Ok,
MatchesEverything,
- UnclosedGroups,
- CannotMatchAnything,
NonASCII,
UnsupportedCharacterClass,
- MisplacedQuantifier,
BackReference,
MisplacedStartOfLine,
WordBoundary,
Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp (181761 => 181762)
--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp 2015-03-19 22:36:43 UTC (rev 181761)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ContentExtensions.cpp 2015-03-19 22:37:35 UTC (rev 181762)
@@ -341,11 +341,11 @@
testRequest(backend, mainDocumentRequest("http://block_only_images.org", ResourceType::Document), { });
}
-static void testPatternStatus(const char* pattern, ContentExtensions::URLFilterParser::ParseStatus status)
+static void testPatternStatus(String pattern, ContentExtensions::URLFilterParser::ParseStatus status)
{
ContentExtensions::NFA nfa;
ContentExtensions::URLFilterParser parser(nfa);
- EXPECT_EQ(status, parser.addPattern(ASCIILiteral(pattern), false, 0));
+ EXPECT_EQ(status, parser.addPattern(pattern, false, 0));
}
TEST_F(ContentExtensionTest, ParsingFailures)
@@ -353,7 +353,55 @@
testPatternStatus("a*b?.*.?[a-z]?[a-z]*", ContentExtensions::URLFilterParser::ParseStatus::MatchesEverything);
testPatternStatus("a*b?.*.?[a-z]?[a-z]+", ContentExtensions::URLFilterParser::ParseStatus::Ok);
testPatternStatus("a*b?.*.?[a-z]?[a-z]", ContentExtensions::URLFilterParser::ParseStatus::Ok);
- // FIXME: Add regexes that cause each parse status.
+ testPatternStatus(".*?a", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus(".*a", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+
+ testPatternStatus("(?!)", ContentExtensions::URLFilterParser::ParseStatus::Group);
+ testPatternStatus("(?=)", ContentExtensions::URLFilterParser::ParseStatus::Group);
+ testPatternStatus("(?!a)", ContentExtensions::URLFilterParser::ParseStatus::Group);
+ testPatternStatus("(?=a)", ContentExtensions::URLFilterParser::ParseStatus::Group);
+ testPatternStatus("(regex)", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("(regex", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("((regex)", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("(?:regex)", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("(?:regex", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("[^.]+", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+
+ testPatternStatus("a++", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("[a]++", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("+", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+
+ testPatternStatus("[", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+ testPatternStatus("[a}", ContentExtensions::URLFilterParser::ParseStatus::YarrError);
+
+ // FIXME: Look into why these do not cause YARR parsing errors. They probably should.
+ testPatternStatus("a]", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("{", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("{[a]", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("{0", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("{0,", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("{0,1", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("a{0,1", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("a{a,b}", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+
+ const char nonASCII[2] = {-1, '\0'};
+ testPatternStatus(nonASCII, ContentExtensions::URLFilterParser::ParseStatus::NonASCII);
+ testPatternStatus("\\xff", ContentExtensions::URLFilterParser::ParseStatus::NonASCII);
+
+ testPatternStatus("\\x\\r\\n", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("\\b", ContentExtensions::URLFilterParser::ParseStatus::WordBoundary);
+ testPatternStatus("[\\d]", ContentExtensions::URLFilterParser::ParseStatus::AtomCharacter);
+ testPatternStatus("\\d\\D\\w\\s\\v\\h\\i\\c", ContentExtensions::URLFilterParser::ParseStatus::UnsupportedCharacterClass);
+
+ testPatternStatus("this|that", ContentExtensions::URLFilterParser::ParseStatus::Disjunction);
+ testPatternStatus("a{0,1}b", ContentExtensions::URLFilterParser::ParseStatus::Ok);
+ testPatternStatus("a{0,2}b", ContentExtensions::URLFilterParser::ParseStatus::InvalidQuantifier);
+ testPatternStatus("", ContentExtensions::URLFilterParser::ParseStatus::EmptyPattern);
+ testPatternStatus("$$", ContentExtensions::URLFilterParser::ParseStatus::MisplacedEndOfLine);
+ testPatternStatus("a^", ContentExtensions::URLFilterParser::ParseStatus::MisplacedStartOfLine);
+ testPatternStatus("(^)", ContentExtensions::URLFilterParser::ParseStatus::MisplacedStartOfLine);
+
+ testPatternStatus("(a)\\1", ContentExtensions::URLFilterParser::ParseStatus::Ok); // This should be BackReference, right?
}
} // namespace TestWebKitAPI