summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parse/parse.c82
-rw-r--r--test/data/parse2/eof.dat119
2 files changed, 194 insertions, 7 deletions
diff --git a/src/parse/parse.c b/src/parse/parse.c
index 4f0bc65..60106a5 100644
--- a/src/parse/parse.c
+++ b/src/parse/parse.c
@@ -934,6 +934,14 @@ css_error parseRuleset(css_parser *parser)
if (error != CSS_OK)
return error;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
+
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
lwc_string_data(token->idata)[0] != '{') {
@@ -977,6 +985,9 @@ css_error parseRulesetEnd(css_parser *parser)
if (error != CSS_OK)
return error;
+ if (token->type == CSS_TOKEN_EOF)
+ return done(parser);
+
/* If this can't possibly be the start of a decl-list, then
* attempt to parse a declaration. This will catch any invalid
* input at this point and read to the start of the next
@@ -1005,8 +1016,13 @@ css_error parseRulesetEnd(css_parser *parser)
if (error != CSS_OK)
return error;
- if (token->type == CSS_TOKEN_EOF)
- break;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
@@ -1139,6 +1155,14 @@ css_error parseAtRuleEnd(css_parser *parser)
if (error != CSS_OK)
return error;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
+
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1) {
/* Should never happen FOLLOW(at-rule) == '{', ';'*/
@@ -1235,8 +1259,13 @@ css_error parseBlock(css_parser *parser)
if (error != CSS_OK)
return error;
- if (token->type == CSS_TOKEN_EOF)
- break;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
@@ -1316,6 +1345,11 @@ css_error parseBlockContent(css_parser *parser)
parser->event_pw);
}
+ unref_interned_strings_in_tokens(
+ parser);
+ parserutils_vector_clear(
+ parser->tokens);
+
return transition(parser, to,
subsequent);
} else if (lwc_string_length(
@@ -1368,6 +1402,11 @@ css_error parseBlockContent(css_parser *parser)
parser->event_pw);
}
+ unref_interned_strings_in_tokens(
+ parser);
+ parserutils_vector_clear(
+ parser->tokens);
+
return done(parser);
}
} else if (token->type == CSS_TOKEN_EOF) {
@@ -1385,6 +1424,9 @@ css_error parseBlockContent(css_parser *parser)
parser->event_pw);
}
+ unref_interned_strings_in_tokens(parser);
+ parserutils_vector_clear(parser->tokens);
+
return done(parser);
}
@@ -1469,6 +1511,14 @@ css_error parseDeclaration(css_parser *parser)
if (error != CSS_OK)
return error;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
+
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
lwc_string_data(token->idata)[0] != ':') {
@@ -1535,8 +1585,13 @@ css_error parseDeclList(css_parser *parser)
if (error != CSS_OK)
return error;
- if (token->type == CSS_TOKEN_EOF)
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
return done(parser);
+ }
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
@@ -1630,6 +1685,14 @@ css_error parseProperty(css_parser *parser)
if (error != CSS_OK)
return error;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
+
if (token->type != CSS_TOKEN_IDENT) {
/* parse error */
parser->parseError = true;
@@ -2498,8 +2561,13 @@ css_error parseISBody(css_parser *parser)
if (error != CSS_OK)
return error;
- if (token->type == CSS_TOKEN_EOF)
- break;
+ if (token->type == CSS_TOKEN_EOF) {
+ error = pushBack(parser, token);
+ if (error != CSS_OK)
+ return error;
+
+ return done(parser);
+ }
if (token->type != CSS_TOKEN_CHAR ||
lwc_string_length(token->idata) != 1 ||
diff --git a/test/data/parse2/eof.dat b/test/data/parse2/eof.dat
index e19b42c..48190a6 100644
--- a/test/data/parse2/eof.dat
+++ b/test/data/parse2/eof.dat
@@ -177,6 +177,125 @@ f{clear:both}
#reset
#data
+@media screen
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen{
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen{
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen{{
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen{;
+#errors
+#expected
+| @media
+#reset
+
+#data
+@media screen{f
+#errors
+#expected
+| @media
+| f
+#reset
+
+#data
+@media screen{f{
+#errors
+#expected
+| @media
+| f
+#reset
+
+#data
+@media screen{f{color
+#errors
+#expected
+| @media
+| f
+#reset
+
+#data
+@media screen{f{color:
+#errors
+#expected
+| @media
+| f
+#reset
+
+#data
+@media screen{f{color:blue
+#errors
+#expected
+| @media
+| f
+| color: #0000ff00
+#reset
+
+#data
+@media screen{f{color:blue;
+#errors
+#expected
+| @media
+| f
+| color: #0000ff00
+#reset
+
+#data
+@media screen{f{color:blue}
+#errors
+#expected
+| @media
+| f
+| color: #0000ff00
+#reset
+
+#data
+@media screen{f{color:blue;}
+#errors
+#expected
+| @media
+| f
+| color: #0000ff00
+#reset
+
+#data
+@media screen{f{color:blue;}}
+#errors
+#expected
+| @media
+| f
+| color: #0000ff00
+#reset
+
+#data
l(
#errors
#expected