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

Side by Side Diff: third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp

Issue 2873433003: Move MediaQuery classes off BlinkGC heap (Closed)
Patch Set: Created 3 years, 7 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 /* 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698