OLD | NEW |
1 /* | 1 /* |
2 * CSS Media Query Evaluator | 2 * CSS Media Query Evaluator |
3 * | 3 * |
4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>. | 4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>. |
5 * Copyright (C) 2013 Apple Inc. All rights reserved. | 5 * Copyright (C) 2013 Apple Inc. All rights reserved. |
6 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 6 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 return mediaTypeToMatch.isEmpty() || | 104 return mediaTypeToMatch.isEmpty() || |
105 equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all) || | 105 equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all) || |
106 equalIgnoringCase(mediaTypeToMatch, mediaType()); | 106 equalIgnoringCase(mediaTypeToMatch, mediaType()); |
107 } | 107 } |
108 | 108 |
109 static bool applyRestrictor(MediaQuery::RestrictorType r, bool value) { | 109 static bool applyRestrictor(MediaQuery::RestrictorType r, bool value) { |
110 return r == MediaQuery::Not ? !value : value; | 110 return r == MediaQuery::Not ? !value : value; |
111 } | 111 } |
112 | 112 |
113 bool MediaQueryEvaluator::eval( | 113 bool MediaQueryEvaluator::eval( |
114 const MediaQuery* query, | 114 const MediaQuery& query, |
115 MediaQueryResultList* viewportDependentMediaQueryResults, | 115 MediaQueryResultList* viewportDependentMediaQueryResults, |
116 MediaQueryResultList* deviceDependentMediaQueryResults) const { | 116 MediaQueryResultList* deviceDependentMediaQueryResults) const { |
117 if (!mediaTypeMatch(query->mediaType())) | 117 if (!mediaTypeMatch(query.mediaType())) |
118 return applyRestrictor(query->restrictor(), false); | 118 return applyRestrictor(query.restrictor(), false); |
119 | 119 |
120 const ExpressionHeapVector& expressions = query->expressions(); | 120 const ExpressionHeapVector& expressions = query.expressions(); |
121 // Iterate through expressions, stop if any of them eval to false (AND | 121 // Iterate through expressions, stop if any of them eval to false (AND |
122 // semantics). | 122 // semantics). |
123 size_t i = 0; | 123 size_t i = 0; |
124 for (; i < expressions.size(); ++i) { | 124 for (; i < expressions.size(); ++i) { |
125 bool exprResult = eval(expressions.at(i).get()); | 125 bool exprResult = eval(expressions.at(i)); |
126 if (viewportDependentMediaQueryResults && | 126 if (viewportDependentMediaQueryResults && |
127 expressions.at(i)->isViewportDependent()) | 127 expressions.at(i).isViewportDependent()) { |
128 viewportDependentMediaQueryResults->push_back( | 128 viewportDependentMediaQueryResults->push_back( |
129 new MediaQueryResult(*expressions.at(i), exprResult)); | 129 MediaQueryResult(expressions.at(i), exprResult)); |
| 130 } |
130 if (deviceDependentMediaQueryResults && | 131 if (deviceDependentMediaQueryResults && |
131 expressions.at(i)->isDeviceDependent()) | 132 expressions.at(i).isDeviceDependent()) { |
132 deviceDependentMediaQueryResults->push_back( | 133 deviceDependentMediaQueryResults->push_back( |
133 new MediaQueryResult(*expressions.at(i), exprResult)); | 134 MediaQueryResult(expressions.at(i), exprResult)); |
| 135 } |
134 if (!exprResult) | 136 if (!exprResult) |
135 break; | 137 break; |
136 } | 138 } |
137 | 139 |
138 // Assume true if we are at the end of the list, otherwise assume false. | 140 // Assume true if we are at the end of the list, otherwise assume false. |
139 return applyRestrictor(query->restrictor(), expressions.size() == i); | 141 return applyRestrictor(query.restrictor(), expressions.size() == i); |
140 } | 142 } |
141 | 143 |
142 bool MediaQueryEvaluator::eval( | 144 bool MediaQueryEvaluator::eval( |
143 const MediaQuerySet* querySet, | 145 const MediaQuerySet& querySet, |
144 MediaQueryResultList* viewportDependentMediaQueryResults, | 146 MediaQueryResultList* viewportDependentMediaQueryResults, |
145 MediaQueryResultList* deviceDependentMediaQueryResults) const { | 147 MediaQueryResultList* deviceDependentMediaQueryResults) const { |
146 if (!querySet) | 148 const Vector<std::unique_ptr<MediaQuery>>& queries = querySet.queryVector(); |
147 return true; | |
148 | |
149 const HeapVector<Member<MediaQuery>>& queries = querySet->queryVector(); | |
150 if (!queries.size()) | 149 if (!queries.size()) |
151 return true; // Empty query list evaluates to true. | 150 return true; // Empty query list evaluates to true. |
152 | 151 |
153 // Iterate over queries, stop if any of them eval to true (OR semantics). | 152 // Iterate over queries, stop if any of them eval to true (OR semantics). |
154 bool result = false; | 153 bool result = false; |
155 for (size_t i = 0; i < queries.size() && !result; ++i) | 154 for (size_t i = 0; i < queries.size() && !result; ++i) { |
156 result = eval(queries[i].get(), viewportDependentMediaQueryResults, | 155 result = eval(*queries[i], viewportDependentMediaQueryResults, |
157 deviceDependentMediaQueryResults); | 156 deviceDependentMediaQueryResults); |
158 | 157 } |
159 return result; | 158 return result; |
160 } | 159 } |
161 | 160 |
162 template <typename T> | 161 template <typename T> |
163 bool compareValue(T a, T b, MediaFeaturePrefix op) { | 162 bool compareValue(T a, T b, MediaFeaturePrefix op) { |
164 switch (op) { | 163 switch (op) { |
165 case MinPrefix: | 164 case MinPrefix: |
166 return a >= b; | 165 return a >= b; |
167 case MaxPrefix: | 166 case MaxPrefix: |
168 return a <= b; | 167 return a <= b; |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 | 801 |
803 void MediaQueryEvaluator::init() { | 802 void MediaQueryEvaluator::init() { |
804 // Create the table. | 803 // Create the table. |
805 gFunctionMap = new FunctionMap; | 804 gFunctionMap = new FunctionMap; |
806 #define ADD_TO_FUNCTIONMAP(name) \ | 805 #define ADD_TO_FUNCTIONMAP(name) \ |
807 gFunctionMap->set(name##MediaFeature.impl(), name##MediaFeatureEval); | 806 gFunctionMap->set(name##MediaFeature.impl(), name##MediaFeatureEval); |
808 CSS_MEDIAQUERY_NAMES_FOR_EACH_MEDIAFEATURE(ADD_TO_FUNCTIONMAP); | 807 CSS_MEDIAQUERY_NAMES_FOR_EACH_MEDIAFEATURE(ADD_TO_FUNCTIONMAP); |
809 #undef ADD_TO_FUNCTIONMAP | 808 #undef ADD_TO_FUNCTIONMAP |
810 } | 809 } |
811 | 810 |
812 bool MediaQueryEvaluator::eval(const MediaQueryExp* expr) const { | 811 bool MediaQueryEvaluator::eval(const MediaQueryExp& expr) const { |
813 if (!m_mediaValues || !m_mediaValues->hasValues()) | 812 if (!m_mediaValues || !m_mediaValues->hasValues()) |
814 return true; | 813 return true; |
815 | 814 |
816 DCHECK(gFunctionMap); | 815 DCHECK(gFunctionMap); |
817 | 816 |
818 // Call the media feature evaluation function. Assume no prefix and let | 817 // Call the media feature evaluation function. Assume no prefix and let |
819 // trampoline functions override the prefix if prefix is used. | 818 // trampoline functions override the prefix if prefix is used. |
820 EvalFunc func = gFunctionMap->at(expr->mediaFeature().impl()); | 819 EvalFunc func = gFunctionMap->at(expr.mediaFeature().impl()); |
821 if (func) | 820 if (func) |
822 return func(expr->expValue(), NoPrefix, *m_mediaValues); | 821 return func(expr.expValue(), NoPrefix, *m_mediaValues); |
823 | 822 |
824 return false; | 823 return false; |
825 } | 824 } |
826 | 825 |
827 } // namespace blink | 826 } // namespace blink |
OLD | NEW |