| Index: Source/core/editing/EditingStyle.cpp
|
| diff --git a/Source/core/editing/EditingStyle.cpp b/Source/core/editing/EditingStyle.cpp
|
| index 4de2caaff33eec502b53a0dafe9fff794b724418..fc85bc256081288ad644ffb99ead339982656065 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;
|
|
|
| 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());
|
| }
|
|
|
| @@ -646,15 +662,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,
|
| @@ -731,12 +750,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;
|
| }
|
|
|
| @@ -1094,7 +1117,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;
|
| @@ -1349,18 +1372,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)
|
| @@ -1424,7 +1447,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)));
|
| @@ -1436,7 +1459,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);
|
| @@ -1541,7 +1564,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))
|
|
|