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

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

Issue 302123002: Enable zero length source size in sizes attribute (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Break out of length calc early for empty length Created 6 years, 6 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 "SizesAttributeParser.h" 6 #include "SizesAttributeParser.h"
7 7
8 #include "MediaTypeNames.h" 8 #include "MediaTypeNames.h"
9 #include "core/css/MediaQueryEvaluator.h" 9 #include "core/css/MediaQueryEvaluator.h"
10 #include "core/css/parser/MediaQueryTokenizer.h" 10 #include "core/css/parser/MediaQueryTokenizer.h"
11 #include "core/css/parser/SizesCalcParser.h" 11 #include "core/css/parser/SizesCalcParser.h"
12 12
13 namespace WebCore { 13 namespace WebCore {
14 14
15 unsigned SizesAttributeParser::findEffectiveSize(const String& attribute, PassRe fPtr<MediaValues> mediaValues) 15 unsigned SizesAttributeParser::findEffectiveSize(const String& attribute, PassRe fPtr<MediaValues> mediaValues)
16 { 16 {
17 Vector<MediaQueryToken> tokens; 17 Vector<MediaQueryToken> tokens;
18 SizesAttributeParser parser(mediaValues); 18 SizesAttributeParser parser(mediaValues);
19 19
20 MediaQueryTokenizer::tokenize(attribute, tokens); 20 MediaQueryTokenizer::tokenize(attribute, tokens);
21 if (!parser.parse(tokens)) 21 if (!parser.parse(tokens))
22 return parser.effectiveSizeDefaultValue(); 22 return parser.effectiveSizeDefaultValue();
23 return parser.effectiveSize(); 23 return parser.effectiveSize();
24 } 24 }
25 25
26 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start Token, MediaQueryTokenIterator endToken, unsigned& result) 26 bool SizesAttributeParser::calculateLengthInPixels(MediaQueryTokenIterator start Token, MediaQueryTokenIterator endToken, unsigned& result)
27 { 27 {
28 if (startToken == endToken)
29 return false;
28 MediaQueryTokenType type = startToken->type(); 30 MediaQueryTokenType type = startToken->type();
29 if (type == DimensionToken) { 31 if (type == DimensionToken) {
30 int length; 32 int length;
31 if (!CSSPrimitiveValue::isLength(startToken->unitType())) 33 if (!CSSPrimitiveValue::isLength(startToken->unitType()))
32 return false; 34 return false;
33 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken ->unitType(), length)) && (length > 0)) { 35 if ((m_mediaValues->computeLength(startToken->numericValue(), startToken ->unitType(), length)) && (length > 0)) {
34 result = (unsigned)length; 36 result = (unsigned)length;
35 return true; 37 return true;
36 } 38 }
37 } else if (type == FunctionToken) { 39 } else if (type == FunctionToken) {
38 return SizesCalcParser::parse(startToken, endToken, m_mediaValues, resul t); 40 return SizesCalcParser::parse(startToken, endToken, m_mediaValues, resul t);
41 } else if (type == NumberToken && !startToken->numericValue()) {
42 result = 0;
43 return true;
39 } 44 }
40 45
41 return false; 46 return false;
42 } 47 }
43 48
44 static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQue ryTokenIterator startToken) 49 static void reverseSkipIrrelevantTokens(MediaQueryTokenIterator& token, MediaQue ryTokenIterator startToken)
45 { 50 {
46 MediaQueryTokenIterator endToken = token; 51 MediaQueryTokenIterator endToken = token;
47 while (token != startToken && (token->type() == WhitespaceToken || token->ty pe() == CommentToken || token->type() == EOFToken)) 52 while (token != startToken && (token->type() == WhitespaceToken || token->ty pe() == CommentToken || token->type() == EOFToken))
48 --token; 53 --token;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 reverseSkipIrrelevantTokens(endToken, startToken); 91 reverseSkipIrrelevantTokens(endToken, startToken);
87 lengthTokenEnd = endToken; 92 lengthTokenEnd = endToken;
88 reverseSkipUntilComponentStart(endToken, startToken); 93 reverseSkipUntilComponentStart(endToken, startToken);
89 lengthTokenStart = endToken; 94 lengthTokenStart = endToken;
90 unsigned length; 95 unsigned length;
91 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length)) 96 if (!calculateLengthInPixels(lengthTokenStart, lengthTokenEnd, length))
92 return false; 97 return false;
93 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe diaCondition(startToken, endToken); 98 RefPtrWillBeRawPtr<MediaQuerySet> mediaCondition = MediaQueryParser::parseMe diaCondition(startToken, endToken);
94 if (mediaCondition && mediaConditionMatches(mediaCondition)) { 99 if (mediaCondition && mediaConditionMatches(mediaCondition)) {
95 m_length = length; 100 m_length = length;
101 m_lengthWasSet = true;
96 return true; 102 return true;
97 } 103 }
98 return false; 104 return false;
99 } 105 }
100 106
101 bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens) 107 bool SizesAttributeParser::parse(Vector<MediaQueryToken>& tokens)
102 { 108 {
103 if (tokens.isEmpty()) 109 if (tokens.isEmpty())
104 return false; 110 return false;
105 MediaQueryTokenIterator startToken = tokens.begin(); 111 MediaQueryTokenIterator startToken = tokens.begin();
106 MediaQueryTokenIterator endToken; 112 MediaQueryTokenIterator endToken;
107 // Split on a comma token, and send the result tokens to be parsed as (media -condition, length) pairs 113 // Split on a comma token, and send the result tokens to be parsed as (media -condition, length) pairs
108 for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end(); ++token) { 114 for (MediaQueryTokenIterator token = tokens.begin(); token != tokens.end(); ++token) {
109 if (token->type() == CommaToken) { 115 if (token->type() == CommaToken) {
110 endToken = token; 116 endToken = token;
111 if (parseMediaConditionAndLength(startToken, endToken)) 117 if (parseMediaConditionAndLength(startToken, endToken))
112 return true; 118 return true;
113 startToken = token; 119 startToken = token;
114 ++startToken; 120 ++startToken;
115 } 121 }
116 } 122 }
117 endToken = tokens.end(); 123 endToken = tokens.end();
118 return parseMediaConditionAndLength(startToken, --endToken); 124 return parseMediaConditionAndLength(startToken, --endToken);
119 } 125 }
120 126
121 unsigned SizesAttributeParser::effectiveSize() 127 unsigned SizesAttributeParser::effectiveSize()
122 { 128 {
123 if (m_length) 129 if (m_lengthWasSet)
124 return m_length; 130 return m_length;
125 return effectiveSizeDefaultValue(); 131 return effectiveSizeDefaultValue();
126 } 132 }
127 133
128 unsigned SizesAttributeParser::effectiveSizeDefaultValue() 134 unsigned SizesAttributeParser::effectiveSizeDefaultValue()
129 { 135 {
130 // Returning the equivalent of "100%" 136 // Returning the equivalent of "100%"
131 return m_mediaValues->viewportWidth(); 137 return m_mediaValues->viewportWidth();
132 } 138 }
133 139
134 } // namespace 140 } // namespace
135 141
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698