Index: third_party/WebKit/Source/core/editing/EditingStyle.cpp |
diff --git a/third_party/WebKit/Source/core/editing/EditingStyle.cpp b/third_party/WebKit/Source/core/editing/EditingStyle.cpp |
index 37c6177d142e6b33411b727cccb8dfc9a7f6e54c..0d2b4277b583517bbc8169105456167c1f6a22e7 100644 |
--- a/third_party/WebKit/Source/core/editing/EditingStyle.cpp |
+++ b/third_party/WebKit/Source/core/editing/EditingStyle.cpp |
@@ -30,6 +30,7 @@ |
#include "core/HTMLNames.h" |
#include "core/css/CSSColorValue.h" |
#include "core/css/CSSComputedStyleDeclaration.h" |
+#include "core/css/CSSIdentifierValue.h" |
#include "core/css/CSSPrimitiveValue.h" |
#include "core/css/CSSPrimitiveValueMappings.h" |
#include "core/css/CSSPropertyMetadata.h" |
@@ -159,7 +160,7 @@ static CSSComputedStyleDeclaration* ensureComputedStyle(const Position& position |
static MutableStylePropertySet* getPropertiesNotIn(StylePropertySet* styleWithRedundantProperties, CSSStyleDeclaration* baseStyle); |
enum LegacyFontSizeMode { AlwaysUseLegacyFontSize, UseLegacyFontSizeOnlyIfPixelValuesMatch }; |
-static int legacyFontSizeFromCSSValue(Document*, const CSSPrimitiveValue*, bool, LegacyFontSizeMode); |
+static int legacyFontSizeFromCSSValue(Document*, const CSSValue*, bool, LegacyFontSizeMode); |
static bool isTransparentColorValue(const CSSValue*); |
static bool hasTransparentBackgroundColor(CSSStyleDeclaration*); |
static bool hasTransparentBackgroundColor(StylePropertySet*); |
@@ -179,14 +180,14 @@ public: |
virtual bool valueIsPresentInStyle(HTMLElement*, StylePropertySet*) const; |
virtual void addToStyle(Element*, EditingStyle*) const; |
- DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_primitiveValue); } |
+ DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_identifierValue); } |
protected: |
HTMLElementEquivalent(CSSPropertyID); |
HTMLElementEquivalent(CSSPropertyID, const HTMLQualifiedName& tagName); |
HTMLElementEquivalent(CSSPropertyID, CSSValueID primitiveValue, const HTMLQualifiedName& tagName); |
const CSSPropertyID m_propertyID; |
- const Member<CSSPrimitiveValue> m_primitiveValue; |
+ const Member<CSSIdentifierValue> m_identifierValue; |
const HTMLQualifiedName* m_tagName; // We can store a pointer because HTML tag names are const global. |
}; |
@@ -202,23 +203,23 @@ HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id, const HTMLQualifi |
{ |
} |
-HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id, CSSValueID primitiveValue, const HTMLQualifiedName& tagName) |
+HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id, CSSValueID valueID, const HTMLQualifiedName& tagName) |
: m_propertyID(id) |
- , m_primitiveValue(CSSPrimitiveValue::createIdentifier(primitiveValue)) |
+ , m_identifierValue(CSSIdentifierValue::create(valueID)) |
, m_tagName(&tagName) |
{ |
- DCHECK_NE(primitiveValue, CSSValueInvalid); |
+ DCHECK_NE(valueID, CSSValueInvalid); |
} |
bool HTMLElementEquivalent::valueIsPresentInStyle(HTMLElement* element, StylePropertySet* style) const |
{ |
const CSSValue* value = style->getPropertyCSSValue(m_propertyID); |
- return matches(element) && value && value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == m_primitiveValue->getValueID(); |
+ return matches(element) && value && value->isIdentifierValue() && toCSSIdentifierValue(value)->getValueID() == m_identifierValue->getValueID(); |
} |
void HTMLElementEquivalent::addToStyle(Element*, EditingStyle* style) const |
{ |
- style->setProperty(m_propertyID, m_primitiveValue->cssText()); |
+ style->setProperty(m_propertyID, m_identifierValue->cssText()); |
} |
class HTMLTextDecorationEquivalent final : public HTMLElementEquivalent { |
@@ -253,7 +254,7 @@ bool HTMLTextDecorationEquivalent::valueIsPresentInStyle(HTMLElement* element, S |
const CSSValue* styleValue = style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect); |
if (!styleValue) |
styleValue = style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
- return matches(element) && styleValue && styleValue->isValueList() && toCSSValueList(styleValue)->hasValue(*m_primitiveValue); |
+ return matches(element) && styleValue && styleValue->isValueList() && toCSSValueList(styleValue)->hasValue(*m_identifierValue); |
} |
class HTMLAttributeEquivalent : public HTMLElementEquivalent { |
@@ -349,7 +350,7 @@ const CSSValue* HTMLFontSizeEquivalent::attributeValueAsCSSValue(Element* elemen |
CSSValueID size; |
if (!HTMLFontElement::cssValueFromFontSizeNumber(value, size)) |
return nullptr; |
- return CSSPrimitiveValue::createIdentifier(size); |
+ return CSSIdentifierValue::create(size); |
} |
float EditingStyle::NoFontDelta = 0.0f; |
@@ -379,7 +380,7 @@ EditingStyle::EditingStyle(CSSPropertyID propertyID, const String& value) |
static Color cssValueToColor(const CSSValue* colorValue) |
{ |
- if (!colorValue || (!colorValue->isColorValue() && !colorValue->isPrimitiveValue())) |
+ if (!colorValue || (!colorValue->isColorValue() && !colorValue->isPrimitiveValue() && !colorValue->isIdentifierValue())) |
return Color::transparent; |
if (colorValue->isColorValue()) |
@@ -535,16 +536,16 @@ bool EditingStyle::textDirection(WritingDirection& writingDirection) const |
return false; |
const CSSValue* unicodeBidi = m_mutableStyle->getPropertyCSSValue(CSSPropertyUnicodeBidi); |
- if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
+ if (!unicodeBidi || !unicodeBidi->isIdentifierValue()) |
return false; |
- CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValueID(); |
+ CSSValueID unicodeBidiValue = toCSSIdentifierValue(unicodeBidi)->getValueID(); |
if (isEmbedOrIsolate(unicodeBidiValue)) { |
const CSSValue* direction = m_mutableStyle->getPropertyCSSValue(CSSPropertyDirection); |
- if (!direction || !direction->isPrimitiveValue()) |
+ if (!direction || !direction->isIdentifierValue()) |
return false; |
- writingDirection = toCSSPrimitiveValue(direction)->getValueID() == CSSValueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection; |
+ writingDirection = toCSSIdentifierValue(direction)->getValueID() == CSSValueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection; |
return true; |
} |
@@ -754,7 +755,7 @@ TriState EditingStyle::triStateOfStyle(const VisibleSelection& selection) const |
// style(vertical-align) to it so that document.queryCommandState() works with the style. |
// See bug http://crbug.com/582225. |
if (m_isVerticalAlign && getIdentifierValue(nodeStyle, CSSPropertyVerticalAlign) == CSSValueBaseline) { |
- const CSSPrimitiveValue* verticalAlign = toCSSPrimitiveValue(m_mutableStyle->getPropertyCSSValue(CSSPropertyVerticalAlign)); |
+ const CSSIdentifierValue* verticalAlign = toCSSIdentifierValue(m_mutableStyle->getPropertyCSSValue(CSSPropertyVerticalAlign)); |
if (hasAncestorVerticalAlignStyle(node, verticalAlign->getValueID())) |
node.mutableComputedStyle()->setVerticalAlign(verticalAlign->convertTo<EVerticalAlign>()); |
} |
@@ -1019,10 +1020,10 @@ void EditingStyle::prepareToApplyAt(const Position& position, ShouldPreserveWrit |
|| cssValueToColor(m_mutableStyle->getPropertyCSSValue(CSSPropertyBackgroundColor)) == backgroundColorInEffect(position.computeContainerNode())) |
m_mutableStyle->removeProperty(CSSPropertyBackgroundColor); |
- if (unicodeBidi && unicodeBidi->isPrimitiveValue()) { |
- m_mutableStyle->setProperty(CSSPropertyUnicodeBidi, toCSSPrimitiveValue(unicodeBidi)->getValueID()); |
- if (direction && direction->isPrimitiveValue()) |
- m_mutableStyle->setProperty(CSSPropertyDirection, toCSSPrimitiveValue(direction)->getValueID()); |
+ if (unicodeBidi && unicodeBidi->isIdentifierValue()) { |
+ m_mutableStyle->setProperty(CSSPropertyUnicodeBidi, toCSSIdentifierValue(unicodeBidi)->getValueID()); |
+ if (direction && direction->isIdentifierValue()) |
+ m_mutableStyle->setProperty(CSSPropertyDirection, toCSSIdentifierValue(direction)->getValueID()); |
} |
} |
@@ -1142,8 +1143,8 @@ EditingStyle* EditingStyle::wrappingStyleForSerialization(ContainerNode* context |
static const CSSValueList& mergeTextDecorationValues(const CSSValueList& mergedValue, const CSSValueList& valueToMerge) |
{ |
- DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::createIdentifier(CSSValueUnderline))); |
- DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::createIdentifier(CSSValueLineThrough))); |
+ DEFINE_STATIC_LOCAL(CSSIdentifierValue, underline, (CSSIdentifierValue::create(CSSValueUnderline))); |
+ DEFINE_STATIC_LOCAL(CSSIdentifierValue, lineThrough, (CSSIdentifierValue::create(CSSValueLineThrough))); |
CSSValueList& result = *mergedValue.copy(); |
if (valueToMerge.hasValue(underline) && !mergedValue.hasValue(underline)) |
result.append(underline); |
@@ -1324,10 +1325,9 @@ void EditingStyle::forceInline() |
int EditingStyle::legacyFontSize(Document* document) const |
{ |
const CSSValue* cssValue = m_mutableStyle->getPropertyCSSValue(CSSPropertyFontSize); |
- if (!cssValue || !cssValue->isPrimitiveValue()) |
+ if (!cssValue || !(cssValue->isPrimitiveValue() || cssValue->isIdentifierValue())) |
return 0; |
- return legacyFontSizeFromCSSValue(document, toCSSPrimitiveValue(cssValue), |
- m_isMonospaceFont, AlwaysUseLegacyFontSize); |
+ return legacyFontSizeFromCSSValue(document, cssValue, m_isMonospaceFont, AlwaysUseLegacyFontSize); |
} |
EditingStyle* EditingStyle::styleAtSelectionStart(const VisibleSelection& selection, bool shouldUseBackgroundColorInEffect, MutableStylePropertySet* styleToCheck) |
@@ -1415,10 +1415,10 @@ WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection& |
CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::create(&n); |
const CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSPropertyUnicodeBidi); |
- if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
+ if (!unicodeBidi || !unicodeBidi->isIdentifierValue()) |
continue; |
- CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValueID(); |
+ CSSValueID unicodeBidiValue = toCSSIdentifierValue(unicodeBidi)->getValueID(); |
if (isUnicodeBidiNestedOrMultipleEmbeddings(unicodeBidiValue)) |
return NaturalWritingDirection; |
} |
@@ -1448,10 +1448,10 @@ WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection& |
Element* element = &toElement(runner); |
CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::create(element); |
const CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSPropertyUnicodeBidi); |
- if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
+ if (!unicodeBidi || !unicodeBidi->isIdentifierValue()) |
continue; |
- CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValueID(); |
+ CSSValueID unicodeBidiValue = toCSSIdentifierValue(unicodeBidi)->getValueID(); |
if (unicodeBidiValue == CSSValueNormal) |
continue; |
@@ -1460,10 +1460,10 @@ WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection& |
DCHECK(isEmbedOrIsolate(unicodeBidiValue)) << unicodeBidiValue; |
const CSSValue* direction = style->getPropertyCSSValue(CSSPropertyDirection); |
- if (!direction || !direction->isPrimitiveValue()) |
+ if (!direction || !direction->isIdentifierValue()) |
continue; |
- int directionValue = toCSSPrimitiveValue(direction)->getValueID(); |
+ int directionValue = toCSSIdentifierValue(direction)->getValueID(); |
if (directionValue != CSSValueLtr && directionValue != CSSValueRtl) |
continue; |
@@ -1566,8 +1566,8 @@ void StyleChange::extractTextStyles(Document* document, MutableStylePropertySet* |
// Furthermore, text-decoration: none has been trimmed so that text-decoration property is always a CSSValueList. |
const CSSValue* textDecoration = style->getPropertyCSSValue(textDecorationPropertyForEditing()); |
if (textDecoration && textDecoration->isValueList()) { |
- DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::createIdentifier(CSSValueUnderline))); |
- DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::createIdentifier(CSSValueLineThrough))); |
+ DEFINE_STATIC_LOCAL(CSSIdentifierValue, underline, (CSSIdentifierValue::create(CSSValueUnderline))); |
+ DEFINE_STATIC_LOCAL(CSSIdentifierValue, lineThrough, (CSSIdentifierValue::create(CSSValueLineThrough))); |
CSSValueList* newTextDecoration = toCSSValueList(textDecoration)->copy(); |
if (newTextDecoration->removeAll(underline)) |
m_applyUnderline = true; |
@@ -1601,9 +1601,9 @@ void StyleChange::extractTextStyles(Document* document, MutableStylePropertySet* |
style->removeProperty(CSSPropertyFontFamily); |
if (const CSSValue* fontSize = style->getPropertyCSSValue(CSSPropertyFontSize)) { |
- if (!fontSize->isPrimitiveValue()) { |
+ if (!fontSize->isPrimitiveValue() && !fontSize->isIdentifierValue()) { |
style->removeProperty(CSSPropertyFontSize); // Can't make sense of the number. Put no font size. |
- } else if (int legacyFontSize = legacyFontSizeFromCSSValue(document, toCSSPrimitiveValue(fontSize), isMonospaceFont, UseLegacyFontSizeOnlyIfPixelValuesMatch)) { |
+ } else if (int legacyFontSize = legacyFontSizeFromCSSValue(document, fontSize, isMonospaceFont, UseLegacyFontSizeOnlyIfPixelValuesMatch)) { |
m_applyFontSize = String::number(legacyFontSize); |
style->removeProperty(CSSPropertyFontSize); |
} |
@@ -1627,12 +1627,12 @@ static void diffTextDecorations(MutableStylePropertySet* style, CSSPropertyID pr |
static bool fontWeightIsBold(const CSSValue* fontWeight) |
{ |
- if (!fontWeight->isPrimitiveValue()) |
+ if (!fontWeight->isIdentifierValue()) |
return false; |
// Because b tag can only bold text, there are only two states in plain html: bold and not bold. |
// Collapse all other values to either one of these two states for editing purposes. |
- switch (toCSSPrimitiveValue(fontWeight)->getValueID()) { |
+ switch (toCSSIdentifierValue(fontWeight)->getValueID()) { |
case CSSValue100: |
case CSSValue200: |
case CSSValue300: |
@@ -1656,10 +1656,10 @@ static bool fontWeightIsBold(const CSSValue* fontWeight) |
static bool fontWeightNeedsResolving(const CSSValue* fontWeight) |
{ |
- if (!fontWeight->isPrimitiveValue()) |
+ if (!fontWeight->isIdentifierValue()) |
return true; |
- const CSSValueID value = toCSSPrimitiveValue(fontWeight)->getValueID(); |
+ const CSSValueID value = toCSSIdentifierValue(fontWeight)->getValueID(); |
return value == CSSValueLighter || value == CSSValueBolder; |
} |
@@ -1701,9 +1701,9 @@ CSSValueID getIdentifierValue(StylePropertySet* style, CSSPropertyID propertyID) |
if (!style) |
return CSSValueInvalid; |
const CSSValue* value = style->getPropertyCSSValue(propertyID); |
- if (!value || !value->isPrimitiveValue()) |
+ if (!value || !value->isIdentifierValue()) |
return CSSValueInvalid; |
- return toCSSPrimitiveValue(value)->getValueID(); |
+ return toCSSIdentifierValue(value)->getValueID(); |
} |
CSSValueID getIdentifierValue(CSSStyleDeclaration* style, CSSPropertyID propertyID) |
@@ -1711,28 +1711,34 @@ CSSValueID getIdentifierValue(CSSStyleDeclaration* style, CSSPropertyID property |
if (!style) |
return CSSValueInvalid; |
const CSSValue* value = style->getPropertyCSSValueInternal(propertyID); |
- if (!value || !value->isPrimitiveValue()) |
+ if (!value || !value->isIdentifierValue()) |
return CSSValueInvalid; |
- return toCSSPrimitiveValue(value)->getValueID(); |
+ return toCSSIdentifierValue(value)->getValueID(); |
} |
-int legacyFontSizeFromCSSValue(Document* document, const CSSPrimitiveValue* value, bool isMonospaceFont, LegacyFontSizeMode mode) |
+int legacyFontSizeFromCSSValue(Document* document, const CSSValue* value, bool isMonospaceFont, LegacyFontSizeMode mode) |
{ |
- CSSPrimitiveValue::LengthUnitType lengthType; |
- if (CSSPrimitiveValue::unitTypeToLengthUnitType(value->typeWithCalcResolved(), lengthType) |
- && lengthType == CSSPrimitiveValue::UnitTypePixels) { |
- double conversion = CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(value->typeWithCalcResolved()); |
- int pixelFontSize = clampTo<int>(value->getDoubleValue() * conversion); |
- int legacyFontSize = FontSize::legacyFontSize(document, pixelFontSize, isMonospaceFont); |
- // Use legacy font size only if pixel value matches exactly to that of legacy font size. |
- if (mode == AlwaysUseLegacyFontSize || FontSize::fontSizeForKeyword(document, legacyFontSize, isMonospaceFont) == pixelFontSize) |
- return legacyFontSize; |
+ if (value->isPrimitiveValue()) { |
+ const CSSPrimitiveValue& primitiveValue = toCSSPrimitiveValue(*value); |
+ CSSPrimitiveValue::LengthUnitType lengthType; |
+ if (CSSPrimitiveValue::unitTypeToLengthUnitType(primitiveValue.typeWithCalcResolved(), lengthType) |
+ && lengthType == CSSPrimitiveValue::UnitTypePixels) { |
+ double conversion = CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor(primitiveValue.typeWithCalcResolved()); |
+ int pixelFontSize = clampTo<int>(primitiveValue.getDoubleValue() * conversion); |
+ int legacyFontSize = FontSize::legacyFontSize(document, pixelFontSize, isMonospaceFont); |
+ // Use legacy font size only if pixel value matches exactly to that of legacy font size. |
+ if (mode == AlwaysUseLegacyFontSize || FontSize::fontSizeForKeyword(document, legacyFontSize, isMonospaceFont) == pixelFontSize) |
+ return legacyFontSize; |
- return 0; |
+ return 0; |
+ } |
} |
- if (CSSValueXSmall <= value->getValueID() && value->getValueID() <= CSSValueWebkitXxxLarge) |
- return value->getValueID() - CSSValueXSmall + 1; |
+ if (value->isIdentifierValue()) { |
+ const CSSIdentifierValue& identifierValue = toCSSIdentifierValue(*value); |
+ if (CSSValueXSmall <= identifierValue.getValueID() && identifierValue.getValueID() <= CSSValueWebkitXxxLarge) |
+ return identifierValue.getValueID() - CSSValueXSmall + 1; |
+ } |
return 0; |
} |
@@ -1743,10 +1749,9 @@ bool isTransparentColorValue(const CSSValue* cssValue) |
return true; |
if (cssValue->isColorValue()) |
return !toCSSColorValue(cssValue)->value().alpha(); |
- if (!cssValue->isPrimitiveValue()) |
+ if (!cssValue->isIdentifierValue()) |
return false; |
- const CSSPrimitiveValue* value = toCSSPrimitiveValue(cssValue); |
- return value->getValueID() == CSSValueTransparent; |
+ return toCSSIdentifierValue(cssValue)->getValueID() == CSSValueTransparent; |
} |
bool hasTransparentBackgroundColor(CSSStyleDeclaration* style) |