зеркало из https://github.com/mozilla/gecko-dev.git
Bug 752187 - Part 8: Implement unprefixed linear-gradient parsing. r=dbaron
This commit is contained in:
Родитель
b27adf13d6
Коммит
6eab3cff50
|
@ -4999,81 +4999,83 @@ CSSParserImpl::ParseLinearGradient(nsCSSValue& aValue, bool aIsRepeating,
|
|||
nsRefPtr<nsCSSValueGradient> cssGradient
|
||||
= new nsCSSValueGradient(false, aIsRepeating);
|
||||
|
||||
// <gradient-line>
|
||||
if (!GetToken(true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool toCorner = false;
|
||||
if (mToken.mType == eCSSToken_Ident &&
|
||||
mToken.mIdent.LowerCaseEqualsLiteral("to")) {
|
||||
toCorner = true;
|
||||
if (!GetToken(true)) {
|
||||
|
||||
// "to" syntax doesn't allow explicit "center"
|
||||
if (!ParseBoxPositionValues(cssGradient->mBgPos, false, false)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
// [ to [left | right] || [top | bottom] ] ,
|
||||
const nsCSSValue& xValue = cssGradient->mBgPos.mXValue;
|
||||
const nsCSSValue& yValue = cssGradient->mBgPos.mYValue;
|
||||
if (xValue.GetUnit() != eCSSUnit_Enumerated ||
|
||||
!(xValue.GetIntValue() & (NS_STYLE_BG_POSITION_LEFT |
|
||||
NS_STYLE_BG_POSITION_CENTER |
|
||||
NS_STYLE_BG_POSITION_RIGHT)) ||
|
||||
yValue.GetUnit() != eCSSUnit_Enumerated ||
|
||||
!(yValue.GetIntValue() & (NS_STYLE_BG_POSITION_TOP |
|
||||
NS_STYLE_BG_POSITION_CENTER |
|
||||
NS_STYLE_BG_POSITION_BOTTOM))) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ExpectSymbol(',', true)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
return ParseGradientColorStops(cssGradient, aValue);
|
||||
}
|
||||
|
||||
if (!aIsLegacy) {
|
||||
UngetToken();
|
||||
|
||||
// <angle> ,
|
||||
if (ParseVariant(cssGradient->mAngle, VARIANT_ANGLE, nsnull) &&
|
||||
!ExpectSymbol(',', true)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
return ParseGradientColorStops(cssGradient, aValue);
|
||||
}
|
||||
|
||||
nsCSSTokenType ty = mToken.mType;
|
||||
nsString id = mToken.mIdent;
|
||||
cssGradient->mIsLegacySyntax = !toCorner;
|
||||
UngetToken();
|
||||
|
||||
// <legacy-gradient-line>
|
||||
bool haveGradientLine = IsLegacyGradientLine(ty, id);
|
||||
if (haveGradientLine) {
|
||||
if (toCorner) {
|
||||
// "to" syntax only allows box position keywords
|
||||
if (ty != eCSSToken_Ident) {
|
||||
cssGradient->mIsLegacySyntax = true;
|
||||
bool haveAngle =
|
||||
ParseVariant(cssGradient->mAngle, VARIANT_ANGLE, nsnull);
|
||||
|
||||
// if we got an angle, we might now have a comma, ending the gradient-line
|
||||
if (!haveAngle || !ExpectSymbol(',', true)) {
|
||||
if (!ParseBoxPositionValues(cssGradient->mBgPos, false)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
// "to" syntax doesn't allow explicit "center"
|
||||
if (!ParseBoxPositionValues(cssGradient->mBgPos, false, false)) {
|
||||
if (!ExpectSymbol(',', true) &&
|
||||
// if we didn't already get an angle, we might have one now,
|
||||
// otherwise it's an error
|
||||
(haveAngle ||
|
||||
!ParseVariant(cssGradient->mAngle, VARIANT_ANGLE, nsnull) ||
|
||||
// now we better have a comma
|
||||
!ExpectSymbol(',', true))) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
const nsCSSValue& xValue = cssGradient->mBgPos.mXValue;
|
||||
const nsCSSValue& yValue = cssGradient->mBgPos.mYValue;
|
||||
if (xValue.GetUnit() != eCSSUnit_Enumerated ||
|
||||
!(xValue.GetIntValue() & (NS_STYLE_BG_POSITION_LEFT |
|
||||
NS_STYLE_BG_POSITION_CENTER |
|
||||
NS_STYLE_BG_POSITION_RIGHT)) ||
|
||||
yValue.GetUnit() != eCSSUnit_Enumerated ||
|
||||
!(yValue.GetIntValue() & (NS_STYLE_BG_POSITION_TOP |
|
||||
NS_STYLE_BG_POSITION_CENTER |
|
||||
NS_STYLE_BG_POSITION_BOTTOM))) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ExpectSymbol(',', true)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
bool haveAngle =
|
||||
ParseVariant(cssGradient->mAngle, VARIANT_ANGLE, nsnull);
|
||||
|
||||
// if we got an angle, we might now have a comma, ending the gradient-line
|
||||
if (!haveAngle || !ExpectSymbol(',', true)) {
|
||||
if (!ParseBoxPositionValues(cssGradient->mBgPos, false)) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ExpectSymbol(',', true) &&
|
||||
// if we didn't already get an angle, we might have one now,
|
||||
// otherwise it's an error
|
||||
(haveAngle ||
|
||||
!ParseVariant(cssGradient->mAngle, VARIANT_ANGLE, nsnull) ||
|
||||
// now we better have a comma
|
||||
!ExpectSymbol(',', true))) {
|
||||
SkipUntil(')');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче