Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: third_party/WebKit/Source/core/editing/EditingStyle.cpp

Issue 2046463003: Resubmission of sashab's patch: Make CSSComputedStyledeclaration::getPropertyCSSValue return const (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missing const Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 static CSSComputedStyleDeclaration* ensureComputedStyle(const Position& position ) 153 static CSSComputedStyleDeclaration* ensureComputedStyle(const Position& position )
154 { 154 {
155 Element* elem = associatedElementOf(position); 155 Element* elem = associatedElementOf(position);
156 if (!elem) 156 if (!elem)
157 return nullptr; 157 return nullptr;
158 return CSSComputedStyleDeclaration::create(elem); 158 return CSSComputedStyleDeclaration::create(elem);
159 } 159 }
160 160
161 static MutableStylePropertySet* getPropertiesNotIn(StylePropertySet* styleWithRe dundantProperties, CSSStyleDeclaration* baseStyle); 161 static MutableStylePropertySet* getPropertiesNotIn(StylePropertySet* styleWithRe dundantProperties, CSSStyleDeclaration* baseStyle);
162 enum LegacyFontSizeMode { AlwaysUseLegacyFontSize, UseLegacyFontSizeOnlyIfPixelV aluesMatch }; 162 enum LegacyFontSizeMode { AlwaysUseLegacyFontSize, UseLegacyFontSizeOnlyIfPixelV aluesMatch };
163 static int legacyFontSizeFromCSSValue(Document*, CSSPrimitiveValue*, bool, Legac yFontSizeMode); 163 static int legacyFontSizeFromCSSValue(Document*, const CSSPrimitiveValue*, bool, LegacyFontSizeMode);
164 static bool isTransparentColorValue(CSSValue*); 164 static bool isTransparentColorValue(const CSSValue*);
165 static bool hasTransparentBackgroundColor(CSSStyleDeclaration*); 165 static bool hasTransparentBackgroundColor(CSSStyleDeclaration*);
166 static bool hasTransparentBackgroundColor(StylePropertySet*); 166 static bool hasTransparentBackgroundColor(StylePropertySet*);
167 static CSSValue* backgroundColorValueInEffect(Node*); 167 static const CSSValue* backgroundColorValueInEffect(Node*);
168 static bool hasAncestorVerticalAlignStyle(Node&, CSSValueID); 168 static bool hasAncestorVerticalAlignStyle(Node&, CSSValueID);
169 169
170 class HTMLElementEquivalent : public GarbageCollected<HTMLElementEquivalent> { 170 class HTMLElementEquivalent : public GarbageCollected<HTMLElementEquivalent> {
171 public: 171 public:
172 static HTMLElementEquivalent* create(CSSPropertyID propertyID, CSSValueID pr imitiveValue, const HTMLQualifiedName& tagName) 172 static HTMLElementEquivalent* create(CSSPropertyID propertyID, CSSValueID pr imitiveValue, const HTMLQualifiedName& tagName)
173 { 173 {
174 return new HTMLElementEquivalent(propertyID, primitiveValue, tagName); 174 return new HTMLElementEquivalent(propertyID, primitiveValue, tagName);
175 } 175 }
176 176
177 virtual bool matches(const Element* element) const { return !m_tagName || el ement->hasTagName(*m_tagName); } 177 virtual bool matches(const Element* element) const { return !m_tagName || el ement->hasTagName(*m_tagName); }
(...skipping 28 matching lines...) Expand all
206 HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id, CSSValueID primit iveValue, const HTMLQualifiedName& tagName) 206 HTMLElementEquivalent::HTMLElementEquivalent(CSSPropertyID id, CSSValueID primit iveValue, const HTMLQualifiedName& tagName)
207 : m_propertyID(id) 207 : m_propertyID(id)
208 , m_primitiveValue(CSSPrimitiveValue::createIdentifier(primitiveValue)) 208 , m_primitiveValue(CSSPrimitiveValue::createIdentifier(primitiveValue))
209 , m_tagName(&tagName) 209 , m_tagName(&tagName)
210 { 210 {
211 DCHECK_NE(primitiveValue, CSSValueInvalid); 211 DCHECK_NE(primitiveValue, CSSValueInvalid);
212 } 212 }
213 213
214 bool HTMLElementEquivalent::valueIsPresentInStyle(HTMLElement* element, StylePro pertySet* style) const 214 bool HTMLElementEquivalent::valueIsPresentInStyle(HTMLElement* element, StylePro pertySet* style) const
215 { 215 {
216 CSSValue* value = style->getPropertyCSSValue(m_propertyID); 216 const CSSValue* value = style->getPropertyCSSValue(m_propertyID);
217 return matches(element) && value && value->isPrimitiveValue() && toCSSPrimit iveValue(value)->getValueID() == m_primitiveValue->getValueID(); 217 return matches(element) && value && value->isPrimitiveValue() && toCSSPrimit iveValue(value)->getValueID() == m_primitiveValue->getValueID();
218 } 218 }
219 219
220 void HTMLElementEquivalent::addToStyle(Element*, EditingStyle* style) const 220 void HTMLElementEquivalent::addToStyle(Element*, EditingStyle* style) const
221 { 221 {
222 style->setProperty(m_propertyID, m_primitiveValue->cssText()); 222 style->setProperty(m_propertyID, m_primitiveValue->cssText());
223 } 223 }
224 224
225 class HTMLTextDecorationEquivalent final : public HTMLElementEquivalent { 225 class HTMLTextDecorationEquivalent final : public HTMLElementEquivalent {
226 public: 226 public:
(...skipping 17 matching lines...) Expand all
244 } 244 }
245 245
246 bool HTMLTextDecorationEquivalent::propertyExistsInStyle(const StylePropertySet* style) const 246 bool HTMLTextDecorationEquivalent::propertyExistsInStyle(const StylePropertySet* style) const
247 { 247 {
248 return style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect) 248 return style->getPropertyCSSValue(CSSPropertyWebkitTextDecorationsInEffect)
249 || style->getPropertyCSSValue(textDecorationPropertyForEditing()); 249 || style->getPropertyCSSValue(textDecorationPropertyForEditing());
250 } 250 }
251 251
252 bool HTMLTextDecorationEquivalent::valueIsPresentInStyle(HTMLElement* element, S tylePropertySet* style) const 252 bool HTMLTextDecorationEquivalent::valueIsPresentInStyle(HTMLElement* element, S tylePropertySet* style) const
253 { 253 {
254 CSSValue* styleValue = style->getPropertyCSSValue(CSSPropertyWebkitTextDecor ationsInEffect); 254 const CSSValue* styleValue = style->getPropertyCSSValue(CSSPropertyWebkitTex tDecorationsInEffect);
255 if (!styleValue) 255 if (!styleValue)
256 styleValue = style->getPropertyCSSValue(textDecorationPropertyForEditing ()); 256 styleValue = style->getPropertyCSSValue(textDecorationPropertyForEditing ());
257 return matches(element) && styleValue && styleValue->isValueList() && toCSSV alueList(styleValue)->hasValue(*m_primitiveValue); 257 return matches(element) && styleValue && styleValue->isValueList() && toCSSV alueList(styleValue)->hasValue(*m_primitiveValue);
258 } 258 }
259 259
260 class HTMLAttributeEquivalent : public HTMLElementEquivalent { 260 class HTMLAttributeEquivalent : public HTMLElementEquivalent {
261 public: 261 public:
262 static HTMLAttributeEquivalent* create(CSSPropertyID propertyID, const HTMLQ ualifiedName& tagName, const QualifiedName& attrName) 262 static HTMLAttributeEquivalent* create(CSSPropertyID propertyID, const HTMLQ ualifiedName& tagName, const QualifiedName& attrName)
263 { 263 {
264 return new HTMLAttributeEquivalent(propertyID, tagName, attrName); 264 return new HTMLAttributeEquivalent(propertyID, tagName, attrName);
(...skipping 26 matching lines...) Expand all
291 291
292 HTMLAttributeEquivalent::HTMLAttributeEquivalent(CSSPropertyID id, const Qualifi edName& attrName) 292 HTMLAttributeEquivalent::HTMLAttributeEquivalent(CSSPropertyID id, const Qualifi edName& attrName)
293 : HTMLElementEquivalent(id) 293 : HTMLElementEquivalent(id)
294 , m_attrName(attrName) 294 , m_attrName(attrName)
295 { 295 {
296 } 296 }
297 297
298 bool HTMLAttributeEquivalent::valueIsPresentInStyle(HTMLElement* element, StyleP ropertySet* style) const 298 bool HTMLAttributeEquivalent::valueIsPresentInStyle(HTMLElement* element, StyleP ropertySet* style) const
299 { 299 {
300 CSSValue* value = attributeValueAsCSSValue(element); 300 CSSValue* value = attributeValueAsCSSValue(element);
301 CSSValue* styleValue = style->getPropertyCSSValue(m_propertyID); 301 const CSSValue* styleValue = style->getPropertyCSSValue(m_propertyID);
302 302
303 return compareCSSValuePtr(value, styleValue); 303 return compareCSSValuePtr(value, styleValue);
304 } 304 }
305 305
306 void HTMLAttributeEquivalent::addToStyle(Element* element, EditingStyle* style) const 306 void HTMLAttributeEquivalent::addToStyle(Element* element, EditingStyle* style) const
307 { 307 {
308 if (CSSValue* value = attributeValueAsCSSValue(element)) 308 if (CSSValue* value = attributeValueAsCSSValue(element))
309 style->setProperty(m_propertyID, value->cssText()); 309 style->setProperty(m_propertyID, value->cssText());
310 } 310 }
311 311
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 extractFontSizeDelta(); 371 extractFontSizeDelta();
372 } 372 }
373 373
374 EditingStyle::EditingStyle(CSSPropertyID propertyID, const String& value) 374 EditingStyle::EditingStyle(CSSPropertyID propertyID, const String& value)
375 : m_mutableStyle(nullptr) 375 : m_mutableStyle(nullptr)
376 { 376 {
377 setProperty(propertyID, value); 377 setProperty(propertyID, value);
378 m_isVerticalAlign = propertyID == CSSPropertyVerticalAlign && (value == "sub " || value == "super"); 378 m_isVerticalAlign = propertyID == CSSPropertyVerticalAlign && (value == "sub " || value == "super");
379 } 379 }
380 380
381 static Color cssValueToColor(CSSValue* colorValue) 381 static Color cssValueToColor(const CSSValue* colorValue)
382 { 382 {
383 if (!colorValue || (!colorValue->isColorValue() && !colorValue->isPrimitiveV alue())) 383 if (!colorValue || (!colorValue->isColorValue() && !colorValue->isPrimitiveV alue()))
384 return Color::transparent; 384 return Color::transparent;
385 385
386 if (colorValue->isColorValue()) 386 if (colorValue->isColorValue())
387 return toCSSColorValue(colorValue)->value(); 387 return toCSSColorValue(colorValue)->value();
388 388
389 Color color = 0; 389 Color color = 0;
390 // FIXME: Why ignore the return value? 390 // FIXME: Why ignore the return value?
391 CSSParser::parseColor(color, colorValue->cssText()); 391 CSSParser::parseColor(color, colorValue->cssText());
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 { 449 {
450 if (isTabHTMLSpanElementTextNode(node)) 450 if (isTabHTMLSpanElementTextNode(node))
451 node = tabSpanElement(node)->parentNode(); 451 node = tabSpanElement(node)->parentNode();
452 else if (isTabHTMLSpanElement(node)) 452 else if (isTabHTMLSpanElement(node))
453 node = node->parentNode(); 453 node = node->parentNode();
454 454
455 CSSComputedStyleDeclaration* computedStyleAtPosition = CSSComputedStyleDecla ration::create(node); 455 CSSComputedStyleDeclaration* computedStyleAtPosition = CSSComputedStyleDecla ration::create(node);
456 m_mutableStyle = propertiesToInclude == AllProperties && computedStyleAtPosi tion ? computedStyleAtPosition->copyProperties() : editingStyleFromComputedStyle (computedStyleAtPosition); 456 m_mutableStyle = propertiesToInclude == AllProperties && computedStyleAtPosi tion ? computedStyleAtPosition->copyProperties() : editingStyleFromComputedStyle (computedStyleAtPosition);
457 457
458 if (propertiesToInclude == EditingPropertiesInEffect) { 458 if (propertiesToInclude == EditingPropertiesInEffect) {
459 if (CSSValue* value = backgroundColorValueInEffect(node)) 459 if (const CSSValue* value = backgroundColorValueInEffect(node))
460 m_mutableStyle->setProperty(CSSPropertyBackgroundColor, value->cssTe xt()); 460 m_mutableStyle->setProperty(CSSPropertyBackgroundColor, value->cssTe xt());
461 if (CSSValue* value = computedStyleAtPosition->getPropertyCSSValue(CSSPr opertyWebkitTextDecorationsInEffect)) 461 if (const CSSValue* value = computedStyleAtPosition->getPropertyCSSValue (CSSPropertyWebkitTextDecorationsInEffect))
462 m_mutableStyle->setProperty(CSSPropertyTextDecoration, value->cssTex t()); 462 m_mutableStyle->setProperty(CSSPropertyTextDecoration, value->cssTex t());
463 } 463 }
464 464
465 if (node && node->ensureComputedStyle()) { 465 if (node && node->ensureComputedStyle()) {
466 const ComputedStyle* computedStyle = node->ensureComputedStyle(); 466 const ComputedStyle* computedStyle = node->ensureComputedStyle();
467 removeTextFillAndStrokeColorsIfNeeded(computedStyle); 467 removeTextFillAndStrokeColorsIfNeeded(computedStyle);
468 replaceFontSizeByKeywordIfPossible(computedStyle, computedStyleAtPositio n); 468 replaceFontSizeByKeywordIfPossible(computedStyle, computedStyleAtPositio n);
469 } 469 }
470 470
471 m_isMonospaceFont = computedStyleAtPosition->isMonospaceFont(); 471 m_isMonospaceFont = computedStyleAtPosition->isMonospaceFont();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 if (!m_mutableStyle) 503 if (!m_mutableStyle)
504 return; 504 return;
505 505
506 if (m_mutableStyle->getPropertyCSSValue(CSSPropertyFontSize)) { 506 if (m_mutableStyle->getPropertyCSSValue(CSSPropertyFontSize)) {
507 // Explicit font size overrides any delta. 507 // Explicit font size overrides any delta.
508 m_mutableStyle->removeProperty(CSSPropertyWebkitFontSizeDelta); 508 m_mutableStyle->removeProperty(CSSPropertyWebkitFontSizeDelta);
509 return; 509 return;
510 } 510 }
511 511
512 // Get the adjustment amount out of the style. 512 // Get the adjustment amount out of the style.
513 CSSValue* value = m_mutableStyle->getPropertyCSSValue(CSSPropertyWebkitFontS izeDelta); 513 const CSSValue* value = m_mutableStyle->getPropertyCSSValue(CSSPropertyWebki tFontSizeDelta);
514 if (!value || !value->isPrimitiveValue()) 514 if (!value || !value->isPrimitiveValue())
515 return; 515 return;
516 516
517 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value); 517 const CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
518 518
519 // Only PX handled now. If we handle more types in the future, perhaps 519 // Only PX handled now. If we handle more types in the future, perhaps
520 // a switch statement here would be more appropriate. 520 // a switch statement here would be more appropriate.
521 if (!primitiveValue->isPx()) 521 if (!primitiveValue->isPx())
522 return; 522 return;
523 523
524 m_fontSizeDelta = primitiveValue->getFloatValue(); 524 m_fontSizeDelta = primitiveValue->getFloatValue();
525 m_mutableStyle->removeProperty(CSSPropertyWebkitFontSizeDelta); 525 m_mutableStyle->removeProperty(CSSPropertyWebkitFontSizeDelta);
526 } 526 }
527 527
528 bool EditingStyle::isEmpty() const 528 bool EditingStyle::isEmpty() const
529 { 529 {
530 return (!m_mutableStyle || m_mutableStyle->isEmpty()) && m_fontSizeDelta == NoFontDelta; 530 return (!m_mutableStyle || m_mutableStyle->isEmpty()) && m_fontSizeDelta == NoFontDelta;
531 } 531 }
532 532
533 bool EditingStyle::textDirection(WritingDirection& writingDirection) const 533 bool EditingStyle::textDirection(WritingDirection& writingDirection) const
534 { 534 {
535 if (!m_mutableStyle) 535 if (!m_mutableStyle)
536 return false; 536 return false;
537 537
538 CSSValue* unicodeBidi = m_mutableStyle->getPropertyCSSValue(CSSPropertyUnico deBidi); 538 const CSSValue* unicodeBidi = m_mutableStyle->getPropertyCSSValue(CSSPropert yUnicodeBidi);
539 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) 539 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue())
540 return false; 540 return false;
541 541
542 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValueID() ; 542 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValueID() ;
543 if (isEmbedOrIsolate(unicodeBidiValue)) { 543 if (isEmbedOrIsolate(unicodeBidiValue)) {
544 CSSValue* direction = m_mutableStyle->getPropertyCSSValue(CSSPropertyDir ection); 544 const CSSValue* direction = m_mutableStyle->getPropertyCSSValue(CSSPrope rtyDirection);
545 if (!direction || !direction->isPrimitiveValue()) 545 if (!direction || !direction->isPrimitiveValue())
546 return false; 546 return false;
547 547
548 writingDirection = toCSSPrimitiveValue(direction)->getValueID() == CSSVa lueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection; 548 writingDirection = toCSSPrimitiveValue(direction)->getValueID() == CSSVa lueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection;
549 549
550 return true; 550 return true;
551 } 551 }
552 552
553 if (unicodeBidiValue == CSSValueNormal) { 553 if (unicodeBidiValue == CSSValueNormal) {
554 writingDirection = NaturalWritingDirection; 554 writingDirection = NaturalWritingDirection;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 unsigned propertyCount = nodeStyle->propertyCount(); 675 unsigned propertyCount = nodeStyle->propertyCount();
676 for (unsigned i = 0; i < propertyCount; ++i) 676 for (unsigned i = 0; i < propertyCount; ++i)
677 m_mutableStyle->removeProperty(nodeStyle->propertyAt(i).id()); 677 m_mutableStyle->removeProperty(nodeStyle->propertyAt(i).id());
678 } 678 }
679 679
680 void EditingStyle::collapseTextDecorationProperties() 680 void EditingStyle::collapseTextDecorationProperties()
681 { 681 {
682 if (!m_mutableStyle) 682 if (!m_mutableStyle)
683 return; 683 return;
684 684
685 CSSValue* textDecorationsInEffect = m_mutableStyle->getPropertyCSSValue(CSSP ropertyWebkitTextDecorationsInEffect); 685 const CSSValue* textDecorationsInEffect = m_mutableStyle->getPropertyCSSValu e(CSSPropertyWebkitTextDecorationsInEffect);
686 if (!textDecorationsInEffect) 686 if (!textDecorationsInEffect)
687 return; 687 return;
688 688
689 if (textDecorationsInEffect->isValueList()) 689 if (textDecorationsInEffect->isValueList())
690 m_mutableStyle->setProperty(textDecorationPropertyForEditing(), textDeco rationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(textDecorationPr opertyForEditing())); 690 m_mutableStyle->setProperty(textDecorationPropertyForEditing(), textDeco rationsInEffect->cssText(), m_mutableStyle->propertyIsImportant(textDecorationPr opertyForEditing()));
691 else 691 else
692 m_mutableStyle->removeProperty(textDecorationPropertyForEditing()); 692 m_mutableStyle->removeProperty(textDecorationPropertyForEditing());
693 m_mutableStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect); 693 m_mutableStyle->removeProperty(CSSPropertyWebkitTextDecorationsInEffect);
694 } 694 }
695 695
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 TriState state = FalseTriState; 748 TriState state = FalseTriState;
749 bool nodeIsStart = true; 749 bool nodeIsStart = true;
750 for (Node& node : NodeTraversal::startsAt(*selection.start().anchorNode())) { 750 for (Node& node : NodeTraversal::startsAt(*selection.start().anchorNode())) {
751 if (node.layoutObject() && node.hasEditableStyle()) { 751 if (node.layoutObject() && node.hasEditableStyle()) {
752 CSSComputedStyleDeclaration* nodeStyle = CSSComputedStyleDeclaration ::create(&node); 752 CSSComputedStyleDeclaration* nodeStyle = CSSComputedStyleDeclaration ::create(&node);
753 if (nodeStyle) { 753 if (nodeStyle) {
754 // If the selected element has <sub> or <sup> ancestor element, apply the corresponding 754 // If the selected element has <sub> or <sup> ancestor element, apply the corresponding
755 // style(vertical-align) to it so that document.queryCommandStat e() works with the style. 755 // style(vertical-align) to it so that document.queryCommandStat e() works with the style.
756 // See bug http://crbug.com/582225. 756 // See bug http://crbug.com/582225.
757 if (m_isVerticalAlign && getIdentifierValue(nodeStyle, CSSProper tyVerticalAlign) == CSSValueBaseline) { 757 if (m_isVerticalAlign && getIdentifierValue(nodeStyle, CSSProper tyVerticalAlign) == CSSValueBaseline) {
758 CSSPrimitiveValue* verticalAlign = toCSSPrimitiveValue(m_mut ableStyle->getPropertyCSSValue(CSSPropertyVerticalAlign)); 758 const CSSPrimitiveValue* verticalAlign = toCSSPrimitiveValue (m_mutableStyle->getPropertyCSSValue(CSSPropertyVerticalAlign));
759 if (hasAncestorVerticalAlignStyle(node, verticalAlign->getVa lueID())) 759 if (hasAncestorVerticalAlignStyle(node, verticalAlign->getVa lueID()))
760 node.mutableComputedStyle()->setVerticalAlign(verticalAl ign->convertTo<EVerticalAlign>()); 760 node.mutableComputedStyle()->setVerticalAlign(verticalAl ign->convertTo<EVerticalAlign>());
761 } 761 }
762 762
763 // Pass EditingStyle::DoNotIgnoreTextOnlyProperties without chec king if node.isTextNode() 763 // Pass EditingStyle::DoNotIgnoreTextOnlyProperties without chec king if node.isTextNode()
764 // because the node can be an element node. See bug http://crbug .com/584939. 764 // because the node can be an element node. See bug http://crbug .com/584939.
765 TriState nodeState = triStateOfStyle(nodeStyle, EditingStyle::Do NotIgnoreTextOnlyProperties); 765 TriState nodeState = triStateOfStyle(nodeStyle, EditingStyle::Do NotIgnoreTextOnlyProperties);
766 if (nodeIsStart) { 766 if (nodeIsStart) {
767 state = nodeState; 767 state = nodeState;
768 nodeIsStart = false; 768 nodeIsStart = false;
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 { 994 {
995 if (!m_mutableStyle) 995 if (!m_mutableStyle)
996 return; 996 return;
997 997
998 // ReplaceSelectionCommand::handleStyleSpans() requires that this function o nly removes the editing style. 998 // ReplaceSelectionCommand::handleStyleSpans() requires that this function o nly removes the editing style.
999 // If this function was modified in the future to delete all redundant prope rties, then add a boolean value to indicate 999 // If this function was modified in the future to delete all redundant prope rties, then add a boolean value to indicate
1000 // which one of editingStyleAtPosition or computedStyle is called. 1000 // which one of editingStyleAtPosition or computedStyle is called.
1001 EditingStyle* editingStyleAtPosition = EditingStyle::create(position, Editin gPropertiesInEffect); 1001 EditingStyle* editingStyleAtPosition = EditingStyle::create(position, Editin gPropertiesInEffect);
1002 StylePropertySet* styleAtPosition = editingStyleAtPosition->m_mutableStyle.g et(); 1002 StylePropertySet* styleAtPosition = editingStyleAtPosition->m_mutableStyle.g et();
1003 1003
1004 CSSValue* unicodeBidi = nullptr; 1004 const CSSValue* unicodeBidi = nullptr;
1005 CSSValue* direction = nullptr; 1005 const CSSValue* direction = nullptr;
1006 if (shouldPreserveWritingDirection == PreserveWritingDirection) { 1006 if (shouldPreserveWritingDirection == PreserveWritingDirection) {
1007 unicodeBidi = m_mutableStyle->getPropertyCSSValue(CSSPropertyUnicodeBidi ); 1007 unicodeBidi = m_mutableStyle->getPropertyCSSValue(CSSPropertyUnicodeBidi );
1008 direction = m_mutableStyle->getPropertyCSSValue(CSSPropertyDirection); 1008 direction = m_mutableStyle->getPropertyCSSValue(CSSPropertyDirection);
1009 } 1009 }
1010 1010
1011 m_mutableStyle->removeEquivalentProperties(styleAtPosition); 1011 m_mutableStyle->removeEquivalentProperties(styleAtPosition);
1012 1012
1013 if (textAlignResolvingStartAndEnd(m_mutableStyle.get()) == textAlignResolvin gStartAndEnd(styleAtPosition)) 1013 if (textAlignResolvingStartAndEnd(m_mutableStyle.get()) == textAlignResolvin gStartAndEnd(styleAtPosition))
1014 m_mutableStyle->removeProperty(CSSPropertyTextAlign); 1014 m_mutableStyle->removeProperty(CSSPropertyTextAlign);
1015 1015
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 break; 1134 break;
1135 if (node.isStyledElement() && !isMailHTMLBlockquoteElement(&node)) { 1135 if (node.isStyledElement() && !isMailHTMLBlockquoteElement(&node)) {
1136 wrappingStyle->mergeInlineAndImplicitStyleOfElement(toElement(&node) , EditingStyle::DoNotOverrideValues, 1136 wrappingStyle->mergeInlineAndImplicitStyleOfElement(toElement(&node) , EditingStyle::DoNotOverrideValues,
1137 EditingStyle::EditingPropertiesInEffect); 1137 EditingStyle::EditingPropertiesInEffect);
1138 } 1138 }
1139 } 1139 }
1140 1140
1141 return wrappingStyle; 1141 return wrappingStyle;
1142 } 1142 }
1143 1143
1144 static void mergeTextDecorationValues(CSSValueList* mergedValue, const CSSValueL ist* valueToMerge) 1144 static CSSValueList* mergeTextDecorationValues(const CSSValueList* mergedValue, const CSSValueList* valueToMerge)
1145 { 1145 {
1146 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::create Identifier(CSSValueUnderline))); 1146 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::create Identifier(CSSValueUnderline)));
1147 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::crea teIdentifier(CSSValueLineThrough))); 1147 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue::crea teIdentifier(CSSValueLineThrough)));
1148 CSSValueList* result = mergedValue->copy();
1148 if (valueToMerge->hasValue(underline) && !mergedValue->hasValue(underline)) 1149 if (valueToMerge->hasValue(underline) && !mergedValue->hasValue(underline))
1149 mergedValue->append(&underline); 1150 result->append(&underline);
1150 1151
1151 if (valueToMerge->hasValue(lineThrough) && !mergedValue->hasValue(lineThroug h)) 1152 if (valueToMerge->hasValue(lineThrough) && !mergedValue->hasValue(lineThroug h))
1152 mergedValue->append(&lineThrough); 1153 result->append(&lineThrough);
1154
1155 return result;
1153 } 1156 }
1154 1157
1155 void EditingStyle::mergeStyle(const StylePropertySet* style, CSSPropertyOverride Mode mode) 1158 void EditingStyle::mergeStyle(const StylePropertySet* style, CSSPropertyOverride Mode mode)
1156 { 1159 {
1157 if (!style) 1160 if (!style)
1158 return; 1161 return;
1159 1162
1160 if (!m_mutableStyle) { 1163 if (!m_mutableStyle) {
1161 m_mutableStyle = style->mutableCopy(); 1164 m_mutableStyle = style->mutableCopy();
1162 return; 1165 return;
1163 } 1166 }
1164 1167
1165 unsigned propertyCount = style->propertyCount(); 1168 unsigned propertyCount = style->propertyCount();
1166 for (unsigned i = 0; i < propertyCount; ++i) { 1169 for (unsigned i = 0; i < propertyCount; ++i) {
1167 StylePropertySet::PropertyReference property = style->propertyAt(i); 1170 StylePropertySet::PropertyReference property = style->propertyAt(i);
1168 CSSValue* value = m_mutableStyle->getPropertyCSSValue(property.id()); 1171 const CSSValue* value = m_mutableStyle->getPropertyCSSValue(property.id( ));
1169 1172
1170 // text decorations never override values 1173 // text decorations never override values
1171 if ((property.id() == textDecorationPropertyForEditing() || property.id( ) == CSSPropertyWebkitTextDecorationsInEffect) && property.value()->isValueList( ) && value) { 1174 if ((property.id() == textDecorationPropertyForEditing() || property.id( ) == CSSPropertyWebkitTextDecorationsInEffect) && property.value()->isValueList( ) && value) {
1172 if (value->isValueList()) { 1175 if (value->isValueList()) {
1173 mergeTextDecorationValues(toCSSValueList(value), toCSSValueList( property.value())); 1176 CSSValueList* result = mergeTextDecorationValues(toCSSValueList( value), toCSSValueList(property.value()));
1177 m_mutableStyle->setProperty(property.id(), result, property.isIm portant());
1174 continue; 1178 continue;
1175 } 1179 }
1176 value = nullptr; // text-decoration: none is equivalent to not havin g the property 1180 value = nullptr; // text-decoration: none is equivalent to not havin g the property
1177 } 1181 }
1178 1182
1179 if (mode == OverrideValues || (mode == DoNotOverrideValues && !value)) 1183 if (mode == OverrideValues || (mode == DoNotOverrideValues && !value))
1180 m_mutableStyle->setProperty(property.id(), property.value()->cssText (), property.isImportant()); 1184 m_mutableStyle->setProperty(property.id(), property.value()->cssText (), property.isImportant());
1181 } 1185 }
1182 } 1186 }
1183 1187
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 CSSComputedStyleDeclaration* computedStyleForElement = CSSComputedStyleDecla ration::create(element); 1219 CSSComputedStyleDeclaration* computedStyleForElement = CSSComputedStyleDecla ration::create(element);
1216 MutableStylePropertySet* fromComputedStyle = MutableStylePropertySet::create (HTMLQuirksMode); 1220 MutableStylePropertySet* fromComputedStyle = MutableStylePropertySet::create (HTMLQuirksMode);
1217 { 1221 {
1218 unsigned propertyCount = m_mutableStyle->propertyCount(); 1222 unsigned propertyCount = m_mutableStyle->propertyCount();
1219 for (unsigned i = 0; i < propertyCount; ++i) { 1223 for (unsigned i = 0; i < propertyCount; ++i) {
1220 StylePropertySet::PropertyReference property = m_mutableStyle->prope rtyAt(i); 1224 StylePropertySet::PropertyReference property = m_mutableStyle->prope rtyAt(i);
1221 CSSValue* value = property.value(); 1225 CSSValue* value = property.value();
1222 if (!value->isPrimitiveValue()) 1226 if (!value->isPrimitiveValue())
1223 continue; 1227 continue;
1224 if (toCSSPrimitiveValue(value)->isPercentage()) { 1228 if (toCSSPrimitiveValue(value)->isPercentage()) {
1225 if (CSSValue* computedPropertyValue = computedStyleForElement->g etPropertyCSSValue(property.id())) 1229 if (const CSSValue* computedPropertyValue = computedStyleForElem ent->getPropertyCSSValue(property.id()))
1226 fromComputedStyle->addRespectingCascade(CSSProperty(property .id(), computedPropertyValue)); 1230 fromComputedStyle->addRespectingCascade(CSSProperty(property .id(), computedPropertyValue));
1227 } 1231 }
1228 } 1232 }
1229 } 1233 }
1230 m_mutableStyle->mergeAndOverrideOnConflict(fromComputedStyle); 1234 m_mutableStyle->mergeAndOverrideOnConflict(fromComputedStyle);
1231 } 1235 }
1232 1236
1233 static void removePropertiesInStyle(MutableStylePropertySet* styleToRemoveProper tiesFrom, StylePropertySet* style) 1237 static void removePropertiesInStyle(MutableStylePropertySet* styleToRemoveProper tiesFrom, StylePropertySet* style)
1234 { 1238 {
1235 unsigned propertyCount = style->propertyCount(); 1239 unsigned propertyCount = style->propertyCount();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 void EditingStyle::forceInline() 1313 void EditingStyle::forceInline()
1310 { 1314 {
1311 if (!m_mutableStyle) 1315 if (!m_mutableStyle)
1312 m_mutableStyle = MutableStylePropertySet::create(HTMLQuirksMode); 1316 m_mutableStyle = MutableStylePropertySet::create(HTMLQuirksMode);
1313 const bool propertyIsImportant = true; 1317 const bool propertyIsImportant = true;
1314 m_mutableStyle->setProperty(CSSPropertyDisplay, CSSValueInline, propertyIsIm portant); 1318 m_mutableStyle->setProperty(CSSPropertyDisplay, CSSValueInline, propertyIsIm portant);
1315 } 1319 }
1316 1320
1317 int EditingStyle::legacyFontSize(Document* document) const 1321 int EditingStyle::legacyFontSize(Document* document) const
1318 { 1322 {
1319 CSSValue* cssValue = m_mutableStyle->getPropertyCSSValue(CSSPropertyFontSize ); 1323 const CSSValue* cssValue = m_mutableStyle->getPropertyCSSValue(CSSPropertyFo ntSize);
1320 if (!cssValue || !cssValue->isPrimitiveValue()) 1324 if (!cssValue || !cssValue->isPrimitiveValue())
1321 return 0; 1325 return 0;
1322 return legacyFontSizeFromCSSValue(document, toCSSPrimitiveValue(cssValue), 1326 return legacyFontSizeFromCSSValue(document, toCSSPrimitiveValue(cssValue),
1323 m_isMonospaceFont, AlwaysUseLegacyFontSize); 1327 m_isMonospaceFont, AlwaysUseLegacyFontSize);
1324 } 1328 }
1325 1329
1326 EditingStyle* EditingStyle::styleAtSelectionStart(const VisibleSelection& select ion, bool shouldUseBackgroundColorInEffect, MutableStylePropertySet* styleToChec k) 1330 EditingStyle* EditingStyle::styleAtSelectionStart(const VisibleSelection& select ion, bool shouldUseBackgroundColorInEffect, MutableStylePropertySet* styleToChec k)
1327 { 1331 {
1328 if (selection.isNone()) 1332 if (selection.isNone())
1329 return nullptr; 1333 return nullptr;
(...skipping 24 matching lines...) Expand all
1354 // Find the ancestor that has CSSValueSub or CSSValueSuper as the value of CSS vertical-align property. 1358 // Find the ancestor that has CSSValueSub or CSSValueSuper as the value of CSS vertical-align property.
1355 if (getIdentifierValue(elementStyle, CSSPropertyVerticalAlign) == CSSVal ueBaseline && hasAncestorVerticalAlignStyle(*element, valueID)) 1359 if (getIdentifierValue(elementStyle, CSSPropertyVerticalAlign) == CSSVal ueBaseline && hasAncestorVerticalAlignStyle(*element, valueID))
1356 style->m_mutableStyle->setProperty(CSSPropertyVerticalAlign, valueID ); 1360 style->m_mutableStyle->setProperty(CSSPropertyVerticalAlign, valueID );
1357 } 1361 }
1358 1362
1359 // If background color is transparent, traverse parent nodes until we hit a different value or document root 1363 // If background color is transparent, traverse parent nodes until we hit a different value or document root
1360 // Also, if the selection is a range, ignore the background color at the sta rt of selection, 1364 // Also, if the selection is a range, ignore the background color at the sta rt of selection,
1361 // and find the background color of the common ancestor. 1365 // and find the background color of the common ancestor.
1362 if (shouldUseBackgroundColorInEffect && (selection.isRange() || hasTranspare ntBackgroundColor(style->m_mutableStyle.get()))) { 1366 if (shouldUseBackgroundColorInEffect && (selection.isRange() || hasTranspare ntBackgroundColor(style->m_mutableStyle.get()))) {
1363 const EphemeralRange range(selection.toNormalizedEphemeralRange()); 1367 const EphemeralRange range(selection.toNormalizedEphemeralRange());
1364 if (CSSValue* value = backgroundColorValueInEffect(Range::commonAncestor Container(range.startPosition().computeContainerNode(), range.endPosition().comp uteContainerNode()))) 1368 if (const CSSValue* value = backgroundColorValueInEffect(Range::commonAn cestorContainer(range.startPosition().computeContainerNode(), range.endPosition( ).computeContainerNode())))
1365 style->setProperty(CSSPropertyBackgroundColor, value->cssText()); 1369 style->setProperty(CSSPropertyBackgroundColor, value->cssText());
1366 } 1370 }
1367 1371
1368 return style; 1372 return style;
1369 } 1373 }
1370 1374
1371 static bool isUnicodeBidiNestedOrMultipleEmbeddings(CSSValueID valueID) 1375 static bool isUnicodeBidiNestedOrMultipleEmbeddings(CSSValueID valueID)
1372 { 1376 {
1373 return valueID == CSSValueEmbed || valueID == CSSValueBidiOverride 1377 return valueID == CSSValueEmbed || valueID == CSSValueBidiOverride
1374 || valueID == CSSValueWebkitIsolate || valueID == CSSValueWebkitIsolateO verride || valueID == CSSValueWebkitPlaintext 1378 || valueID == CSSValueWebkitIsolate || valueID == CSSValueWebkitIsolateO verride || valueID == CSSValueWebkitPlaintext
(...skipping 17 matching lines...) Expand all
1392 if (selection.isRange()) { 1396 if (selection.isRange()) {
1393 end = mostBackwardCaretPosition(selection.end()); 1397 end = mostBackwardCaretPosition(selection.end());
1394 1398
1395 DCHECK(end.document()); 1399 DCHECK(end.document());
1396 Node* pastLast = Range::create(*end.document(), position.parentAnchoredE quivalent(), end.parentAnchoredEquivalent())->pastLastNode(); 1400 Node* pastLast = Range::create(*end.document(), position.parentAnchoredE quivalent(), end.parentAnchoredEquivalent())->pastLastNode();
1397 for (Node* n = node; n && n != pastLast; n = NodeTraversal::next(*n)) { 1401 for (Node* n = node; n && n != pastLast; n = NodeTraversal::next(*n)) {
1398 if (!n->isStyledElement()) 1402 if (!n->isStyledElement())
1399 continue; 1403 continue;
1400 1404
1401 CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::cr eate(n); 1405 CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::cr eate(n);
1402 CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSPropertyUnicod eBidi); 1406 const CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSProperty UnicodeBidi);
1403 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) 1407 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue())
1404 continue; 1408 continue;
1405 1409
1406 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getV alueID(); 1410 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getV alueID();
1407 if (isUnicodeBidiNestedOrMultipleEmbeddings(unicodeBidiValue)) 1411 if (isUnicodeBidiNestedOrMultipleEmbeddings(unicodeBidiValue))
1408 return NaturalWritingDirection; 1412 return NaturalWritingDirection;
1409 } 1413 }
1410 } 1414 }
1411 1415
1412 if (selection.isCaret()) { 1416 if (selection.isCaret()) {
(...skipping 12 matching lines...) Expand all
1425 WritingDirection foundDirection = NaturalWritingDirection; 1429 WritingDirection foundDirection = NaturalWritingDirection;
1426 1430
1427 for (Node& runner : NodeTraversal::inclusiveAncestorsOf(*node)) { 1431 for (Node& runner : NodeTraversal::inclusiveAncestorsOf(*node)) {
1428 if (runner == block) 1432 if (runner == block)
1429 break; 1433 break;
1430 if (!runner.isStyledElement()) 1434 if (!runner.isStyledElement())
1431 continue; 1435 continue;
1432 1436
1433 Element* element = &toElement(runner); 1437 Element* element = &toElement(runner);
1434 CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::create (element); 1438 CSSComputedStyleDeclaration* style = CSSComputedStyleDeclaration::create (element);
1435 CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSPropertyUnicodeBid i); 1439 const CSSValue* unicodeBidi = style->getPropertyCSSValue(CSSPropertyUnic odeBidi);
1436 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) 1440 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue())
1437 continue; 1441 continue;
1438 1442
1439 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValue ID(); 1443 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi)->getValue ID();
1440 if (unicodeBidiValue == CSSValueNormal) 1444 if (unicodeBidiValue == CSSValueNormal)
1441 continue; 1445 continue;
1442 1446
1443 if (unicodeBidiValue == CSSValueBidiOverride) 1447 if (unicodeBidiValue == CSSValueBidiOverride)
1444 return NaturalWritingDirection; 1448 return NaturalWritingDirection;
1445 1449
1446 DCHECK(isEmbedOrIsolate(unicodeBidiValue)) << unicodeBidiValue; 1450 DCHECK(isEmbedOrIsolate(unicodeBidiValue)) << unicodeBidiValue;
1447 CSSValue* direction = style->getPropertyCSSValue(CSSPropertyDirection); 1451 const CSSValue* direction = style->getPropertyCSSValue(CSSPropertyDirect ion);
1448 if (!direction || !direction->isPrimitiveValue()) 1452 if (!direction || !direction->isPrimitiveValue())
1449 continue; 1453 continue;
1450 1454
1451 int directionValue = toCSSPrimitiveValue(direction)->getValueID(); 1455 int directionValue = toCSSPrimitiveValue(direction)->getValueID();
1452 if (directionValue != CSSValueLtr && directionValue != CSSValueRtl) 1456 if (directionValue != CSSValueLtr && directionValue != CSSValueRtl)
1453 continue; 1457 continue;
1454 1458
1455 if (foundDirection != NaturalWritingDirection) 1459 if (foundDirection != NaturalWritingDirection)
1456 return NaturalWritingDirection; 1460 return NaturalWritingDirection;
1457 1461
1458 // In the range case, make sure that the embedding element persists unti l the end of the range. 1462 // In the range case, make sure that the embedding element persists unti l the end of the range.
1459 if (selection.isRange() && !end.anchorNode()->isDescendantOf(element)) 1463 if (selection.isRange() && !end.anchorNode()->isDescendantOf(element))
1460 return NaturalWritingDirection; 1464 return NaturalWritingDirection;
1461 1465
1462 foundDirection = directionValue == CSSValueLtr ? LeftToRightWritingDirec tion : RightToLeftWritingDirection; 1466 foundDirection = directionValue == CSSValueLtr ? LeftToRightWritingDirec tion : RightToLeftWritingDirection;
1463 } 1467 }
1464 hasNestedOrMultipleEmbeddings = false; 1468 hasNestedOrMultipleEmbeddings = false;
1465 return foundDirection; 1469 return foundDirection;
1466 } 1470 }
1467 1471
1468 DEFINE_TRACE(EditingStyle) 1472 DEFINE_TRACE(EditingStyle)
1469 { 1473 {
1470 visitor->trace(m_mutableStyle); 1474 visitor->trace(m_mutableStyle);
1471 } 1475 }
1472 1476
1473 static void reconcileTextDecorationProperties(MutableStylePropertySet* style) 1477 static void reconcileTextDecorationProperties(MutableStylePropertySet* style)
1474 { 1478 {
1475 CSSValue* textDecorationsInEffect = style->getPropertyCSSValue(CSSPropertyWe bkitTextDecorationsInEffect); 1479 const CSSValue* textDecorationsInEffect = style->getPropertyCSSValue(CSSProp ertyWebkitTextDecorationsInEffect);
1476 CSSValue* textDecoration = style->getPropertyCSSValue(textDecorationProperty ForEditing()); 1480 const CSSValue* textDecoration = style->getPropertyCSSValue(textDecorationPr opertyForEditing());
1477 // We shouldn't have both text-decoration and -webkit-text-decorations-in-ef fect because that wouldn't make sense. 1481 // We shouldn't have both text-decoration and -webkit-text-decorations-in-ef fect because that wouldn't make sense.
1478 DCHECK(!textDecorationsInEffect || !textDecoration); 1482 DCHECK(!textDecorationsInEffect || !textDecoration);
1479 if (textDecorationsInEffect) { 1483 if (textDecorationsInEffect) {
1480 style->setProperty(textDecorationPropertyForEditing(), textDecorationsIn Effect->cssText()); 1484 style->setProperty(textDecorationPropertyForEditing(), textDecorationsIn Effect->cssText());
1481 style->removeProperty(CSSPropertyWebkitTextDecorationsInEffect); 1485 style->removeProperty(CSSPropertyWebkitTextDecorationsInEffect);
1482 textDecoration = textDecorationsInEffect; 1486 textDecoration = textDecorationsInEffect;
1483 } 1487 }
1484 1488
1485 // If text-decoration is set to "none", remove the property because we don't want to add redundant "text-decoration: none". 1489 // If text-decoration is set to "none", remove the property because we don't want to add redundant "text-decoration: none".
1486 if (textDecoration && !textDecoration->isValueList()) 1490 if (textDecoration && !textDecoration->isValueList())
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 } 1546 }
1543 1547
1544 int fontStyle = getIdentifierValue(style, CSSPropertyFontStyle); 1548 int fontStyle = getIdentifierValue(style, CSSPropertyFontStyle);
1545 if (fontStyle == CSSValueItalic || fontStyle == CSSValueOblique) { 1549 if (fontStyle == CSSValueItalic || fontStyle == CSSValueOblique) {
1546 style->removeProperty(CSSPropertyFontStyle); 1550 style->removeProperty(CSSPropertyFontStyle);
1547 m_applyItalic = true; 1551 m_applyItalic = true;
1548 } 1552 }
1549 1553
1550 // Assuming reconcileTextDecorationProperties has been called, there should not be -webkit-text-decorations-in-effect 1554 // Assuming reconcileTextDecorationProperties has been called, there should not be -webkit-text-decorations-in-effect
1551 // Furthermore, text-decoration: none has been trimmed so that text-decorati on property is always a CSSValueList. 1555 // Furthermore, text-decoration: none has been trimmed so that text-decorati on property is always a CSSValueList.
1552 CSSValue* textDecoration = style->getPropertyCSSValue(textDecorationProperty ForEditing()); 1556 const CSSValue* textDecoration = style->getPropertyCSSValue(textDecorationPr opertyForEditing());
1553 if (textDecoration && textDecoration->isValueList()) { 1557 if (textDecoration && textDecoration->isValueList()) {
1554 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::cr eateIdentifier(CSSValueUnderline))); 1558 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, underline, (CSSPrimitiveValue::cr eateIdentifier(CSSValueUnderline)));
1555 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue:: createIdentifier(CSSValueLineThrough))); 1559 DEFINE_STATIC_LOCAL(CSSPrimitiveValue, lineThrough, (CSSPrimitiveValue:: createIdentifier(CSSValueLineThrough)));
1556 CSSValueList* newTextDecoration = toCSSValueList(textDecoration)->copy() ; 1560 CSSValueList* newTextDecoration = toCSSValueList(textDecoration)->copy() ;
1557 if (newTextDecoration->removeAll(underline)) 1561 if (newTextDecoration->removeAll(underline))
1558 m_applyUnderline = true; 1562 m_applyUnderline = true;
1559 if (newTextDecoration->removeAll(lineThrough)) 1563 if (newTextDecoration->removeAll(lineThrough))
1560 m_applyLineThrough = true; 1564 m_applyLineThrough = true;
1561 1565
1562 // If trimTextDecorations, delete underline and line-through 1566 // If trimTextDecorations, delete underline and line-through
(...skipping 15 matching lines...) Expand all
1578 if (style->getPropertyCSSValue(CSSPropertyColor)) { 1582 if (style->getPropertyCSSValue(CSSPropertyColor)) {
1579 m_applyFontColor = getFontColor(style).serialized(); 1583 m_applyFontColor = getFontColor(style).serialized();
1580 style->removeProperty(CSSPropertyColor); 1584 style->removeProperty(CSSPropertyColor);
1581 } 1585 }
1582 1586
1583 m_applyFontFace = style->getPropertyValue(CSSPropertyFontFamily); 1587 m_applyFontFace = style->getPropertyValue(CSSPropertyFontFamily);
1584 // Remove double quotes for Outlook 2007 compatibility. See https://bugs.web kit.org/show_bug.cgi?id=79448 1588 // Remove double quotes for Outlook 2007 compatibility. See https://bugs.web kit.org/show_bug.cgi?id=79448
1585 m_applyFontFace.replace('"', ""); 1589 m_applyFontFace.replace('"', "");
1586 style->removeProperty(CSSPropertyFontFamily); 1590 style->removeProperty(CSSPropertyFontFamily);
1587 1591
1588 if (CSSValue* fontSize = style->getPropertyCSSValue(CSSPropertyFontSize)) { 1592 if (const CSSValue* fontSize = style->getPropertyCSSValue(CSSPropertyFontSiz e)) {
1589 if (!fontSize->isPrimitiveValue()) { 1593 if (!fontSize->isPrimitiveValue()) {
1590 style->removeProperty(CSSPropertyFontSize); // Can't make sense of t he number. Put no font size. 1594 style->removeProperty(CSSPropertyFontSize); // Can't make sense of t he number. Put no font size.
1591 } else if (int legacyFontSize = legacyFontSizeFromCSSValue(document, toC SSPrimitiveValue(fontSize), isMonospaceFont, UseLegacyFontSizeOnlyIfPixelValuesM atch)) { 1595 } else if (int legacyFontSize = legacyFontSizeFromCSSValue(document, toC SSPrimitiveValue(fontSize), isMonospaceFont, UseLegacyFontSizeOnlyIfPixelValuesM atch)) {
1592 m_applyFontSize = String::number(legacyFontSize); 1596 m_applyFontSize = String::number(legacyFontSize);
1593 style->removeProperty(CSSPropertyFontSize); 1597 style->removeProperty(CSSPropertyFontSize);
1594 } 1598 }
1595 } 1599 }
1596 } 1600 }
1597 1601
1598 static void diffTextDecorations(MutableStylePropertySet* style, CSSPropertyID pr opertID, CSSValue* refTextDecoration) 1602 static void diffTextDecorations(MutableStylePropertySet* style, CSSPropertyID pr opertyID, const CSSValue* refTextDecoration)
1599 { 1603 {
1600 CSSValue* textDecoration = style->getPropertyCSSValue(propertID); 1604 const CSSValue* textDecoration = style->getPropertyCSSValue(propertyID);
1601 if (!textDecoration || !textDecoration->isValueList() || !refTextDecoration || !refTextDecoration->isValueList()) 1605 if (!textDecoration || !textDecoration->isValueList() || !refTextDecoration || !refTextDecoration->isValueList())
1602 return; 1606 return;
1603 1607
1604 CSSValueList* newTextDecoration = toCSSValueList(textDecoration)->copy(); 1608 CSSValueList* newTextDecoration = toCSSValueList(textDecoration)->copy();
1605 CSSValueList* valuesInRefTextDecoration = toCSSValueList(refTextDecoration); 1609 const CSSValueList* valuesInRefTextDecoration = toCSSValueList(refTextDecora tion);
1606 1610
1607 for (size_t i = 0; i < valuesInRefTextDecoration->length(); i++) 1611 for (size_t i = 0; i < valuesInRefTextDecoration->length(); i++)
1608 newTextDecoration->removeAll(*valuesInRefTextDecoration->item(i)); 1612 newTextDecoration->removeAll(*valuesInRefTextDecoration->item(i));
1609 1613
1610 setTextDecorationProperty(style, newTextDecoration, propertID); 1614 setTextDecorationProperty(style, newTextDecoration, propertyID);
1611 } 1615 }
1612 1616
1613 static bool fontWeightIsBold(CSSValue* fontWeight) 1617 static bool fontWeightIsBold(const CSSValue* fontWeight)
1614 { 1618 {
1615 if (!fontWeight->isPrimitiveValue()) 1619 if (!fontWeight->isPrimitiveValue())
1616 return false; 1620 return false;
1617 1621
1618 // Because b tag can only bold text, there are only two states in plain html : bold and not bold. 1622 // Because b tag can only bold text, there are only two states in plain html : bold and not bold.
1619 // Collapse all other values to either one of these two states for editing p urposes. 1623 // Collapse all other values to either one of these two states for editing p urposes.
1620 switch (toCSSPrimitiveValue(fontWeight)->getValueID()) { 1624 switch (toCSSPrimitiveValue(fontWeight)->getValueID()) {
1621 case CSSValue100: 1625 case CSSValue100:
1622 case CSSValue200: 1626 case CSSValue200:
1623 case CSSValue300: 1627 case CSSValue300:
1624 case CSSValue400: 1628 case CSSValue400:
1625 case CSSValue500: 1629 case CSSValue500:
1626 case CSSValueNormal: 1630 case CSSValueNormal:
1627 return false; 1631 return false;
1628 case CSSValueBold: 1632 case CSSValueBold:
1629 case CSSValue600: 1633 case CSSValue600:
1630 case CSSValue700: 1634 case CSSValue700:
1631 case CSSValue800: 1635 case CSSValue800:
1632 case CSSValue900: 1636 case CSSValue900:
1633 return true; 1637 return true;
1634 default: 1638 default:
1635 break; 1639 break;
1636 } 1640 }
1637 1641
1638 ASSERT_NOT_REACHED(); // For CSSValueBolder and CSSValueLighter 1642 ASSERT_NOT_REACHED(); // For CSSValueBolder and CSSValueLighter
1639 return false; 1643 return false;
1640 } 1644 }
1641 1645
1642 static bool fontWeightNeedsResolving(CSSValue* fontWeight) 1646 static bool fontWeightNeedsResolving(const CSSValue* fontWeight)
1643 { 1647 {
1644 if (!fontWeight->isPrimitiveValue()) 1648 if (!fontWeight->isPrimitiveValue())
1645 return true; 1649 return true;
1646 1650
1647 CSSValueID value = toCSSPrimitiveValue(fontWeight)->getValueID(); 1651 const CSSValueID value = toCSSPrimitiveValue(fontWeight)->getValueID();
1648 return value == CSSValueLighter || value == CSSValueBolder; 1652 return value == CSSValueLighter || value == CSSValueBolder;
1649 } 1653 }
1650 1654
1651 MutableStylePropertySet* getPropertiesNotIn(StylePropertySet* styleWithRedundant Properties, CSSStyleDeclaration* baseStyle) 1655 MutableStylePropertySet* getPropertiesNotIn(StylePropertySet* styleWithRedundant Properties, CSSStyleDeclaration* baseStyle)
1652 { 1656 {
1653 DCHECK(styleWithRedundantProperties); 1657 DCHECK(styleWithRedundantProperties);
1654 DCHECK(baseStyle); 1658 DCHECK(baseStyle);
1655 MutableStylePropertySet* result = styleWithRedundantProperties->mutableCopy( ); 1659 MutableStylePropertySet* result = styleWithRedundantProperties->mutableCopy( );
1656 1660
1657 result->removeEquivalentProperties(baseStyle); 1661 result->removeEquivalentProperties(baseStyle);
1658 1662
1659 CSSValue* baseTextDecorationsInEffect = baseStyle->getPropertyCSSValueIntern al(CSSPropertyWebkitTextDecorationsInEffect); 1663 const CSSValue* baseTextDecorationsInEffect = baseStyle->getPropertyCSSValue Internal(CSSPropertyWebkitTextDecorationsInEffect);
1660 diffTextDecorations(result, textDecorationPropertyForEditing(), baseTextDeco rationsInEffect); 1664 diffTextDecorations(result, textDecorationPropertyForEditing(), baseTextDeco rationsInEffect);
1661 diffTextDecorations(result, CSSPropertyWebkitTextDecorationsInEffect, baseTe xtDecorationsInEffect); 1665 diffTextDecorations(result, CSSPropertyWebkitTextDecorationsInEffect, baseTe xtDecorationsInEffect);
1662 1666
1663 if (CSSValue* baseFontWeight = baseStyle->getPropertyCSSValueInternal(CSSPro pertyFontWeight)) { 1667 if (const CSSValue* baseFontWeight = baseStyle->getPropertyCSSValueInternal( CSSPropertyFontWeight)) {
1664 if (CSSValue* fontWeight = result->getPropertyCSSValue(CSSPropertyFontWe ight)) { 1668 if (CSSValue* fontWeight = result->getPropertyCSSValue(CSSPropertyFontWe ight)) {
1665 if (!fontWeightNeedsResolving(fontWeight) && !fontWeightNeedsResolvi ng(baseFontWeight) 1669 if (!fontWeightNeedsResolving(fontWeight) && !fontWeightNeedsResolvi ng(baseFontWeight)
1666 && (fontWeightIsBold(fontWeight) == fontWeightIsBold(baseFontWei ght))) 1670 && (fontWeightIsBold(fontWeight) == fontWeightIsBold(baseFontWei ght)))
1667 result->removeProperty(CSSPropertyFontWeight); 1671 result->removeProperty(CSSPropertyFontWeight);
1668 } 1672 }
1669 } 1673 }
1670 1674
1671 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyColor) && getFontColor (result) == getFontColor(baseStyle)) 1675 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyColor) && getFontColor (result) == getFontColor(baseStyle))
1672 result->removeProperty(CSSPropertyColor); 1676 result->removeProperty(CSSPropertyColor);
1673 1677
1674 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyTextAlign) 1678 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyTextAlign)
1675 && textAlignResolvingStartAndEnd(result) == textAlignResolvingStartAndEn d(baseStyle)) 1679 && textAlignResolvingStartAndEnd(result) == textAlignResolvingStartAndEn d(baseStyle))
1676 result->removeProperty(CSSPropertyTextAlign); 1680 result->removeProperty(CSSPropertyTextAlign);
1677 1681
1678 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyBackgroundColor) && ge tBackgroundColor(result) == getBackgroundColor(baseStyle)) 1682 if (baseStyle->getPropertyCSSValueInternal(CSSPropertyBackgroundColor) && ge tBackgroundColor(result) == getBackgroundColor(baseStyle))
1679 result->removeProperty(CSSPropertyBackgroundColor); 1683 result->removeProperty(CSSPropertyBackgroundColor);
1680 1684
1681 return result; 1685 return result;
1682 } 1686 }
1683 1687
1684 CSSValueID getIdentifierValue(StylePropertySet* style, CSSPropertyID propertyID) 1688 CSSValueID getIdentifierValue(StylePropertySet* style, CSSPropertyID propertyID)
1685 { 1689 {
1686 if (!style) 1690 if (!style)
1687 return CSSValueInvalid; 1691 return CSSValueInvalid;
1688 CSSValue* value = style->getPropertyCSSValue(propertyID); 1692 const CSSValue* value = style->getPropertyCSSValue(propertyID);
1689 if (!value || !value->isPrimitiveValue()) 1693 if (!value || !value->isPrimitiveValue())
1690 return CSSValueInvalid; 1694 return CSSValueInvalid;
1691 return toCSSPrimitiveValue(value)->getValueID(); 1695 return toCSSPrimitiveValue(value)->getValueID();
1692 } 1696 }
1693 1697
1694 CSSValueID getIdentifierValue(CSSStyleDeclaration* style, CSSPropertyID property ID) 1698 CSSValueID getIdentifierValue(CSSStyleDeclaration* style, CSSPropertyID property ID)
1695 { 1699 {
1696 if (!style) 1700 if (!style)
1697 return CSSValueInvalid; 1701 return CSSValueInvalid;
1698 CSSValue* value = style->getPropertyCSSValueInternal(propertyID); 1702 const CSSValue* value = style->getPropertyCSSValueInternal(propertyID);
1699 if (!value || !value->isPrimitiveValue()) 1703 if (!value || !value->isPrimitiveValue())
1700 return CSSValueInvalid; 1704 return CSSValueInvalid;
1701 return toCSSPrimitiveValue(value)->getValueID(); 1705 return toCSSPrimitiveValue(value)->getValueID();
1702 } 1706 }
1703 1707
1704 int legacyFontSizeFromCSSValue(Document* document, CSSPrimitiveValue* value, boo l isMonospaceFont, LegacyFontSizeMode mode) 1708 int legacyFontSizeFromCSSValue(Document* document, const CSSPrimitiveValue* valu e, bool isMonospaceFont, LegacyFontSizeMode mode)
1705 { 1709 {
1706 CSSPrimitiveValue::LengthUnitType lengthType; 1710 CSSPrimitiveValue::LengthUnitType lengthType;
1707 if (CSSPrimitiveValue::unitTypeToLengthUnitType(value->typeWithCalcResolved( ), lengthType) 1711 if (CSSPrimitiveValue::unitTypeToLengthUnitType(value->typeWithCalcResolved( ), lengthType)
1708 && lengthType == CSSPrimitiveValue::UnitTypePixels) { 1712 && lengthType == CSSPrimitiveValue::UnitTypePixels) {
1709 double conversion = CSSPrimitiveValue::conversionToCanonicalUnitsScaleFa ctor(value->typeWithCalcResolved()); 1713 double conversion = CSSPrimitiveValue::conversionToCanonicalUnitsScaleFa ctor(value->typeWithCalcResolved());
1710 int pixelFontSize = clampTo<int>(value->getDoubleValue() * conversion); 1714 int pixelFontSize = clampTo<int>(value->getDoubleValue() * conversion);
1711 int legacyFontSize = FontSize::legacyFontSize(document, pixelFontSize, i sMonospaceFont); 1715 int legacyFontSize = FontSize::legacyFontSize(document, pixelFontSize, i sMonospaceFont);
1712 // Use legacy font size only if pixel value matches exactly to that of l egacy font size. 1716 // Use legacy font size only if pixel value matches exactly to that of l egacy font size.
1713 if (mode == AlwaysUseLegacyFontSize || FontSize::fontSizeForKeyword(docu ment, legacyFontSize, isMonospaceFont) == pixelFontSize) 1717 if (mode == AlwaysUseLegacyFontSize || FontSize::fontSizeForKeyword(docu ment, legacyFontSize, isMonospaceFont) == pixelFontSize)
1714 return legacyFontSize; 1718 return legacyFontSize;
1715 1719
1716 return 0; 1720 return 0;
1717 } 1721 }
1718 1722
1719 if (CSSValueXSmall <= value->getValueID() && value->getValueID() <= CSSValue WebkitXxxLarge) 1723 if (CSSValueXSmall <= value->getValueID() && value->getValueID() <= CSSValue WebkitXxxLarge)
1720 return value->getValueID() - CSSValueXSmall + 1; 1724 return value->getValueID() - CSSValueXSmall + 1;
1721 1725
1722 return 0; 1726 return 0;
1723 } 1727 }
1724 1728
1725 bool isTransparentColorValue(CSSValue* cssValue) 1729 bool isTransparentColorValue(const CSSValue* cssValue)
1726 { 1730 {
1727 if (!cssValue) 1731 if (!cssValue)
1728 return true; 1732 return true;
1729 if (cssValue->isColorValue()) 1733 if (cssValue->isColorValue())
1730 return !toCSSColorValue(cssValue)->value().alpha(); 1734 return !toCSSColorValue(cssValue)->value().alpha();
1731 if (!cssValue->isPrimitiveValue()) 1735 if (!cssValue->isPrimitiveValue())
1732 return false; 1736 return false;
1733 CSSPrimitiveValue* value = toCSSPrimitiveValue(cssValue); 1737 const CSSPrimitiveValue* value = toCSSPrimitiveValue(cssValue);
1734 return value->getValueID() == CSSValueTransparent; 1738 return value->getValueID() == CSSValueTransparent;
1735 } 1739 }
1736 1740
1737 bool hasTransparentBackgroundColor(CSSStyleDeclaration* style) 1741 bool hasTransparentBackgroundColor(CSSStyleDeclaration* style)
1738 { 1742 {
1739 CSSValue* cssValue = style->getPropertyCSSValueInternal(CSSPropertyBackgroun dColor); 1743 const CSSValue* cssValue = style->getPropertyCSSValueInternal(CSSPropertyBac kgroundColor);
1740 return isTransparentColorValue(cssValue); 1744 return isTransparentColorValue(cssValue);
1741 } 1745 }
1742 1746
1743 bool hasTransparentBackgroundColor(StylePropertySet* style) 1747 bool hasTransparentBackgroundColor(StylePropertySet* style)
1744 { 1748 {
1745 CSSValue* cssValue = style->getPropertyCSSValue(CSSPropertyBackgroundColor); 1749 const CSSValue* cssValue = style->getPropertyCSSValue(CSSPropertyBackgroundC olor);
1746 return isTransparentColorValue(cssValue); 1750 return isTransparentColorValue(cssValue);
1747 } 1751 }
1748 1752
1749 CSSValue* backgroundColorValueInEffect(Node* node) 1753 const CSSValue* backgroundColorValueInEffect(Node* node)
1750 { 1754 {
1751 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) { 1755 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) {
1752 CSSComputedStyleDeclaration* ancestorStyle = CSSComputedStyleDeclaration ::create(ancestor); 1756 CSSComputedStyleDeclaration* ancestorStyle = CSSComputedStyleDeclaration ::create(ancestor);
1753 if (!hasTransparentBackgroundColor(ancestorStyle)) 1757 if (!hasTransparentBackgroundColor(ancestorStyle))
1754 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor ); 1758 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor );
1755 } 1759 }
1756 return nullptr; 1760 return nullptr;
1757 } 1761 }
1758 1762
1759 } // namespace blink 1763 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698