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

Side by Side Diff: Source/core/rendering/RenderObject.cpp

Issue 280503003: Fix incorrect style recalculation of text-decoration properties. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review issues. Created 6 years, 7 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 3059 matching lines...) Expand 10 before | Expand all | Expand 10 after
3070 } 3070 }
3071 3071
3072 return getUncachedPseudoStyle(PseudoStyleRequest(SELECTION)); 3072 return getUncachedPseudoStyle(PseudoStyleRequest(SELECTION));
3073 } 3073 }
3074 3074
3075 bool RenderObject::hasBlendMode() const 3075 bool RenderObject::hasBlendMode() const
3076 { 3076 {
3077 return RuntimeEnabledFeatures::cssCompositingEnabled() && style() && style() ->hasBlendMode(); 3077 return RuntimeEnabledFeatures::cssCompositingEnabled() && style() && style() ->hasBlendMode();
3078 } 3078 }
3079 3079
3080 static Color decorationColor(const RenderObject* object, RenderStyle* style)
3081 {
3082 // Check for text decoration color first.
3083 StyleColor result = style->visitedDependentDecorationColor();
3084 if (!result.isCurrentColor())
3085 return result.color();
3086
3087 if (style->textStrokeWidth() > 0) {
3088 // Prefer stroke color if possible but not if it's fully transparent.
3089 Color textStrokeColor = object->resolveColor(style, CSSPropertyWebkitTex tStrokeColor);
3090 if (textStrokeColor.alpha())
3091 return textStrokeColor;
3092 }
3093
3094 return object->resolveColor(style, CSSPropertyWebkitTextFillColor);
3095 }
3096
3097 void RenderObject::getTextDecorations(unsigned decorations, AppliedTextDecoratio n& underline, AppliedTextDecoration& overline, AppliedTextDecoration& linethroug h, bool quirksMode, bool firstlineStyle) 3080 void RenderObject::getTextDecorations(unsigned decorations, AppliedTextDecoratio n& underline, AppliedTextDecoration& overline, AppliedTextDecoration& linethroug h, bool quirksMode, bool firstlineStyle)
3098 { 3081 {
3099 RenderObject* curr = this; 3082 RenderObject* curr = this;
3100 RenderStyle* styleToUse = 0; 3083 RenderStyle* styleToUse = 0;
3101 unsigned currDecs = TextDecorationNone; 3084 unsigned currDecs = TextDecorationNone;
3102 Color resultColor; 3085 Color resultColor;
3103 TextDecorationStyle resultStyle; 3086 TextDecorationStyle resultStyle;
3104 do { 3087 do {
3105 styleToUse = curr->style(firstlineStyle); 3088 styleToUse = curr->style(firstlineStyle);
3106 currDecs = styleToUse->textDecoration(); 3089 currDecs = styleToUse->textDecoration();
3107 currDecs &= decorations; 3090 currDecs &= decorations;
3108 resultColor = decorationColor(this, styleToUse); 3091 resultColor = styleToUse->visitedDependentDecorationColor();
3109 resultStyle = styleToUse->textDecorationStyle(); 3092 resultStyle = styleToUse->textDecorationStyle();
3110 // Parameter 'decorations' is cast as an int to enable the bitwise opera tions below. 3093 // Parameter 'decorations' is cast as an int to enable the bitwise opera tions below.
3111 if (currDecs) { 3094 if (currDecs) {
3112 if (currDecs & TextDecorationUnderline) { 3095 if (currDecs & TextDecorationUnderline) {
3113 decorations &= ~TextDecorationUnderline; 3096 decorations &= ~TextDecorationUnderline;
3114 underline.color = resultColor; 3097 underline.color = resultColor;
3115 underline.style = resultStyle; 3098 underline.style = resultStyle;
3116 } 3099 }
3117 if (currDecs & TextDecorationOverline) { 3100 if (currDecs & TextDecorationOverline) {
3118 decorations &= ~TextDecorationOverline; 3101 decorations &= ~TextDecorationOverline;
3119 overline.color = resultColor; 3102 overline.color = resultColor;
3120 overline.style = resultStyle; 3103 overline.style = resultStyle;
3121 } 3104 }
3122 if (currDecs & TextDecorationLineThrough) { 3105 if (currDecs & TextDecorationLineThrough) {
3123 decorations &= ~TextDecorationLineThrough; 3106 decorations &= ~TextDecorationLineThrough;
3124 linethrough.color = resultColor; 3107 linethrough.color = resultColor;
3125 linethrough.style = resultStyle; 3108 linethrough.style = resultStyle;
3126 } 3109 }
3127 } 3110 }
3128 if (curr->isRubyText()) 3111 if (curr->isRubyText())
3129 return; 3112 return;
3130 curr = curr->parent(); 3113 curr = curr->parent();
3131 if (curr && curr->isAnonymousBlock() && toRenderBlock(curr)->continuatio n()) 3114 if (curr && curr->isAnonymousBlock() && toRenderBlock(curr)->continuatio n())
3132 curr = toRenderBlock(curr)->continuation(); 3115 curr = toRenderBlock(curr)->continuation();
3133 } while (curr && decorations && (!quirksMode || !curr->node() || (!isHTMLAnc horElement(*curr->node()) && !isHTMLFontElement(*curr->node())))); 3116 } while (curr && decorations && (!quirksMode || !curr->node() || (!isHTMLAnc horElement(*curr->node()) && !isHTMLFontElement(*curr->node()))));
3134 3117
3135 // If we bailed out, use the element we bailed out at (typically a <font> or <a> element). 3118 // If we bailed out, use the element we bailed out at (typically a <font> or <a> element).
3136 if (decorations && curr) { 3119 if (decorations && curr) {
3137 styleToUse = curr->style(firstlineStyle); 3120 styleToUse = curr->style(firstlineStyle);
3138 resultColor = decorationColor(this, styleToUse); 3121 resultColor = styleToUse->visitedDependentDecorationColor();
3139 if (decorations & TextDecorationUnderline) { 3122 if (decorations & TextDecorationUnderline) {
3140 underline.color = resultColor; 3123 underline.color = resultColor;
3141 underline.style = resultStyle; 3124 underline.style = resultStyle;
3142 } 3125 }
3143 if (decorations & TextDecorationOverline) { 3126 if (decorations & TextDecorationOverline) {
3144 overline.color = resultColor; 3127 overline.color = resultColor;
3145 overline.style = resultStyle; 3128 overline.style = resultStyle;
3146 } 3129 }
3147 if (decorations & TextDecorationLineThrough) { 3130 if (decorations & TextDecorationLineThrough) {
3148 linethrough.color = resultColor; 3131 linethrough.color = resultColor;
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
3478 { 3461 {
3479 if (object1) { 3462 if (object1) {
3480 const WebCore::RenderObject* root = object1; 3463 const WebCore::RenderObject* root = object1;
3481 while (root->parent()) 3464 while (root->parent())
3482 root = root->parent(); 3465 root = root->parent();
3483 root->showRenderTreeAndMark(object1, "*", object2, "-", 0); 3466 root->showRenderTreeAndMark(object1, "*", object2, "-", 0);
3484 } 3467 }
3485 } 3468 }
3486 3469
3487 #endif 3470 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698