Index: third_party/WebKit/Source/core/css/StylePropertySerializer.cpp |
diff --git a/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp b/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp |
index 101a5d7ce4788e31ff88a0f5cfd86382704fda06..7f23c2f2cbd373bad4b3d126055abded33162507 100644 |
--- a/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp |
+++ b/third_party/WebKit/Source/core/css/StylePropertySerializer.cpp |
@@ -33,11 +33,6 @@ |
namespace blink { |
-static bool isInitialOrInherit(const String& value) |
-{ |
- return value.length() == 7 && (value == "initial" || value == "inherit"); |
-} |
- |
StylePropertySerializer::StylePropertySetForSerializer::StylePropertySetForSerializer(const StylePropertySet& properties) |
: m_propertySet(&properties) |
, m_allIndex(m_propertySet->findPropertyIndex(CSSPropertyAll)) |
@@ -227,8 +222,6 @@ String StylePropertySerializer::asText() const |
std::bitset<numCSSProperties> longhandSerialized; |
std::bitset<numCSSProperties> shorthandAppeared; |
- bool backgroundLonghandSeen = false; |
- |
unsigned size = m_propertySet.propertyCount(); |
unsigned numDecls = 0; |
for (unsigned n = 0; n < size; ++n) { |
@@ -275,12 +268,6 @@ String StylePropertySerializer::asText() const |
// but Firefox doesn't do this. |
if (shorthandProperty == CSSPropertyFont) |
continue; |
- // TODO(timloh): Why is background special? |
- if (shorthandProperty == CSSPropertyBackground) { |
- serializedAsShorthand = true; |
- backgroundLonghandSeen = true; |
- break; |
- } |
// We already tried serializing as this shorthand |
if (shorthandAppeared.test(shorthandPropertyIndex)) |
continue; |
@@ -310,23 +297,125 @@ String StylePropertySerializer::asText() const |
if (serializedAsShorthand) |
continue; |
- // TODO(timloh): This is wrong and makes declarations not round-trip. |
- if (property.value()->isImplicitInitialValue()) |
- continue; |
- |
result.append(getPropertyText(propertyID, property.value()->cssText(), property.isImportant(), numDecls++)); |
} |
- if (backgroundLonghandSeen) |
- appendBackgroundPropertyAsText(result, numDecls); |
- |
ASSERT(!numDecls ^ !result.isEmpty()); |
return result.toString(); |
} |
+// As per css-cascade, shorthands do not expand longhands to the value |
+// "initial", except when the shorthand is set to "initial", instead |
+// setting "missing" sub-properties to their initial values. This means |
+// that a shorthand can never represent a list of subproperties where |
+// some are "initial" and some are not, and so serialization should |
+// always fail in these cases (as per cssom). However we currently use |
+// "initial" instead of the initial values for certain shorthands, so |
+// these are special-cased here. |
+// TODO(timloh): Don't use "initial" in shorthands and remove this |
+// special-casing |
+static bool allowInitialInShorthand(CSSPropertyID propertyID) |
+{ |
+ switch (propertyID) { |
+ case CSSPropertyBorder: |
+ case CSSPropertyBorderTop: |
+ case CSSPropertyBorderRight: |
+ case CSSPropertyBorderBottom: |
+ case CSSPropertyBorderLeft: |
+ case CSSPropertyOutline: |
+ case CSSPropertyColumnRule: |
+ case CSSPropertyColumns: |
+ case CSSPropertyFlex: |
+ case CSSPropertyFlexFlow: |
+ case CSSPropertyGridColumn: |
+ case CSSPropertyGridRow: |
+ case CSSPropertyGridArea: |
+ case CSSPropertyGridGap: |
+ case CSSPropertyMotion: |
+ case CSSPropertyWebkitMarginCollapse: |
+ case CSSPropertyListStyle: |
+ case CSSPropertyWebkitTextEmphasis: |
+ case CSSPropertyWebkitTextStroke: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+// TODO(timloh): This should go away eventually, see crbug.com/471917 |
+static bool allowImplicitInitialInShorthand(CSSPropertyID propertyID) |
+{ |
+ return propertyID == CSSPropertyBackground || propertyID == CSSPropertyWebkitMask; |
+} |
+ |
+String StylePropertySerializer::commonShorthandChecks(const StylePropertyShorthand& shorthand) const |
+{ |
+ int longhandCount = shorthand.length(); |
+ DCHECK_LE(longhandCount, 17); |
+ const CSSValue* longhands[17] = {}; |
+ |
+ bool hasImportant = false; |
+ bool hasNonImportant = false; |
+ |
+ for (int i = 0; i < longhandCount; i++) { |
+ int index = m_propertySet.findPropertyIndex(shorthand.properties()[i]); |
+ if (index == -1) |
+ return emptyString(); |
+ PropertyValueForSerializer value = m_propertySet.propertyAt(index); |
+ |
+ hasImportant |= value.isImportant(); |
+ hasNonImportant |= !value.isImportant(); |
+ longhands[i] = value.value(); |
+ } |
+ |
+ if (hasImportant && hasNonImportant) |
+ return emptyString(); |
+ |
+ // TODO(timloh): This should be isCSSWideKeyword() |
+ if (longhands[0]->isInitialValue() || longhands[0]->isInheritedValue()) { |
+ bool success = true; |
+ for (int i = 1; i < longhandCount; i++) { |
+ if (!longhands[i]->equals(*longhands[0])) { |
+ // This should just return emptyString() but some shorthands currently |
+ // allow 'initial' for their longhands. |
+ success = false; |
+ break; |
+ } |
+ } |
+ if (success) |
+ return longhands[0]->cssText(); |
+ } |
+ |
+ bool allowInitial = allowInitialInShorthand(shorthand.id()); |
+ bool allowImplicitInitial = allowInitial || allowImplicitInitialInShorthand(shorthand.id()); |
+ for (int i = 0; i < longhandCount; i++) { |
+ const CSSValue& value = *longhands[i]; |
+ if (value.isImplicitInitialValue()) { |
+ if (allowImplicitInitial) |
+ continue; |
+ return emptyString(); |
+ } |
+ if (!allowInitial && value.isInitialValue()) |
+ return emptyString(); |
+ // TODO(timloh): This should also check unset |
+ if (value.isInheritedValue()) |
+ return emptyString(); |
+ } |
+ |
+ return String(); |
+} |
+ |
String StylePropertySerializer::getPropertyValue(CSSPropertyID propertyID) const |
{ |
- // Shorthand and 4-values properties |
+ const StylePropertyShorthand& shorthand = shorthandForProperty(propertyID); |
+ // TODO(timloh): This is weird, why do we call this with non-shorthands at all? |
+ if (!shorthand.length()) |
+ return String(); |
+ |
+ String result = commonShorthandChecks(shorthand); |
+ if (!result.isNull()) |
+ return result; |
+ |
switch (propertyID) { |
case CSSPropertyAnimation: |
return getLayeredShorthandValue(animationShorthand()); |
@@ -417,12 +506,6 @@ String StylePropertySerializer::borderSpacingValue(const StylePropertyShorthand& |
const CSSValue* horizontalValue = m_propertySet.getPropertyCSSValue(shorthand.properties()[0]); |
const CSSValue* verticalValue = m_propertySet.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>, |
- // -webkit-border-spacing-vertical can be set without -webkit-border-spacing-horizontal. |
- if (!horizontalValue || !verticalValue) |
- return String(); |
- |
String horizontalValueCSSText = horizontalValue->cssText(); |
String verticalValueCSSText = verticalValue->cssText(); |
if (horizontalValueCSSText == verticalValueCSSText) |
@@ -430,16 +513,14 @@ String StylePropertySerializer::borderSpacingValue(const StylePropertyShorthand& |
return horizontalValueCSSText + ' ' + verticalValueCSSText; |
} |
-void StylePropertySerializer::appendFontLonghandValueIfNotNormal(CSSPropertyID propertyID, StringBuilder& result, String& commonValue) const |
+void StylePropertySerializer::appendFontLonghandValueIfNotNormal(CSSPropertyID propertyID, StringBuilder& result) const |
{ |
int foundPropertyIndex = m_propertySet.findPropertyIndex(propertyID); |
ASSERT(foundPropertyIndex != -1); |
const CSSValue* val = m_propertySet.propertyAt(foundPropertyIndex).value(); |
- if (val->isPrimitiveValue() && toCSSPrimitiveValue(val)->getValueID() == CSSValueNormal) { |
- commonValue = String(); |
+ if (val->isPrimitiveValue() && toCSSPrimitiveValue(val)->getValueID() == CSSValueNormal) |
return; |
- } |
char prefix = '\0'; |
switch (propertyID) { |
@@ -474,15 +555,10 @@ void StylePropertySerializer::appendFontLonghandValueIfNotNormal(CSSPropertyID p |
} |
result.append(value); |
- if (!commonValue.isNull() && commonValue != value) |
- commonValue = String(); |
} |
String StylePropertySerializer::fontValue() const |
{ |
- if (!isPropertyShorthandAvailable(fontShorthand()) && !shorthandHasOnlyInitialOrInheritedValue(fontShorthand())) |
- return emptyString(); |
- |
int fontSizePropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontSize); |
int fontFamilyPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontFamily); |
int fontVariantCapsPropertyIndex = m_propertySet.findPropertyIndex(CSSPropertyFontVariantCaps); |
@@ -511,48 +587,38 @@ String StylePropertySerializer::fontValue() const |
|| numericValue->isValueList()) |
return emptyString(); |
- String commonValue = fontSizeProperty.value()->cssText(); |
StringBuilder result; |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontStyle, result, commonValue); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontStyle, result); |
const CSSValue* val = fontVariantCapsProperty.value(); |
if (val->isPrimitiveValue() |
&& (toCSSPrimitiveValue(val)->getValueID() != CSSValueSmallCaps |
&& toCSSPrimitiveValue(val)->getValueID() != CSSValueNormal)) |
return emptyString(); |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result, commonValue); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result); |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontWeight, result, commonValue); |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontStretch, result, commonValue); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontWeight, result); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontStretch, result); |
if (!result.isEmpty()) |
result.append(' '); |
result.append(fontSizeProperty.value()->cssText()); |
- appendFontLonghandValueIfNotNormal(CSSPropertyLineHeight, result, commonValue); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyLineHeight, result); |
if (!result.isEmpty()) |
result.append(' '); |
result.append(fontFamilyProperty.value()->cssText()); |
- if (isInitialOrInherit(commonValue)) |
- return commonValue; |
return result.toString(); |
} |
String StylePropertySerializer::fontVariantValue() const |
{ |
- if (!isPropertyShorthandAvailable(fontVariantShorthand())) { |
- if (!shorthandHasOnlyInitialOrInheritedValue(fontVariantShorthand())) |
- return String(); |
- return m_propertySet.getPropertyValue(CSSPropertyFontVariantLigatures); |
- } |
- |
StringBuilder result; |
// TODO(drott): Decide how we want to return ligature values in shorthands, reduced to "none" or |
// spelled out, filed as W3C bug: |
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=29594 |
- String dummyCommonValue; |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantLigatures, result, dummyCommonValue); |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result, dummyCommonValue); |
- appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantNumeric, result, dummyCommonValue); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantLigatures, result); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantCaps, result); |
+ appendFontLonghandValueIfNotNormal(CSSPropertyFontVariantNumeric, result); |
if (result.isEmpty()) { |
return "normal"; |
@@ -577,22 +643,6 @@ String StylePropertySerializer::get4Values(const StylePropertyShorthand& shortha |
PropertyValueForSerializer bottom = m_propertySet.propertyAt(bottomValueIndex); |
PropertyValueForSerializer left = m_propertySet.propertyAt(leftValueIndex); |
- // All 4 properties must be specified. |
- if (!top.value() || !right.value() || !bottom.value() || !left.value()) |
- return String(); |
- |
- if (top.isImportant() != right.isImportant() || right.isImportant() != bottom.isImportant() || bottom.isImportant() != left.isImportant()) |
- return String(); |
- |
- if (top.isInherited() && right.isInherited() && bottom.isInherited() && left.isInherited()) |
- return getValueName(CSSValueInherit); |
- |
- unsigned numInitial = top.value()->isInitialValue() + right.value()->isInitialValue() + bottom.value()->isInitialValue() + left.value()->isInitialValue(); |
- if (numInitial == 4) |
- return getValueName(CSSValueInitial); |
- if (numInitial > 0) |
- return String(); |
- |
bool showLeft = !right.value()->equals(*left.value()); |
bool showBottom = !top.value()->equals(*bottom.value()) || showLeft; |
bool showRight = !top.value()->equals(*right.value()) || showBottom; |
@@ -625,9 +675,6 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
for (size_t i = 0; i < size; i++) { |
values[i] = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
- // A shorthand is not available if getPropertyCSSValue didn't resolve to anything. |
- if (!values[i]) |
- return String(); |
if (values[i]->isBaseValueList()) { |
const CSSValueList* valueList = toCSSValueList(values[i]); |
numLayers = std::max(numLayers, valueList->length()); |
@@ -635,10 +682,6 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
} |
StringBuilder result; |
- // Tracks whether or not all the values are initial or all the values are inherit. |
- // Start out assuming there is a common value. It will get set to false below if there isn't one. |
- bool hasCommonValue = true; |
- const CSSValue* commonValue = nullptr; |
// Now stitch the properties together. Implicit initial values are flagged as such and |
// can safely be omitted. |
@@ -724,15 +767,8 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
foundPositionYCSSProperty = true; |
// background-position is a special case. If only the first offset is specified, |
// the second one defaults to "center", not the same value. |
- if (hasCommonValue && !value->isInitialValue() && !value->isInheritedValue()) |
- hasCommonValue = false; |
} |
} |
- |
- if (hasCommonValue && !commonValue) |
- commonValue = value; |
- else if (!value->equals(*commonValue)) |
- hasCommonValue = false; |
} |
if (!layerResult.isEmpty()) { |
if (!result.isEmpty()) |
@@ -741,33 +777,21 @@ String StylePropertySerializer::getLayeredShorthandValue(const StylePropertyShor |
} |
} |
- if (hasCommonValue && (commonValue->isInitialValue() || commonValue->isInheritedValue())) |
- return commonValue->cssText(); |
- |
return result.toString(); |
} |
String StylePropertySerializer::getShorthandValue(const StylePropertyShorthand& shorthand, String separator) const |
{ |
- String commonValue; |
StringBuilder result; |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
const CSSValue* value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
- if (!value) |
- return String(); |
String valueText = value->cssText(); |
- if (!i) |
- commonValue = valueText; |
- else if (!commonValue.isNull() && commonValue != valueText) |
- commonValue = String(); |
if (value->isInitialValue()) |
continue; |
if (!result.isEmpty()) |
result.append(separator); |
result.append(valueText); |
} |
- if (isInitialOrInherit(commonValue)) |
- return commonValue; |
return result.toString(); |
} |
@@ -775,24 +799,14 @@ String StylePropertySerializer::getShorthandValue(const StylePropertyShorthand& |
String StylePropertySerializer::getCommonValue(const StylePropertyShorthand& shorthand) const |
{ |
String res; |
- bool lastPropertyWasImportant = false; |
for (unsigned i = 0; i < shorthand.length(); ++i) { |
const CSSValue* value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
// FIXME: CSSInitialValue::cssText should generate the right value. |
- if (!value) |
- return String(); |
String text = value->cssText(); |
- if (text.isNull()) |
- return String(); |
if (res.isNull()) |
res = text; |
else if (res != text) |
return String(); |
- |
- bool currentPropertyIsImportant = m_propertySet.propertyIsImportant(shorthand.properties()[i]); |
- if (i && lastPropertyWasImportant != currentPropertyIsImportant) |
- return String(); |
- lastPropertyWasImportant = currentPropertyIsImportant; |
} |
return res; |
} |
@@ -800,24 +814,17 @@ String StylePropertySerializer::getCommonValue(const StylePropertyShorthand& sho |
String StylePropertySerializer::borderPropertyValue() const |
{ |
const StylePropertyShorthand properties[3] = { borderWidthShorthand(), borderStyleShorthand(), borderColorShorthand() }; |
- String commonValue; |
StringBuilder result; |
for (size_t i = 0; i < WTF_ARRAY_LENGTH(properties); ++i) { |
String value = getCommonValue(properties[i]); |
if (value.isNull()) |
return String(); |
- if (!i) |
- commonValue = value; |
- else if (!commonValue.isNull() && commonValue != value) |
- commonValue = String(); |
if (value == "initial") |
continue; |
if (!result.isEmpty()) |
result.append(' '); |
result.append(value); |
} |
- if (isInitialOrInherit(commonValue)) |
- return commonValue; |
return result.isEmpty() ? String() : result.toString(); |
} |
@@ -846,12 +853,6 @@ String StylePropertySerializer::backgroundRepeatPropertyValue() const |
{ |
const CSSValue* repeatX = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundRepeatX); |
const CSSValue* repeatY = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundRepeatY); |
- if (!repeatX || !repeatY) |
- return String(); |
- if (m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatX) != m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatY)) |
- return String(); |
- if ((repeatX->isInitialValue() && repeatY->isInitialValue()) || (repeatX->isInheritedValue() && repeatY->isInheritedValue())) |
- return repeatX->cssText(); |
const CSSValueList* repeatXList = 0; |
int repeatXLength = 1; |
@@ -884,106 +885,4 @@ String StylePropertySerializer::backgroundRepeatPropertyValue() const |
return builder.toString(); |
} |
-void StylePropertySerializer::appendBackgroundPropertyAsText(StringBuilder& result, unsigned& numDecls) const |
-{ |
- if (isPropertyShorthandAvailable(backgroundShorthand())) { |
- String backgroundValue = getPropertyValue(CSSPropertyBackground); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundImage); |
- result.append(getPropertyText(CSSPropertyBackground, backgroundValue, isImportant, numDecls++)); |
- return; |
- } |
- if (shorthandHasOnlyInitialOrInheritedValue(backgroundShorthand())) { |
- const CSSValue* value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundImage); |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundImage); |
- result.append(getPropertyText(CSSPropertyBackground, value->cssText(), isImportant, numDecls++)); |
- return; |
- } |
- |
- // backgroundShorthandProperty without layered shorhand properties |
- const CSSPropertyID backgroundPropertyIds[] = { |
- CSSPropertyBackgroundImage, |
- CSSPropertyBackgroundAttachment, |
- CSSPropertyBackgroundColor, |
- CSSPropertyBackgroundSize, |
- CSSPropertyBackgroundOrigin, |
- CSSPropertyBackgroundClip |
- }; |
- |
- for (unsigned i = 0; i < WTF_ARRAY_LENGTH(backgroundPropertyIds); ++i) { |
- CSSPropertyID propertyID = backgroundPropertyIds[i]; |
- const CSSValue* value = m_propertySet.getPropertyCSSValue(propertyID); |
- if (!value) |
- continue; |
- result.append(getPropertyText(propertyID, value->cssText(), m_propertySet.propertyIsImportant(propertyID), numDecls++)); |
- } |
- |
- // FIXME: This is a not-so-nice way to turn x/y positions into single background-position in output. |
- // It is required because background-position-x/y are non-standard properties and WebKit generated output |
- // would not work in Firefox (<rdar://problem/5143183>) |
- // It would be a better solution if background-position was UnitType::Pair. |
- if (shorthandHasOnlyInitialOrInheritedValue(backgroundPositionShorthand())) { |
- const CSSValue* value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionX); |
- bool isImportant = m_propertySet.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); |
- if (!positionValue.isNull()) |
- result.append(getPropertyText(CSSPropertyBackgroundPosition, positionValue, isImportant, numDecls++)); |
- } else { |
- // should check background-position-x or background-position-y. |
- if (const CSSValue* value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionX)) { |
- if (!value->isImplicitInitialValue()) { |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionX); |
- result.append(getPropertyText(CSSPropertyBackgroundPositionX, value->cssText(), isImportant, numDecls++)); |
- } |
- } |
- if (const CSSValue* value = m_propertySet.getPropertyCSSValue(CSSPropertyBackgroundPositionY)) { |
- if (!value->isImplicitInitialValue()) { |
- bool isImportant = m_propertySet.propertyIsImportant(CSSPropertyBackgroundPositionY); |
- result.append(getPropertyText(CSSPropertyBackgroundPositionY, value->cssText(), isImportant, numDecls++)); |
- } |
- } |
- } |
- |
- String repeatValue = m_propertySet.getPropertyValue(CSSPropertyBackgroundRepeat); |
- if (!repeatValue.isNull()) |
- result.append(getPropertyText(CSSPropertyBackgroundRepeat, repeatValue, m_propertySet.propertyIsImportant(CSSPropertyBackgroundRepeatX), numDecls++)); |
-} |
- |
-bool StylePropertySerializer::isPropertyShorthandAvailable(const StylePropertyShorthand& shorthand) const |
-{ |
- ASSERT(shorthand.length() > 0); |
- |
- bool isImportant = m_propertySet.propertyIsImportant(shorthand.properties()[0]); |
- for (unsigned i = 0; i < shorthand.length(); ++i) { |
- const CSSValue* value = m_propertySet.getPropertyCSSValue(shorthand.properties()[i]); |
- if (!value || (value->isInitialValue() && !value->isImplicitInitialValue()) || value->isInheritedValue()) |
- return false; |
- if (isImportant != m_propertySet.propertyIsImportant(shorthand.properties()[i])) |
- return false; |
- } |
- return true; |
-} |
- |
-bool StylePropertySerializer::shorthandHasOnlyInitialOrInheritedValue(const StylePropertyShorthand& shorthand) const |
-{ |
- ASSERT(shorthand.length() > 0); |
- bool isImportant = m_propertySet.propertyIsImportant(shorthand.properties()[0]); |
- bool isInitialValue = true; |
- bool isInheritedValue = true; |
- for (unsigned i = 0; i < shorthand.length(); ++i) { |
- const CSSValue* value = m_propertySet.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])) |
- return false; |
- } |
- return isInitialValue || isInheritedValue; |
-} |
- |
} // namespace blink |