Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / parser / SizesAttributeParser.cpp
index 1ca67fe..11474ed 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "core/MediaTypeNames.h"
 #include "core/css/MediaQueryEvaluator.h"
-#include "core/css/parser/MediaQueryTokenizer.h"
+#include "core/css/parser/CSSTokenizer.h"
 #include "core/css/parser/SizesCalcParser.h"
 
 namespace blink {
@@ -16,38 +16,35 @@ SizesAttributeParser::SizesAttributeParser(PassRefPtr<MediaValues> mediaValues,
     : m_mediaValues(mediaValues)
     , m_length(0)
     , m_lengthWasSet(false)
-    , m_viewportDependant(false)
 {
-    MediaQueryTokenizer::tokenize(attribute, m_tokens);
+    CSSTokenizer::tokenize(attribute, m_tokens);
     m_isValid = parse(m_tokens);
 }
 
-unsigned SizesAttributeParser::length()
+float SizesAttributeParser::length()
 {
     if (m_isValid)
         return effectiveSize();
     return effectiveSizeDefaultValue();
 }
 
-bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator startToken, MediaQueryTokenIterator endToken, unsigned& result)
+bool SizesAttributeParser::calculateLengthInPixels(CSSParserTokenIterator startToken, CSSParserTokenIterator endToken, float& result)
 {
     if (startToken == endToken)
         return false;
-    MediaQueryTokenType type = startToken->type();
+    CSSParserTokenType type = startToken->type();
     if (type == DimensionToken) {
-        int length;
+        double length;
         if (!CSSPrimitiveValue::isLength(startToken->unitType()))
             return false;
-        m_viewportDependant = CSSPrimitiveValue::isViewportPercentageLength(startToken->unitType());
-        if ((m_mediaValues->computeLength(startToken->numericValue(), startToken->unitType(), length)) && (length > 0)) {
-            result = (unsigned)length;
+        if ((m_mediaValues->computeLength(startToken->numericValue(), startToken->unitType(), length)) && (length >= 0)) {
+            result = clampTo<float>(length);
             return true;
         }
     } else if (type == FunctionToken) {
         SizesCalcParser calcParser(startToken, endToken, m_mediaValues);
         if (!calcParser.isValid())
             return false;
-        m_viewportDependant = calcParser.viewportDependant();
         result = calcParser.result();
         return true;
     } else if (type == NumberToken && !startToken->numericValue()) {
@@ -58,27 +55,27 @@ bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
     return false;
 }
 
-static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQueryTokenIterator startToken)
+static void reverseSkipIrrelevantTokens(CSSParserTokenIterator& token, CSSParserTokenIterator startToken)
 {
-    MediaQueryTokenIterator endToken = token;
+    CSSParserTokenIterator endToken = token;
     while (token != startToken && (token->type() == WhitespaceToken || token->type() == CommentToken || token->type() == EOFToken))
         --token;
     if (token != endToken)
         ++token;
 }
 
-static void reverseSkipUntilComponentStart(MediaQueryTokenIterator& token, MediaQueryTokenIterator startToken)
+static void reverseSkipUntilComponentStart(CSSParserTokenIterator& token, CSSParserTokenIterator startToken)
 {
     if (token == startToken)
         return;
     --token;
-    if (token->blockType() != MediaQueryToken::BlockEnd)
+    if (token->blockType() != CSSParserToken::BlockEnd)
         return;
     unsigned blockLevel = 0;
     while (token != startToken) {
-        if (token->blockType() == MediaQueryToken::BlockEnd) {
+        if (token->blockType() == CSSParserToken::BlockEnd) {
             ++blockLevel;
-        } else if (token->blockType() == MediaQueryToken::BlockStart) {
+        } else if (token->blockType() == CSSParserToken::BlockStart) {
             --blockLevel;
             if (!blockLevel)
                 break;
@@ -95,16 +92,16 @@ bool SizesAttributeParser::mediaConditionMatches(PassRefPtrWillBeRawPtr<MediaQue
     return mediaQueryEvaluator.eval(mediaCondition.get());
 }
 
-bool SizesAttributeParser::parseMediaConditionAndLength(MediaQueryTokenIterator startToken, MediaQueryTokenIterator endToken)
+bool SizesAttributeParser::parseMediaConditionAndLength(CSSParserTokenIterator startToken, CSSParserTokenIterator endToken)
 {
-    MediaQueryTokenIterator lengthTokenStart;
-    MediaQueryTokenIterator lengthTokenEnd;
+    CSSParserTokenIterator lengthTokenStart;
+    CSSParserTokenIterator lengthTokenEnd;
 
     reverseSkipIrrelevantTokens(endToken, startToken);
     lengthTokenEnd = endToken;
     reverseSkipUntilComponentStart(endToken, startToken);
     lengthTokenStart = endToken;
-    unsigned length;
+    float length;
     if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length))
         return false;
     RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMediaCondition(startToken, endToken);
@@ -116,19 +113,20 @@ bool SizesAttributeParser::parseMediaConditionAndLength(MediaQueryTokenIterator
     return false;
 }
 
-bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens)
+bool SizesAttributeParser::parse(Vector<CSSParserToken>& tokens)
 {
     if (tokens.isEmpty())
         return false;
-    MediaQueryTokenIterator startToken = tokens.begin();
-    MediaQueryTokenIterator endToken;
+    CSSParserTokenIterator startToken = tokens.begin();
+    CSSParserTokenIterator endToken;
     // Split on a comma token, and send the result tokens to be parsed as (media-condition, length) pairs
-    for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end(); ++token) {
-        if (token->type() == CommaToken) {
-            endToken = token;
+    for (auto& token : tokens) {
+        m_blockWatcher.handleToken(token);
+        if (token.type() == CommaToken && !m_blockWatcher.blockLevel()) {
+            endToken = &token;
             if (parseMediaConditionAndLength(startToken, endToken))
                 return true;
-            startToken = token;
+            startToken = &token;
             ++startToken;
         }
     }
@@ -136,7 +134,7 @@ bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens)
     return parseMediaConditionAndLength(startToken, --endToken);
 }
 
-unsigned SizesAttributeParser::effectiveSize()
+float SizesAttributeParser::effectiveSize()
 {
     if (m_lengthWasSet)
         return m_length;
@@ -146,9 +144,7 @@ unsigned SizesAttributeParser::effectiveSize()
 unsigned SizesAttributeParser::effectiveSizeDefaultValue()
 {
     // Returning the equivalent of "100vw"
-    m_viewportDependant = true;
     return m_mediaValues->viewportWidth();
 }
 
 } // namespace
-