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, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. |
4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. | 4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. |
5 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 5 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 return nullptr; | 140 return nullptr; |
141 return propertyAt(foundPropertyIndex).value(); | 141 return propertyAt(foundPropertyIndex).value(); |
142 } | 142 } |
143 | 143 |
144 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) | 144 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) |
145 { | 145 { |
146 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 146 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
147 if (!shorthand.length()) | 147 if (!shorthand.length()) |
148 return false; | 148 return false; |
149 | 149 |
150 bool ret = removePropertiesInSet(shorthand.properties(), shorthand.length())
; | 150 return removePropertiesInSet(shorthand.properties(), shorthand.length()); |
151 | |
152 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID); | |
153 if (prefixingVariant == propertyID) | |
154 return ret; | |
155 | |
156 StylePropertyShorthand shorthandPrefixingVariant = shorthandForProperty(pref
ixingVariant); | |
157 return removePropertiesInSet(shorthandPrefixingVariant.properties(), shortha
ndPrefixingVariant.length()); | |
158 } | 151 } |
159 | 152 |
160 bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* r
eturnText) | 153 bool MutableStylePropertySet::removeProperty(CSSPropertyID propertyID, String* r
eturnText) |
161 { | 154 { |
162 if (removeShorthandProperty(propertyID)) { | 155 if (removeShorthandProperty(propertyID)) { |
163 // FIXME: Return an equivalent shorthand when possible. | 156 // FIXME: Return an equivalent shorthand when possible. |
164 if (returnText) | 157 if (returnText) |
165 *returnText = ""; | 158 *returnText = ""; |
166 return true; | 159 return true; |
167 } | 160 } |
168 | 161 |
169 int foundPropertyIndex = findPropertyIndex(propertyID); | 162 int foundPropertyIndex = findPropertyIndex(propertyID); |
170 if (foundPropertyIndex == -1) { | 163 if (foundPropertyIndex == -1) { |
171 if (returnText) | 164 if (returnText) |
172 *returnText = ""; | 165 *returnText = ""; |
173 return false; | 166 return false; |
174 } | 167 } |
175 | 168 |
176 if (returnText) | 169 if (returnText) |
177 *returnText = propertyAt(foundPropertyIndex).value()->cssText(); | 170 *returnText = propertyAt(foundPropertyIndex).value()->cssText(); |
178 | 171 |
179 // A more efficient removal strategy would involve marking entries as empty | 172 // A more efficient removal strategy would involve marking entries as empty |
180 // and sweeping them when the vector grows too big. | 173 // and sweeping them when the vector grows too big. |
181 m_propertyVector.remove(foundPropertyIndex); | 174 m_propertyVector.remove(foundPropertyIndex); |
182 | 175 |
183 removePrefixedOrUnprefixedProperty(propertyID); | |
184 | |
185 return true; | 176 return true; |
186 } | 177 } |
187 | 178 |
188 void MutableStylePropertySet::removePrefixedOrUnprefixedProperty(CSSPropertyID p
ropertyID) | |
189 { | |
190 int foundPropertyIndex = findPropertyIndex(prefixingVariantForPropertyId(pro
pertyID)); | |
191 if (foundPropertyIndex == -1) | |
192 return; | |
193 m_propertyVector.remove(foundPropertyIndex); | |
194 } | |
195 | |
196 bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const | 179 bool StylePropertySet::propertyIsImportant(CSSPropertyID propertyID) const |
197 { | 180 { |
198 int foundPropertyIndex = findPropertyIndex(propertyID); | 181 int foundPropertyIndex = findPropertyIndex(propertyID); |
199 if (foundPropertyIndex != -1) | 182 if (foundPropertyIndex != -1) |
200 return propertyAt(foundPropertyIndex).isImportant(); | 183 return propertyAt(foundPropertyIndex).isImportant(); |
201 | 184 |
202 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 185 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
203 if (!shorthand.length()) | 186 if (!shorthand.length()) |
204 return false; | 187 return false; |
205 | 188 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 for (unsigned i = 0; i < shorthand.length(); ++i) | 235 for (unsigned i = 0; i < shorthand.length(); ++i) |
253 m_propertyVector.append(CSSProperty(shorthand.properties()[i], value, im
portant)); | 236 m_propertyVector.append(CSSProperty(shorthand.properties()[i], value, im
portant)); |
254 } | 237 } |
255 | 238 |
256 void MutableStylePropertySet::setProperty(const CSSProperty& property, CSSProper
ty* slot) | 239 void MutableStylePropertySet::setProperty(const CSSProperty& property, CSSProper
ty* slot) |
257 { | 240 { |
258 if (!removeShorthandProperty(property.id())) { | 241 if (!removeShorthandProperty(property.id())) { |
259 CSSProperty* toReplace = slot ? slot : findCSSPropertyWithID(property.id
()); | 242 CSSProperty* toReplace = slot ? slot : findCSSPropertyWithID(property.id
()); |
260 if (toReplace) { | 243 if (toReplace) { |
261 *toReplace = property; | 244 *toReplace = property; |
262 setPrefixingVariantProperty(property); | |
263 return; | 245 return; |
264 } | 246 } |
265 } | 247 } |
266 appendPrefixingVariantProperty(property); | 248 appendProperty(property); |
267 } | 249 } |
268 | 250 |
269 unsigned getIndexInShorthandVectorForPrefixingVariant(const CSSProperty& propert
y, CSSPropertyID prefixingVariant) | 251 void MutableStylePropertySet::appendProperty(const CSSProperty& property) |
270 { | |
271 if (!property.isSetFromShorthand()) | |
272 return 0; | |
273 | |
274 CSSPropertyID prefixedShorthand = prefixingVariantForPropertyId(property.sho
rthandID()); | |
275 Vector<StylePropertyShorthand, 4> shorthands; | |
276 getMatchingShorthandsForLonghand(prefixingVariant, &shorthands); | |
277 return indexOfShorthandForLonghand(prefixedShorthand, shorthands); | |
278 } | |
279 | |
280 void MutableStylePropertySet::appendPrefixingVariantProperty(const CSSProperty&
property) | |
281 { | 252 { |
282 m_propertyVector.append(property); | 253 m_propertyVector.append(property); |
283 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(property.id()
); | |
284 if (prefixingVariant == property.id()) | |
285 return; | |
286 | |
287 m_propertyVector.append(CSSProperty(prefixingVariant, property.value(), prop
erty.isImportant(), property.isSetFromShorthand(), getIndexInShorthandVectorForP
refixingVariant(property, prefixingVariant), property.metadata().m_implicit)); | |
288 } | |
289 | |
290 void MutableStylePropertySet::setPrefixingVariantProperty(const CSSProperty& pro
perty) | |
291 { | |
292 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(property.id()
); | |
293 CSSProperty* toReplace = findCSSPropertyWithID(prefixingVariant); | |
294 if (toReplace && prefixingVariant != property.id()) | |
295 *toReplace = CSSProperty(prefixingVariant, property.value(), property.is
Important(), property.isSetFromShorthand(), getIndexInShorthandVectorForPrefixin
gVariant(property, prefixingVariant), property.metadata().m_implicit); | |
296 } | 254 } |
297 | 255 |
298 bool MutableStylePropertySet::setProperty(CSSPropertyID propertyID, CSSValueID i
dentifier, bool important) | 256 bool MutableStylePropertySet::setProperty(CSSPropertyID propertyID, CSSValueID i
dentifier, bool important) |
299 { | 257 { |
300 setProperty(CSSProperty(propertyID, cssValuePool().createIdentifierValue(ide
ntifier), important)); | 258 setProperty(CSSProperty(propertyID, cssValuePool().createIdentifierValue(ide
ntifier), important)); |
301 return true; | 259 return true; |
302 } | 260 } |
303 | 261 |
304 bool MutableStylePropertySet::setProperty(CSSPropertyID propertyID, CSSPropertyI
D identifier, bool important) | 262 bool MutableStylePropertySet::setProperty(CSSPropertyID propertyID, CSSPropertyI
D identifier, bool important) |
305 { | 263 { |
(...skipping 26 matching lines...) Expand all Loading... |
332 // Only add properties that have no !important counterpart present | 290 // Only add properties that have no !important counterpart present |
333 if (!propertyIsImportant(property.id()) || property.isImportant()) | 291 if (!propertyIsImportant(property.id()) || property.isImportant()) |
334 setProperty(property); | 292 setProperty(property); |
335 } | 293 } |
336 | 294 |
337 String StylePropertySet::asText() const | 295 String StylePropertySet::asText() const |
338 { | 296 { |
339 return StylePropertySerializer(*this).asText(); | 297 return StylePropertySerializer(*this).asText(); |
340 } | 298 } |
341 | 299 |
342 void MutableStylePropertySet::mergeAndOverrideOnConflict(const StylePropertySet*
other) | |
343 { | |
344 unsigned size = other->propertyCount(); | |
345 for (unsigned n = 0; n < size; ++n) { | |
346 PropertyReference toMerge = other->propertyAt(n); | |
347 CSSProperty* old = findCSSPropertyWithID(toMerge.id()); | |
348 if (old) | |
349 setProperty(toMerge.toCSSProperty(), old); | |
350 else | |
351 appendPrefixingVariantProperty(toMerge.toCSSProperty()); | |
352 } | |
353 } | |
354 | |
355 bool StylePropertySet::hasFailedOrCanceledSubresources() const | 300 bool StylePropertySet::hasFailedOrCanceledSubresources() const |
356 { | 301 { |
357 unsigned size = propertyCount(); | 302 unsigned size = propertyCount(); |
358 for (unsigned i = 0; i < size; ++i) { | 303 for (unsigned i = 0; i < size; ++i) { |
359 if (propertyAt(i).value()->hasFailedOrCanceledSubresources()) | 304 if (propertyAt(i).value()->hasFailedOrCanceledSubresources()) |
360 return true; | 305 return true; |
361 } | 306 } |
362 return false; | 307 return false; |
363 } | 308 } |
364 | 309 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 result.appendLiteral(": "); | 508 result.appendLiteral(": "); |
564 result.append(propertyValue()->cssText()); | 509 result.append(propertyValue()->cssText()); |
565 if (isImportant()) | 510 if (isImportant()) |
566 result.appendLiteral(" !important"); | 511 result.appendLiteral(" !important"); |
567 result.append(';'); | 512 result.append(';'); |
568 return result.toString(); | 513 return result.toString(); |
569 } | 514 } |
570 | 515 |
571 | 516 |
572 } // namespace blink | 517 } // namespace blink |
OLD | NEW |