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

Side by Side Diff: Source/core/css/MediaList.cpp

Issue 170283019: Change various helper classes to transition types to get CSSValue entirely onto the gc heap. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2006, 2010, 2012 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2006, 2010, 2012 Apple Inc. All rights reserved.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 * However, the parsing rules for media queries are incompatible with those of H TML4 45 * However, the parsing rules for media queries are incompatible with those of H TML4
46 * and are consistent with those of media queries used in CSS. 46 * and are consistent with those of media queries used in CSS.
47 * 47 *
48 * HTML5 (at the moment of writing still work in progress) references the Media Queries 48 * HTML5 (at the moment of writing still work in progress) references the Media Queries
49 * specification directly and thus updates the rules for HTML. 49 * specification directly and thus updates the rules for HTML.
50 * 50 *
51 * CSS 2.1 Spec (http://www.w3.org/TR/CSS21/media.html) 51 * CSS 2.1 Spec (http://www.w3.org/TR/CSS21/media.html)
52 * CSS 3 Media Queries Spec (http://www.w3.org/TR/css3-mediaqueries/) 52 * CSS 3 Media Queries Spec (http://www.w3.org/TR/css3-mediaqueries/)
53 */ 53 */
54 54
55 DEFINE_GC_INFO(MediaQuerySet);
56 DEFINE_GC_INFO(MediaList);
57
55 MediaQuerySet::MediaQuerySet() 58 MediaQuerySet::MediaQuerySet()
56 { 59 {
57 } 60 }
58 61
59 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) 62 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o)
60 : RefCounted<MediaQuerySet>() 63 : m_queries(o.m_queries.size())
61 , m_queries(o.m_queries.size())
62 { 64 {
63 for (unsigned i = 0; i < m_queries.size(); ++i) 65 for (unsigned i = 0; i < m_queries.size(); ++i)
64 m_queries[i] = o.m_queries[i]->copy(); 66 m_queries[i] = o.m_queries[i]->copy();
65 } 67 }
66 68
67 MediaQuerySet::~MediaQuerySet() 69 MediaQuerySet::~MediaQuerySet()
68 { 70 {
69 } 71 }
70 72
71 PassRefPtr<MediaQuerySet> MediaQuerySet::create(const String& mediaString) 73 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQuerySet::create(const String& mediaS tring)
72 { 74 {
73 if (mediaString.isEmpty()) 75 if (mediaString.isEmpty())
74 return MediaQuerySet::create(); 76 return MediaQuerySet::create();
75 77
76 BisonCSSParser parser(strictCSSParserContext()); 78 BisonCSSParser parser(strictCSSParserContext());
77 return parser.parseMediaQueryList(mediaString); 79 return parser.parseMediaQueryList(mediaString);
78 } 80 }
79 81
80 bool MediaQuerySet::set(const String& mediaString) 82 bool MediaQuerySet::set(const String& mediaString)
81 { 83 {
82 RefPtr<MediaQuerySet> result = create(mediaString); 84 RefPtrWillBeRawPtr<MediaQuerySet> result = create(mediaString);
83 m_queries.swap(result->m_queries); 85 m_queries.swap(result->m_queries);
84 return true; 86 return true;
85 } 87 }
86 88
87 bool MediaQuerySet::add(const String& queryString) 89 bool MediaQuerySet::add(const String& queryString)
88 { 90 {
89 // To "parse a media query" for a given string means to follow "the parse 91 // To "parse a media query" for a given string means to follow "the parse
90 // a media query list" steps and return "null" if more than one media query 92 // a media query list" steps and return "null" if more than one media query
91 // is returned, or else the returned media query. 93 // is returned, or else the returned media query.
92 RefPtr<MediaQuerySet> result = create(queryString); 94 RefPtrWillBeRawPtr<MediaQuerySet> result = create(queryString);
93 95
94 // Only continue if exactly one media query is found, as described above. 96 // Only continue if exactly one media query is found, as described above.
95 if (result->m_queries.size() != 1) 97 if (result->m_queries.size() != 1)
96 return true; 98 return true;
97 99
98 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); 100 OwnPtrWillBeRawPtr<MediaQuery> newQuery = result->m_queries[0].release();
99 ASSERT(newQuery); 101 ASSERT(newQuery);
100 102
101 // If comparing with any of the media queries in the collection of media 103 // If comparing with any of the media queries in the collection of media
102 // queries returns true terminate these steps. 104 // queries returns true terminate these steps.
103 for (size_t i = 0; i < m_queries.size(); ++i) { 105 for (size_t i = 0; i < m_queries.size(); ++i) {
104 MediaQuery* query = m_queries[i].get(); 106 MediaQuery* query = m_queries[i].get();
105 if (*query == *newQuery) 107 if (*query == *newQuery)
106 return true; 108 return true;
107 } 109 }
108 110
109 m_queries.append(newQuery.release()); 111 m_queries.append(newQuery.release());
110 return true; 112 return true;
111 } 113 }
112 114
113 bool MediaQuerySet::remove(const String& queryStringToRemove) 115 bool MediaQuerySet::remove(const String& queryStringToRemove)
114 { 116 {
115 // To "parse a media query" for a given string means to follow "the parse 117 // To "parse a media query" for a given string means to follow "the parse
116 // a media query list" steps and return "null" if more than one media query 118 // a media query list" steps and return "null" if more than one media query
117 // is returned, or else the returned media query. 119 // is returned, or else the returned media query.
118 RefPtr<MediaQuerySet> result = create(queryStringToRemove); 120 RefPtrWillBeRawPtr<MediaQuerySet> result = create(queryStringToRemove);
119 121
120 // Only continue if exactly one media query is found, as described above. 122 // Only continue if exactly one media query is found, as described above.
121 if (result->m_queries.size() != 1) 123 if (result->m_queries.size() != 1)
122 return true; 124 return true;
123 125
124 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); 126 OwnPtrWillBeRawPtr<MediaQuery> newQuery = result->m_queries[0].release();
125 ASSERT(newQuery); 127 ASSERT(newQuery);
126 128
127 // Remove any media query from the collection of media queries for which 129 // Remove any media query from the collection of media queries for which
128 // comparing with the media query returns true. 130 // comparing with the media query returns true.
129 bool found = false; 131 bool found = false;
130 for (size_t i = 0; i < m_queries.size(); ++i) { 132 for (size_t i = 0; i < m_queries.size(); ++i) {
131 MediaQuery* query = m_queries[i].get(); 133 MediaQuery* query = m_queries[i].get();
132 if (*query == *newQuery) { 134 if (*query == *newQuery) {
133 m_queries.remove(i); 135 m_queries.remove(i);
134 --i; 136 --i;
135 found = true; 137 found = true;
136 } 138 }
137 } 139 }
138 140
139 return found; 141 return found;
140 } 142 }
141 143
142 void MediaQuerySet::addMediaQuery(PassOwnPtr<MediaQuery> mediaQuery) 144 void MediaQuerySet::addMediaQuery(PassOwnPtrWillBeRawPtr<MediaQuery> mediaQuery)
143 { 145 {
144 m_queries.append(mediaQuery); 146 m_queries.append(mediaQuery);
145 } 147 }
146 148
147 String MediaQuerySet::mediaText() const 149 String MediaQuerySet::mediaText() const
148 { 150 {
149 StringBuilder text; 151 StringBuilder text;
150 152
151 bool first = true; 153 bool first = true;
152 for (size_t i = 0; i < m_queries.size(); ++i) { 154 for (size_t i = 0; i < m_queries.size(); ++i) {
153 if (!first) 155 if (!first)
154 text.appendLiteral(", "); 156 text.appendLiteral(", ");
155 else 157 else
156 first = false; 158 first = false;
157 text.append(m_queries[i]->cssText()); 159 text.append(m_queries[i]->cssText());
158 } 160 }
159 return text.toString(); 161 return text.toString();
160 } 162 }
161 163
164 void MediaQuerySet::trace(Visitor* visitor)
165 {
166 // We don't support tracing of vectors of OwnPtrs (ie. OwnPtr<Vector<OwnPtr< MediaQuery> > >).
haraken 2014/02/21 01:02:36 OwnPtr<Vector<OwnPtr<MediaQuery> > > => Vector<Own
wibling-chromium 2014/02/21 08:43:08 We talked a bit about this locally. We could fix t
wibling-chromium 2014/02/25 12:07:28 I tried this above and both when calling visitor->
haraken 2014/02/25 12:09:57 Makes sense. Having #if in a couple of places in a
167 // Since this is a transitional object we are just ifdef'ing it out when oil pan is not enabled.
168 #if ENABLE(OILPAN)
169 visitor->trace(m_queries);
170 #endif
171 }
172
162 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSStyleSheet* parentSheet) 173 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSStyleSheet* parentSheet)
163 : m_mediaQueries(mediaQueries) 174 : m_mediaQueries(mediaQueries)
164 , m_parentStyleSheet(parentSheet) 175 , m_parentStyleSheet(parentSheet)
165 , m_parentRule(0) 176 , m_parentRule(0)
166 { 177 {
167 } 178 }
168 179
169 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSRule* parentRule) 180 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSRule* parentRule)
170 : m_mediaQueries(mediaQueries) 181 : m_mediaQueries(mediaQueries)
171 , m_parentStyleSheet(0) 182 , m_parentStyleSheet(0)
(...skipping 10 matching lines...) Expand all
182 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); 193 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule);
183 194
184 m_mediaQueries->set(value); 195 m_mediaQueries->set(value);
185 196
186 if (m_parentStyleSheet) 197 if (m_parentStyleSheet)
187 m_parentStyleSheet->didMutate(); 198 m_parentStyleSheet->didMutate();
188 } 199 }
189 200
190 String MediaList::item(unsigned index) const 201 String MediaList::item(unsigned index) const
191 { 202 {
192 const Vector<OwnPtr<MediaQuery> >& queries = m_mediaQueries->queryVector(); 203 const WillBeHeapVector<OwnPtrWillBeMember<MediaQuery> >& queries = m_mediaQu eries->queryVector();
193 if (index < queries.size()) 204 if (index < queries.size())
194 return queries[index]->cssText(); 205 return queries[index]->cssText();
195 return String(); 206 return String();
196 } 207 }
197 208
198 void MediaList::deleteMedium(const String& medium, ExceptionState& exceptionStat e) 209 void MediaList::deleteMedium(const String& medium, ExceptionState& exceptionStat e)
199 { 210 {
200 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); 211 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule);
201 212
202 bool success = m_mediaQueries->remove(medium); 213 bool success = m_mediaQueries->remove(medium);
(...skipping 18 matching lines...) Expand all
221 if (m_parentStyleSheet) 232 if (m_parentStyleSheet)
222 m_parentStyleSheet->didMutate(); 233 m_parentStyleSheet->didMutate();
223 } 234 }
224 235
225 void MediaList::reattach(MediaQuerySet* mediaQueries) 236 void MediaList::reattach(MediaQuerySet* mediaQueries)
226 { 237 {
227 ASSERT(mediaQueries); 238 ASSERT(mediaQueries);
228 m_mediaQueries = mediaQueries; 239 m_mediaQueries = mediaQueries;
229 } 240 }
230 241
242 void MediaList::trace(Visitor* visitor)
243 {
244 visitor->trace(m_mediaQueries);
245 }
246
231 static void addResolutionWarningMessageToConsole(Document* document, const Strin g& serializedExpression, const CSSPrimitiveValue* value) 247 static void addResolutionWarningMessageToConsole(Document* document, const Strin g& serializedExpression, const CSSPrimitiveValue* value)
232 { 248 {
233 ASSERT(document); 249 ASSERT(document);
234 ASSERT(value); 250 ASSERT(value);
235 251
236 DEFINE_STATIC_LOCAL(String, mediaQueryMessage, ("Consider using 'dppx' units instead of '%replacementUnits%', as in CSS '%replacementUnits%' means dots-per- CSS-%lengthUnit%, not dots-per-physical-%lengthUnit%, so does not correspond to the actual '%replacementUnits%' of a screen. In media query expression: ")); 252 DEFINE_STATIC_LOCAL(String, mediaQueryMessage, ("Consider using 'dppx' units instead of '%replacementUnits%', as in CSS '%replacementUnits%' means dots-per- CSS-%lengthUnit%, not dots-per-physical-%lengthUnit%, so does not correspond to the actual '%replacementUnits%' of a screen. In media query expression: "));
237 DEFINE_STATIC_LOCAL(String, mediaValueDPI, ("dpi")); 253 DEFINE_STATIC_LOCAL(String, mediaValueDPI, ("dpi"));
238 DEFINE_STATIC_LOCAL(String, mediaValueDPCM, ("dpcm")); 254 DEFINE_STATIC_LOCAL(String, mediaValueDPCM, ("dpcm"));
239 DEFINE_STATIC_LOCAL(String, lengthUnitInch, ("inch")); 255 DEFINE_STATIC_LOCAL(String, lengthUnitInch, ("inch"));
240 DEFINE_STATIC_LOCAL(String, lengthUnitCentimeter, ("centimeter")); 256 DEFINE_STATIC_LOCAL(String, lengthUnitCentimeter, ("centimeter"));
(...skipping 16 matching lines...) Expand all
257 return mediaFeature == MediaFeatureNames::resolutionMediaFeature 273 return mediaFeature == MediaFeatureNames::resolutionMediaFeature
258 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature 274 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature
259 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature; 275 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature;
260 } 276 }
261 277
262 void reportMediaQueryWarningIfNeeded(Document* document, const MediaQuerySet* me diaQuerySet) 278 void reportMediaQueryWarningIfNeeded(Document* document, const MediaQuerySet* me diaQuerySet)
263 { 279 {
264 if (!mediaQuerySet || !document) 280 if (!mediaQuerySet || !document)
265 return; 281 return;
266 282
267 const Vector<OwnPtr<MediaQuery> >& mediaQueries = mediaQuerySet->queryVector (); 283 const WillBeHeapVector<OwnPtrWillBeMember<MediaQuery> >& mediaQueries = medi aQuerySet->queryVector();
268 const size_t queryCount = mediaQueries.size(); 284 const size_t queryCount = mediaQueries.size();
269 285
270 if (!queryCount) 286 if (!queryCount)
271 return; 287 return;
272 288
273 for (size_t i = 0; i < queryCount; ++i) { 289 for (size_t i = 0; i < queryCount; ++i) {
274 const MediaQuery* query = mediaQueries[i].get(); 290 const MediaQuery* query = mediaQueries[i].get();
275 if (equalIgnoringCase(query->mediaType(), "print")) 291 if (equalIgnoringCase(query->mediaType(), "print"))
276 continue; 292 continue;
277 293
278 const ExpressionVector& expressions = query->expressions(); 294 const ExpressionVector& expressions = query->expressions();
279 for (size_t j = 0; j < expressions.size(); ++j) { 295 for (size_t j = 0; j < expressions.size(); ++j) {
280 const MediaQueryExp* expression = expressions.at(j).get(); 296 const MediaQueryExp* expression = expressions.at(j).get();
281 if (isResolutionMediaFeature(expression->mediaFeature())) { 297 if (isResolutionMediaFeature(expression->mediaFeature())) {
282 CSSValue* cssValue = expression->value(); 298 CSSValue* cssValue = expression->value();
283 if (cssValue && cssValue->isPrimitiveValue()) { 299 if (cssValue && cssValue->isPrimitiveValue()) {
284 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV alue); 300 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV alue);
285 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot sPerCentimeter()) 301 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot sPerCentimeter())
286 addResolutionWarningMessageToConsole(document, mediaQuer ySet->mediaText(), primitiveValue); 302 addResolutionWarningMessageToConsole(document, mediaQuer ySet->mediaText(), primitiveValue);
287 } 303 }
288 } 304 }
289 } 305 }
290 } 306 }
291 } 307 }
292 308
293 } 309 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698