Bug 1273706 - Part 5: Factor out code for parsing resolutions in nsCSSParser. r?heycam
Move it into a new ParseResolution method on CSSParserImpl. This is used by a
later patch in this series which parses custom property values.
MozReview-Commit-ID: 9SCyuepbXJR
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -1359,16 +1359,19 @@ protected:
/* Find and return the namespace ID associated with aPrefix.
If aPrefix has not been declared in an @namespace rule, returns
kNameSpaceID_Unknown. */
int32_t GetNamespaceIdForPrefix(const nsString& aPrefix);
/* Find the correct default namespace, and set it on aSelector. */
void SetDefaultNamespaceOnSelector(nsCSSSelector& aSelector);
+ /* Parse a CSS resolution (dpi, dppx, etc.) */
+ bool ParseResolution(nsCSSValue& aValue);
+
// Current token. The value is valid after calling GetToken and invalidated
// by UngetToken.
nsCSSToken mToken;
// Our scanner.
nsCSSScanner* mScanner;
// Our error reporter.
@@ -3004,16 +3007,43 @@ CSSParserImpl::ParsePropertyWithVariable
// Copy the property value into the rule data.
mTempData.MapRuleInfoInto(aPropertyID, aRuleData);
mTempData.ClearProperty(propertyToParse);
mTempData.AssertInitialState();
}
bool
+CSSParserImpl::ParseResolution(nsCSSValue& aValue)
+{
+ bool rv;
+ rv = GetToken(true);
+ if (!rv)
+ return false;
+ rv = mToken.mType == eCSSToken_Dimension && mToken.mNumber > 0.0f;
+ if (!rv) {
+ UngetToken();
+ return false;
+ }
+ // No worries about whether unitless zero is allowed, since the
+ // value must be positive (and we checked that above).
+ NS_ASSERTION(!mToken.mIdent.IsEmpty(), "unit lied");
+ if (mToken.mIdent.LowerCaseEqualsLiteral("dpi")) {
+ aValue.SetFloatValue(mToken.mNumber, eCSSUnit_DotsPerInch);
+ } else if (mToken.mIdent.LowerCaseEqualsLiteral("dppx")) {
+ aValue.SetFloatValue(mToken.mNumber, eCSSUnit_DotsPerPixel);
+ } else if (mToken.mIdent.LowerCaseEqualsLiteral("dpcm")) {
+ aValue.SetFloatValue(mToken.mNumber, eCSSUnit_DotsPerCentimeter);
+ } else {
+ rv = false;
+ }
+ return rv;
+}
+
+bool
CSSParserImpl::ParseCounterStyleName(const nsAString& aBuffer,
nsIURI* aURL,
nsAString& aName)
{
nsCSSScanner scanner(aBuffer, 0);
css::ErrorReporter reporter(scanner, mSheet, mChildLoader, aURL);
InitScanner(scanner, reporter, aURL, aURL, nullptr);
@@ -3660,36 +3690,17 @@ CSSParserImpl::ParseMediaQueryExpression
rv = ParseSingleTokenVariant(a->Item(0), VARIANT_INTEGER, nullptr) &&
a->Item(0).GetIntValue() > 0 &&
ExpectSymbol('/', true) &&
ParseSingleTokenVariant(a->Item(1), VARIANT_INTEGER, nullptr) &&
a->Item(1).GetIntValue() > 0;
}
break;
case nsMediaFeature::eResolution:
- rv = GetToken(true);
- if (!rv)
- break;
- rv = mToken.mType == eCSSToken_Dimension && mToken.mNumber > 0.0f;
- if (!rv) {
- UngetToken();
- break;
- }
- // No worries about whether unitless zero is allowed, since the
- // value must be positive (and we checked that above).
- NS_ASSERTION(!mToken.mIdent.IsEmpty(), "unit lied");
- if (mToken.mIdent.LowerCaseEqualsLiteral("dpi")) {
- expr->mValue.SetFloatValue(mToken.mNumber, eCSSUnit_Inch);
- } else if (mToken.mIdent.LowerCaseEqualsLiteral("dppx")) {
- expr->mValue.SetFloatValue(mToken.mNumber, eCSSUnit_Pixel);
- } else if (mToken.mIdent.LowerCaseEqualsLiteral("dpcm")) {
- expr->mValue.SetFloatValue(mToken.mNumber, eCSSUnit_Centimeter);
- } else {
- rv = false;
- }
+ rv = ParseResolution(expr->mValue);
break;
case nsMediaFeature::eEnumerated:
rv = ParseSingleTokenVariant(expr->mValue, VARIANT_KEYWORD,
feature->mData.mKeywordTable);
break;
case nsMediaFeature::eIdent:
rv = ParseSingleTokenVariant(expr->mValue, VARIANT_IDENTIFIER, nullptr);
break;