OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |