Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: Source/core/css/parser/SizesCalcParser.cpp

Issue 369423002: Have srcset respond to viewport changes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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) && calculate();
16 if (!parser.calcToReversePolishNotation(start, end)) 19 }
17 return false; 20
18 return parser.calculate(result); 21 unsigned SizesCalcParser::result() const
22 {
23 ASSERT(m_isValid);
24 return m_result;
19 } 25 }
20 26
21 static bool operatorPriority(UChar cc, bool& highPriority) 27 static bool operatorPriority(UChar cc, bool& highPriority)
22 { 28 {
23 if (cc == '+' || cc == '-') 29 if (cc == '+' || cc == '-')
24 highPriority = false; 30 highPriority = false;
25 else if (cc == '*' || cc == '/') 31 else if (cc == '*' || cc == '/')
26 highPriority = true; 32 highPriority = true;
27 else 33 else
28 return false; 34 return false;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 // http://en.wikipedia.org/wiki/Shunting-yard_algorithm 92 // http://en.wikipedia.org/wiki/Shunting-yard_algorithm
87 93
88 Vector<MediaQueryToken> stack; 94 Vector<MediaQueryToken> stack;
89 for (MediaQueryTokenIterator it = start; it != end; ++it) { 95 for (MediaQueryTokenIterator it = start; it != end; ++it) {
90 MediaQueryTokenType type = it->type(); 96 MediaQueryTokenType type = it->type();
91 switch (type) { 97 switch (type) {
92 case NumberToken: 98 case NumberToken:
93 appendNumber(*it); 99 appendNumber(*it);
94 break; 100 break;
95 case DimensionToken: 101 case DimensionToken:
102 m_viewportDependant = m_viewportDependant || CSSPrimitiveValue::isVi ewportPercentageLength(it->unitType());
96 if (!CSSPrimitiveValue::isLength(it->unitType()) || !appendLength(*i t)) 103 if (!CSSPrimitiveValue::isLength(it->unitType()) || !appendLength(*i t))
97 return false; 104 return false;
98 break; 105 break;
99 case DelimiterToken: 106 case DelimiterToken:
100 if (!handleOperator(stack, *it)) 107 if (!handleOperator(stack, *it))
101 return false; 108 return false;
102 break; 109 break;
103 case FunctionToken: 110 case FunctionToken:
104 if (it->value() != "calc") 111 if (it->value() != "calc")
105 return false; 112 return false;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 if (rightOperand.isLength || rightOperand.value == 0) 193 if (rightOperand.isLength || rightOperand.value == 0)
187 return false; 194 return false;
188 stack.append(SizesCalcValue(leftOperand.value / rightOperand.value, left Operand.isLength)); 195 stack.append(SizesCalcValue(leftOperand.value / rightOperand.value, left Operand.isLength));
189 break; 196 break;
190 default: 197 default:
191 return false; 198 return false;
192 } 199 }
193 return true; 200 return true;
194 } 201 }
195 202
196 bool SizesCalcParser::calculate(unsigned& result) 203 bool SizesCalcParser::calculate()
197 { 204 {
198 Vector<SizesCalcValue> stack; 205 Vector<SizesCalcValue> stack;
199 for (Vector<SizesCalcValue>::iterator it = m_valueList.begin(); it != m_valu eList.end(); ++it) { 206 for (Vector<SizesCalcValue>::iterator it = m_valueList.begin(); it != m_valu eList.end(); ++it) {
200 if (it->operation == 0) { 207 if (it->operation == 0) {
201 stack.append(*it); 208 stack.append(*it);
202 } else { 209 } else {
203 if (!operateOnStack(stack, it->operation)) 210 if (!operateOnStack(stack, it->operation))
204 return false; 211 return false;
205 } 212 }
206 } 213 }
207 if (stack.size() == 1 && stack.last().isLength) { 214 if (stack.size() == 1 && stack.last().isLength) {
208 result = clampTo<unsigned>(stack.last().value); 215 m_result = clampTo<unsigned>(stack.last().value);
209 return true; 216 return true;
210 } 217 }
211 return false; 218 return false;
212 } 219 }
213 220
214 } // namespace blink 221 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/parser/SizesCalcParser.h ('k') | Source/core/css/parser/SizesCalcParserTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698