Index: Source/core/css/StylePropertySerializer.cpp |
diff --git a/Source/core/css/StylePropertySerializer.cpp b/Source/core/css/StylePropertySerializer.cpp |
index 3b6e94a02945f839fb2b6ff8d9171411c32dfe18..b2fceed300a1e44ed8d1fd8ae8d8c995ca1f5ff3 100644 |
--- a/Source/core/css/StylePropertySerializer.cpp |
+++ b/Source/core/css/StylePropertySerializer.cpp |
@@ -25,6 +25,7 @@ |
#include "CSSValueKeywords.h" |
#include "StylePropertyShorthand.h" |
+#include "core/css/CSSValuePool.h" |
#include "core/css/RuntimeCSSEnabled.h" |
#include "wtf/BitArray.h" |
#include "wtf/text/StringBuilder.h" |
@@ -40,9 +41,159 @@ static bool isInitialOrInherit(const String& value) |
return value.length() == 7 && (value == initial || value == inherit); |
} |
+static bool isAffectedByAllProperty(CSSPropertyID propertyID) |
+{ |
+ return propertyID != CSSPropertyUnicodeBidi && propertyID != CSSPropertyDirection; |
+} |
+ |
+static bool shouldExpandAll(const StylePropertySet& properties) |
+{ |
+ int allIndex = properties.findPropertyIndex(CSSPropertyAll); |
+ if (allIndex == -1) |
+ return false; |
+ |
+ for (unsigned i = 0; i < properties.propertyCount(); ++i) { |
+ StylePropertySet::PropertyReference property = properties.propertyAt(i); |
+ if (isAffectedByAllProperty(property.id()) && property.id() != CSSPropertyAll) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+static bool canAllOverwriteProperty(StylePropertySet::PropertyReference all, unsigned allIndex, StylePropertySet::PropertyReference property, unsigned propertyIndex) |
esprehn
2014/05/30 00:59:22
const StylePropertySet::PropertyReference&
tasak
2014/06/04 09:37:41
Done.
|
+{ |
+ if (allIndex == propertyIndex) |
+ return true; |
+ if (!isAffectedByAllProperty(property.id())) |
+ return false; |
+ if (all.isImportant() != property.isImportant()) |
+ return all.isImportant(); |
+ return propertyIndex < allIndex; |
+} |
+ |
StylePropertySerializer::StylePropertySerializer(const StylePropertySet& properties) |
: m_propertySet(properties) |
{ |
+ if (!shouldExpandAll(properties)) |
+ return; |
+ |
+ unsigned allIndex = properties.findPropertyIndex(CSSPropertyAll); |
+ StylePropertySet::PropertyReference all = properties.propertyAt(allIndex); |
+ BitArray<numCSSProperties> shorthandPropertyAppeared; |
+ |
+ m_propertyVector = adoptPtr(new Vector<CSSPropertyInternal>()); |
esprehn
2014/05/30 00:59:22
Why heap allocate this if the constructor is alway
tasak
2014/06/04 09:37:40
I changed m_propertyVector, from OwnPtr<Vector..>
|
+ |
+ unsigned position = 0; |
+ for (unsigned i = 0; i < properties.propertyCount(); ++i) { |
esprehn
2014/05/30 00:59:22
All of this needs to be in a method.
the early re
tasak
2014/06/04 09:37:40
Done.
|
+ StylePropertySet::PropertyReference property = properties.propertyAt(i); |
+ CSSPropertyID propertyId = property.id(); |
+ |
+ if (propertyId == CSSPropertyAll) |
+ position = m_propertyVector->size(); |
+ |
+ if (!canAllOverwriteProperty(all, allIndex, property, i)) { |
+ m_propertyVector->append(CSSPropertyInternal(property)); |
+ |
+ unsigned shortPropertyIndex = property.id() - firstCSSProperty; |
+ shorthandPropertyAppeared.set(shortPropertyIndex); |
+ } |
+ } |
+ |
+ bool allIsUnset = !all.value()->isInitialValue() && !all.value()->isInheritedValue(); |
+ CSSValue* value = all.value(); |
+ |
+ for (int i = firstCSSProperty; i <= lastCSSProperty; ++i) { |
+ CSSPropertyID propertyId = static_cast<CSSPropertyID>(i); |
+ |
+ if (isExpandedShorthandForAll(propertyId)) |
+ continue; |
+ if (propertyId == CSSPropertyAll || !isAffectedByAllProperty(propertyId)) |
+ continue; |
+ if (shorthandPropertyAppeared.get(i - firstCSSProperty)) |
+ continue; |
+ |
+ if (allIsUnset) { |
+ if (CSSProperty::isInheritedProperty(propertyId)) |
+ value = cssValuePool().createInheritedValue().get(); |
+ else |
+ value = cssValuePool().createExplicitInitialValue().get(); |
+ } |
+ m_propertyVector->insert(position++, CSSPropertyInternal(propertyId, value, all.isImportant(), value->isInheritedValue(), all.isImplicit())); |
+ } |
+} |
+ |
+unsigned StylePropertySerializer::propertyCount() const |
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.propertyCount(); |
+ |
+ return m_propertyVector->size(); |
+} |
+ |
+StylePropertySerializer::CSSPropertyInternal StylePropertySerializer::propertyAt(unsigned index) const |
esprehn
2014/05/30 00:59:22
Is this private? PropertyInternal doesn't seem lik
tasak
2014/06/04 09:37:41
Yes, this is private.
|
+{ |
+ if (!m_propertyVector) |
+ return CSSPropertyInternal(m_propertySet.propertyAt(index)); |
+ |
+ return m_propertyVector->at(index); |
+} |
+ |
+String StylePropertySerializer::getPropertyValueInternal(CSSPropertyID propertyId) const |
esprehn
2014/05/30 00:59:22
these are all named wrong. propertyValue() and suc
tasak
2014/06/04 09:37:40
Done.
Now propertyValue().
|
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.getPropertyValue(propertyId); |
+ |
+ int index = findPropertyIndex(propertyId); |
+ if (index == -1) |
+ return String(); |
+ if (CSSValue* value = m_propertyVector->at(index).value()) |
+ return value->cssText(); |
+ return String(); |
+} |
+ |
+CSSValue* StylePropertySerializer::getPropertyCSSValue(CSSPropertyID propertyId) const |
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.getPropertyCSSValue(propertyId).get(); |
+ |
+ int index = findPropertyIndex(propertyId); |
+ if (index == -1) |
+ return 0; |
+ return m_propertyVector->at(index).value(); |
+} |
+ |
+int StylePropertySerializer::findPropertyIndex(CSSPropertyID propertyId) const |
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.findPropertyIndex(propertyId); |
+ |
+ for (unsigned i = 0; i < m_propertyVector->size(); ++i) { |
+ if (m_propertyVector->at(i).id() == propertyId) |
+ return i; |
+ } |
+ return -1; |
+} |
+ |
+bool StylePropertySerializer::isPropertyImplicit(CSSPropertyID propertyId) const |
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.isPropertyImplicit(propertyId); |
+ |
+ int index = findPropertyIndex(propertyId); |
+ if (index == -1) |
+ return false; |
+ return m_propertyVector->at(index).isImplicit(); |
+} |
+ |
+bool StylePropertySerializer::propertyIsImportant(CSSPropertyID propertyId) const |
+{ |
+ if (!m_propertyVector) |
+ return m_propertySet.propertyIsImportant(propertyId); |
+ |
+ int index = findPropertyIndex(propertyId); |
+ if (index == -1) |
+ return false; |
+ return m_propertyVector->at(index).isImportant(); |
} |
String StylePropertySerializer::getPropertyText(CSSPropertyID propertyID, const String& value, bool isImportant, bool isNotFirstDecl) const |
@@ -63,13 +214,17 @@ String StylePropertySerializer::asText() const |
{ |
StringBuilder result; |
+ String allValue; |
+ if (hasAllShorthand(allValue)) |
+ return allValue; |
+ |
BitArray<numCSSProperties> shorthandPropertyUsed; |
BitArray<numCSSProperties> shorthandPropertyAppeared; |
- unsigned size = m_propertySet.propertyCount(); |
+ unsigned size = propertyCount(); |
unsigned numDecls = 0; |
for (unsigned n = 0; n < size; ++n) { |
- StylePropertySet::PropertyReference property = m_propertySet.propertyAt(n); |
+ CSSPropertyInternal property = propertyAt(n); |
CSSPropertyID propertyID = property.id(); |
// Only enabled or internal properties should be part of the style. |
ASSERT(RuntimeCSSEnabled::isCSSPropertyEnabled(propertyID) || isInternalProperty(propertyID)); |
@@ -209,6 +364,9 @@ String StylePropertySerializer::asText() const |
case CSSPropertyWebkitTransitionDelay: |
shorthandPropertyID = CSSPropertyWebkitTransition; |
break; |
+ case CSSPropertyAll: |
+ result.append(getPropertyText(propertyID, property.value()->cssText(), property.isImportant(), numDecls++)); |
+ continue; |
default: |
break; |
} |
@@ -218,7 +376,7 @@ String StylePropertySerializer::asText() const |
if (shorthandPropertyUsed.get(shortPropertyIndex)) |
continue; |
if (!shorthandPropertyAppeared.get(shortPropertyIndex) && value.isNull()) |
- value = m_propertySet.getPropertyValue(shorthandPropertyID); |
+ value = getPropertyValueInternal(shorthandPropertyID); |
shorthandPropertyAppeared.set(shortPropertyIndex); |
} |
@@ -321,7 +479,7 @@ String StylePropertySerializer::getPropertyValue(CSSPropertyID propertyID) const |
case CSSPropertyWebkitAnimation: |
return getLayeredShorthandValue(webkitAnimationShorthand()); |
case CSSPropertyMarker: { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(CSSPropertyMarkerStart); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(CSSPropertyMarkerStart); |
if (value) |
return value->cssText(); |
return String(); |
@@ -335,8 +493,8 @@ String StylePropertySerializer::getPropertyValue(CSSPropertyID propertyID) const |
String StylePropertySerializer::borderSpacingValue(const StylePropertyShorthand& shorthand) const |
{ |
- RefPtrWillBeRawPtr<CSSValue> horizontalValue = m_propertySet.getPropertyCSSValue(shorthand.properties()[0]); |
- RefPtrWillBeRawPtr<CSSValue> verticalValue = m_propertySet.getPropertyCSSValue(shorthand.properties()[1]); |
+ RefPtrWillBeRawPtr<CSSValue> horizontalValue = getPropertyCSSValue(shorthand.properties()[0]); |
+ RefPtrWillBeRawPtr<CSSValue> verticalValue = getPropertyCSSValue(shorthand.properties()[1]); |
// While standard border-spacing property does not allow specifying border-spacing-vertical without |
// specifying border-spacing-horizontal <http://www.w3.org/TR/CSS21/tables.html#separated-borders>, |
@@ -353,11 +511,11 @@ String StylePropertySerializer::borderSpacingValue(const StylePropertyShorthand& |
void StylePropertySerializer::appendFontLonghandValueIfExplicit(CSSPropertyID propertyID, StringBuilder& result, String& commonValue) const |
{ |
- int foundPropertyIndex = m_propertySet.findPropertyIndex(propertyID); |
+ int foundPropertyIndex = findPropertyIndex(propertyID); |
if (foundPropertyIndex == -1) |
return; // All longhands must have at least implicit values if "font" is specified. |
- if (m_propertySet.propertyAt(foundPropertyIndex).isImplicit()) { |
+ if (propertyAt(foundPropertyIndex).isImplicit()) { |
commonValue = String(); |
return; |
} |
@@ -380,7 +538,7 @@ void StylePropertySerializer::appendFontLonghandValueIfExplicit(CSSPropertyID pr |
if (prefix && !result.isEmpty()) |
result.append(prefix); |
- String value = m_propertySet.propertyAt(foundPropertyIndex).value()->cssText(); |
+ String value = propertyAt(foundPropertyIndex).value()->cssText(); |
result.append(value); |
if (!commonValue.isNull() && commonValue != value) |
commonValue = String(); |
@@ -388,13 +546,13 @@ void StylePropertySerializer::appendFontLonghandValueIfExplicit(CSSPropertyID pr |
String StylePropertySerializer::fontValue() const |
{ |
- int fontSizePropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontSize); |
- int fontFamilyPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontFamily); |
+ int fontSizePropertyIndex = findPropertyIndex(CSSPropertyFontSize); |
+ int fontFamilyPropertyIndex = findPropertyIndex(CSSPropertyFontFamily); |
if (fontSizePropertyIndex == -1 || fontFamilyPropertyIndex == -1) |
return emptyString(); |
- StylePropertySet::PropertyReference fontSizeProperty = m_propertySet.propertyAt(fontSizePropertyIndex); |
- StylePropertySet::PropertyReference fontFamilyProperty = m_propertySet.propertyAt(fontFamilyPropertyIndex); |
+ CSSPropertyInternal fontSizeProperty = propertyAt(fontSizePropertyIndex); |
esprehn
2014/05/30 00:59:22
This needs a different name. Internal usually mean
tasak
2014/06/04 09:37:40
Yes, I would like to make CSSPropertyInternal priv
|
+ CSSPropertyInternal fontFamilyProperty = propertyAt(fontFamilyPropertyIndex); |
if (fontSizeProperty.isImplicit() || fontFamilyProperty.isImplicit()) |
return emptyString(); |
@@ -418,18 +576,18 @@ String StylePropertySerializer::fontValue() const |
String StylePropertySerializer::get4Values(const StylePropertyShorthand& shorthand) const |
{ |
// Assume the properties are in the usual order top, right, bottom, left. |
- int topValueIndex = m_propertySet.findPropertyIndex(shorthand.properties()[0]); |
- int rightValueIndex = m_propertySet.findPropertyIndex(shorthand.properties()[1]); |
- int bottomValueIndex = m_propertySet.findPropertyIndex(shorthand.properties()[2]); |
- int leftValueIndex = m_propertySet.findPropertyIndex(shorthand.properties()[3]); |
+ int topValueIndex = findPropertyIndex(shorthand.properties()[0]); |
+ int rightValueIndex = findPropertyIndex(shorthand.properties()[1]); |
+ int bottomValueIndex = findPropertyIndex(shorthand.properties()[2]); |
+ int leftValueIndex = findPropertyIndex(shorthand.properties()[3]); |
if (topValueIndex == -1 || rightValueIndex == -1 || bottomValueIndex == -1 || leftValueIndex == -1) |
return String(); |
- StylePropertySet::PropertyReference top = m_propertySet.propertyAt(topValueIndex); |
- StylePropertySet::PropertyReference right = m_propertySet.propertyAt(rightValueIndex); |
- StylePropertySet::PropertyReference bottom = m_propertySet.propertyAt(bottomValueIndex); |
- StylePropertySet::PropertyReference left = m_propertySet.propertyAt(leftValueIndex); |
+ CSSPropertyInternal top = propertyAt(topValueIndex); |
+ CSSPropertyInternal right = propertyAt(rightValueIndex); |
+ CSSPropertyInternal bottom = propertyAt(bottomValueIndex); |
+ CSSPropertyInternal left = propertyAt(leftValueIndex); |
// All 4 properties must be specified. |
if (!top.value() || !right.value() || !bottom.value() || !left.value()) |
@@ -479,7 +637,7 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
size_t numLayers = 0; |
for (unsigned i = 0; i < size; ++i) { |
- values[i] = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
+ values[i] = getPropertyCSSValue(shorthand.properties()[i]); |
if (values[i]) { |
if (values[i]->isBaseValueList()) { |
CSSValueList* valueList = toCSSValueList(values[i].get()); |
@@ -522,8 +680,8 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
// We need to report background-repeat as it was written in the CSS. If the property is implicit, |
// then it was written with only one value. Here we figure out which value that was so we can |
// report back correctly. |
- if ((shorthand.properties()[j] == CSSPropertyBackgroundRepeatX && m_propertySet.isPropertyImplicit(shorthand.properties()[j])) |
- || (shorthand.properties()[j] == CSSPropertyWebkitMaskRepeatX && m_propertySet.isPropertyImplicit(shorthand.properties()[j]))) { |
+ if ((shorthand.properties()[j] == CSSPropertyBackgroundRepeatX && isPropertyImplicit(shorthand.properties()[j])) |
+ || (shorthand.properties()[j] == CSSPropertyWebkitMaskRepeatX && isPropertyImplicit(shorthand.properties()[j]))) { |
// BUG 49055: make sure the value was not reset in the layer check just above. |
if ((j < size - 1 && shorthand.properties()[j + 1] == CSSPropertyBackgroundRepeatY && value) |
@@ -624,8 +782,8 @@ String StylePropertySerializer::getShorthandValue(const StylePropertyShorthand& |
String commonValue; |
StringBuilder result; |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
- if (!m_propertySet.isPropertyImplicit(shorthand.properties()[i])) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
+ if (!isPropertyImplicit(shorthand.properties()[i])) { |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(shorthand.properties()[i]); |
if (!value) |
return String(); |
String valueText = value->cssText(); |
@@ -654,7 +812,7 @@ String StylePropertySerializer::getCommonValue(const StylePropertyShorthand& sho |
String res; |
bool lastPropertyWasImportant = false; |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(shorthand.properties()[i]); |
// FIXME: CSSInitialValue::cssText should generate the right value. |
if (!value) |
return String(); |
@@ -666,7 +824,7 @@ String StylePropertySerializer::getCommonValue(const StylePropertyShorthand& sho |
else if (res != text) |
return String(); |
- bool currentPropertyIsImportant = m_propertySet.propertyIsImportant(shorthand.properties()[i]); |
+ bool currentPropertyIsImportant = propertyIsImportant(shorthand.properties()[i]); |
if (i && lastPropertyWasImportant != currentPropertyIsImportant) |
return String(); |
lastPropertyWasImportant = currentPropertyIsImportant; |
@@ -704,13 +862,13 @@ String StylePropertySerializer::borderPropertyValue(CommonValueMode valueMode) c |
String StylePropertySerializer::backgroundRepeatPropertyValue() const |
{ |
- RefPtrWillBeRawPtr<CSSValue> repeatX = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundRepeatX); |
- RefPtrWillBeRawPtr<CSSValue> repeatY = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundRepeatY); |
+ RefPtrWillBeRawPtr<CSSValue> repeatX = getPropertyCSSValue(CSSPropertyBackgroundRepeatX); |
+ RefPtrWillBeRawPtr<CSSValue> repeatY = getPropertyCSSValue(CSSPropertyBackgroundRepeatY); |
if (!repeatX || !repeatY) |
return String(); |
if (repeatX->cssValueType() != repeatY->cssValueType()) |
return String(); |
- if (m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatX) != m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatY)) |
+ if (propertyIsImportant(CSSPropertyBackgroundRepeatX) != propertyIsImportant(CSSPropertyBackgroundRepeatY)) |
return String(); |
StringBuilder builder; |
@@ -751,13 +909,13 @@ void StylePropertySerializer::appendBackgroundPropertyAsText(StringBuilder& resu |
{ |
if (isPropertyShorthandAvailable(backgroundShorthand())) { |
String backgroundValue = getPropertyValue(CSSPropertyBackground); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundImage); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundImage); |
result.append(getPropertyText(CSSPropertyBackground, backgroundValue, isImportant, numDecls++)); |
return; |
} |
if (shorthandHasOnlyInitialOrInheritedValue(backgroundShorthand())) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundImage); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundImage); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(CSSPropertyBackgroundImage); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundImage); |
result.append(getPropertyText(CSSPropertyBackground, value->cssText(), isImportant, numDecls++)); |
return; |
} |
@@ -774,10 +932,10 @@ void StylePropertySerializer::appendBackgroundPropertyAsText(StringBuilder& resu |
for (unsigned i = 0; i < WTF_ARRAY_LENGTH(backgroundPropertyIds); ++i) { |
CSSPropertyID propertyID = backgroundPropertyIds[i]; |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(propertyID); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(propertyID); |
if (!value) |
continue; |
- result.append(getPropertyText(propertyID, value->cssText(), m_propertySet.propertyIsImportant(propertyID), numDecls++)); |
+ result.append(getPropertyText(propertyID, value->cssText(), propertyIsImportant(propertyID), numDecls++)); |
} |
// FIXME: This is a not-so-nice way to turn x/y positions into single background-position in output. |
@@ -785,45 +943,45 @@ void StylePropertySerializer::appendBackgroundPropertyAsText(StringBuilder& resu |
// would not work in Firefox (<rdar://problem/5143183>) |
// It would be a better solution if background-position was CSS_PAIR. |
if (shorthandHasOnlyInitialOrInheritedValue(backgroundPositionShorthand())) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionX); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionX); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(CSSPropertyBackgroundPositionX); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundPositionX); |
result.append(getPropertyText(CSSPropertyBackgroundPosition, value->cssText(), isImportant, numDecls++)); |
} else if (isPropertyShorthandAvailable(backgroundPositionShorthand())) { |
- String positionValue = m_propertySet.getPropertyValue(CSSPropertyBackgroundPosition); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionX); |
+ String positionValue = getPropertyValueInternal(CSSPropertyBackgroundPosition); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundPositionX); |
if (!positionValue.isNull()) |
result.append(getPropertyText(CSSPropertyBackgroundPosition, positionValue, isImportant, numDecls++)); |
} else { |
// should check background-position-x or background-position-y. |
- if (RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionX)) { |
+ if (RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(CSSPropertyBackgroundPositionX)) { |
if (!value->isImplicitInitialValue()) { |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionX); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundPositionX); |
result.append(getPropertyText(CSSPropertyBackgroundPositionX, value->cssText(), isImportant, numDecls++)); |
} |
} |
- if (RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionY)) { |
+ if (RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(CSSPropertyBackgroundPositionY)) { |
if (!value->isImplicitInitialValue()) { |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionY); |
+ bool isImportant = propertyIsImportant(CSSPropertyBackgroundPositionY); |
result.append(getPropertyText(CSSPropertyBackgroundPositionY, value->cssText(), isImportant, numDecls++)); |
} |
} |
} |
- String repeatValue = m_propertySet.getPropertyValue(CSSPropertyBackgroundRepeat); |
+ String repeatValue = getPropertyValueInternal(CSSPropertyBackgroundRepeat); |
if (!repeatValue.isNull()) |
- result.append(getPropertyText(CSSPropertyBackgroundRepeat, repeatValue, m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatX), numDecls++)); |
+ result.append(getPropertyText(CSSPropertyBackgroundRepeat, repeatValue, propertyIsImportant(CSSPropertyBackgroundRepeatX), numDecls++)); |
} |
bool StylePropertySerializer::isPropertyShorthandAvailable(const StylePropertyShorthand& shorthand) const |
{ |
ASSERT(shorthand.length() > 0); |
- bool isImportant = m_propertySet.propertyIsImportant(shorthand.properties()[0]); |
+ bool isImportant = propertyIsImportant(shorthand.properties()[0]); |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(shorthand.properties()[i]); |
if (!value || (value->isInitialValue() && !value->isImplicitInitialValue()) || value->isInheritedValue()) |
return false; |
- if (isImportant != m_propertySet.propertyIsImportant(shorthand.properties()[i])) |
+ if (isImportant != propertyIsImportant(shorthand.properties()[i])) |
return false; |
} |
return true; |
@@ -832,21 +990,70 @@ bool StylePropertySerializer::isPropertyShorthandAvailable(const StylePropertySh |
bool StylePropertySerializer::shorthandHasOnlyInitialOrInheritedValue(const StylePropertyShorthand& shorthand) const |
{ |
ASSERT(shorthand.length() > 0); |
- bool isImportant = m_propertySet.propertyIsImportant(shorthand.properties()[0]); |
+ bool isImportant = propertyIsImportant(shorthand.properties()[0]); |
bool isInitialValue = true; |
bool isInheritedValue = true; |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
- RefPtrWillBeRawPtr<CSSValue> value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
+ RefPtrWillBeRawPtr<CSSValue> value = getPropertyCSSValue(shorthand.properties()[i]); |
if (!value) |
return false; |
if (!value->isInitialValue()) |
isInitialValue = false; |
if (!value->isInheritedValue()) |
isInheritedValue = false; |
- if (isImportant != m_propertySet.propertyIsImportant(shorthand.properties()[i])) |
+ if (isImportant != propertyIsImportant(shorthand.properties()[i])) |
return false; |
} |
return isInitialValue || isInheritedValue; |
} |
+bool StylePropertySerializer::hasAllShorthand(String& result) const |
+{ |
+ if (!propertyCount()) |
+ return false; |
+ |
+ bool isImportant = propertyAt(0).isImportant(); |
esprehn
2014/05/30 00:59:22
why is it okay to only check 0?
tasak
2014/06/04 09:37:40
I'm trying to see if all properties' isImportant a
|
+ bool isInitialValue = true; |
+ bool isInheritedValue = true; |
+ bool isUnsetValue = true; |
+ |
+ BitArray<numCSSProperties> shorthandPropertyAppeared; |
+ |
+ for (unsigned i = 0; i < propertyCount(); ++i) { |
+ CSSPropertyInternal property = propertyAt(i); |
+ |
+ unsigned shorthandIndex = property.id() - firstCSSProperty; |
+ shorthandPropertyAppeared.set(shorthandIndex); |
+ |
+ if (!property.value()->isInitialValue()) |
+ isInitialValue = false; |
+ if (!property.value()->isInheritedValue()) |
+ isInheritedValue = false; |
+ if ((CSSProperty::isInheritedProperty(property.id()) && !property.value()->isInheritedValue()) || (!CSSProperty::isInheritedProperty(property.id()) && !property.value()->isInitialValue())) |
+ isUnsetValue = false; |
+ |
+ if (isImportant != property.isImportant()) |
+ return false; |
+ } |
+ if (!isInitialValue && !isInheritedValue && !isUnsetValue) |
+ return false; |
+ |
+ for (int i = firstCSSProperty; i <= lastCSSProperty; ++i) { |
esprehn
2014/05/30 00:59:22
I think you can just loop over CSSPropertyID and c
tasak
2014/06/04 09:37:40
Because I have the following error:
"error: cannot
|
+ CSSPropertyID propertyId = static_cast<CSSPropertyID>(i); |
+ |
+ if (isExpandedShorthandForAll(propertyId)) |
+ continue; |
+ if (propertyId == CSSPropertyAll || !isAffectedByAllProperty(propertyId)) |
+ continue; |
+ |
+ unsigned shorthandIndex = i - firstCSSProperty; |
+ if (!shorthandPropertyAppeared.get(shorthandIndex)) |
+ return false; |
+ } |
+ |
+ String value = isInitialValue ? "initial" : (isInheritedValue ? "inherit" : "unset"); |
esprehn
2014/05/30 00:59:22
don't nest ternaries
tasak
2014/06/04 09:37:40
Done.
|
+ result = getPropertyText(CSSPropertyAll, value, isImportant, false); |
+ return true; |
+} |
+ |
} |