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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 namespace WebCore { | 43 namespace WebCore { |
44 | 44 |
45 static size_t sizeForImmutableStylePropertySetWithPropertyCount(unsigned count) | 45 static size_t sizeForImmutableStylePropertySetWithPropertyCount(unsigned count) |
46 { | 46 { |
47 return sizeof(ImmutableStylePropertySet) - sizeof(void*) + sizeof(CSSValue*)
* count + sizeof(StylePropertyMetadata) * count; | 47 return sizeof(ImmutableStylePropertySet) - sizeof(void*) + sizeof(CSSValue*)
* count + sizeof(StylePropertyMetadata) * count; |
48 } | 48 } |
49 | 49 |
50 PassRefPtr<ImmutableStylePropertySet> ImmutableStylePropertySet::create(const CS
SProperty* properties, unsigned count, CSSParserMode cssParserMode) | 50 PassRefPtr<ImmutableStylePropertySet> ImmutableStylePropertySet::create(const CS
SProperty* properties, unsigned count, CSSParserMode cssParserMode) |
51 { | 51 { |
52 ASSERT(count <= MaxArraySize); | 52 ASSERT(count <= MaxArraySize); |
53 #if ENABLE(OILPAN) | |
54 void* slot = Heap::allocate<StylePropertySet>(sizeForImmutableStylePropertyS
etWithPropertyCount(count)); | |
55 #else | |
56 void* slot = WTF::fastMalloc(sizeForImmutableStylePropertySetWithPropertyCou
nt(count)); | 53 void* slot = WTF::fastMalloc(sizeForImmutableStylePropertySetWithPropertyCou
nt(count)); |
57 #endif // ENABLE(OILPAN) | 54 return adoptRef(new (slot) ImmutableStylePropertySet(properties, count, cssP
arserMode)); |
58 return adoptRefWillBeRefCountedGarbageCollected(new (slot) ImmutableStylePro
pertySet(properties, count, cssParserMode)); | |
59 } | 55 } |
60 | 56 |
61 PassRefPtr<ImmutableStylePropertySet> StylePropertySet::immutableCopyIfNeeded()
const | 57 PassRefPtr<ImmutableStylePropertySet> StylePropertySet::immutableCopyIfNeeded()
const |
62 { | 58 { |
63 if (!isMutable()) | 59 if (!isMutable()) |
64 return toImmutableStylePropertySet(const_cast<StylePropertySet*>(this)); | 60 return toImmutableStylePropertySet(const_cast<StylePropertySet*>(this)); |
65 const MutableStylePropertySet* mutableThis = toMutableStylePropertySet(this)
; | 61 const MutableStylePropertySet* mutableThis = toMutableStylePropertySet(this)
; |
66 return ImmutableStylePropertySet::create(mutableThis->m_propertyVector.data(
), mutableThis->m_propertyVector.size(), cssParserMode()); | 62 return ImmutableStylePropertySet::create(mutableThis->m_propertyVector.data(
), mutableThis->m_propertyVector.size(), cssParserMode()); |
67 } | 63 } |
68 | 64 |
69 MutableStylePropertySet::MutableStylePropertySet(CSSParserMode cssParserMode) | 65 MutableStylePropertySet::MutableStylePropertySet(CSSParserMode cssParserMode) |
70 : StylePropertySet(cssParserMode) | 66 : StylePropertySet(cssParserMode) |
71 { | 67 { |
72 } | 68 } |
73 | 69 |
74 MutableStylePropertySet::MutableStylePropertySet(const CSSProperty* properties,
unsigned length) | 70 MutableStylePropertySet::MutableStylePropertySet(const CSSProperty* properties,
unsigned length) |
75 : StylePropertySet(HTMLStandardMode) | 71 : StylePropertySet(HTMLStandardMode) |
76 { | 72 { |
77 m_propertyVector.reserveInitialCapacity(length); | 73 m_propertyVector.reserveInitialCapacity(length); |
78 for (unsigned i = 0; i < length; ++i) | 74 for (unsigned i = 0; i < length; ++i) |
79 m_propertyVector.uncheckedAppend(properties[i]); | 75 m_propertyVector.uncheckedAppend(properties[i]); |
80 } | 76 } |
81 | 77 |
82 ImmutableStylePropertySet::ImmutableStylePropertySet(const CSSProperty* properti
es, unsigned length, CSSParserMode cssParserMode) | 78 ImmutableStylePropertySet::ImmutableStylePropertySet(const CSSProperty* properti
es, unsigned length, CSSParserMode cssParserMode) |
83 : StylePropertySet(cssParserMode, length) | 79 : StylePropertySet(cssParserMode, length) |
84 { | 80 { |
85 StylePropertyMetadata* metadataArray = const_cast<StylePropertyMetadata*>(th
is->metadataArray()); | 81 StylePropertyMetadata* metadataArray = const_cast<StylePropertyMetadata*>(th
is->metadataArray()); |
86 RawPtrWillBeMember<CSSValue>* valueArray = const_cast<RawPtrWillBeMember<CSS
Value>*>(this->valueArray()); | 82 CSSValue** valueArray = const_cast<CSSValue**>(this->valueArray()); |
87 for (unsigned i = 0; i < m_arraySize; ++i) { | 83 for (unsigned i = 0; i < m_arraySize; ++i) { |
88 metadataArray[i] = properties[i].metadata(); | 84 metadataArray[i] = properties[i].metadata(); |
89 valueArray[i] = properties[i].value(); | 85 valueArray[i] = properties[i].value(); |
90 valueArray[i]->ref(); | 86 valueArray[i]->ref(); |
91 } | 87 } |
92 } | 88 } |
93 | 89 |
94 ImmutableStylePropertySet::~ImmutableStylePropertySet() | 90 ImmutableStylePropertySet::~ImmutableStylePropertySet() |
95 { | 91 { |
96 #if !ENABLE(OILPAN) | 92 CSSValue** valueArray = const_cast<CSSValue**>(this->valueArray()); |
97 RawPtrWillBeMember<CSSValue>* valueArray = const_cast<RawPtrWillBeMember<CSS
Value>*>(this->valueArray()); | |
98 for (unsigned i = 0; i < m_arraySize; ++i) | 93 for (unsigned i = 0; i < m_arraySize; ++i) |
99 valueArray[i]->deref(); | 94 valueArray[i]->deref(); |
100 #endif | |
101 } | 95 } |
102 | 96 |
103 int ImmutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const | 97 int ImmutableStylePropertySet::findPropertyIndex(CSSPropertyID propertyID) const |
104 { | 98 { |
105 // Convert here propertyID into an uint16_t to compare it with the metadata'
s m_propertyID to avoid | 99 // Convert here propertyID into an uint16_t to compare it with the metadata'
s m_propertyID to avoid |
106 // the compiler converting it to an int multiple times in the loop. | 100 // the compiler converting it to an int multiple times in the loop. |
107 uint16_t id = static_cast<uint16_t>(propertyID); | 101 uint16_t id = static_cast<uint16_t>(propertyID); |
108 for (int n = m_arraySize - 1 ; n >= 0; --n) { | 102 for (int n = m_arraySize - 1 ; n >= 0; --n) { |
109 if (metadataArray()[n].m_propertyID == id) { | 103 if (metadataArray()[n].m_propertyID == id) { |
110 // Only enabled or internal properties should be part of the style. | 104 // Only enabled or internal properties should be part of the style. |
111 ASSERT(RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID) || isInte
rnalProperty(propertyID)); | 105 ASSERT(RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID) || isInte
rnalProperty(propertyID)); |
112 return n; | 106 return n; |
113 } | 107 } |
114 } | 108 } |
115 | 109 |
116 return -1; | 110 return -1; |
117 } | 111 } |
118 | 112 |
119 void ImmutableStylePropertySet::traceAfterDispatch(Visitor* visitor) | |
120 { | |
121 const RawPtrWillBeMember<CSSValue>* values = valueArray(); | |
122 for (unsigned i = 0; i < m_arraySize; i++) | |
123 visitor->trace(values[i]); | |
124 StylePropertySet::traceAfterDispatch(visitor); | |
125 } | |
126 | |
127 MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other) | 113 MutableStylePropertySet::MutableStylePropertySet(const StylePropertySet& other) |
128 : StylePropertySet(other.cssParserMode()) | 114 : StylePropertySet(other.cssParserMode()) |
129 { | 115 { |
130 if (other.isMutable()) { | 116 if (other.isMutable()) { |
131 m_propertyVector = toMutableStylePropertySet(other).m_propertyVector; | 117 m_propertyVector = toMutableStylePropertySet(other).m_propertyVector; |
132 } else { | 118 } else { |
133 m_propertyVector.reserveInitialCapacity(other.propertyCount()); | 119 m_propertyVector.reserveInitialCapacity(other.propertyCount()); |
134 for (unsigned i = 0; i < other.propertyCount(); ++i) | 120 for (unsigned i = 0; i < other.propertyCount(); ++i) |
135 m_propertyVector.uncheckedAppend(other.propertyAt(i).toCSSProperty()
); | 121 m_propertyVector.uncheckedAppend(other.propertyAt(i).toCSSProperty()
); |
136 } | 122 } |
137 } | 123 } |
138 | 124 |
139 String StylePropertySet::getPropertyValue(CSSPropertyID propertyID) const | 125 String StylePropertySet::getPropertyValue(CSSPropertyID propertyID) const |
140 { | 126 { |
141 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(propertyID); | 127 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(propertyID); |
142 if (value) | 128 if (value) |
143 return value->cssText(); | 129 return value->cssText(); |
144 | 130 |
145 return StylePropertySerializer(*this).getPropertyValue(propertyID); | 131 return StylePropertySerializer(*this).getPropertyValue(propertyID); |
146 } | 132 } |
147 | 133 |
148 PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSProper
tyID propertyID) const | 134 PassRefPtrWillBeRawPtr<CSSValue> StylePropertySet::getPropertyCSSValue(CSSProper
tyID propertyID) const |
149 { | 135 { |
150 int foundPropertyIndex = findPropertyIndex(propertyID); | 136 int foundPropertyIndex = findPropertyIndex(propertyID); |
151 if (foundPropertyIndex == -1) | 137 if (foundPropertyIndex == -1) |
152 return nullptr; | 138 return nullptr; |
153 return propertyAt(foundPropertyIndex).value(); | 139 return propertyAt(foundPropertyIndex).value(); |
154 } | 140 } |
155 | 141 |
156 void StylePropertySet::trace(Visitor* visitor) | |
157 { | |
158 if (m_isMutable) | |
159 toMutableStylePropertySet(this)->traceAfterDispatch(visitor); | |
160 else | |
161 toImmutableStylePropertySet(this)->traceAfterDispatch(visitor); | |
162 } | |
163 | |
164 void StylePropertySet::finalize() | |
165 { | |
166 if (m_isMutable) | |
167 toMutableStylePropertySet(this)->~MutableStylePropertySet(); | |
168 else | |
169 toImmutableStylePropertySet(this)->~ImmutableStylePropertySet(); | |
170 } | |
171 | |
172 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) | 142 bool MutableStylePropertySet::removeShorthandProperty(CSSPropertyID propertyID) |
173 { | 143 { |
174 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | 144 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); |
175 if (!shorthand.length()) | 145 if (!shorthand.length()) |
176 return false; | 146 return false; |
177 | 147 |
178 bool ret = removePropertiesInSet(shorthand.properties(), shorthand.length())
; | 148 bool ret = removePropertiesInSet(shorthand.properties(), shorthand.length())
; |
179 | 149 |
180 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID); | 150 CSSPropertyID prefixingVariant = prefixingVariantForPropertyId(propertyID); |
181 if (prefixingVariant == propertyID) | 151 if (prefixingVariant == propertyID) |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 CSSParserContext context(cssParserMode(), UseCounter::getFrom(contextStyleSh
eet)); | 312 CSSParserContext context(cssParserMode(), UseCounter::getFrom(contextStyleSh
eet)); |
343 if (contextStyleSheet) { | 313 if (contextStyleSheet) { |
344 context = contextStyleSheet->parserContext(); | 314 context = contextStyleSheet->parserContext(); |
345 context.setMode(cssParserMode()); | 315 context.setMode(cssParserMode()); |
346 } | 316 } |
347 | 317 |
348 BisonCSSParser parser(context); | 318 BisonCSSParser parser(context); |
349 parser.parseDeclaration(this, styleDeclaration, 0, contextStyleSheet); | 319 parser.parseDeclaration(this, styleDeclaration, 0, contextStyleSheet); |
350 } | 320 } |
351 | 321 |
352 void MutableStylePropertySet::addParsedProperties(const WillBeHeapVector<CSSProp
erty, 256>& properties) | 322 void MutableStylePropertySet::addParsedProperties(const Vector<CSSProperty, 256>
& properties) |
353 { | 323 { |
354 m_propertyVector.reserveCapacity(m_propertyVector.size() + properties.size()
); | 324 m_propertyVector.reserveCapacity(m_propertyVector.size() + properties.size()
); |
355 for (unsigned i = 0; i < properties.size(); ++i) | 325 for (unsigned i = 0; i < properties.size(); ++i) |
356 addParsedProperty(properties[i]); | 326 addParsedProperty(properties[i]); |
357 } | 327 } |
358 | 328 |
359 void MutableStylePropertySet::addParsedProperty(const CSSProperty& property) | 329 void MutableStylePropertySet::addParsedProperty(const CSSProperty& property) |
360 { | 330 { |
361 // Only add properties that have no !important counterpart present | 331 // Only add properties that have no !important counterpart present |
362 if (!propertyIsImportant(property.id()) || property.isImportant()) | 332 if (!propertyIsImportant(property.id()) || property.isImportant()) |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 bool MutableStylePropertySet::removePropertiesInSet(const CSSPropertyID* set, un
signed length) | 412 bool MutableStylePropertySet::removePropertiesInSet(const CSSPropertyID* set, un
signed length) |
443 { | 413 { |
444 if (m_propertyVector.isEmpty()) | 414 if (m_propertyVector.isEmpty()) |
445 return false; | 415 return false; |
446 | 416 |
447 // FIXME: This is always used with static sets and in that case constructing
the hash repeatedly is pretty pointless. | 417 // FIXME: This is always used with static sets and in that case constructing
the hash repeatedly is pretty pointless. |
448 HashSet<CSSPropertyID> toRemove; | 418 HashSet<CSSPropertyID> toRemove; |
449 for (unsigned i = 0; i < length; ++i) | 419 for (unsigned i = 0; i < length; ++i) |
450 toRemove.add(set[i]); | 420 toRemove.add(set[i]); |
451 | 421 |
452 WillBeHeapVector<CSSProperty> newProperties; | 422 Vector<CSSProperty> newProperties; |
453 newProperties.reserveInitialCapacity(m_propertyVector.size()); | 423 newProperties.reserveInitialCapacity(m_propertyVector.size()); |
454 | 424 |
455 unsigned size = m_propertyVector.size(); | 425 unsigned size = m_propertyVector.size(); |
456 for (unsigned n = 0; n < size; ++n) { | 426 for (unsigned n = 0; n < size; ++n) { |
457 const CSSProperty& property = m_propertyVector.at(n); | 427 const CSSProperty& property = m_propertyVector.at(n); |
458 // Not quite sure if the isImportant test is needed but it matches the e
xisting behavior. | 428 // Not quite sure if the isImportant test is needed but it matches the e
xisting behavior. |
459 if (!property.isImportant()) { | 429 if (!property.isImportant()) { |
460 if (toRemove.contains(property.id())) | 430 if (toRemove.contains(property.id())) |
461 continue; | 431 continue; |
462 } | 432 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 if (style->cssPropertyMatches(property.id(), property.value())) | 477 if (style->cssPropertyMatches(property.id(), property.value())) |
508 propertiesToRemove.append(property.id()); | 478 propertiesToRemove.append(property.id()); |
509 } | 479 } |
510 // FIXME: This should use mass removal. | 480 // FIXME: This should use mass removal. |
511 for (unsigned i = 0; i < propertiesToRemove.size(); ++i) | 481 for (unsigned i = 0; i < propertiesToRemove.size(); ++i) |
512 removeProperty(propertiesToRemove[i]); | 482 removeProperty(propertiesToRemove[i]); |
513 } | 483 } |
514 | 484 |
515 PassRefPtr<MutableStylePropertySet> StylePropertySet::mutableCopy() const | 485 PassRefPtr<MutableStylePropertySet> StylePropertySet::mutableCopy() const |
516 { | 486 { |
517 return adoptRefWillBeRefCountedGarbageCollected(new MutableStylePropertySet(
*this)); | 487 return adoptRef(new MutableStylePropertySet(*this)); |
518 } | 488 } |
519 | 489 |
520 PassRefPtr<MutableStylePropertySet> StylePropertySet::copyPropertiesInSet(const
Vector<CSSPropertyID>& properties) const | 490 PassRefPtr<MutableStylePropertySet> StylePropertySet::copyPropertiesInSet(const
Vector<CSSPropertyID>& properties) const |
521 { | 491 { |
522 WillBeHeapVector<CSSProperty, 256> list; | 492 Vector<CSSProperty, 256> list; |
523 list.reserveInitialCapacity(properties.size()); | 493 list.reserveInitialCapacity(properties.size()); |
524 for (unsigned i = 0; i < properties.size(); ++i) { | 494 for (unsigned i = 0; i < properties.size(); ++i) { |
525 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(properties[i]); | 495 RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(properties[i]); |
526 if (value) | 496 if (value) |
527 list.append(CSSProperty(properties[i], value.release(), false)); | 497 list.append(CSSProperty(properties[i], value.release(), false)); |
528 } | 498 } |
529 return MutableStylePropertySet::create(list.data(), list.size()); | 499 return MutableStylePropertySet::create(list.data(), list.size()); |
530 } | 500 } |
531 | 501 |
532 CSSStyleDeclaration* MutableStylePropertySet::ensureCSSStyleDeclaration() | 502 CSSStyleDeclaration* MutableStylePropertySet::ensureCSSStyleDeclaration() |
(...skipping 18 matching lines...) Expand all Loading... |
551 if (m_propertyVector.at(n).metadata().m_propertyID == id) { | 521 if (m_propertyVector.at(n).metadata().m_propertyID == id) { |
552 // Only enabled or internal properties should be part of the style. | 522 // Only enabled or internal properties should be part of the style. |
553 ASSERT(RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID) || isInte
rnalProperty(propertyID)); | 523 ASSERT(RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID) || isInte
rnalProperty(propertyID)); |
554 return n; | 524 return n; |
555 } | 525 } |
556 } | 526 } |
557 | 527 |
558 return -1; | 528 return -1; |
559 } | 529 } |
560 | 530 |
561 void MutableStylePropertySet::traceAfterDispatch(Visitor* visitor) | |
562 { | |
563 visitor->trace(m_propertyVector); | |
564 StylePropertySet::traceAfterDispatch(visitor); | |
565 } | |
566 | |
567 unsigned StylePropertySet::averageSizeInBytes() | 531 unsigned StylePropertySet::averageSizeInBytes() |
568 { | 532 { |
569 // Please update this if the storage scheme changes so that this longer refl
ects the actual size. | 533 // Please update this if the storage scheme changes so that this longer refl
ects the actual size. |
570 return sizeForImmutableStylePropertySetWithPropertyCount(4); | 534 return sizeForImmutableStylePropertySetWithPropertyCount(4); |
571 } | 535 } |
572 | 536 |
573 // See the function above if you need to update this. | 537 // See the function above if you need to update this. |
574 struct SameSizeAsStylePropertySet : public RefCountedWillBeRefCountedGarbageColl
ected<SameSizeAsStylePropertySet> { | 538 struct SameSizeAsStylePropertySet : public RefCounted<SameSizeAsStylePropertySet
> { |
575 unsigned bitfield; | 539 unsigned bitfield; |
576 }; | 540 }; |
577 COMPILE_ASSERT(sizeof(StylePropertySet) == sizeof(SameSizeAsStylePropertySet), s
tyle_property_set_should_stay_small); | 541 COMPILE_ASSERT(sizeof(StylePropertySet) == sizeof(SameSizeAsStylePropertySet), s
tyle_property_set_should_stay_small); |
578 | 542 |
579 #ifndef NDEBUG | 543 #ifndef NDEBUG |
580 void StylePropertySet::showStyle() | 544 void StylePropertySet::showStyle() |
581 { | 545 { |
582 fprintf(stderr, "%s\n", asText().ascii().data()); | 546 fprintf(stderr, "%s\n", asText().ascii().data()); |
583 } | 547 } |
584 #endif | 548 #endif |
585 | 549 |
586 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(CSSParserMod
e cssParserMode) | 550 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(CSSParserMod
e cssParserMode) |
587 { | 551 { |
588 return adoptRefWillBeRefCountedGarbageCollected(new MutableStylePropertySet(
cssParserMode)); | 552 return adoptRef(new MutableStylePropertySet(cssParserMode)); |
589 } | 553 } |
590 | 554 |
591 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(const CSSPro
perty* properties, unsigned count) | 555 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(const CSSPro
perty* properties, unsigned count) |
592 { | 556 { |
593 return adoptRefWillBeRefCountedGarbageCollected(new MutableStylePropertySet(
properties, count)); | 557 return adoptRef(new MutableStylePropertySet(properties, count)); |
594 } | 558 } |
595 | 559 |
596 String StylePropertySet::PropertyReference::cssName() const | 560 String StylePropertySet::PropertyReference::cssName() const |
597 { | 561 { |
598 return getPropertyNameString(id()); | 562 return getPropertyNameString(id()); |
599 } | 563 } |
600 | 564 |
601 String StylePropertySet::PropertyReference::cssText() const | 565 String StylePropertySet::PropertyReference::cssText() const |
602 { | 566 { |
603 StringBuilder result; | 567 StringBuilder result; |
604 result.append(cssName()); | 568 result.append(cssName()); |
605 result.appendLiteral(": "); | 569 result.appendLiteral(": "); |
606 result.append(propertyValue()->cssText()); | 570 result.append(propertyValue()->cssText()); |
607 if (isImportant()) | 571 if (isImportant()) |
608 result.appendLiteral(" !important"); | 572 result.appendLiteral(" !important"); |
609 result.append(';'); | 573 result.append(';'); |
610 return result.toString(); | 574 return result.toString(); |
611 } | 575 } |
612 | 576 |
613 | 577 |
614 } // namespace WebCore | 578 } // namespace WebCore |
OLD | NEW |