Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / parser / SizesAttributeParser.cpp
index 15f5590..1ca67fe 100644 (file)
 #include "core/css/parser/MediaQueryTokenizer.h"
 #include "core/css/parser/SizesCalcParser.h"
 
-namespace WebCore {
+namespace blink {
 
-unsigned SizesAttributeParser::findEffectiveSize(const String& attribute, PassRefPtr<MediaValues> mediaValues)
+SizesAttributeParser::SizesAttributeParser(PassRefPtr<MediaValues> mediaValues, const String& attribute)
+    : m_mediaValues(mediaValues)
+    , m_length(0)
+    , m_lengthWasSet(false)
+    , m_viewportDependant(false)
 {
-    Vector<MediaQueryToken> tokens;
-    SizesAttributeParser parser(mediaValues);
+    MediaQueryTokenizer::tokenize(attribute, m_tokens);
+    m_isValid = parse(m_tokens);
+}
 
-    MediaQueryTokenizer::tokenize(attribute, tokens);
-    if (!parser.parse(tokens))
-        return parser.effectiveSizeDefaultValue();
-    return parser.effectiveSize();
+unsigned SizesAttributeParser::length()
+{
+    if (m_isValid)
+        return effectiveSize();
+    return effectiveSizeDefaultValue();
 }
 
 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator startToken, MediaQueryTokenIterator endToken, unsigned& result)
@@ -32,12 +38,18 @@ bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start
         int 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;
             return true;
         }
     } else if (type == FunctionToken) {
-        return SizesCalcParser::parse(startToken, endToken, m_mediaValues, result);
+        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()) {
         result = 0;
         return true;
@@ -79,7 +91,7 @@ static void reverseSkipUntilComponentStart(MediaQueryTokenIterator& token, Media
 bool SizesAttributeParser::mediaConditionMatches(PassRefPtrWillBeRawPtr<MediaQuerySet> mediaCondition)
 {
     // A Media Condition cannot have a media type other then screen.
-    MediaQueryEvaluator mediaQueryEvaluator(MediaTypeNames::screen, *m_mediaValues);
+    MediaQueryEvaluator mediaQueryEvaluator(*m_mediaValues);
     return mediaQueryEvaluator.eval(mediaCondition.get());
 }
 
@@ -133,7 +145,8 @@ unsigned SizesAttributeParser::effectiveSize()
 
 unsigned SizesAttributeParser::effectiveSizeDefaultValue()
 {
-    // Returning the equivalent of "100%"
+    // Returning the equivalent of "100vw"
+    m_viewportDependant = true;
     return m_mediaValues->viewportWidth();
 }