Chromium Code Reviews| Index: Source/core/editing/EditingStyle.cpp |
| diff --git a/Source/core/editing/EditingStyle.cpp b/Source/core/editing/EditingStyle.cpp |
| index 07d155599197d256996d15a817e643e2241a69f5..5b488558b6ab20a60a96417d8176c2004901bbbb 100644 |
| --- a/Source/core/editing/EditingStyle.cpp |
| +++ b/Source/core/editing/EditingStyle.cpp |
| @@ -56,16 +56,25 @@ |
| namespace WebCore { |
| +static const CSSPropertyID& textDecorationPropertyForEditing() |
| +{ |
| + static const CSSPropertyID property = RuntimeEnabledFeatures::css3TextDecorationsEnabled() ? CSSPropertyTextDecorationLine : CSSPropertyTextDecoration; |
| + return property; |
| +} |
| + |
| // Editing style properties must be preserved during editing operation. |
| // e.g. when a user inserts a new paragraph, all properties listed here must be copied to the new paragraph. |
| // NOTE: Use editingProperties() to respect runtime enabling of properties. |
| -static const unsigned nonInheritedStaticPropertiesCount = 2; |
| +static const unsigned nonInheritedStaticPropertiesCount = 3; |
|
Julien - ping for review
2013/08/07 17:10:00
It's too bad this isn't tested but I couldn't find
abinader
2013/08/07 17:24:04
Right, just in case, as we discussed yesterday on
|
| static const CSSPropertyID staticEditingProperties[] = { |
| - // NOTE: inheritableEditingProperties depends on these two properties being first. |
| + // NOTE: inheritableEditingProperties depends on these properties being first. |
| // If you change this list, make sure to update nonInheritedPropertyCount. |
| CSSPropertyBackgroundColor, |
| + // FIXME: CSSPropertyTextDecoration needs to be removed when CSS3 Text |
| + // Decoration feature is no longer experimental. |
| CSSPropertyTextDecoration, |
| + CSSPropertyTextDecorationLine, |
| // CSS inheritable properties |
| CSSPropertyColor, |
| @@ -94,8 +103,14 @@ enum EditingPropertiesType { OnlyInheritableEditingProperties, AllEditingPropert |
| static const Vector<CSSPropertyID>& allEditingProperties() |
| { |
| DEFINE_STATIC_LOCAL(Vector<CSSPropertyID>, properties, ()); |
| - if (properties.isEmpty()) |
| + if (properties.isEmpty()) { |
| RuntimeCSSEnabled::filterEnabledCSSPropertiesIntoVector(staticEditingProperties, WTF_ARRAY_LENGTH(staticEditingProperties), properties); |
| + // This ensures we have only one of these properties on the vector. |
| + if (RuntimeEnabledFeatures::css3TextDecorationsEnabled()) |
| + properties.remove(properties.find(CSSPropertyTextDecoration)); |
| + else |
| + properties.remove(properties.find(CSSPropertyTextDecorationLine)); |
| + } |
| return properties; |
| } |
| @@ -204,21 +219,22 @@ private: |
| }; |
| HTMLTextDecorationEquivalent::HTMLTextDecorationEquivalent(CSSValueID primitiveValue, const QualifiedName& tagName) |
| - : HTMLElementEquivalent(CSSPropertyTextDecoration, primitiveValue, tagName) |
| + : HTMLElementEquivalent(textDecorationPropertyForEditing(), primitiveValue, tagName) |
| // m_propertyID is used in HTMLElementEquivalent::addToStyle |
| { |
| } |
| bool HTMLTextDecorationEquivalent::propertyExistsInStyle(const StylePropertySet* style) const |
| { |
| - return style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) || style->getPropertyCSSValue(CSSPropertyTextDecoration); |
| + return style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) |
| + || style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
| } |
| bool HTMLTextDecorationEquivalent::valueIsPresentInStyle(Element* element, StylePropertySet* style) const |
| { |
| RefPtr<CSSValue> styleValue = style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect); |
| if (!styleValue) |
| - styleValue = style->getPropertyCSSValue(CSSPropertyTextDecoration); |
| + styleValue = style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
| return matches(element) && styleValue && styleValue->isValueList() && toCSSValueList(styleValue.get())->hasValue(m_primitiveValue.get()); |
| } |
| @@ -652,15 +668,18 @@ void EditingStyle::collapseTextDecorationProperties() |
| return; |
| if (textDecorationsInEffect->isValueList()) |
| - m_mutableStyle->setProperty(CSSPropertyTextDecoration, textDecorationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(CSSPropertyTextDecoration)); |
| + m_mutableStyle->setProperty(textDecorationPropertyForEditing(), textDecorationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(textDecorationPropertyForEditing())); |
| else |
| - m_mutableStyle->removeProperty(CSSPropertyTextDecoration); |
| + m_mutableStyle->removeProperty(textDecorationPropertyForEditing()); |
| m_mutableStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect); |
| } |
| // CSS properties that create a visual difference only when applied to text. |
| static const CSSPropertyID textOnlyProperties[] = { |
| + // FIXME: CSSPropertyTextDecoration needs to be removed when CSS3 Text |
| + // Decoration feature is no longer experimental. |
| CSSPropertyTextDecoration, |
| + CSSPropertyTextDecorationLine, |
| CSSPropertyWebkitTextDecorationsInEffect, |
| CSSPropertyFontStyle, |
| CSSPropertyFontWeight, |
| @@ -737,12 +756,16 @@ bool EditingStyle::conflictsWithInlineStyleOfElement(Element* element, EditingSt |
| if (propertyID == CSSPropertyWhiteSpace && isTabSpanNode(element)) |
| continue; |
| - if (propertyID == CSSPropertyWebkitTextDecorationsInEffect && inlineStyle->getPropertyCSSValue(CSSPropertyTextDecoration)) { |
| + if (propertyID == CSSPropertyWebkitTextDecorationsInEffect && inlineStyle->getPropertyCSSValue(textDecorationPropertyForEditing())) { |
| if (!conflictingProperties) |
| return true; |
| conflictingProperties->append(CSSPropertyTextDecoration); |
| + // Because text-decoration expands to text-decoration-line when CSS3 |
| + // Text Decoration is enabled, we also state it as conflicting. |
| + if (RuntimeEnabledFeatures::css3TextDecorationsEnabled()) |
| + conflictingProperties->append(CSSPropertyTextDecorationLine); |
| if (extractedStyle) |
| - extractedStyle->setProperty(CSSPropertyTextDecoration, inlineStyle->getPropertyValue(CSSPropertyTextDecoration), inlineStyle->propertyIsImportant(CSSPropertyTextDecoration)); |
| + extractedStyle->setProperty(textDecorationPropertyForEditing(), inlineStyle->getPropertyValue(textDecorationPropertyForEditing()), inlineStyle->propertyIsImportant(textDecorationPropertyForEditing())); |
| continue; |
| } |
| @@ -1083,7 +1106,7 @@ void EditingStyle::mergeStyle(const StylePropertySet* style, CSSPropertyOverride |
| RefPtr<CSSValue> value = m_mutableStyle->getPropertyCSSValue(property.id()); |
| // text decorations never override values |
| - if ((property.id() == CSSPropertyTextDecoration || property.id() == CSSPropertyWebkitTextDecorationsInEffect) && property.value()->isValueList() && value) { |
| + if ((property.id() == textDecorationPropertyForEditing() || property.id() == CSSPropertyWebkitTextDecorationsInEffect) && property.value()->isValueList() && value) { |
| if (value->isValueList()) { |
| mergeTextDecorationValues(toCSSValueList(value.get()), toCSSValueList(property.value())); |
| continue; |
| @@ -1338,18 +1361,18 @@ WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection& |
| static void reconcileTextDecorationProperties(MutableStylePropertySet* style) |
| { |
| RefPtr<CSSValue> textDecorationsInEffect = style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect); |
| - RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(CSSPropertyTextDecoration); |
| + RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
| // We shouldn't have both text-decoration and -webkit-text-decorations-in-effect because that wouldn't make sense. |
| ASSERT(!textDecorationsInEffect || !textDecoration); |
| if (textDecorationsInEffect) { |
| - style->setProperty(CSSPropertyTextDecoration, textDecorationsInEffect->cssText()); |
| + style->setProperty(textDecorationPropertyForEditing(), textDecorationsInEffect->cssText()); |
| style->removeProperty(CSSPropertyWebkitTextDecorationsInEffect); |
| textDecoration = textDecorationsInEffect; |
| } |
| // If text-decoration is set to "none", remove the property because we don't want to add redundant "text-decoration: none". |
| if (textDecoration && !textDecoration->isValueList()) |
| - style->removeProperty(CSSPropertyTextDecoration); |
| + style->removeProperty(textDecorationPropertyForEditing()); |
| } |
| StyleChange::StyleChange(EditingStyle* style, const Position& position) |
| @@ -1413,7 +1436,7 @@ void StyleChange::extractTextStyles(Document* document, MutableStylePropertySet* |
| // Assuming reconcileTextDecorationProperties has been called, there should not be -webkit-text-decorations-in-effect |
| // Furthermore, text-decoration: none has been trimmed so that text-decoration property is always a CSSValueList. |
| - RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(CSSPropertyTextDecoration); |
| + RefPtr<CSSValue> textDecoration = style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
| if (textDecoration && textDecoration->isValueList()) { |
| DEFINE_STATIC_LOCAL(RefPtr<CSSPrimitiveValue>, underline, (CSSPrimitiveValue::createIdentifier(CSSValueUnderline))); |
| DEFINE_STATIC_LOCAL(RefPtr<CSSPrimitiveValue>, lineThrough, (CSSPrimitiveValue::createIdentifier(CSSValueLineThrough))); |
| @@ -1425,7 +1448,7 @@ void StyleChange::extractTextStyles(Document* document, MutableStylePropertySet* |
| m_applyLineThrough = true; |
| // If trimTextDecorations, delete underline and line-through |
| - setTextDecorationProperty(style, newTextDecoration.get(), CSSPropertyTextDecoration); |
| + setTextDecorationProperty(style, newTextDecoration.get(), textDecorationPropertyForEditing()); |
| } |
| int verticalAlign = getIdentifierValue(style, CSSPropertyVerticalAlign); |
| @@ -1530,7 +1553,7 @@ PassRefPtr<MutableStylePropertySet> getPropertiesNotIn(StylePropertySet* styleWi |
| result->removeEquivalentProperties(baseStyle); |
| RefPtr<CSSValue> baseTextDecorationsInEffect = baseStyle->getPropertyCSSValueInternal(CSSPropertyWebkitTextDecorationsInEffect); |
| - diffTextDecorations(result.get(), CSSPropertyTextDecoration, baseTextDecorationsInEffect.get()); |
| + diffTextDecorations(result.get(), textDecorationPropertyForEditing(), baseTextDecorationsInEffect.get()); |
| diffTextDecorations(result.get(), CSSPropertyWebkitTextDecorationsInEffect, baseTextDecorationsInEffect.get()); |
| if (baseStyle->getPropertyCSSValueInternal(CSSPropertyFontWeight) && fontWeightIsBold(result.get()) == fontWeightIsBold(baseStyle)) |