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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 MediaQuerySet::MediaQuerySet() | 68 MediaQuerySet::MediaQuerySet() |
69 : m_fallbackToDescriptor(false) | 69 : m_fallbackToDescriptor(false) |
70 , m_lastLine(0) | 70 , m_lastLine(0) |
71 { | 71 { |
72 } | 72 } |
73 | 73 |
74 MediaQuerySet::MediaQuerySet(const String& mediaString, bool fallbackToDescripto
r) | 74 MediaQuerySet::MediaQuerySet(const String& mediaString, bool fallbackToDescripto
r) |
75 : m_fallbackToDescriptor(fallbackToDescriptor) | 75 : m_fallbackToDescriptor(fallbackToDescriptor) |
76 , m_lastLine(0) | 76 , m_lastLine(0) |
77 { | 77 { |
78 bool success = parse(mediaString); | 78 set(mediaString); |
79 // FIXME: parsing can fail. The problem with failing constructor is that | |
80 // we would need additional flag saying MediaList is not valid | |
81 // Parse can fail only when fallbackToDescriptor == false, i.e when HTML4 me
dia descriptor | |
82 // forward-compatible syntax is not in use. | |
83 // DOMImplementationCSS seems to mandate that media descriptors are used | |
84 // for both html and svg, even though svg:style doesn't use media descriptor
s | |
85 // Currently the only places where parsing can fail are | |
86 // creating <svg:style>, creating css media / import rules from js | |
87 | |
88 // FIXME: This doesn't make much sense. | |
89 if (!success) | |
90 parse("invalid"); | |
91 } | 79 } |
92 | 80 |
93 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) | 81 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) |
94 : RefCounted<MediaQuerySet>() | 82 : RefCounted<MediaQuerySet>() |
95 , m_fallbackToDescriptor(o.m_fallbackToDescriptor) | 83 , m_fallbackToDescriptor(o.m_fallbackToDescriptor) |
96 , m_lastLine(o.m_lastLine) | 84 , m_lastLine(o.m_lastLine) |
97 , m_queries(o.m_queries.size()) | 85 , m_queries(o.m_queries.size()) |
98 { | 86 { |
99 for (unsigned i = 0; i < m_queries.size(); ++i) | 87 for (unsigned i = 0; i < m_queries.size(); ++i) |
100 m_queries[i] = o.m_queries[i]->copy(); | 88 m_queries[i] = o.m_queries[i]->copy(); |
(...skipping 29 matching lines...) Expand all Loading... |
130 | 118 |
131 if (m_fallbackToDescriptor) { | 119 if (m_fallbackToDescriptor) { |
132 String medium = parseMediaDescriptor(queryString); | 120 String medium = parseMediaDescriptor(queryString); |
133 if (!medium.isNull()) | 121 if (!medium.isNull()) |
134 return adoptPtr(new MediaQuery(MediaQuery::None, medium, nullptr)); | 122 return adoptPtr(new MediaQuery(MediaQuery::None, medium, nullptr)); |
135 } | 123 } |
136 | 124 |
137 return adoptPtr(new MediaQuery(MediaQuery::None, "not all", nullptr)); | 125 return adoptPtr(new MediaQuery(MediaQuery::None, "not all", nullptr)); |
138 } | 126 } |
139 | 127 |
140 bool MediaQuerySet::parse(const String& mediaString) | 128 void MediaQuerySet::parseMediaQueryList(const String& mediaString, Vector<OwnPtr
<MediaQuery> >& result) |
141 { | 129 { |
142 if (mediaString.isEmpty()) { | 130 if (mediaString.isEmpty()) { |
143 m_queries.clear(); | 131 result.clear(); |
144 return true; | 132 return; |
145 } | 133 } |
146 | 134 |
147 Vector<String> list; | 135 Vector<String> list; |
148 // FIXME: This is too simple as it shouldn't split when the ',' is inside | 136 // FIXME: This is too simple as it shouldn't split when the ',' is inside |
149 // other allowed matching pairs such as (), [], {}, "", and ''. | 137 // other allowed matching pairs such as (), [], {}, "", and ''. |
150 mediaString.split(',', /* allowEmptyEntries */ true, list); | 138 mediaString.split(',', /* allowEmptyEntries */ true, list); |
151 | 139 |
152 Vector<OwnPtr<MediaQuery> > result; | |
153 result.reserveInitialCapacity(list.size()); | 140 result.reserveInitialCapacity(list.size()); |
154 | 141 |
155 for (unsigned i = 0; i < list.size(); ++i) { | 142 for (unsigned i = 0; i < list.size(); ++i) { |
156 String queryString = list[i].stripWhiteSpace(); | 143 String queryString = list[i].stripWhiteSpace(); |
157 if (OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString)) | 144 OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString); |
158 result.uncheckedAppend(parsedQuery.release()); | 145 ASSERT(parsedQuery); |
| 146 result.uncheckedAppend(parsedQuery.release()); |
159 } | 147 } |
| 148 } |
160 | 149 |
| 150 bool MediaQuerySet::set(const String& mediaString) |
| 151 { |
| 152 Vector<OwnPtr<MediaQuery> > result; |
| 153 parseMediaQueryList(mediaString, result); |
161 m_queries.swap(result); | 154 m_queries.swap(result); |
162 return true; | 155 return true; |
163 } | 156 } |
164 | 157 |
165 bool MediaQuerySet::add(const String& queryString) | 158 bool MediaQuerySet::add(const String& queryString) |
166 { | 159 { |
167 if (OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString)) { | 160 // To parse a media query for a given string means to follow the parse |
168 m_queries.append(parsedQuery.release()); | 161 // a media query list steps and return null if more than one media query |
169 return true; | 162 // is returned or a media query if a single media query is returned. |
| 163 Vector<OwnPtr<MediaQuery> > queries; |
| 164 parseMediaQueryList(queryString, queries); |
| 165 |
| 166 // If "null", terminate these steps. |
| 167 if (queries.size() != 1) |
| 168 return false; |
| 169 |
| 170 OwnPtr<MediaQuery> newQuery = queries[0].release(); |
| 171 ASSERT(newQuery); |
| 172 |
| 173 // If comparing with any of the media queries in the collection of media |
| 174 // queries returns true terminate these steps. |
| 175 for (size_t i = 0; i < m_queries.size(); ++i) { |
| 176 MediaQuery* query = m_queries[i].get(); |
| 177 if (*query == *newQuery) |
| 178 return true; |
170 } | 179 } |
171 return false; | 180 |
| 181 m_queries.append(newQuery.release()); |
| 182 return true; |
172 } | 183 } |
173 | 184 |
174 bool MediaQuerySet::remove(const String& queryStringToRemove) | 185 bool MediaQuerySet::remove(const String& queryStringToRemove) |
175 { | 186 { |
176 OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryStringToRemove); | 187 // To parse a media query for a given string means to follow the parse |
177 if (!parsedQuery) | 188 // a media query list steps and return null if more than one media query |
| 189 // is returned or a media query if a single media query is returned. |
| 190 Vector<OwnPtr<MediaQuery> > queries; |
| 191 parseMediaQueryList(queryStringToRemove, queries); |
| 192 |
| 193 // If "null", terminate these steps. |
| 194 if (queries.size() != 1) |
178 return false; | 195 return false; |
179 | 196 |
| 197 OwnPtr<MediaQuery> newQuery = queries[0].release(); |
| 198 ASSERT(newQuery); |
| 199 |
| 200 // Remove any media query from the collection of media queries for which |
| 201 // comparing the media query with m returns true. |
| 202 bool found = false; |
180 for (size_t i = 0; i < m_queries.size(); ++i) { | 203 for (size_t i = 0; i < m_queries.size(); ++i) { |
181 MediaQuery* query = m_queries[i].get(); | 204 MediaQuery* query = m_queries[i].get(); |
182 if (*query == *parsedQuery) { | 205 if (*query == *newQuery) { |
183 m_queries.remove(i); | 206 m_queries.remove(i); |
184 return true; | 207 --i; |
| 208 found = true; |
185 } | 209 } |
186 } | 210 } |
187 return false; | 211 |
| 212 return found; |
188 } | 213 } |
189 | 214 |
190 void MediaQuerySet::addMediaQuery(PassOwnPtr<MediaQuery> mediaQuery) | 215 void MediaQuerySet::addMediaQuery(PassOwnPtr<MediaQuery> mediaQuery) |
191 { | 216 { |
192 m_queries.append(mediaQuery); | 217 m_queries.append(mediaQuery); |
193 } | 218 } |
194 | 219 |
195 String MediaQuerySet::mediaText() const | 220 String MediaQuerySet::mediaText() const |
196 { | 221 { |
197 StringBuilder text; | 222 StringBuilder text; |
(...skipping 26 matching lines...) Expand all Loading... |
224 : m_mediaQueries(mediaQueries) | 249 : m_mediaQueries(mediaQueries) |
225 , m_parentStyleSheet(0) | 250 , m_parentStyleSheet(0) |
226 , m_parentRule(parentRule) | 251 , m_parentRule(parentRule) |
227 { | 252 { |
228 } | 253 } |
229 | 254 |
230 MediaList::~MediaList() | 255 MediaList::~MediaList() |
231 { | 256 { |
232 } | 257 } |
233 | 258 |
234 void MediaList::setMediaText(const String& value, ExceptionCode& ec) | 259 void MediaList::setMediaText(const String& value) |
235 { | 260 { |
236 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); | 261 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); |
237 | 262 |
238 bool success = m_mediaQueries->parse(value); | 263 m_mediaQueries->set(value); |
239 if (!success) { | 264 |
240 ec = SYNTAX_ERR; | |
241 return; | |
242 } | |
243 if (m_parentStyleSheet) | 265 if (m_parentStyleSheet) |
244 m_parentStyleSheet->didMutate(); | 266 m_parentStyleSheet->didMutate(); |
245 } | 267 } |
246 | 268 |
247 String MediaList::item(unsigned index) const | 269 String MediaList::item(unsigned index) const |
248 { | 270 { |
249 const Vector<OwnPtr<MediaQuery> >& queries = m_mediaQueries->queryVector(); | 271 const Vector<OwnPtr<MediaQuery> >& queries = m_mediaQueries->queryVector(); |
250 if (index < queries.size()) | 272 if (index < queries.size()) |
251 return queries[index]->cssText(); | 273 return queries[index]->cssText(); |
252 return String(); | 274 return String(); |
(...skipping 11 matching lines...) Expand all Loading... |
264 if (m_parentStyleSheet) | 286 if (m_parentStyleSheet) |
265 m_parentStyleSheet->didMutate(); | 287 m_parentStyleSheet->didMutate(); |
266 } | 288 } |
267 | 289 |
268 void MediaList::appendMedium(const String& medium, ExceptionCode& ec) | 290 void MediaList::appendMedium(const String& medium, ExceptionCode& ec) |
269 { | 291 { |
270 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); | 292 CSSStyleSheet::RuleMutationScope mutationScope(m_parentRule); |
271 | 293 |
272 bool success = m_mediaQueries->add(medium); | 294 bool success = m_mediaQueries->add(medium); |
273 if (!success) { | 295 if (!success) { |
274 // FIXME: Should this really be INVALID_CHARACTER_ERR? | |
275 ec = INVALID_CHARACTER_ERR; | 296 ec = INVALID_CHARACTER_ERR; |
276 return; | 297 return; |
277 } | 298 } |
| 299 |
278 if (m_parentStyleSheet) | 300 if (m_parentStyleSheet) |
279 m_parentStyleSheet->didMutate(); | 301 m_parentStyleSheet->didMutate(); |
280 } | 302 } |
281 | 303 |
282 void MediaList::reattach(MediaQuerySet* mediaQueries) | 304 void MediaList::reattach(MediaQuerySet* mediaQueries) |
283 { | 305 { |
284 ASSERT(mediaQueries); | 306 ASSERT(mediaQueries); |
285 m_mediaQueries = mediaQueries; | 307 m_mediaQueries = mediaQueries; |
286 } | 308 } |
287 | 309 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV
alue); | 371 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV
alue); |
350 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot
sPerCentimeter()) | 372 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot
sPerCentimeter()) |
351 addResolutionWarningMessageToConsole(document, mediaQuer
ySet->mediaText(), primitiveValue); | 373 addResolutionWarningMessageToConsole(document, mediaQuer
ySet->mediaText(), primitiveValue); |
352 } | 374 } |
353 } | 375 } |
354 } | 376 } |
355 } | 377 } |
356 } | 378 } |
357 | 379 |
358 } | 380 } |
OLD | NEW |