| 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 |