| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "config.h" | 5 #include "config.h" | 
| 6 #include "core/css/parser/SizesCalcParser.h" | 6 #include "core/css/parser/SizesCalcParser.h" | 
| 7 | 7 | 
| 8 #include "core/css/MediaValues.h" | 8 #include "core/css/MediaValues.h" | 
| 9 #include "core/css/parser/MediaQueryToken.h" | 9 #include "core/css/parser/MediaQueryToken.h" | 
| 10 | 10 | 
| 11 namespace blink { | 11 namespace blink { | 
| 12 | 12 | 
| 13 bool SizesCalcParser::parse(MediaQueryTokenIterator start, MediaQueryTokenIterat
     or end, PassRefPtr<MediaValues> mediaValues, unsigned& result) | 13 SizesCalcParser::SizesCalcParser(MediaQueryTokenIterator start, MediaQueryTokenI
     terator end, PassRefPtr<MediaValues> mediaValues) | 
|  | 14     : m_mediaValues(mediaValues) | 
|  | 15     , m_viewportDependant(false) | 
|  | 16     , m_result(0) | 
| 14 { | 17 { | 
| 15     SizesCalcParser parser(mediaValues); | 18     m_isValid = calcToReversePolishNotation(start, end); | 
| 16     if (!parser.calcToReversePolishNotation(start, end)) | 19     if (m_isValid) | 
| 17         return false; | 20         m_isValid = calculate(); | 
| 18     return parser.calculate(result); | 21 } | 
|  | 22 | 
|  | 23 unsigned SizesCalcParser::result() | 
|  | 24 { | 
|  | 25     ASSERT(m_isValid); | 
|  | 26     return m_result; | 
| 19 } | 27 } | 
| 20 | 28 | 
| 21 static bool operatorPriority(UChar cc, bool& highPriority) | 29 static bool operatorPriority(UChar cc, bool& highPriority) | 
| 22 { | 30 { | 
| 23     if (cc == '+' || cc == '-') | 31     if (cc == '+' || cc == '-') | 
| 24         highPriority = false; | 32         highPriority = false; | 
| 25     else if (cc == '*' || cc == '/') | 33     else if (cc == '*' || cc == '/') | 
| 26         highPriority = true; | 34         highPriority = true; | 
| 27     else | 35     else | 
| 28         return false; | 36         return false; | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 86     // http://en.wikipedia.org/wiki/Shunting-yard_algorithm | 94     // http://en.wikipedia.org/wiki/Shunting-yard_algorithm | 
| 87 | 95 | 
| 88     Vector<MediaQueryToken> stack; | 96     Vector<MediaQueryToken> stack; | 
| 89     for (MediaQueryTokenIterator it = start; it != end; ++it) { | 97     for (MediaQueryTokenIterator it = start; it != end; ++it) { | 
| 90         MediaQueryTokenType type = it->type(); | 98         MediaQueryTokenType type = it->type(); | 
| 91         switch (type) { | 99         switch (type) { | 
| 92         case NumberToken: | 100         case NumberToken: | 
| 93             appendNumber(*it); | 101             appendNumber(*it); | 
| 94             break; | 102             break; | 
| 95         case DimensionToken: | 103         case DimensionToken: | 
|  | 104             m_viewportDependant = m_viewportDependant || CSSPrimitiveValue::isVi
     ewportPercentageLength(it->unitType()); | 
| 96             if (!CSSPrimitiveValue::isLength(it->unitType()) || !appendLength(*i
     t)) | 105             if (!CSSPrimitiveValue::isLength(it->unitType()) || !appendLength(*i
     t)) | 
| 97                 return false; | 106                 return false; | 
| 98             break; | 107             break; | 
| 99         case DelimiterToken: | 108         case DelimiterToken: | 
| 100             if (!handleOperator(stack, *it)) | 109             if (!handleOperator(stack, *it)) | 
| 101                 return false; | 110                 return false; | 
| 102             break; | 111             break; | 
| 103         case FunctionToken: | 112         case FunctionToken: | 
| 104             if (it->value() != "calc") | 113             if (it->value() != "calc") | 
| 105                 return false; | 114                 return false; | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 186         if (rightOperand.isLength || rightOperand.value == 0) | 195         if (rightOperand.isLength || rightOperand.value == 0) | 
| 187             return false; | 196             return false; | 
| 188         stack.append(SizesCalcValue(leftOperand.value / rightOperand.value, left
     Operand.isLength)); | 197         stack.append(SizesCalcValue(leftOperand.value / rightOperand.value, left
     Operand.isLength)); | 
| 189         break; | 198         break; | 
| 190     default: | 199     default: | 
| 191         return false; | 200         return false; | 
| 192     } | 201     } | 
| 193     return true; | 202     return true; | 
| 194 } | 203 } | 
| 195 | 204 | 
| 196 bool SizesCalcParser::calculate(unsigned& result) | 205 bool SizesCalcParser::calculate() | 
| 197 { | 206 { | 
| 198     Vector<SizesCalcValue> stack; | 207     Vector<SizesCalcValue> stack; | 
| 199     for (Vector<SizesCalcValue>::iterator it = m_valueList.begin(); it != m_valu
     eList.end(); ++it) { | 208     for (Vector<SizesCalcValue>::iterator it = m_valueList.begin(); it != m_valu
     eList.end(); ++it) { | 
| 200         if (it->operation == 0) { | 209         if (it->operation == 0) { | 
| 201             stack.append(*it); | 210             stack.append(*it); | 
| 202         } else { | 211         } else { | 
| 203             if (!operateOnStack(stack, it->operation)) | 212             if (!operateOnStack(stack, it->operation)) | 
| 204                 return false; | 213                 return false; | 
| 205         } | 214         } | 
| 206     } | 215     } | 
| 207     if (stack.size() == 1 && stack.last().isLength) { | 216     if (stack.size() == 1 && stack.last().isLength) { | 
| 208         result = clampTo<unsigned>(stack.last().value); | 217         m_result = clampTo<unsigned>(stack.last().value); | 
| 209         return true; | 218         return true; | 
| 210     } | 219     } | 
| 211     return false; | 220     return false; | 
| 212 } | 221 } | 
| 213 | 222 | 
| 214 } // namespace blink | 223 } // namespace blink | 
| OLD | NEW | 
|---|