| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008, 2009 Apple Computer, Inc. | 2 * Copyright (C) 2007, 2008, 2009 Apple Computer, Inc. |
| 3 * Copyright (C) 2010, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2010, 2011 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 #include "core/editing/FrameSelection.h" | 50 #include "core/editing/FrameSelection.h" |
| 51 #include "core/editing/Position.h" | 51 #include "core/editing/Position.h" |
| 52 #include "core/editing/commands/ApplyStyleCommand.h" | 52 #include "core/editing/commands/ApplyStyleCommand.h" |
| 53 #include "core/editing/serializers/HTMLInterchange.h" | 53 #include "core/editing/serializers/HTMLInterchange.h" |
| 54 #include "core/frame/LocalFrame.h" | 54 #include "core/frame/LocalFrame.h" |
| 55 #include "core/html/HTMLFontElement.h" | 55 #include "core/html/HTMLFontElement.h" |
| 56 #include "core/html/HTMLSpanElement.h" | 56 #include "core/html/HTMLSpanElement.h" |
| 57 #include "core/layout/LayoutBox.h" | 57 #include "core/layout/LayoutBox.h" |
| 58 #include "core/layout/LayoutObject.h" | 58 #include "core/layout/LayoutObject.h" |
| 59 #include "core/style/ComputedStyle.h" | 59 #include "core/style/ComputedStyle.h" |
| 60 #include "wtf/StdLibExtras.h" |
| 60 | 61 |
| 61 namespace blink { | 62 namespace blink { |
| 62 | 63 |
| 63 static const CSSPropertyID& textDecorationPropertyForEditing() | 64 static const CSSPropertyID& textDecorationPropertyForEditing() |
| 64 { | 65 { |
| 65 static const CSSPropertyID property = RuntimeEnabledFeatures::css3TextDecora
tionsEnabled() ? CSSPropertyTextDecorationLine : CSSPropertyTextDecoration; | 66 static const CSSPropertyID property = RuntimeEnabledFeatures::css3TextDecora
tionsEnabled() ? CSSPropertyTextDecorationLine : CSSPropertyTextDecoration; |
| 66 return property; | 67 return property; |
| 67 } | 68 } |
| 68 | 69 |
| 69 // Editing style properties must be preserved during editing operation. | 70 // Editing style properties must be preserved during editing operation. |
| (...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 818 | 819 |
| 819 if (extractedStyle) | 820 if (extractedStyle) |
| 820 extractedStyle->setProperty(propertyID, inlineStyle->getPropertyValu
e(propertyID), inlineStyle->propertyIsImportant(propertyID)); | 821 extractedStyle->setProperty(propertyID, inlineStyle->getPropertyValu
e(propertyID), inlineStyle->propertyIsImportant(propertyID)); |
| 821 } | 822 } |
| 822 | 823 |
| 823 return conflictingProperties && !conflictingProperties->isEmpty(); | 824 return conflictingProperties && !conflictingProperties->isEmpty(); |
| 824 } | 825 } |
| 825 | 826 |
| 826 static const HeapVector<Member<HTMLElementEquivalent>>& htmlElementEquivalents() | 827 static const HeapVector<Member<HTMLElementEquivalent>>& htmlElementEquivalents() |
| 827 { | 828 { |
| 828 DEFINE_STATIC_LOCAL(PersistentHeapVector<Member<HTMLElementEquivalent>>, HTM
LElementEquivalents, ()); | 829 DEFINE_STATIC_LOCAL(HeapVector<Member<HTMLElementEquivalent>>, HTMLElementEq
uivalents, (new HeapVector<Member<HTMLElementEquivalent>>)); |
| 829 if (!HTMLElementEquivalents.size()) { | 830 if (!HTMLElementEquivalents.size()) { |
| 830 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontWeight, CSSValueBold, HTMLNames::bTag)); | 831 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontWeight, CSSValueBold, HTMLNames::bTag)); |
| 831 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontWeight, CSSValueBold, HTMLNames::strongTag)); | 832 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontWeight, CSSValueBold, HTMLNames::strongTag)); |
| 832 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyV
erticalAlign, CSSValueSub, HTMLNames::subTag)); | 833 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyV
erticalAlign, CSSValueSub, HTMLNames::subTag)); |
| 833 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyV
erticalAlign, CSSValueSuper, HTMLNames::supTag)); | 834 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyV
erticalAlign, CSSValueSuper, HTMLNames::supTag)); |
| 834 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontStyle, CSSValueItalic, HTMLNames::iTag)); | 835 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontStyle, CSSValueItalic, HTMLNames::iTag)); |
| 835 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontStyle, CSSValueItalic, HTMLNames::emTag)); | 836 HTMLElementEquivalents.append(HTMLElementEquivalent::create(CSSPropertyF
ontStyle, CSSValueItalic, HTMLNames::emTag)); |
| 836 | 837 |
| 837 HTMLElementEquivalents.append(HTMLTextDecorationEquivalent::create(CSSVa
lueUnderline, HTMLNames::uTag)); | 838 HTMLElementEquivalents.append(HTMLTextDecorationEquivalent::create(CSSVa
lueUnderline, HTMLNames::uTag)); |
| 838 HTMLElementEquivalents.append(HTMLTextDecorationEquivalent::create(CSSVa
lueLineThrough, HTMLNames::sTag)); | 839 HTMLElementEquivalents.append(HTMLTextDecorationEquivalent::create(CSSVa
lueLineThrough, HTMLNames::sTag)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 856 if (extractedStyle) | 857 if (extractedStyle) |
| 857 equivalent->addToStyle(element, extractedStyle); | 858 equivalent->addToStyle(element, extractedStyle); |
| 858 return true; | 859 return true; |
| 859 } | 860 } |
| 860 } | 861 } |
| 861 return false; | 862 return false; |
| 862 } | 863 } |
| 863 | 864 |
| 864 static const HeapVector<Member<HTMLAttributeEquivalent>>& htmlAttributeEquivalen
ts() | 865 static const HeapVector<Member<HTMLAttributeEquivalent>>& htmlAttributeEquivalen
ts() |
| 865 { | 866 { |
| 866 DEFINE_STATIC_LOCAL(PersistentHeapVector<Member<HTMLAttributeEquivalent>>, H
TMLAttributeEquivalents, ()); | 867 DEFINE_STATIC_LOCAL(HeapVector<Member<HTMLAttributeEquivalent>>, HTMLAttribu
teEquivalents, (new HeapVector<Member<HTMLAttributeEquivalent>>)); |
| 867 if (!HTMLAttributeEquivalents.size()) { | 868 if (!HTMLAttributeEquivalents.size()) { |
| 868 // elementIsStyledSpanOrHTMLEquivalent depends on the fact each HTMLAttr
iuteEquivalent matches exactly one attribute | 869 // elementIsStyledSpanOrHTMLEquivalent depends on the fact each HTMLAttr
iuteEquivalent matches exactly one attribute |
| 869 // of exactly one element except dirAttr. | 870 // of exactly one element except dirAttr. |
| 870 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyColor, HTMLNames::fontTag, HTMLNames::colorAttr)); | 871 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyColor, HTMLNames::fontTag, HTMLNames::colorAttr)); |
| 871 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyFontFamily, HTMLNames::fontTag, HTMLNames::faceAttr)); | 872 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyFontFamily, HTMLNames::fontTag, HTMLNames::faceAttr)); |
| 872 HTMLAttributeEquivalents.append(HTMLFontSizeEquivalent::create()); | 873 HTMLAttributeEquivalents.append(HTMLFontSizeEquivalent::create()); |
| 873 | 874 |
| 874 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyDirection, HTMLNames::dirAttr)); | 875 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyDirection, HTMLNames::dirAttr)); |
| 875 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyUnicodeBidi, HTMLNames::dirAttr)); | 876 HTMLAttributeEquivalents.append(HTMLAttributeEquivalent::create(CSSPrope
rtyUnicodeBidi, HTMLNames::dirAttr)); |
| 876 } | 877 } |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 wrappingStyle->mergeInlineAndImplicitStyleOfElement(toElement(node),
EditingStyle::DoNotOverrideValues, | 1124 wrappingStyle->mergeInlineAndImplicitStyleOfElement(toElement(node),
EditingStyle::DoNotOverrideValues, |
| 1124 EditingStyle::EditingPropertiesInEffect); | 1125 EditingStyle::EditingPropertiesInEffect); |
| 1125 } | 1126 } |
| 1126 } | 1127 } |
| 1127 | 1128 |
| 1128 return wrappingStyle.release(); | 1129 return wrappingStyle.release(); |
| 1129 } | 1130 } |
| 1130 | 1131 |
| 1131 static void mergeTextDecorationValues(CSSValueList* mergedValue, const CSSValueL
ist* valueToMerge) | 1132 static void mergeTextDecorationValues(CSSValueList* mergedValue, const CSSValueL
ist* valueToMerge) |
| 1132 { | 1133 { |
| 1133 DEFINE_STATIC_REF_WILL_BE_PERSISTENT(CSSPrimitiveValue, underline, (CSSPrimi
tiveValue::createIdentifier(CSSValueUnderline))); | 1134 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::create
Identifier(CSSValueUnderline))); |
| 1134 DEFINE_STATIC_REF_WILL_BE_PERSISTENT(CSSPrimitiveValue, lineThrough, (CSSPri
mitiveValue::createIdentifier(CSSValueLineThrough))); | 1135 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::crea
teIdentifier(CSSValueLineThrough))); |
| 1135 if (valueToMerge->hasValue(underline) && !mergedValue->hasValue(underline)) | 1136 if (valueToMerge->hasValue(&underline) && !mergedValue->hasValue(&underline)
) |
| 1136 mergedValue->append(underline); | 1137 mergedValue->append(&underline); |
| 1137 | 1138 |
| 1138 if (valueToMerge->hasValue(lineThrough) && !mergedValue->hasValue(lineThroug
h)) | 1139 if (valueToMerge->hasValue(&lineThrough) && !mergedValue->hasValue(&lineThro
ugh)) |
| 1139 mergedValue->append(lineThrough); | 1140 mergedValue->append(&lineThrough); |
| 1140 } | 1141 } |
| 1141 | 1142 |
| 1142 void EditingStyle::mergeStyle(const StylePropertySet* style, CSSPropertyOverride
Mode mode) | 1143 void EditingStyle::mergeStyle(const StylePropertySet* style, CSSPropertyOverride
Mode mode) |
| 1143 { | 1144 { |
| 1144 if (!style) | 1145 if (!style) |
| 1145 return; | 1146 return; |
| 1146 | 1147 |
| 1147 if (!m_mutableStyle) { | 1148 if (!m_mutableStyle) { |
| 1148 m_mutableStyle = style->mutableCopy(); | 1149 m_mutableStyle = style->mutableCopy(); |
| 1149 return; | 1150 return; |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1517 int fontStyle = getIdentifierValue(style, CSSPropertyFontStyle); | 1518 int fontStyle = getIdentifierValue(style, CSSPropertyFontStyle); |
| 1518 if (fontStyle == CSSValueItalic || fontStyle == CSSValueOblique) { | 1519 if (fontStyle == CSSValueItalic || fontStyle == CSSValueOblique) { |
| 1519 style->removeProperty(CSSPropertyFontStyle); | 1520 style->removeProperty(CSSPropertyFontStyle); |
| 1520 m_applyItalic = true; | 1521 m_applyItalic = true; |
| 1521 } | 1522 } |
| 1522 | 1523 |
| 1523 // Assuming reconcileTextDecorationProperties has been called, there should
not be -webkit-text-decorations-in-effect | 1524 // Assuming reconcileTextDecorationProperties has been called, there should
not be -webkit-text-decorations-in-effect |
| 1524 // Furthermore, text-decoration: none has been trimmed so that text-decorati
on property is always a CSSValueList. | 1525 // Furthermore, text-decoration: none has been trimmed so that text-decorati
on property is always a CSSValueList. |
| 1525 RawPtr<CSSValue> textDecoration = style->getPropertyCSSValue(textDecorationP
ropertyForEditing()); | 1526 RawPtr<CSSValue> textDecoration = style->getPropertyCSSValue(textDecorationP
ropertyForEditing()); |
| 1526 if (textDecoration && textDecoration->isValueList()) { | 1527 if (textDecoration && textDecoration->isValueList()) { |
| 1527 DEFINE_STATIC_REF_WILL_BE_PERSISTENT(CSSPrimitiveValue, underline, (CSSP
rimitiveValue::createIdentifier(CSSValueUnderline))); | 1528 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::cr
eateIdentifier(CSSValueUnderline))); |
| 1528 DEFINE_STATIC_REF_WILL_BE_PERSISTENT(CSSPrimitiveValue, lineThrough, (CS
SPrimitiveValue::createIdentifier(CSSValueLineThrough))); | 1529 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::
createIdentifier(CSSValueLineThrough))); |
| 1529 RawPtr<CSSValueList> newTextDecoration = toCSSValueList(textDecoration.g
et())->copy(); | 1530 RawPtr<CSSValueList> newTextDecoration = toCSSValueList(textDecoration.g
et())->copy(); |
| 1530 if (newTextDecoration->removeAll(underline)) | 1531 if (newTextDecoration->removeAll(&underline)) |
| 1531 m_applyUnderline = true; | 1532 m_applyUnderline = true; |
| 1532 if (newTextDecoration->removeAll(lineThrough)) | 1533 if (newTextDecoration->removeAll(&lineThrough)) |
| 1533 m_applyLineThrough = true; | 1534 m_applyLineThrough = true; |
| 1534 | 1535 |
| 1535 // If trimTextDecorations, delete underline and line-through | 1536 // If trimTextDecorations, delete underline and line-through |
| 1536 setTextDecorationProperty(style, newTextDecoration.get(), textDecoration
PropertyForEditing()); | 1537 setTextDecorationProperty(style, newTextDecoration.get(), textDecoration
PropertyForEditing()); |
| 1537 } | 1538 } |
| 1538 | 1539 |
| 1539 int verticalAlign = getIdentifierValue(style, CSSPropertyVerticalAlign); | 1540 int verticalAlign = getIdentifierValue(style, CSSPropertyVerticalAlign); |
| 1540 switch (verticalAlign) { | 1541 switch (verticalAlign) { |
| 1541 case CSSValueSub: | 1542 case CSSValueSub: |
| 1542 style->removeProperty(CSSPropertyVerticalAlign); | 1543 style->removeProperty(CSSPropertyVerticalAlign); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 { | 1724 { |
| 1724 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) { | 1725 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) { |
| 1725 RawPtr<CSSComputedStyleDeclaration> ancestorStyle = CSSComputedStyleDecl
aration::create(ancestor); | 1726 RawPtr<CSSComputedStyleDeclaration> ancestorStyle = CSSComputedStyleDecl
aration::create(ancestor); |
| 1726 if (!hasTransparentBackgroundColor(ancestorStyle.get())) | 1727 if (!hasTransparentBackgroundColor(ancestorStyle.get())) |
| 1727 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor
); | 1728 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor
); |
| 1728 } | 1729 } |
| 1729 return nullptr; | 1730 return nullptr; |
| 1730 } | 1731 } |
| 1731 | 1732 |
| 1732 } // namespace blink | 1733 } // namespace blink |
| OLD | NEW |