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

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

Issue 15094019: Fixing inconsistency with Media Query append/deleteMedium. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 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 * (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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698