Bug 1273706 - Part 5: Factor out code for parsing resolutions in nsCSSParser. r?heycam draft
authorJonathan Chan <jyc@eqv.io>
Thu, 18 Aug 2016 13:25:30 -0700
changeset 402894 694bf09bb0de94645fb94a18cf6c7b37a90c1a4e
parent 402893 7208789a1148a6040b7ff07cb6185154634b8007
child 402895 16d66cf7b281e2ca1c4764a28d2c962593693039
push id26775
push userjchan@mozilla.com
push dateThu, 18 Aug 2016 22:38:41 +0000
reviewersheycam
bugs1273706
milestone51.0a1
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
layout/style/nsCSSParser.cpp
--- 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;