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

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: Rebase and revert member to persistent in StorageEvent Created 6 years, 9 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 MediaQuerySet::MediaQuerySet() 55 MediaQuerySet::MediaQuerySet()
56 { 56 {
57 } 57 }
58 58
59 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) 59 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o)
60 : RefCounted<MediaQuerySet>() 60 : m_queries(o.m_queries.size())
61 , m_queries(o.m_queries.size())
62 { 61 {
63 for (unsigned i = 0; i < m_queries.size(); ++i) 62 for (unsigned i = 0; i < m_queries.size(); ++i)
64 m_queries[i] = o.m_queries[i]->copy(); 63 m_queries[i] = o.m_queries[i]->copy();
65 } 64 }
66 65
67 MediaQuerySet::~MediaQuerySet() 66 MediaQuerySet::~MediaQuerySet()
68 { 67 {
69 } 68 }
70 69
71 PassRefPtr<MediaQuerySet> MediaQuerySet::create(const String& mediaString) 70 PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQuerySet::create(const String& mediaS tring)
72 { 71 {
73 if (mediaString.isEmpty()) 72 if (mediaString.isEmpty())
74 return MediaQuerySet::create(); 73 return MediaQuerySet::create();
75 74
76 BisonCSSParser parser(strictCSSParserContext()); 75 BisonCSSParser parser(strictCSSParserContext());
77 return parser.parseMediaQueryList(mediaString); 76 return parser.parseMediaQueryList(mediaString);
78 } 77 }
79 78
80 bool MediaQuerySet::set(const String& mediaString) 79 bool MediaQuerySet::set(const String& mediaString)
81 { 80 {
82 RefPtr<MediaQuerySet> result = create(mediaString); 81 RefPtrWillBeRawPtr<MediaQuerySet> result = create(mediaString);
83 m_queries.swap(result->m_queries); 82 m_queries.swap(result->m_queries);
84 return true; 83 return true;
85 } 84 }
86 85
87 bool MediaQuerySet::add(const String& queryString) 86 bool MediaQuerySet::add(const String& queryString)
88 { 87 {
89 // To "parse a media query" for a given string means to follow "the parse 88 // 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 89 // a media query list" steps and return "null" if more than one media query
91 // is returned, or else the returned media query. 90 // is returned, or else the returned media query.
92 RefPtr<MediaQuerySet> result = create(queryString); 91 RefPtrWillBeRawPtr<MediaQuerySet> result = create(queryString);
93 92
94 // Only continue if exactly one media query is found, as described above. 93 // Only continue if exactly one media query is found, as described above.
95 if (result->m_queries.size() != 1) 94 if (result->m_queries.size() != 1)
96 return true; 95 return true;
97 96
98 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); 97 OwnPtrWillBeRawPtr<MediaQuery> newQuery = result->m_queries[0].release();
99 ASSERT(newQuery); 98 ASSERT(newQuery);
100 99
101 // If comparing with any of the media queries in the collection of media 100 // If comparing with any of the media queries in the collection of media
102 // queries returns true terminate these steps. 101 // queries returns true terminate these steps.
103 for (size_t i = 0; i < m_queries.size(); ++i) { 102 for (size_t i = 0; i < m_queries.size(); ++i) {
104 MediaQuery* query = m_queries[i].get(); 103 MediaQuery* query = m_queries[i].get();
105 if (*query == *newQuery) 104 if (*query == *newQuery)
106 return true; 105 return true;
107 } 106 }
108 107
109 m_queries.append(newQuery.release()); 108 m_queries.append(newQuery.release());
110 return true; 109 return true;
111 } 110 }
112 111
113 bool MediaQuerySet::remove(const String& queryStringToRemove) 112 bool MediaQuerySet::remove(const String& queryStringToRemove)
114 { 113 {
115 // To "parse a media query" for a given string means to follow "the parse 114 // 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 115 // a media query list" steps and return "null" if more than one media query
117 // is returned, or else the returned media query. 116 // is returned, or else the returned media query.
118 RefPtr<MediaQuerySet> result = create(queryStringToRemove); 117 RefPtrWillBeRawPtr<MediaQuerySet> result = create(queryStringToRemove);
119 118
120 // Only continue if exactly one media query is found, as described above. 119 // Only continue if exactly one media query is found, as described above.
121 if (result->m_queries.size() != 1) 120 if (result->m_queries.size() != 1)
122 return true; 121 return true;
123 122
124 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); 123 OwnPtrWillBeRawPtr<MediaQuery> newQuery = result->m_queries[0].release();
125 ASSERT(newQuery); 124 ASSERT(newQuery);
126 125
127 // Remove any media query from the collection of media queries for which 126 // Remove any media query from the collection of media queries for which
128 // comparing with the media query returns true. 127 // comparing with the media query returns true.
129 bool found = false; 128 bool found = false;
130 for (size_t i = 0; i < m_queries.size(); ++i) { 129 for (size_t i = 0; i < m_queries.size(); ++i) {
131 MediaQuery* query = m_queries[i].get(); 130 MediaQuery* query = m_queries[i].get();
132 if (*query == *newQuery) { 131 if (*query == *newQuery) {
133 m_queries.remove(i); 132 m_queries.remove(i);
134 --i; 133 --i;
135 found = true; 134 found = true;
136 } 135 }
137 } 136 }
138 137
139 return found; 138 return found;
140 } 139 }
141 140
142 void MediaQuerySet::addMediaQuery(PassOwnPtr<MediaQuery> mediaQuery) 141 void MediaQuerySet::addMediaQuery(PassOwnPtrWillBeRawPtr<MediaQuery> mediaQuery)
143 { 142 {
144 m_queries.append(mediaQuery); 143 m_queries.append(mediaQuery);
145 } 144 }
146 145
147 String MediaQuerySet::mediaText() const 146 String MediaQuerySet::mediaText() const
148 { 147 {
149 StringBuilder text; 148 StringBuilder text;
150 149
151 bool first = true; 150 bool first = true;
152 for (size_t i = 0; i < m_queries.size(); ++i) { 151 for (size_t i = 0; i < m_queries.size(); ++i) {
153 if (!first) 152 if (!first)
154 text.appendLiteral(", "); 153 text.appendLiteral(", ");
155 else 154 else
156 first = false; 155 first = false;
157 text.append(m_queries[i]->cssText()); 156 text.append(m_queries[i]->cssText());
158 } 157 }
159 return text.toString(); 158 return text.toString();
160 } 159 }
161 160
161 void MediaQuerySet::trace(Visitor* visitor)
162 {
163 // We don't support tracing of vectors of OwnPtrs (ie. OwnPtr<Vector<OwnPtr< MediaQuery> > >).
164 // Since this is a transitional object we are just ifdef'ing it out when oil pan is not enabled.
165 #if ENABLE(OILPAN)
166 visitor->trace(m_queries);
167 #endif
168 }
169
162 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSStyleSheet* parentSheet) 170 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSStyleSheet* parentSheet)
163 : m_mediaQueries(mediaQueries) 171 : m_mediaQueries(mediaQueries)
164 , m_parentStyleSheet(parentSheet) 172 , m_parentStyleSheet(parentSheet)
165 , m_parentRule(0) 173 , m_parentRule(nullptr)
166 { 174 {
167 } 175 }
168 176
169 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSRule* parentRule) 177 MediaList::MediaList(MediaQuerySet* mediaQueries, CSSRule* parentRule)
170 : m_mediaQueries(mediaQueries) 178 : m_mediaQueries(mediaQueries)
171 , m_parentStyleSheet(0) 179 , m_parentStyleSheet(0)
172 , m_parentRule(parentRule) 180 , m_parentRule(parentRule)
173 { 181 {
174 } 182 }
175 183
176 MediaList::~MediaList() 184 MediaList::~MediaList()
177 { 185 {
178 } 186 }
179 187
180 void MediaList::setMediaText(const String& value) 188 void MediaList::setMediaText(const String& value)
181 { 189 {
182 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); 190 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule);
183 191
184 m_mediaQueries->set(value); 192 m_mediaQueries->set(value);
185 193
186 if (m_parentStyleSheet) 194 if (m_parentStyleSheet)
187 m_parentStyleSheet->didMutate(); 195 m_parentStyleSheet->didMutate();
188 } 196 }
189 197
190 String MediaList::item(unsigned index) const 198 String MediaList::item(unsigned index) const
191 { 199 {
192 const Vector<OwnPtr<MediaQuery> >& queries = m_mediaQueries->queryVector(); 200 const WillBeHeapVector<OwnPtrWillBeMember<MediaQuery> >& queries = m_mediaQu eries->queryVector();
193 if (index < queries.size()) 201 if (index < queries.size())
194 return queries[index]->cssText(); 202 return queries[index]->cssText();
195 return String(); 203 return String();
196 } 204 }
197 205
198 void MediaList::deleteMedium(const String& medium, ExceptionState& exceptionStat e) 206 void MediaList::deleteMedium(const String& medium, ExceptionState& exceptionStat e)
199 { 207 {
200 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); 208 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule);
201 209
202 bool success = m_mediaQueries->remove(medium); 210 bool success = m_mediaQueries->remove(medium);
(...skipping 18 matching lines...) Expand all
221 if (m_parentStyleSheet) 229 if (m_parentStyleSheet)
222 m_parentStyleSheet->didMutate(); 230 m_parentStyleSheet->didMutate();
223 } 231 }
224 232
225 void MediaList::reattach(MediaQuerySet* mediaQueries) 233 void MediaList::reattach(MediaQuerySet* mediaQueries)
226 { 234 {
227 ASSERT(mediaQueries); 235 ASSERT(mediaQueries);
228 m_mediaQueries = mediaQueries; 236 m_mediaQueries = mediaQueries;
229 } 237 }
230 238
239 void MediaList::trace(Visitor* visitor)
240 {
241 visitor->trace(m_mediaQueries);
242 visitor->trace(m_parentRule);
243 }
244
231 static void addResolutionWarningMessageToConsole(Document* document, const Strin g& serializedExpression, const CSSPrimitiveValue* value) 245 static void addResolutionWarningMessageToConsole(Document* document, const Strin g& serializedExpression, const CSSPrimitiveValue* value)
232 { 246 {
233 ASSERT(document); 247 ASSERT(document);
234 ASSERT(value); 248 ASSERT(value);
235 249
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: ")); 250 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")); 251 DEFINE_STATIC_LOCAL(String, mediaValueDPI, ("dpi"));
238 DEFINE_STATIC_LOCAL(String, mediaValueDPCM, ("dpcm")); 252 DEFINE_STATIC_LOCAL(String, mediaValueDPCM, ("dpcm"));
239 DEFINE_STATIC_LOCAL(String, lengthUnitInch, ("inch")); 253 DEFINE_STATIC_LOCAL(String, lengthUnitInch, ("inch"));
240 DEFINE_STATIC_LOCAL(String, lengthUnitCentimeter, ("centimeter")); 254 DEFINE_STATIC_LOCAL(String, lengthUnitCentimeter, ("centimeter"));
(...skipping 16 matching lines...) Expand all
257 return mediaFeature == MediaFeatureNames::resolutionMediaFeature 271 return mediaFeature == MediaFeatureNames::resolutionMediaFeature
258 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature 272 || mediaFeature == MediaFeatureNames::maxResolutionMediaFeature
259 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature; 273 || mediaFeature == MediaFeatureNames::minResolutionMediaFeature;
260 } 274 }
261 275
262 void reportMediaQueryWarningIfNeeded(Document* document, const MediaQuerySet* me diaQuerySet) 276 void reportMediaQueryWarningIfNeeded(Document* document, const MediaQuerySet* me diaQuerySet)
263 { 277 {
264 if (!mediaQuerySet || !document) 278 if (!mediaQuerySet || !document)
265 return; 279 return;
266 280
267 const Vector<OwnPtr<MediaQuery> >& mediaQueries = mediaQuerySet->queryVector (); 281 const WillBeHeapVector<OwnPtrWillBeMember<MediaQuery> >& mediaQueries = medi aQuerySet->queryVector();
268 const size_t queryCount = mediaQueries.size(); 282 const size_t queryCount = mediaQueries.size();
269 283
270 if (!queryCount) 284 if (!queryCount)
271 return; 285 return;
272 286
273 for (size_t i = 0; i < queryCount; ++i) { 287 for (size_t i = 0; i < queryCount; ++i) {
274 const MediaQuery* query = mediaQueries[i].get(); 288 const MediaQuery* query = mediaQueries[i].get();
275 if (equalIgnoringCase(query->mediaType(), "print")) 289 if (equalIgnoringCase(query->mediaType(), "print"))
276 continue; 290 continue;
277 291
278 const ExpressionVector& expressions = query->expressions(); 292 const ExpressionHeapVector& expressions = query->expressions();
279 for (size_t j = 0; j < expressions.size(); ++j) { 293 for (size_t j = 0; j < expressions.size(); ++j) {
280 const MediaQueryExp* expression = expressions.at(j).get(); 294 const MediaQueryExp* expression = expressions.at(j).get();
281 if (isResolutionMediaFeature(expression->mediaFeature())) { 295 if (isResolutionMediaFeature(expression->mediaFeature())) {
282 CSSValue* cssValue = expression->value(); 296 CSSValue* cssValue = expression->value();
283 if (cssValue && cssValue->isPrimitiveValue()) { 297 if (cssValue && cssValue->isPrimitiveValue()) {
284 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV alue); 298 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV alue);
285 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot sPerCentimeter()) 299 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot sPerCentimeter())
286 addResolutionWarningMessageToConsole(document, mediaQuer ySet->mediaText(), primitiveValue); 300 addResolutionWarningMessageToConsole(document, mediaQuer ySet->mediaText(), primitiveValue);
287 } 301 }
288 } 302 }
289 } 303 }
290 } 304 }
291 } 305 }
292 306
293 } 307 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698