summaryrefslogtreecommitdiffstats
path: root/layout/style/nsCSSScanner.cpp
diff options
context:
space:
mode:
authorJustOff <Off.Just.Off@gmail.com>2019-04-20 13:53:46 +0300
committerJustOff <Off.Just.Off@gmail.com>2019-04-20 13:53:46 +0300
commitd9137b4b7ae446750713c48a48574465301e3699 (patch)
treef9089b1a382b20b797704c0b224afcb93891f538 /layout/style/nsCSSScanner.cpp
parente0116ac2b78eb4e621a4d0769e01f8358a6d661c (diff)
downloadUXP-d9137b4b7ae446750713c48a48574465301e3699.tar
UXP-d9137b4b7ae446750713c48a48574465301e3699.tar.gz
UXP-d9137b4b7ae446750713c48a48574465301e3699.tar.lz
UXP-d9137b4b7ae446750713c48a48574465301e3699.tar.xz
UXP-d9137b4b7ae446750713c48a48574465301e3699.zip
Handle URL token in a closer way to the CSS3 spec
Diffstat (limited to 'layout/style/nsCSSScanner.cpp')
-rw-r--r--layout/style/nsCSSScanner.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/layout/style/nsCSSScanner.cpp b/layout/style/nsCSSScanner.cpp
index 771c8936b..2110be78c 100644
--- a/layout/style/nsCSSScanner.cpp
+++ b/layout/style/nsCSSScanner.cpp
@@ -1164,6 +1164,7 @@ nsCSSScanner::NextURL(nsCSSToken& aToken)
// aToken.mIdent may be "url" at this point; clear that out
aToken.mIdent.Truncate();
+ bool hasString = false;
int32_t ch = Peek();
// Do we have a string?
if (ch == '"' || ch == '\'') {
@@ -1173,7 +1174,7 @@ nsCSSScanner::NextURL(nsCSSToken& aToken)
return;
}
MOZ_ASSERT(aToken.mType == eCSSToken_String, "unexpected token type");
-
+ hasString = true;
} else {
// Otherwise, this is the start of a non-quoted url (which may be empty).
aToken.mSymbol = char16_t(0);
@@ -1193,6 +1194,25 @@ nsCSSScanner::NextURL(nsCSSToken& aToken)
} else {
mSeenBadToken = true;
aToken.mType = eCSSToken_Bad_URL;
+ if (!hasString) {
+ // Consume until before the next right parenthesis, which follows
+ // how <bad-url-token> is consumed in CSS Syntax 3 spec.
+ // Note that, we only do this when "url(" is not followed by a
+ // string, because in the spec, "url(" followed by a string is
+ // handled as a url function rather than a <url-token>, so the
+ // rest of content before ")" should be consumed in balance,
+ // which will be done by the parser.
+ // The closing ")" is not consumed here. It is left to the parser
+ // so that the parser can handle both cases.
+ do {
+ if (IsVertSpace(ch)) {
+ AdvanceLine();
+ } else {
+ Advance();
+ }
+ ch = Peek();
+ } while (ch >= 0 && ch != ')');
+ }
}
}