diff options
author | JustOff <Off.Just.Off@gmail.com> | 2019-04-20 13:53:46 +0300 |
---|---|---|
committer | JustOff <Off.Just.Off@gmail.com> | 2019-04-20 13:53:46 +0300 |
commit | d9137b4b7ae446750713c48a48574465301e3699 (patch) | |
tree | f9089b1a382b20b797704c0b224afcb93891f538 /layout/style/nsCSSScanner.cpp | |
parent | e0116ac2b78eb4e621a4d0769e01f8358a6d661c (diff) | |
download | UXP-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.cpp | 22 |
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 != ')'); + } } } |