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

Side by Side Diff: Source/core/layout/style/ComputedStyle.cpp

Issue 1033943002: Rename LayoutStyle to papayawhip (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ensureComputedStyle Created 5 years, 8 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org) 2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
4 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. 4 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
11 * This library is distributed in the hope that it will be useful, 11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details. 14 * Library General Public License for more details.
15 * 15 *
16 * You should have received a copy of the GNU Library General Public License 16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to 17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA. 19 * Boston, MA 02110-1301, USA.
20 * 20 *
21 */ 21 */
22 22
23 #include "config.h" 23 #include "config.h"
24 #include "core/layout/style/LayoutStyle.h" 24 #include "core/layout/style/ComputedStyle.h"
25 25
26 #include "core/css/resolver/StyleResolver.h" 26 #include "core/css/resolver/StyleResolver.h"
27 #include "core/layout/LayoutTheme.h" 27 #include "core/layout/LayoutTheme.h"
28 #include "core/layout/TextAutosizer.h" 28 #include "core/layout/TextAutosizer.h"
29 #include "core/layout/style/AppliedTextDecoration.h" 29 #include "core/layout/style/AppliedTextDecoration.h"
30 #include "core/layout/style/BorderEdge.h" 30 #include "core/layout/style/BorderEdge.h"
31 #include "core/layout/style/ContentData.h" 31 #include "core/layout/style/ContentData.h"
32 #include "core/layout/style/DataEquivalency.h" 32 #include "core/layout/style/DataEquivalency.h"
33 #include "core/layout/style/LayoutStyleConstants.h" 33 #include "core/layout/style/ComputedStyleConstants.h"
34 #include "core/layout/style/PathStyleMotionPath.h" 34 #include "core/layout/style/PathStyleMotionPath.h"
35 #include "core/layout/style/QuotesData.h" 35 #include "core/layout/style/QuotesData.h"
36 #include "core/layout/style/ShadowList.h" 36 #include "core/layout/style/ShadowList.h"
37 #include "core/layout/style/StyleImage.h" 37 #include "core/layout/style/StyleImage.h"
38 #include "core/layout/style/StyleInheritedData.h" 38 #include "core/layout/style/StyleInheritedData.h"
39 #include "platform/LengthFunctions.h" 39 #include "platform/LengthFunctions.h"
40 #include "platform/RuntimeEnabledFeatures.h" 40 #include "platform/RuntimeEnabledFeatures.h"
41 #include "platform/fonts/Font.h" 41 #include "platform/fonts/Font.h"
42 #include "platform/fonts/FontSelector.h" 42 #include "platform/fonts/FontSelector.h"
43 #include "platform/geometry/FloatRoundedRect.h" 43 #include "platform/geometry/FloatRoundedRect.h"
44 #include "wtf/MathExtras.h" 44 #include "wtf/MathExtras.h"
45 45
46 #include <algorithm> 46 #include <algorithm>
47 47
48 namespace blink { 48 namespace blink {
49 49
50 struct SameSizeAsBorderValue { 50 struct SameSizeAsBorderValue {
51 RGBA32 m_color; 51 RGBA32 m_color;
52 unsigned m_width; 52 unsigned m_width;
53 }; 53 };
54 54
55 static_assert(sizeof(BorderValue) == sizeof(SameSizeAsBorderValue), "BorderValue should stay small"); 55 static_assert(sizeof(BorderValue) == sizeof(SameSizeAsBorderValue), "BorderValue should stay small");
56 56
57 struct SameSizeAsLayoutStyle : public RefCounted<SameSizeAsLayoutStyle> { 57 struct SameSizeAsComputedStyle : public RefCounted<SameSizeAsComputedStyle> {
58 void* dataRefs[7]; 58 void* dataRefs[7];
59 void* ownPtrs[1]; 59 void* ownPtrs[1];
60 void* dataRefSvgStyle; 60 void* dataRefSvgStyle;
61 61
62 struct InheritedFlags { 62 struct InheritedFlags {
63 unsigned m_bitfields[2]; 63 unsigned m_bitfields[2];
64 } inherited_flags; 64 } inherited_flags;
65 65
66 struct NonInheritedFlags { 66 struct NonInheritedFlags {
67 unsigned m_bitfields[2]; 67 unsigned m_bitfields[2];
68 } noninherited_flags; 68 } noninherited_flags;
69 }; 69 };
70 70
71 static_assert(sizeof(LayoutStyle) == sizeof(SameSizeAsLayoutStyle), "LayoutStyle should stay small"); 71 static_assert(sizeof(ComputedStyle) == sizeof(SameSizeAsComputedStyle), "Compute dStyle should stay small");
72 72
73 PassRefPtr<LayoutStyle> LayoutStyle::create() 73 PassRefPtr<ComputedStyle> ComputedStyle::create()
74 { 74 {
75 return adoptRef(new LayoutStyle()); 75 return adoptRef(new ComputedStyle());
76 } 76 }
77 77
78 PassRefPtr<LayoutStyle> LayoutStyle::createInitialStyle() 78 PassRefPtr<ComputedStyle> ComputedStyle::createInitialStyle()
79 { 79 {
80 return adoptRef(new LayoutStyle(InitialStyle)); 80 return adoptRef(new ComputedStyle(InitialStyle));
81 } 81 }
82 82
83 PassRefPtr<LayoutStyle> LayoutStyle::createAnonymousStyleWithDisplay(const Layou tStyle& parentStyle, EDisplay display) 83 PassRefPtr<ComputedStyle> ComputedStyle::createAnonymousStyleWithDisplay(const C omputedStyle& parentStyle, EDisplay display)
84 { 84 {
85 RefPtr<LayoutStyle> newStyle = LayoutStyle::create(); 85 RefPtr<ComputedStyle> newStyle = ComputedStyle::create();
86 newStyle->inheritFrom(parentStyle); 86 newStyle->inheritFrom(parentStyle);
87 newStyle->inheritUnicodeBidiFrom(parentStyle); 87 newStyle->inheritUnicodeBidiFrom(parentStyle);
88 newStyle->setDisplay(display); 88 newStyle->setDisplay(display);
89 return newStyle; 89 return newStyle;
90 } 90 }
91 91
92 PassRefPtr<LayoutStyle> LayoutStyle::clone(const LayoutStyle& other) 92 PassRefPtr<ComputedStyle> ComputedStyle::clone(const ComputedStyle& other)
93 { 93 {
94 return adoptRef(new LayoutStyle(other)); 94 return adoptRef(new ComputedStyle(other));
95 } 95 }
96 96
97 ALWAYS_INLINE LayoutStyle::LayoutStyle() 97 ALWAYS_INLINE ComputedStyle::ComputedStyle()
98 : m_box(initialStyle()->m_box) 98 : m_box(initialStyle()->m_box)
99 , visual(initialStyle()->visual) 99 , visual(initialStyle()->visual)
100 , m_background(initialStyle()->m_background) 100 , m_background(initialStyle()->m_background)
101 , surround(initialStyle()->surround) 101 , surround(initialStyle()->surround)
102 , rareNonInheritedData(initialStyle()->rareNonInheritedData) 102 , rareNonInheritedData(initialStyle()->rareNonInheritedData)
103 , rareInheritedData(initialStyle()->rareInheritedData) 103 , rareInheritedData(initialStyle()->rareInheritedData)
104 , inherited(initialStyle()->inherited) 104 , inherited(initialStyle()->inherited)
105 , m_svgStyle(initialStyle()->m_svgStyle) 105 , m_svgStyle(initialStyle()->m_svgStyle)
106 { 106 {
107 setBitDefaults(); // Would it be faster to copy this from the default style? 107 setBitDefaults(); // Would it be faster to copy this from the default style?
108 static_assert((sizeof(InheritedFlags) <= 8), "InheritedFlags should not grow "); 108 static_assert((sizeof(InheritedFlags) <= 8), "InheritedFlags should not grow ");
109 static_assert((sizeof(NonInheritedFlags) <= 8), "NonInheritedFlags should no t grow"); 109 static_assert((sizeof(NonInheritedFlags) <= 8), "NonInheritedFlags should no t grow");
110 } 110 }
111 111
112 ALWAYS_INLINE LayoutStyle::LayoutStyle(InitialStyleTag) 112 ALWAYS_INLINE ComputedStyle::ComputedStyle(InitialStyleTag)
113 { 113 {
114 setBitDefaults(); 114 setBitDefaults();
115 115
116 m_box.init(); 116 m_box.init();
117 visual.init(); 117 visual.init();
118 m_background.init(); 118 m_background.init();
119 surround.init(); 119 surround.init();
120 rareNonInheritedData.init(); 120 rareNonInheritedData.init();
121 rareNonInheritedData.access()->m_deprecatedFlexibleBox.init(); 121 rareNonInheritedData.access()->m_deprecatedFlexibleBox.init();
122 rareNonInheritedData.access()->m_flexibleBox.init(); 122 rareNonInheritedData.access()->m_flexibleBox.init();
123 rareNonInheritedData.access()->m_multiCol.init(); 123 rareNonInheritedData.access()->m_multiCol.init();
124 rareNonInheritedData.access()->m_transform.init(); 124 rareNonInheritedData.access()->m_transform.init();
125 rareNonInheritedData.access()->m_willChange.init(); 125 rareNonInheritedData.access()->m_willChange.init();
126 rareNonInheritedData.access()->m_filter.init(); 126 rareNonInheritedData.access()->m_filter.init();
127 rareNonInheritedData.access()->m_grid.init(); 127 rareNonInheritedData.access()->m_grid.init();
128 rareNonInheritedData.access()->m_gridItem.init(); 128 rareNonInheritedData.access()->m_gridItem.init();
129 rareInheritedData.init(); 129 rareInheritedData.init();
130 inherited.init(); 130 inherited.init();
131 m_svgStyle.init(); 131 m_svgStyle.init();
132 } 132 }
133 133
134 ALWAYS_INLINE LayoutStyle::LayoutStyle(const LayoutStyle& o) 134 ALWAYS_INLINE ComputedStyle::ComputedStyle(const ComputedStyle& o)
135 : RefCounted<LayoutStyle>() 135 : RefCounted<ComputedStyle>()
136 , m_box(o.m_box) 136 , m_box(o.m_box)
137 , visual(o.visual) 137 , visual(o.visual)
138 , m_background(o.m_background) 138 , m_background(o.m_background)
139 , surround(o.surround) 139 , surround(o.surround)
140 , rareNonInheritedData(o.rareNonInheritedData) 140 , rareNonInheritedData(o.rareNonInheritedData)
141 , rareInheritedData(o.rareInheritedData) 141 , rareInheritedData(o.rareInheritedData)
142 , inherited(o.inherited) 142 , inherited(o.inherited)
143 , m_svgStyle(o.m_svgStyle) 143 , m_svgStyle(o.m_svgStyle)
144 , inherited_flags(o.inherited_flags) 144 , inherited_flags(o.inherited_flags)
145 , noninherited_flags(o.noninherited_flags) 145 , noninherited_flags(o.noninherited_flags)
146 { 146 {
147 } 147 }
148 148
149 static StyleRecalcChange diffPseudoStyles(const LayoutStyle& oldStyle, const Lay outStyle& newStyle) 149 static StyleRecalcChange diffPseudoStyles(const ComputedStyle& oldStyle, const C omputedStyle& newStyle)
150 { 150 {
151 // If the pseudoStyles have changed, we want any StyleRecalcChange that is n ot NoChange 151 // If the pseudoStyles have changed, we want any StyleRecalcChange that is n ot NoChange
152 // because setStyle will do the right thing with anything else. 152 // because setStyle will do the right thing with anything else.
153 if (!oldStyle.hasAnyPublicPseudoStyles()) 153 if (!oldStyle.hasAnyPublicPseudoStyles())
154 return NoChange; 154 return NoChange;
155 for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; pseudoId < FIRST_INTERNAL_PS EUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) { 155 for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; pseudoId < FIRST_INTERNAL_PS EUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) {
156 if (!oldStyle.hasPseudoStyle(pseudoId)) 156 if (!oldStyle.hasPseudoStyle(pseudoId))
157 continue; 157 continue;
158 const LayoutStyle* newPseudoStyle = newStyle.getCachedPseudoStyle(pseudo Id); 158 const ComputedStyle* newPseudoStyle = newStyle.getCachedPseudoStyle(pseu doId);
159 if (!newPseudoStyle) 159 if (!newPseudoStyle)
160 return NoInherit; 160 return NoInherit;
161 const LayoutStyle* oldPseudoStyle = oldStyle.getCachedPseudoStyle(pseudo Id); 161 const ComputedStyle* oldPseudoStyle = oldStyle.getCachedPseudoStyle(pseu doId);
162 if (oldPseudoStyle && *oldPseudoStyle != *newPseudoStyle) 162 if (oldPseudoStyle && *oldPseudoStyle != *newPseudoStyle)
163 return NoInherit; 163 return NoInherit;
164 } 164 }
165 return NoChange; 165 return NoChange;
166 } 166 }
167 167
168 StyleRecalcChange LayoutStyle::stylePropagationDiff(const LayoutStyle* oldStyle, const LayoutStyle* newStyle) 168 StyleRecalcChange ComputedStyle::stylePropagationDiff(const ComputedStyle* oldSt yle, const ComputedStyle* newStyle)
169 { 169 {
170 if ((!oldStyle && newStyle) || (oldStyle && !newStyle)) 170 if ((!oldStyle && newStyle) || (oldStyle && !newStyle))
171 return Reattach; 171 return Reattach;
172 172
173 if (!oldStyle && !newStyle) 173 if (!oldStyle && !newStyle)
174 return NoChange; 174 return NoChange;
175 175
176 if (oldStyle->display() != newStyle->display() 176 if (oldStyle->display() != newStyle->display()
177 || oldStyle->hasPseudoStyle(FIRST_LETTER) != newStyle->hasPseudoStyle(FI RST_LETTER) 177 || oldStyle->hasPseudoStyle(FIRST_LETTER) != newStyle->hasPseudoStyle(FI RST_LETTER)
178 || oldStyle->columnSpan() != newStyle->columnSpan() 178 || oldStyle->columnSpan() != newStyle->columnSpan()
179 || !oldStyle->contentDataEquivalent(newStyle) 179 || !oldStyle->contentDataEquivalent(newStyle)
180 || oldStyle->hasTextCombine() != newStyle->hasTextCombine() 180 || oldStyle->hasTextCombine() != newStyle->hasTextCombine()
181 || oldStyle->justifyItems() != newStyle->justifyItems() 181 || oldStyle->justifyItems() != newStyle->justifyItems()
182 || oldStyle->alignItems() != newStyle->alignItems()) 182 || oldStyle->alignItems() != newStyle->alignItems())
183 return Reattach; 183 return Reattach;
184 184
185 if (oldStyle->inheritedNotEqual(*newStyle)) 185 if (oldStyle->inheritedNotEqual(*newStyle))
186 return Inherit; 186 return Inherit;
187 187
188 if (*oldStyle == *newStyle) 188 if (*oldStyle == *newStyle)
189 return diffPseudoStyles(*oldStyle, *newStyle); 189 return diffPseudoStyles(*oldStyle, *newStyle);
190 190
191 if (oldStyle->hasExplicitlyInheritedProperties()) 191 if (oldStyle->hasExplicitlyInheritedProperties())
192 return Inherit; 192 return Inherit;
193 193
194 return NoInherit; 194 return NoInherit;
195 } 195 }
196 196
197 ItemPosition LayoutStyle::resolveAlignment(const LayoutStyle& parentStyle, const LayoutStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject) 197 ItemPosition ComputedStyle::resolveAlignment(const ComputedStyle& parentStyle, c onst ComputedStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject )
198 { 198 {
199 // The auto keyword computes to the parent's align-items computed value, or to "stretch", if not set or "auto". 199 // The auto keyword computes to the parent's align-items computed value, or to "stretch", if not set or "auto".
200 if (childStyle.alignSelf() == ItemPositionAuto) 200 if (childStyle.alignSelf() == ItemPositionAuto)
201 return (parentStyle.alignItems() == ItemPositionAuto) ? resolvedAutoPosi tionForLayoutObject : parentStyle.alignItems(); 201 return (parentStyle.alignItems() == ItemPositionAuto) ? resolvedAutoPosi tionForLayoutObject : parentStyle.alignItems();
202 return childStyle.alignSelf(); 202 return childStyle.alignSelf();
203 } 203 }
204 204
205 ItemPosition LayoutStyle::resolveJustification(const LayoutStyle& parentStyle, c onst LayoutStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject) 205 ItemPosition ComputedStyle::resolveJustification(const ComputedStyle& parentStyl e, const ComputedStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutOb ject)
206 { 206 {
207 if (childStyle.justifySelf() == ItemPositionAuto) 207 if (childStyle.justifySelf() == ItemPositionAuto)
208 return (parentStyle.justifyItems() == ItemPositionAuto) ? resolvedAutoPo sitionForLayoutObject : parentStyle.justifyItems(); 208 return (parentStyle.justifyItems() == ItemPositionAuto) ? resolvedAutoPo sitionForLayoutObject : parentStyle.justifyItems();
209 return childStyle.justifySelf(); 209 return childStyle.justifySelf();
210 } 210 }
211 211
212 void LayoutStyle::inheritFrom(const LayoutStyle& inheritParent, IsAtShadowBounda ry isAtShadowBoundary) 212 void ComputedStyle::inheritFrom(const ComputedStyle& inheritParent, IsAtShadowBo undary isAtShadowBoundary)
213 { 213 {
214 if (isAtShadowBoundary == AtShadowBoundary) { 214 if (isAtShadowBoundary == AtShadowBoundary) {
215 // Even if surrounding content is user-editable, shadow DOM should act a s a single unit, and not necessarily be editable 215 // Even if surrounding content is user-editable, shadow DOM should act a s a single unit, and not necessarily be editable
216 EUserModify currentUserModify = userModify(); 216 EUserModify currentUserModify = userModify();
217 rareInheritedData = inheritParent.rareInheritedData; 217 rareInheritedData = inheritParent.rareInheritedData;
218 setUserModify(currentUserModify); 218 setUserModify(currentUserModify);
219 } else { 219 } else {
220 rareInheritedData = inheritParent.rareInheritedData; 220 rareInheritedData = inheritParent.rareInheritedData;
221 } 221 }
222 inherited = inheritParent.inherited; 222 inherited = inheritParent.inherited;
223 inherited_flags = inheritParent.inherited_flags; 223 inherited_flags = inheritParent.inherited_flags;
224 if (m_svgStyle != inheritParent.m_svgStyle) 224 if (m_svgStyle != inheritParent.m_svgStyle)
225 m_svgStyle.access()->inheritFrom(inheritParent.m_svgStyle.get()); 225 m_svgStyle.access()->inheritFrom(inheritParent.m_svgStyle.get());
226 } 226 }
227 227
228 void LayoutStyle::copyNonInheritedFromCached(const LayoutStyle& other) 228 void ComputedStyle::copyNonInheritedFromCached(const ComputedStyle& other)
229 { 229 {
230 m_box = other.m_box; 230 m_box = other.m_box;
231 visual = other.visual; 231 visual = other.visual;
232 m_background = other.m_background; 232 m_background = other.m_background;
233 surround = other.surround; 233 surround = other.surround;
234 rareNonInheritedData = other.rareNonInheritedData; 234 rareNonInheritedData = other.rareNonInheritedData;
235 235
236 // The flags are copied one-by-one because noninherited_flags contains a bun ch of stuff other than real style data. 236 // The flags are copied one-by-one because noninherited_flags contains a bun ch of stuff other than real style data.
237 // See comments for each skipped flag below. 237 // See comments for each skipped flag below.
238 noninherited_flags.effectiveDisplay = other.noninherited_flags.effectiveDisp lay; 238 noninherited_flags.effectiveDisplay = other.noninherited_flags.effectiveDisp lay;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 // noninherited_flags.affectedByHover 277 // noninherited_flags.affectedByHover
278 // noninherited_flags.affectedByActive 278 // noninherited_flags.affectedByActive
279 // noninherited_flags.affectedByDrag 279 // noninherited_flags.affectedByDrag
280 // noninherited_flags.isLink 280 // noninherited_flags.isLink
281 281
282 if (m_svgStyle != other.m_svgStyle) 282 if (m_svgStyle != other.m_svgStyle)
283 m_svgStyle.access()->copyNonInheritedFromCached(other.m_svgStyle.get()); 283 m_svgStyle.access()->copyNonInheritedFromCached(other.m_svgStyle.get());
284 ASSERT(zoom() == initialZoom()); 284 ASSERT(zoom() == initialZoom());
285 } 285 }
286 286
287 bool LayoutStyle::operator==(const LayoutStyle& o) const 287 bool ComputedStyle::operator==(const ComputedStyle& o) const
288 { 288 {
289 // compare everything except the pseudoStyle pointer 289 // compare everything except the pseudoStyle pointer
290 return inherited_flags == o.inherited_flags 290 return inherited_flags == o.inherited_flags
291 && noninherited_flags == o.noninherited_flags 291 && noninherited_flags == o.noninherited_flags
292 && m_box == o.m_box 292 && m_box == o.m_box
293 && visual == o.visual 293 && visual == o.visual
294 && m_background == o.m_background 294 && m_background == o.m_background
295 && surround == o.surround 295 && surround == o.surround
296 && rareNonInheritedData == o.rareNonInheritedData 296 && rareNonInheritedData == o.rareNonInheritedData
297 && rareInheritedData == o.rareInheritedData 297 && rareInheritedData == o.rareInheritedData
298 && inherited == o.inherited 298 && inherited == o.inherited
299 && m_svgStyle == o.m_svgStyle; 299 && m_svgStyle == o.m_svgStyle;
300 } 300 }
301 301
302 bool LayoutStyle::isStyleAvailable() const 302 bool ComputedStyle::isStyleAvailable() const
303 { 303 {
304 return this != StyleResolver::styleNotYetAvailable(); 304 return this != StyleResolver::styleNotYetAvailable();
305 } 305 }
306 306
307 bool LayoutStyle::hasUniquePseudoStyle() const 307 bool ComputedStyle::hasUniquePseudoStyle() const
308 { 308 {
309 if (!m_cachedPseudoStyles || styleType() != NOPSEUDO) 309 if (!m_cachedPseudoStyles || styleType() != NOPSEUDO)
310 return false; 310 return false;
311 311
312 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) { 312 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
313 const LayoutStyle& pseudoStyle = *m_cachedPseudoStyles->at(i); 313 const ComputedStyle& pseudoStyle = *m_cachedPseudoStyles->at(i);
314 if (pseudoStyle.unique()) 314 if (pseudoStyle.unique())
315 return true; 315 return true;
316 } 316 }
317 317
318 return false; 318 return false;
319 } 319 }
320 320
321 LayoutStyle* LayoutStyle::getCachedPseudoStyle(PseudoId pid) const 321 ComputedStyle* ComputedStyle::getCachedPseudoStyle(PseudoId pid) const
322 { 322 {
323 if (!m_cachedPseudoStyles || !m_cachedPseudoStyles->size()) 323 if (!m_cachedPseudoStyles || !m_cachedPseudoStyles->size())
324 return 0; 324 return 0;
325 325
326 if (styleType() != NOPSEUDO) 326 if (styleType() != NOPSEUDO)
327 return 0; 327 return 0;
328 328
329 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) { 329 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
330 LayoutStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get(); 330 ComputedStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
331 if (pseudoStyle->styleType() == pid) 331 if (pseudoStyle->styleType() == pid)
332 return pseudoStyle; 332 return pseudoStyle;
333 } 333 }
334 334
335 return 0; 335 return 0;
336 } 336 }
337 337
338 LayoutStyle* LayoutStyle::addCachedPseudoStyle(PassRefPtr<LayoutStyle> pseudo) 338 ComputedStyle* ComputedStyle::addCachedPseudoStyle(PassRefPtr<ComputedStyle> pse udo)
339 { 339 {
340 if (!pseudo) 340 if (!pseudo)
341 return 0; 341 return 0;
342 342
343 ASSERT(pseudo->styleType() > NOPSEUDO); 343 ASSERT(pseudo->styleType() > NOPSEUDO);
344 344
345 LayoutStyle* result = pseudo.get(); 345 ComputedStyle* result = pseudo.get();
346 346
347 if (!m_cachedPseudoStyles) 347 if (!m_cachedPseudoStyles)
348 m_cachedPseudoStyles = adoptPtr(new PseudoStyleCache); 348 m_cachedPseudoStyles = adoptPtr(new PseudoStyleCache);
349 349
350 m_cachedPseudoStyles->append(pseudo); 350 m_cachedPseudoStyles->append(pseudo);
351 351
352 return result; 352 return result;
353 } 353 }
354 354
355 void LayoutStyle::removeCachedPseudoStyle(PseudoId pid) 355 void ComputedStyle::removeCachedPseudoStyle(PseudoId pid)
356 { 356 {
357 if (!m_cachedPseudoStyles) 357 if (!m_cachedPseudoStyles)
358 return; 358 return;
359 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) { 359 for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
360 LayoutStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get(); 360 ComputedStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
361 if (pseudoStyle->styleType() == pid) { 361 if (pseudoStyle->styleType() == pid) {
362 m_cachedPseudoStyles->remove(i); 362 m_cachedPseudoStyles->remove(i);
363 return; 363 return;
364 } 364 }
365 } 365 }
366 } 366 }
367 367
368 bool LayoutStyle::inheritedNotEqual(const LayoutStyle& other) const 368 bool ComputedStyle::inheritedNotEqual(const ComputedStyle& other) const
369 { 369 {
370 return inherited_flags != other.inherited_flags 370 return inherited_flags != other.inherited_flags
371 || inherited != other.inherited 371 || inherited != other.inherited
372 || font().loadingCustomFonts() != other.font().loadingCustomFonts() 372 || font().loadingCustomFonts() != other.font().loadingCustomFonts()
373 || m_svgStyle->inheritedNotEqual(other.m_svgStyle.get()) 373 || m_svgStyle->inheritedNotEqual(other.m_svgStyle.get())
374 || rareInheritedData != other.rareInheritedData; 374 || rareInheritedData != other.rareInheritedData;
375 } 375 }
376 376
377 bool LayoutStyle::inheritedDataShared(const LayoutStyle& other) const 377 bool ComputedStyle::inheritedDataShared(const ComputedStyle& other) const
378 { 378 {
379 // This is a fast check that only looks if the data structures are shared. 379 // This is a fast check that only looks if the data structures are shared.
380 return inherited_flags == other.inherited_flags 380 return inherited_flags == other.inherited_flags
381 && inherited.get() == other.inherited.get() 381 && inherited.get() == other.inherited.get()
382 && m_svgStyle.get() == other.m_svgStyle.get() 382 && m_svgStyle.get() == other.m_svgStyle.get()
383 && rareInheritedData.get() == other.rareInheritedData.get(); 383 && rareInheritedData.get() == other.rareInheritedData.get();
384 } 384 }
385 385
386 static bool dependenceOnContentHeightHasChanged(const LayoutStyle& a, const Layo utStyle& b) 386 static bool dependenceOnContentHeightHasChanged(const ComputedStyle& a, const Co mputedStyle& b)
387 { 387 {
388 // If top or bottom become auto/non-auto then it means we either have to sol ve height based 388 // If top or bottom become auto/non-auto then it means we either have to sol ve height based
389 // on the content or stop doing so (http://www.w3.org/TR/CSS2/visudet.html#a bs-non-replaced-height) 389 // on the content or stop doing so (http://www.w3.org/TR/CSS2/visudet.html#a bs-non-replaced-height)
390 // - either way requires a layout. 390 // - either way requires a layout.
391 return a.logicalTop().isAuto() != b.logicalTop().isAuto() || a.logicalBottom ().isAuto() != b.logicalBottom().isAuto(); 391 return a.logicalTop().isAuto() != b.logicalTop().isAuto() || a.logicalBottom ().isAuto() != b.logicalBottom().isAuto();
392 } 392 }
393 393
394 StyleDifference LayoutStyle::visualInvalidationDiff(const LayoutStyle& other) co nst 394 StyleDifference ComputedStyle::visualInvalidationDiff(const ComputedStyle& other ) const
395 { 395 {
396 // Note, we use .get() on each DataRef below because DataRef::operator== wil l do a deep 396 // Note, we use .get() on each DataRef below because DataRef::operator== wil l do a deep
397 // compare, which is duplicate work when we're going to compare each propert y inside 397 // compare, which is duplicate work when we're going to compare each propert y inside
398 // this function anyway. 398 // this function anyway.
399 399
400 StyleDifference diff; 400 StyleDifference diff;
401 if (m_svgStyle.get() != other.m_svgStyle.get()) 401 if (m_svgStyle.get() != other.m_svgStyle.get())
402 diff = m_svgStyle->diff(other.m_svgStyle.get()); 402 diff = m_svgStyle->diff(other.m_svgStyle.get());
403 403
404 if ((!diff.needsFullLayout() || !diff.needsPaintInvalidation()) && diffNeeds FullLayoutAndPaintInvalidation(other)) { 404 if ((!diff.needsFullLayout() || !diff.needsPaintInvalidation()) && diffNeeds FullLayoutAndPaintInvalidation(other)) {
(...skipping 29 matching lines...) Expand all
434 434
435 // Cursors are not checked, since they will be set appropriately in response to mouse events, 435 // Cursors are not checked, since they will be set appropriately in response to mouse events,
436 // so they don't need to cause any paint invalidation or layout. 436 // so they don't need to cause any paint invalidation or layout.
437 437
438 // Animations don't need to be checked either. We always set the new style o n the layoutObject, so we will get a chance to fire off 438 // Animations don't need to be checked either. We always set the new style o n the layoutObject, so we will get a chance to fire off
439 // the resulting transition properly. 439 // the resulting transition properly.
440 440
441 return diff; 441 return diff;
442 } 442 }
443 443
444 bool LayoutStyle::diffNeedsFullLayoutAndPaintInvalidation(const LayoutStyle& oth er) const 444 bool ComputedStyle::diffNeedsFullLayoutAndPaintInvalidation(const ComputedStyle& other) const
445 { 445 {
446 // FIXME: Not all cases in this method need both full layout and paint inval idation. 446 // FIXME: Not all cases in this method need both full layout and paint inval idation.
447 // Should move cases into diffNeedsFullLayout() if 447 // Should move cases into diffNeedsFullLayout() if
448 // - don't need paint invalidation at all; 448 // - don't need paint invalidation at all;
449 // - or the layoutObject knows how to exactly invalidate paints caused by th e layout change 449 // - or the layoutObject knows how to exactly invalidate paints caused by th e layout change
450 // instead of forced full paint invalidation. 450 // instead of forced full paint invalidation.
451 451
452 if (surround.get() != other.surround.get()) { 452 if (surround.get() != other.surround.get()) {
453 // If our border widths change, then we need to layout. Other changes to borders only necessitate a paint invalidation. 453 // If our border widths change, then we need to layout. Other changes to borders only necessitate a paint invalidation.
454 if (borderLeftWidth() != other.borderLeftWidth() 454 if (borderLeftWidth() != other.borderLeftWidth()
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 return true; 606 return true;
607 607
608 if (!m_background->outline().visuallyEqual(other.m_background->outline())) { 608 if (!m_background->outline().visuallyEqual(other.m_background->outline())) {
609 // FIXME: We only really need to recompute the overflow but we don't hav e an optimized layout for it. 609 // FIXME: We only really need to recompute the overflow but we don't hav e an optimized layout for it.
610 return true; 610 return true;
611 } 611 }
612 612
613 if (hasPseudoStyle(SCROLLBAR) != other.hasPseudoStyle(SCROLLBAR)) 613 if (hasPseudoStyle(SCROLLBAR) != other.hasPseudoStyle(SCROLLBAR))
614 return true; 614 return true;
615 615
616 // Movement of non-static-positioned object is special cased in LayoutStyle: :visualInvalidationDiff(). 616 // Movement of non-static-positioned object is special cased in ComputedStyl e::visualInvalidationDiff().
617 617
618 return false; 618 return false;
619 } 619 }
620 620
621 bool LayoutStyle::diffNeedsFullLayout(const LayoutStyle& other) const 621 bool ComputedStyle::diffNeedsFullLayout(const ComputedStyle& other) const
622 { 622 {
623 if (m_box.get() != other.m_box.get()) { 623 if (m_box.get() != other.m_box.get()) {
624 if (m_box->width() != other.m_box->width() 624 if (m_box->width() != other.m_box->width()
625 || m_box->minWidth() != other.m_box->minWidth() 625 || m_box->minWidth() != other.m_box->minWidth()
626 || m_box->maxWidth() != other.m_box->maxWidth() 626 || m_box->maxWidth() != other.m_box->maxWidth()
627 || m_box->height() != other.m_box->height() 627 || m_box->height() != other.m_box->height()
628 || m_box->minHeight() != other.m_box->minHeight() 628 || m_box->minHeight() != other.m_box->minHeight()
629 || m_box->maxHeight() != other.m_box->maxHeight()) 629 || m_box->maxHeight() != other.m_box->maxHeight())
630 return true; 630 return true;
631 631
(...skipping 17 matching lines...) Expand all
649 if (rareNonInheritedData->m_alignContent != other.rareNonInheritedData-> m_alignContent 649 if (rareNonInheritedData->m_alignContent != other.rareNonInheritedData-> m_alignContent
650 || rareNonInheritedData->m_alignContentDistribution != other.rareNon InheritedData->m_alignContentDistribution 650 || rareNonInheritedData->m_alignContentDistribution != other.rareNon InheritedData->m_alignContentDistribution
651 || rareNonInheritedData->m_alignItems != other.rareNonInheritedData- >m_alignItems 651 || rareNonInheritedData->m_alignItems != other.rareNonInheritedData- >m_alignItems
652 || rareNonInheritedData->m_alignSelf != other.rareNonInheritedData-> m_alignSelf) 652 || rareNonInheritedData->m_alignSelf != other.rareNonInheritedData-> m_alignSelf)
653 return true; 653 return true;
654 } 654 }
655 655
656 return false; 656 return false;
657 } 657 }
658 658
659 bool LayoutStyle::diffNeedsPaintInvalidationLayer(const LayoutStyle& other) cons t 659 bool ComputedStyle::diffNeedsPaintInvalidationLayer(const ComputedStyle& other) const
660 { 660 {
661 if (position() != StaticPosition && (visual->clip != other.visual->clip || v isual->hasAutoClip != other.visual->hasAutoClip)) 661 if (position() != StaticPosition && (visual->clip != other.visual->clip || v isual->hasAutoClip != other.visual->hasAutoClip))
662 return true; 662 return true;
663 663
664 if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) { 664 if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
665 if (RuntimeEnabledFeatures::cssCompositingEnabled() 665 if (RuntimeEnabledFeatures::cssCompositingEnabled()
666 && (rareNonInheritedData->m_effectiveBlendMode != other.rareNonInher itedData->m_effectiveBlendMode 666 && (rareNonInheritedData->m_effectiveBlendMode != other.rareNonInher itedData->m_effectiveBlendMode
667 || rareNonInheritedData->m_isolation != other.rareNonInheritedDa ta->m_isolation)) 667 || rareNonInheritedData->m_isolation != other.rareNonInheritedDa ta->m_isolation))
668 return true; 668 return true;
669 669
670 if (rareNonInheritedData->m_mask != other.rareNonInheritedData->m_mask 670 if (rareNonInheritedData->m_mask != other.rareNonInheritedData->m_mask
671 || rareNonInheritedData->m_maskBoxImage != other.rareNonInheritedDat a->m_maskBoxImage) 671 || rareNonInheritedData->m_maskBoxImage != other.rareNonInheritedDat a->m_maskBoxImage)
672 return true; 672 return true;
673 } 673 }
674 674
675 return false; 675 return false;
676 } 676 }
677 677
678 bool LayoutStyle::diffNeedsPaintInvalidationObject(const LayoutStyle& other) con st 678 bool ComputedStyle::diffNeedsPaintInvalidationObject(const ComputedStyle& other) const
679 { 679 {
680 if (inherited_flags._visibility != other.inherited_flags._visibility 680 if (inherited_flags._visibility != other.inherited_flags._visibility
681 || inherited_flags.m_printColorAdjust != other.inherited_flags.m_printCo lorAdjust 681 || inherited_flags.m_printColorAdjust != other.inherited_flags.m_printCo lorAdjust
682 || inherited_flags._insideLink != other.inherited_flags._insideLink 682 || inherited_flags._insideLink != other.inherited_flags._insideLink
683 || !surround->border.visuallyEqual(other.surround->border) 683 || !surround->border.visuallyEqual(other.surround->border)
684 || !m_background->visuallyEqual(*other.m_background)) 684 || !m_background->visuallyEqual(*other.m_background))
685 return true; 685 return true;
686 686
687 if (rareInheritedData.get() != other.rareInheritedData.get()) { 687 if (rareInheritedData.get() != other.rareInheritedData.get()) {
688 if (rareInheritedData->userModify != other.rareInheritedData->userModify 688 if (rareInheritedData->userModify != other.rareInheritedData->userModify
(...skipping 16 matching lines...) Expand all
705 || (visitedLinkBackgroundColor() != other.visitedLinkBackgroundColor ())) 705 || (visitedLinkBackgroundColor() != other.visitedLinkBackgroundColor ()))
706 return true; 706 return true;
707 } 707 }
708 708
709 if (resize() != other.resize()) 709 if (resize() != other.resize())
710 return true; 710 return true;
711 711
712 return false; 712 return false;
713 } 713 }
714 714
715 void LayoutStyle::updatePropertySpecificDifferences(const LayoutStyle& other, St yleDifference& diff) const 715 void ComputedStyle::updatePropertySpecificDifferences(const ComputedStyle& other , StyleDifference& diff) const
716 { 716 {
717 // StyleAdjuster has ensured that zIndex is non-auto only if it's applicable . 717 // StyleAdjuster has ensured that zIndex is non-auto only if it's applicable .
718 if (m_box->zIndex() != other.m_box->zIndex() || m_box->hasAutoZIndex() != ot her.m_box->hasAutoZIndex()) 718 if (m_box->zIndex() != other.m_box->zIndex() || m_box->hasAutoZIndex() != ot her.m_box->hasAutoZIndex())
719 diff.setZIndexChanged(); 719 diff.setZIndexChanged();
720 720
721 if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) { 721 if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
722 if (!transformDataEquivalent(other)) 722 if (!transformDataEquivalent(other))
723 diff.setTransformChanged(); 723 diff.setTransformChanged();
724 724
725 if (rareNonInheritedData->opacity != other.rareNonInheritedData->opacity ) 725 if (rareNonInheritedData->opacity != other.rareNonInheritedData->opacity )
(...skipping 21 matching lines...) Expand all
747 || rareInheritedData->visitedLinkTextFillColor() != other.rareIn heritedData->visitedLinkTextFillColor() 747 || rareInheritedData->visitedLinkTextFillColor() != other.rareIn heritedData->visitedLinkTextFillColor()
748 || rareInheritedData->visitedLinkTextStrokeColor() != other.rare InheritedData->visitedLinkTextStrokeColor() 748 || rareInheritedData->visitedLinkTextStrokeColor() != other.rare InheritedData->visitedLinkTextStrokeColor()
749 || rareInheritedData->visitedLinkTextEmphasisColor() != other.ra reInheritedData->visitedLinkTextEmphasisColor() 749 || rareInheritedData->visitedLinkTextEmphasisColor() != other.ra reInheritedData->visitedLinkTextEmphasisColor()
750 || rareInheritedData->textEmphasisFill != other.rareInheritedDat a->textEmphasisFill 750 || rareInheritedData->textEmphasisFill != other.rareInheritedDat a->textEmphasisFill
751 || rareInheritedData->appliedTextDecorations != other.rareInheri tedData->appliedTextDecorations)) { 751 || rareInheritedData->appliedTextDecorations != other.rareInheri tedData->appliedTextDecorations)) {
752 diff.setTextOrColorChanged(); 752 diff.setTextOrColorChanged();
753 } 753 }
754 } 754 }
755 } 755 }
756 756
757 void LayoutStyle::addCursor(PassRefPtr<StyleImage> image, bool hotSpotSpecified, const IntPoint& hotSpot) 757 void ComputedStyle::addCursor(PassRefPtr<StyleImage> image, bool hotSpotSpecifie d, const IntPoint& hotSpot)
758 { 758 {
759 if (!rareInheritedData.access()->cursorData) 759 if (!rareInheritedData.access()->cursorData)
760 rareInheritedData.access()->cursorData = CursorList::create(); 760 rareInheritedData.access()->cursorData = CursorList::create();
761 rareInheritedData.access()->cursorData->append(CursorData(image, hotSpotSpec ified, hotSpot)); 761 rareInheritedData.access()->cursorData->append(CursorData(image, hotSpotSpec ified, hotSpot));
762 } 762 }
763 763
764 void LayoutStyle::setCursorList(PassRefPtr<CursorList> other) 764 void ComputedStyle::setCursorList(PassRefPtr<CursorList> other)
765 { 765 {
766 rareInheritedData.access()->cursorData = other; 766 rareInheritedData.access()->cursorData = other;
767 } 767 }
768 768
769 void LayoutStyle::setQuotes(PassRefPtr<QuotesData> q) 769 void ComputedStyle::setQuotes(PassRefPtr<QuotesData> q)
770 { 770 {
771 rareInheritedData.access()->quotes = q; 771 rareInheritedData.access()->quotes = q;
772 } 772 }
773 773
774 void LayoutStyle::clearCursorList() 774 void ComputedStyle::clearCursorList()
775 { 775 {
776 if (rareInheritedData->cursorData) 776 if (rareInheritedData->cursorData)
777 rareInheritedData.access()->cursorData = nullptr; 777 rareInheritedData.access()->cursorData = nullptr;
778 } 778 }
779 779
780 void LayoutStyle::addCallbackSelector(const String& selector) 780 void ComputedStyle::addCallbackSelector(const String& selector)
781 { 781 {
782 if (!rareNonInheritedData->m_callbackSelectors.contains(selector)) 782 if (!rareNonInheritedData->m_callbackSelectors.contains(selector))
783 rareNonInheritedData.access()->m_callbackSelectors.append(selector); 783 rareNonInheritedData.access()->m_callbackSelectors.append(selector);
784 } 784 }
785 785
786 void LayoutStyle::clearContent() 786 void ComputedStyle::clearContent()
787 { 787 {
788 if (rareNonInheritedData->m_content) 788 if (rareNonInheritedData->m_content)
789 rareNonInheritedData.access()->m_content = nullptr; 789 rareNonInheritedData.access()->m_content = nullptr;
790 } 790 }
791 791
792 void LayoutStyle::appendContent(PassOwnPtr<ContentData> contentData) 792 void ComputedStyle::appendContent(PassOwnPtr<ContentData> contentData)
793 { 793 {
794 OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content; 794 OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
795 ContentData* lastContent = content.get(); 795 ContentData* lastContent = content.get();
796 while (lastContent && lastContent->next()) 796 while (lastContent && lastContent->next())
797 lastContent = lastContent->next(); 797 lastContent = lastContent->next();
798 798
799 if (lastContent) 799 if (lastContent)
800 lastContent->setNext(contentData); 800 lastContent->setNext(contentData);
801 else 801 else
802 content = contentData; 802 content = contentData;
803 } 803 }
804 804
805 void LayoutStyle::setContent(PassRefPtr<StyleImage> image, bool add) 805 void ComputedStyle::setContent(PassRefPtr<StyleImage> image, bool add)
806 { 806 {
807 if (!image) 807 if (!image)
808 return; 808 return;
809 809
810 if (add) { 810 if (add) {
811 appendContent(ContentData::create(image)); 811 appendContent(ContentData::create(image));
812 return; 812 return;
813 } 813 }
814 814
815 rareNonInheritedData.access()->m_content = ContentData::create(image); 815 rareNonInheritedData.access()->m_content = ContentData::create(image);
816 } 816 }
817 817
818 void LayoutStyle::setContent(const String& string, bool add) 818 void ComputedStyle::setContent(const String& string, bool add)
819 { 819 {
820 OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content; 820 OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
821 if (add) { 821 if (add) {
822 ContentData* lastContent = content.get(); 822 ContentData* lastContent = content.get();
823 while (lastContent && lastContent->next()) 823 while (lastContent && lastContent->next())
824 lastContent = lastContent->next(); 824 lastContent = lastContent->next();
825 825
826 if (lastContent) { 826 if (lastContent) {
827 // We attempt to merge with the last ContentData if possible. 827 // We attempt to merge with the last ContentData if possible.
828 if (lastContent->isText()) { 828 if (lastContent->isText()) {
829 TextContentData* textContent = toTextContentData(lastContent); 829 TextContentData* textContent = toTextContentData(lastContent);
830 textContent->setText(textContent->text() + string); 830 textContent->setText(textContent->text() + string);
831 } else { 831 } else {
832 lastContent->setNext(ContentData::create(string)); 832 lastContent->setNext(ContentData::create(string));
833 } 833 }
834 834
835 return; 835 return;
836 } 836 }
837 } 837 }
838 838
839 content = ContentData::create(string); 839 content = ContentData::create(string);
840 } 840 }
841 841
842 void LayoutStyle::setContent(PassOwnPtr<CounterContent> counter, bool add) 842 void ComputedStyle::setContent(PassOwnPtr<CounterContent> counter, bool add)
843 { 843 {
844 if (!counter) 844 if (!counter)
845 return; 845 return;
846 846
847 if (add) { 847 if (add) {
848 appendContent(ContentData::create(counter)); 848 appendContent(ContentData::create(counter));
849 return; 849 return;
850 } 850 }
851 851
852 rareNonInheritedData.access()->m_content = ContentData::create(counter); 852 rareNonInheritedData.access()->m_content = ContentData::create(counter);
853 } 853 }
854 854
855 void LayoutStyle::setContent(QuoteType quote, bool add) 855 void ComputedStyle::setContent(QuoteType quote, bool add)
856 { 856 {
857 if (add) { 857 if (add) {
858 appendContent(ContentData::create(quote)); 858 appendContent(ContentData::create(quote));
859 return; 859 return;
860 } 860 }
861 861
862 rareNonInheritedData.access()->m_content = ContentData::create(quote); 862 rareNonInheritedData.access()->m_content = ContentData::create(quote);
863 } 863 }
864 864
865 bool LayoutStyle::hasWillChangeCompositingHint() const 865 bool ComputedStyle::hasWillChangeCompositingHint() const
866 { 866 {
867 for (size_t i = 0; i < rareNonInheritedData->m_willChange->m_properties.size (); ++i) { 867 for (size_t i = 0; i < rareNonInheritedData->m_willChange->m_properties.size (); ++i) {
868 switch (rareNonInheritedData->m_willChange->m_properties[i]) { 868 switch (rareNonInheritedData->m_willChange->m_properties[i]) {
869 case CSSPropertyOpacity: 869 case CSSPropertyOpacity:
870 case CSSPropertyTransform: 870 case CSSPropertyTransform:
871 case CSSPropertyWebkitTransform: 871 case CSSPropertyWebkitTransform:
872 case CSSPropertyTop: 872 case CSSPropertyTop:
873 case CSSPropertyLeft: 873 case CSSPropertyLeft:
874 case CSSPropertyBottom: 874 case CSSPropertyBottom:
875 case CSSPropertyRight: 875 case CSSPropertyRight:
876 return true; 876 return true;
877 default: 877 default:
878 break; 878 break;
879 } 879 }
880 } 880 }
881 return false; 881 return false;
882 } 882 }
883 883
884 inline bool requireTransformOrigin(const Vector<RefPtr<TransformOperation>>& tra nsformOperations, LayoutStyle::ApplyTransformOrigin applyOrigin, LayoutStyle::Ap plyMotionPath applyMotionPath) 884 inline bool requireTransformOrigin(const Vector<RefPtr<TransformOperation>>& tra nsformOperations, ComputedStyle::ApplyTransformOrigin applyOrigin, ComputedStyle ::ApplyMotionPath applyMotionPath)
885 { 885 {
886 // transform-origin brackets the transform with translate operations. 886 // transform-origin brackets the transform with translate operations.
887 // Optimize for the case where the only transform is a translation, since th e transform-origin is irrelevant 887 // Optimize for the case where the only transform is a translation, since th e transform-origin is irrelevant
888 // in that case. 888 // in that case.
889 if (applyOrigin != LayoutStyle::IncludeTransformOrigin) 889 if (applyOrigin != ComputedStyle::IncludeTransformOrigin)
890 return false; 890 return false;
891 891
892 if (applyMotionPath == LayoutStyle::IncludeMotionPath) 892 if (applyMotionPath == ComputedStyle::IncludeMotionPath)
893 return true; 893 return true;
894 894
895 unsigned size = transformOperations.size(); 895 unsigned size = transformOperations.size();
896 for (unsigned i = 0; i < size; ++i) { 896 for (unsigned i = 0; i < size; ++i) {
897 TransformOperation::OperationType type = transformOperations[i]->type(); 897 TransformOperation::OperationType type = transformOperations[i]->type();
898 if (type != TransformOperation::TranslateX 898 if (type != TransformOperation::TranslateX
899 && type != TransformOperation::TranslateY 899 && type != TransformOperation::TranslateY
900 && type != TransformOperation::Translate 900 && type != TransformOperation::Translate
901 && type != TransformOperation::TranslateZ 901 && type != TransformOperation::TranslateZ
902 && type != TransformOperation::Translate3D) 902 && type != TransformOperation::Translate3D)
903 return true; 903 return true;
904 } 904 }
905 905
906 return false; 906 return false;
907 } 907 }
908 908
909 void LayoutStyle::applyTransform(TransformationMatrix& transform, const LayoutSi ze& borderBoxSize, ApplyTransformOrigin applyOrigin, ApplyMotionPath applyMotion Path) const 909 void ComputedStyle::applyTransform(TransformationMatrix& transform, const Layout Size& borderBoxSize, ApplyTransformOrigin applyOrigin, ApplyMotionPath applyMoti onPath) const
910 { 910 {
911 applyTransform(transform, FloatRect(FloatPoint(), FloatSize(borderBoxSize)), applyOrigin, applyMotionPath); 911 applyTransform(transform, FloatRect(FloatPoint(), FloatSize(borderBoxSize)), applyOrigin, applyMotionPath);
912 } 912 }
913 913
914 void LayoutStyle::applyTransform(TransformationMatrix& transform, const FloatRec t& boundingBox, ApplyTransformOrigin applyOrigin, ApplyMotionPath applyMotionPat h) const 914 void ComputedStyle::applyTransform(TransformationMatrix& transform, const FloatR ect& boundingBox, ApplyTransformOrigin applyOrigin, ApplyMotionPath applyMotionP ath) const
915 { 915 {
916 if (!hasMotionPath()) 916 if (!hasMotionPath())
917 applyMotionPath = ExcludeMotionPath; 917 applyMotionPath = ExcludeMotionPath;
918 const Vector<RefPtr<TransformOperation>>& transformOperations = rareNonInher itedData->m_transform->m_operations.operations(); 918 const Vector<RefPtr<TransformOperation>>& transformOperations = rareNonInher itedData->m_transform->m_operations.operations();
919 bool applyTransformOrigin = requireTransformOrigin(transformOperations, appl yOrigin, applyMotionPath); 919 bool applyTransformOrigin = requireTransformOrigin(transformOperations, appl yOrigin, applyMotionPath);
920 920
921 float offsetX = transformOriginX().type() == Percent ? boundingBox.x() : 0; 921 float offsetX = transformOriginX().type() == Percent ? boundingBox.x() : 0;
922 float offsetY = transformOriginY().type() == Percent ? boundingBox.y() : 0; 922 float offsetY = transformOriginY().type() == Percent ? boundingBox.y() : 0;
923 923
924 if (applyTransformOrigin) { 924 if (applyTransformOrigin) {
925 transform.translate3d(floatValueForLength(transformOriginX(), boundingBo x.width()) + offsetX, 925 transform.translate3d(floatValueForLength(transformOriginX(), boundingBo x.width()) + offsetX,
926 floatValueForLength(transformOriginY(), boundingBox.height()) + offs etY, 926 floatValueForLength(transformOriginY(), boundingBox.height()) + offs etY,
927 transformOriginZ()); 927 transformOriginZ());
928 } 928 }
929 929
930 if (applyMotionPath == LayoutStyle::IncludeMotionPath) 930 if (applyMotionPath == ComputedStyle::IncludeMotionPath)
931 applyMotionPathTransform(transform); 931 applyMotionPathTransform(transform);
932 932
933 unsigned size = transformOperations.size(); 933 unsigned size = transformOperations.size();
934 for (unsigned i = 0; i < size; ++i) 934 for (unsigned i = 0; i < size; ++i)
935 transformOperations[i]->apply(transform, boundingBox.size()); 935 transformOperations[i]->apply(transform, boundingBox.size());
936 936
937 if (applyTransformOrigin) { 937 if (applyTransformOrigin) {
938 transform.translate3d(-floatValueForLength(transformOriginX(), boundingB ox.width()) - offsetX, 938 transform.translate3d(-floatValueForLength(transformOriginX(), boundingB ox.width()) - offsetX,
939 -floatValueForLength(transformOriginY(), boundingBox.height()) - off setY, 939 -floatValueForLength(transformOriginY(), boundingBox.height()) - off setY,
940 -transformOriginZ()); 940 -transformOriginZ());
941 } 941 }
942 } 942 }
943 943
944 void LayoutStyle::applyMotionPathTransform(TransformationMatrix& transform) cons t 944 void ComputedStyle::applyMotionPathTransform(TransformationMatrix& transform) co nst
945 { 945 {
946 const StyleMotionData& motionData = rareNonInheritedData->m_transform->m_mot ion; 946 const StyleMotionData& motionData = rareNonInheritedData->m_transform->m_mot ion;
947 ASSERT(motionData.m_path && motionData.m_path->isPathStyleMotionPath()); 947 ASSERT(motionData.m_path && motionData.m_path->isPathStyleMotionPath());
948 const PathStyleMotionPath& motionPath = toPathStyleMotionPath(*motionData.m_ path); 948 const PathStyleMotionPath& motionPath = toPathStyleMotionPath(*motionData.m_ path);
949 float pathLength = motionPath.length(); 949 float pathLength = motionPath.length();
950 float distance = floatValueForLength(motionData.m_offset, pathLength); 950 float distance = floatValueForLength(motionData.m_offset, pathLength);
951 float computedDistance; 951 float computedDistance;
952 if (motionPath.isClosed() && pathLength > 0) { 952 if (motionPath.isClosed() && pathLength > 0) {
953 computedDistance = fmod(distance, pathLength); 953 computedDistance = fmod(distance, pathLength);
954 if (computedDistance < 0) 954 if (computedDistance < 0)
955 computedDistance += pathLength; 955 computedDistance += pathLength;
956 } else { 956 } else {
957 computedDistance = clampTo<float>(distance, 0, pathLength); 957 computedDistance = clampTo<float>(distance, 0, pathLength);
958 } 958 }
959 959
960 FloatPoint point; 960 FloatPoint point;
961 float angle; 961 float angle;
962 if (!motionPath.path().pointAndNormalAtLength(computedDistance, point, angle )) 962 if (!motionPath.path().pointAndNormalAtLength(computedDistance, point, angle ))
963 return; 963 return;
964 if (motionData.m_rotationType == MotionRotationFixed) 964 if (motionData.m_rotationType == MotionRotationFixed)
965 angle = 0; 965 angle = 0;
966 966
967 transform.translate(point.x(), point.y()); 967 transform.translate(point.x(), point.y());
968 transform.rotate(angle + motionData.m_rotation); 968 transform.rotate(angle + motionData.m_rotation);
969 } 969 }
970 970
971 void LayoutStyle::setTextShadow(PassRefPtr<ShadowList> s) 971 void ComputedStyle::setTextShadow(PassRefPtr<ShadowList> s)
972 { 972 {
973 rareInheritedData.access()->textShadow = s; 973 rareInheritedData.access()->textShadow = s;
974 } 974 }
975 975
976 void LayoutStyle::setBoxShadow(PassRefPtr<ShadowList> s) 976 void ComputedStyle::setBoxShadow(PassRefPtr<ShadowList> s)
977 { 977 {
978 rareNonInheritedData.access()->m_boxShadow = s; 978 rareNonInheritedData.access()->m_boxShadow = s;
979 } 979 }
980 980
981 static FloatRoundedRect::Radii calcRadiiFor(const BorderData& border, LayoutSize size) 981 static FloatRoundedRect::Radii calcRadiiFor(const BorderData& border, LayoutSize size)
982 { 982 {
983 return FloatRoundedRect::Radii( 983 return FloatRoundedRect::Radii(
984 IntSize(valueForLength(border.topLeft().width(), size.width()), 984 IntSize(valueForLength(border.topLeft().width(), size.width()),
985 valueForLength(border.topLeft().height(), size.height())), 985 valueForLength(border.topLeft().height(), size.height())),
986 IntSize(valueForLength(border.topRight().width(), size.width()), 986 IntSize(valueForLength(border.topRight().width(), size.width()),
987 valueForLength(border.topRight().height(), size.height())), 987 valueForLength(border.topRight().height(), size.height())),
988 IntSize(valueForLength(border.bottomLeft().width(), size.width()), 988 IntSize(valueForLength(border.bottomLeft().width(), size.width()),
989 valueForLength(border.bottomLeft().height(), size.height())), 989 valueForLength(border.bottomLeft().height(), size.height())),
990 IntSize(valueForLength(border.bottomRight().width(), size.width()), 990 IntSize(valueForLength(border.bottomRight().width(), size.width()),
991 valueForLength(border.bottomRight().height(), size.height()))); 991 valueForLength(border.bottomRight().height(), size.height())));
992 } 992 }
993 993
994 StyleImage* LayoutStyle::listStyleImage() const { return rareInheritedData->list StyleImage.get(); } 994 StyleImage* ComputedStyle::listStyleImage() const { return rareInheritedData->li stStyleImage.get(); }
995 void LayoutStyle::setListStyleImage(PassRefPtr<StyleImage> v) 995 void ComputedStyle::setListStyleImage(PassRefPtr<StyleImage> v)
996 { 996 {
997 if (rareInheritedData->listStyleImage != v) 997 if (rareInheritedData->listStyleImage != v)
998 rareInheritedData.access()->listStyleImage = v; 998 rareInheritedData.access()->listStyleImage = v;
999 } 999 }
1000 1000
1001 Color LayoutStyle::color() const { return inherited->color; } 1001 Color ComputedStyle::color() const { return inherited->color; }
1002 Color LayoutStyle::visitedLinkColor() const { return inherited->visitedLinkColor ; } 1002 Color ComputedStyle::visitedLinkColor() const { return inherited->visitedLinkCol or; }
1003 void LayoutStyle::setColor(const Color& v) { SET_VAR(inherited, color, v); } 1003 void ComputedStyle::setColor(const Color& v) { SET_VAR(inherited, color, v); }
1004 void LayoutStyle::setVisitedLinkColor(const Color& v) { SET_VAR(inherited, visit edLinkColor, v); } 1004 void ComputedStyle::setVisitedLinkColor(const Color& v) { SET_VAR(inherited, vis itedLinkColor, v); }
1005 1005
1006 short LayoutStyle::horizontalBorderSpacing() const { return inherited->horizonta l_border_spacing; } 1006 short ComputedStyle::horizontalBorderSpacing() const { return inherited->horizon tal_border_spacing; }
1007 short LayoutStyle::verticalBorderSpacing() const { return inherited->vertical_bo rder_spacing; } 1007 short ComputedStyle::verticalBorderSpacing() const { return inherited->vertical_ border_spacing; }
1008 void LayoutStyle::setHorizontalBorderSpacing(short v) { SET_VAR(inherited, horiz ontal_border_spacing, v); } 1008 void ComputedStyle::setHorizontalBorderSpacing(short v) { SET_VAR(inherited, hor izontal_border_spacing, v); }
1009 void LayoutStyle::setVerticalBorderSpacing(short v) { SET_VAR(inherited, vertica l_border_spacing, v); } 1009 void ComputedStyle::setVerticalBorderSpacing(short v) { SET_VAR(inherited, verti cal_border_spacing, v); }
1010 1010
1011 FloatRoundedRect LayoutStyle::getRoundedBorderFor(const LayoutRect& borderRect, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const 1011 FloatRoundedRect ComputedStyle::getRoundedBorderFor(const LayoutRect& borderRect , bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
1012 { 1012 {
1013 FloatRoundedRect roundedRect(pixelSnappedIntRect(borderRect)); 1013 FloatRoundedRect roundedRect(pixelSnappedIntRect(borderRect));
1014 if (hasBorderRadius()) { 1014 if (hasBorderRadius()) {
1015 FloatRoundedRect::Radii radii = calcRadiiFor(surround->border, borderRec t.size()); 1015 FloatRoundedRect::Radii radii = calcRadiiFor(surround->border, borderRec t.size());
1016 roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includ eLogicalLeftEdge, includeLogicalRightEdge); 1016 roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includ eLogicalLeftEdge, includeLogicalRightEdge);
1017 roundedRect.constrainRadii(); 1017 roundedRect.constrainRadii();
1018 } 1018 }
1019 return roundedRect; 1019 return roundedRect;
1020 } 1020 }
1021 1021
1022 FloatRoundedRect LayoutStyle::getRoundedInnerBorderFor(const LayoutRect& borderR ect, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const 1022 FloatRoundedRect ComputedStyle::getRoundedInnerBorderFor(const LayoutRect& borde rRect, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
1023 { 1023 {
1024 bool horizontal = isHorizontalWritingMode(); 1024 bool horizontal = isHorizontalWritingMode();
1025 1025
1026 int leftWidth = (!horizontal || includeLogicalLeftEdge) ? borderLeftWidth() : 0; 1026 int leftWidth = (!horizontal || includeLogicalLeftEdge) ? borderLeftWidth() : 0;
1027 int rightWidth = (!horizontal || includeLogicalRightEdge) ? borderRightWidth () : 0; 1027 int rightWidth = (!horizontal || includeLogicalRightEdge) ? borderRightWidth () : 0;
1028 int topWidth = (horizontal || includeLogicalLeftEdge) ? borderTopWidth() : 0 ; 1028 int topWidth = (horizontal || includeLogicalLeftEdge) ? borderTopWidth() : 0 ;
1029 int bottomWidth = (horizontal || includeLogicalRightEdge) ? borderBottomWidt h() : 0; 1029 int bottomWidth = (horizontal || includeLogicalRightEdge) ? borderBottomWidt h() : 0;
1030 1030
1031 return getRoundedInnerBorderFor(borderRect, topWidth, bottomWidth, leftWidth , rightWidth, includeLogicalLeftEdge, includeLogicalRightEdge); 1031 return getRoundedInnerBorderFor(borderRect, topWidth, bottomWidth, leftWidth , rightWidth, includeLogicalLeftEdge, includeLogicalRightEdge);
1032 } 1032 }
1033 1033
1034 FloatRoundedRect LayoutStyle::getRoundedInnerBorderFor(const LayoutRect& borderR ect, 1034 FloatRoundedRect ComputedStyle::getRoundedInnerBorderFor(const LayoutRect& borde rRect,
1035 int topWidth, int bottomWidth, int leftWidth, int rightWidth, bool includeLo gicalLeftEdge, bool includeLogicalRightEdge) const 1035 int topWidth, int bottomWidth, int leftWidth, int rightWidth, bool includeLo gicalLeftEdge, bool includeLogicalRightEdge) const
1036 { 1036 {
1037 LayoutRect innerRect(borderRect.x() + leftWidth, 1037 LayoutRect innerRect(borderRect.x() + leftWidth,
1038 borderRect.y() + topWidth, 1038 borderRect.y() + topWidth,
1039 borderRect.width() - leftWidth - rightWidth, 1039 borderRect.width() - leftWidth - rightWidth,
1040 borderRect.height() - topWidth - bottomWidth); 1040 borderRect.height() - topWidth - bottomWidth);
1041 1041
1042 FloatRoundedRect roundedRect(pixelSnappedIntRect(innerRect)); 1042 FloatRoundedRect roundedRect(pixelSnappedIntRect(innerRect));
1043 1043
1044 if (hasBorderRadius()) { 1044 if (hasBorderRadius()) {
1045 FloatRoundedRect::Radii radii = getRoundedBorderFor(borderRect).radii(); 1045 FloatRoundedRect::Radii radii = getRoundedBorderFor(borderRect).radii();
1046 radii.shrink(topWidth, bottomWidth, leftWidth, rightWidth); 1046 radii.shrink(topWidth, bottomWidth, leftWidth, rightWidth);
1047 roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includ eLogicalLeftEdge, includeLogicalRightEdge); 1047 roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includ eLogicalLeftEdge, includeLogicalRightEdge);
1048 } 1048 }
1049 return roundedRect; 1049 return roundedRect;
1050 } 1050 }
1051 1051
1052 static bool allLayersAreFixed(const FillLayer& layer) 1052 static bool allLayersAreFixed(const FillLayer& layer)
1053 { 1053 {
1054 for (const FillLayer* currLayer = &layer; currLayer; currLayer = currLayer-> next()) { 1054 for (const FillLayer* currLayer = &layer; currLayer; currLayer = currLayer-> next()) {
1055 if (!currLayer->image() || currLayer->attachment() != FixedBackgroundAtt achment) 1055 if (!currLayer->image() || currLayer->attachment() != FixedBackgroundAtt achment)
1056 return false; 1056 return false;
1057 } 1057 }
1058 1058
1059 return true; 1059 return true;
1060 } 1060 }
1061 1061
1062 bool LayoutStyle::hasEntirelyFixedBackground() const 1062 bool ComputedStyle::hasEntirelyFixedBackground() const
1063 { 1063 {
1064 return allLayersAreFixed(backgroundLayers()); 1064 return allLayersAreFixed(backgroundLayers());
1065 } 1065 }
1066 1066
1067 const CounterDirectiveMap* LayoutStyle::counterDirectives() const 1067 const CounterDirectiveMap* ComputedStyle::counterDirectives() const
1068 { 1068 {
1069 return rareNonInheritedData->m_counterDirectives.get(); 1069 return rareNonInheritedData->m_counterDirectives.get();
1070 } 1070 }
1071 1071
1072 CounterDirectiveMap& LayoutStyle::accessCounterDirectives() 1072 CounterDirectiveMap& ComputedStyle::accessCounterDirectives()
1073 { 1073 {
1074 OwnPtr<CounterDirectiveMap>& map = rareNonInheritedData.access()->m_counterD irectives; 1074 OwnPtr<CounterDirectiveMap>& map = rareNonInheritedData.access()->m_counterD irectives;
1075 if (!map) 1075 if (!map)
1076 map = adoptPtr(new CounterDirectiveMap); 1076 map = adoptPtr(new CounterDirectiveMap);
1077 return *map; 1077 return *map;
1078 } 1078 }
1079 1079
1080 const CounterDirectives LayoutStyle::getCounterDirectives(const AtomicString& id entifier) const 1080 const CounterDirectives ComputedStyle::getCounterDirectives(const AtomicString& identifier) const
1081 { 1081 {
1082 if (const CounterDirectiveMap* directives = counterDirectives()) 1082 if (const CounterDirectiveMap* directives = counterDirectives())
1083 return directives->get(identifier); 1083 return directives->get(identifier);
1084 return CounterDirectives(); 1084 return CounterDirectives();
1085 } 1085 }
1086 1086
1087 void LayoutStyle::clearIncrementDirectives() 1087 void ComputedStyle::clearIncrementDirectives()
1088 { 1088 {
1089 if (!counterDirectives()) 1089 if (!counterDirectives())
1090 return; 1090 return;
1091 1091
1092 // This makes us copy even if we may not be removing any items. 1092 // This makes us copy even if we may not be removing any items.
1093 CounterDirectiveMap& map = accessCounterDirectives(); 1093 CounterDirectiveMap& map = accessCounterDirectives();
1094 typedef CounterDirectiveMap::iterator Iterator; 1094 typedef CounterDirectiveMap::iterator Iterator;
1095 1095
1096 Iterator end = map.end(); 1096 Iterator end = map.end();
1097 for (Iterator it = map.begin(); it != end; ++it) 1097 for (Iterator it = map.begin(); it != end; ++it)
1098 it->value.clearIncrement(); 1098 it->value.clearIncrement();
1099 } 1099 }
1100 1100
1101 void LayoutStyle::clearResetDirectives() 1101 void ComputedStyle::clearResetDirectives()
1102 { 1102 {
1103 if (!counterDirectives()) 1103 if (!counterDirectives())
1104 return; 1104 return;
1105 1105
1106 // This makes us copy even if we may not be removing any items. 1106 // This makes us copy even if we may not be removing any items.
1107 CounterDirectiveMap& map = accessCounterDirectives(); 1107 CounterDirectiveMap& map = accessCounterDirectives();
1108 typedef CounterDirectiveMap::iterator Iterator; 1108 typedef CounterDirectiveMap::iterator Iterator;
1109 1109
1110 Iterator end = map.end(); 1110 Iterator end = map.end();
1111 for (Iterator it = map.begin(); it != end; ++it) 1111 for (Iterator it = map.begin(); it != end; ++it)
1112 it->value.clearReset(); 1112 it->value.clearReset();
1113 } 1113 }
1114 1114
1115 const AtomicString& LayoutStyle::hyphenString() const 1115 const AtomicString& ComputedStyle::hyphenString() const
1116 { 1116 {
1117 const AtomicString& hyphenationString = rareInheritedData.get()->hyphenation String; 1117 const AtomicString& hyphenationString = rareInheritedData.get()->hyphenation String;
1118 if (!hyphenationString.isNull()) 1118 if (!hyphenationString.isNull())
1119 return hyphenationString; 1119 return hyphenationString;
1120 1120
1121 // FIXME: This should depend on locale. 1121 // FIXME: This should depend on locale.
1122 DEFINE_STATIC_LOCAL(AtomicString, hyphenMinusString, (&hyphenMinus, 1)); 1122 DEFINE_STATIC_LOCAL(AtomicString, hyphenMinusString, (&hyphenMinus, 1));
1123 DEFINE_STATIC_LOCAL(AtomicString, hyphenString, (&hyphen, 1)); 1123 DEFINE_STATIC_LOCAL(AtomicString, hyphenString, (&hyphen, 1));
1124 return font().primaryFontHasGlyphForCharacter(hyphen) ? hyphenString : hyphe nMinusString; 1124 return font().primaryFontHasGlyphForCharacter(hyphen) ? hyphenString : hyphe nMinusString;
1125 } 1125 }
1126 1126
1127 const AtomicString& LayoutStyle::textEmphasisMarkString() const 1127 const AtomicString& ComputedStyle::textEmphasisMarkString() const
1128 { 1128 {
1129 switch (textEmphasisMark()) { 1129 switch (textEmphasisMark()) {
1130 case TextEmphasisMarkNone: 1130 case TextEmphasisMarkNone:
1131 return nullAtom; 1131 return nullAtom;
1132 case TextEmphasisMarkCustom: 1132 case TextEmphasisMarkCustom:
1133 return textEmphasisCustomMark(); 1133 return textEmphasisCustomMark();
1134 case TextEmphasisMarkDot: { 1134 case TextEmphasisMarkDot: {
1135 DEFINE_STATIC_LOCAL(AtomicString, filledDotString, (&bullet, 1)); 1135 DEFINE_STATIC_LOCAL(AtomicString, filledDotString, (&bullet, 1));
1136 DEFINE_STATIC_LOCAL(AtomicString, openDotString, (&whiteBullet, 1)); 1136 DEFINE_STATIC_LOCAL(AtomicString, openDotString, (&whiteBullet, 1));
1137 return textEmphasisFill() == TextEmphasisFillFilled ? filledDotString : openDotString; 1137 return textEmphasisFill() == TextEmphasisFillFilled ? filledDotString : openDotString;
(...skipping 20 matching lines...) Expand all
1158 } 1158 }
1159 case TextEmphasisMarkAuto: 1159 case TextEmphasisMarkAuto:
1160 ASSERT_NOT_REACHED(); 1160 ASSERT_NOT_REACHED();
1161 return nullAtom; 1161 return nullAtom;
1162 } 1162 }
1163 1163
1164 ASSERT_NOT_REACHED(); 1164 ASSERT_NOT_REACHED();
1165 return nullAtom; 1165 return nullAtom;
1166 } 1166 }
1167 1167
1168 CSSAnimationData& LayoutStyle::accessAnimations() 1168 CSSAnimationData& ComputedStyle::accessAnimations()
1169 { 1169 {
1170 if (!rareNonInheritedData.access()->m_animations) 1170 if (!rareNonInheritedData.access()->m_animations)
1171 rareNonInheritedData.access()->m_animations = CSSAnimationData::create() ; 1171 rareNonInheritedData.access()->m_animations = CSSAnimationData::create() ;
1172 return *rareNonInheritedData->m_animations; 1172 return *rareNonInheritedData->m_animations;
1173 } 1173 }
1174 1174
1175 CSSTransitionData& LayoutStyle::accessTransitions() 1175 CSSTransitionData& ComputedStyle::accessTransitions()
1176 { 1176 {
1177 if (!rareNonInheritedData.access()->m_transitions) 1177 if (!rareNonInheritedData.access()->m_transitions)
1178 rareNonInheritedData.access()->m_transitions = CSSTransitionData::create (); 1178 rareNonInheritedData.access()->m_transitions = CSSTransitionData::create ();
1179 return *rareNonInheritedData->m_transitions; 1179 return *rareNonInheritedData->m_transitions;
1180 } 1180 }
1181 1181
1182 const Font& LayoutStyle::font() const { return inherited->font; } 1182 const Font& ComputedStyle::font() const { return inherited->font; }
1183 const FontMetrics& LayoutStyle::fontMetrics() const { return inherited->font.fon tMetrics(); } 1183 const FontMetrics& ComputedStyle::fontMetrics() const { return inherited->font.f ontMetrics(); }
1184 const FontDescription& LayoutStyle::fontDescription() const { return inherited-> font.fontDescription(); } 1184 const FontDescription& ComputedStyle::fontDescription() const { return inherited ->font.fontDescription(); }
1185 float LayoutStyle::specifiedFontSize() const { return fontDescription().specifie dSize(); } 1185 float ComputedStyle::specifiedFontSize() const { return fontDescription().specif iedSize(); }
1186 float LayoutStyle::computedFontSize() const { return fontDescription().computedS ize(); } 1186 float ComputedStyle::computedFontSize() const { return fontDescription().compute dSize(); }
1187 int LayoutStyle::fontSize() const { return fontDescription().computedPixelSize() ; } 1187 int ComputedStyle::fontSize() const { return fontDescription().computedPixelSize (); }
1188 float LayoutStyle::fontSizeAdjust() const { return fontDescription().sizeAdjust( ); } 1188 float ComputedStyle::fontSizeAdjust() const { return fontDescription().sizeAdjus t(); }
1189 bool LayoutStyle::hasFontSizeAdjust() const { return fontDescription().hasSizeAd just(); } 1189 bool ComputedStyle::hasFontSizeAdjust() const { return fontDescription().hasSize Adjust(); }
1190 FontWeight LayoutStyle::fontWeight() const { return fontDescription().weight(); } 1190 FontWeight ComputedStyle::fontWeight() const { return fontDescription().weight() ; }
1191 FontStretch LayoutStyle::fontStretch() const { return fontDescription().stretch( ); } 1191 FontStretch ComputedStyle::fontStretch() const { return fontDescription().stretc h(); }
1192 1192
1193 TextDecoration LayoutStyle::textDecorationsInEffect() const 1193 TextDecoration ComputedStyle::textDecorationsInEffect() const
1194 { 1194 {
1195 int decorations = 0; 1195 int decorations = 0;
1196 1196
1197 const Vector<AppliedTextDecoration>& applied = appliedTextDecorations(); 1197 const Vector<AppliedTextDecoration>& applied = appliedTextDecorations();
1198 1198
1199 for (size_t i = 0; i < applied.size(); ++i) 1199 for (size_t i = 0; i < applied.size(); ++i)
1200 decorations |= applied[i].line(); 1200 decorations |= applied[i].line();
1201 1201
1202 return static_cast<TextDecoration>(decorations); 1202 return static_cast<TextDecoration>(decorations);
1203 } 1203 }
1204 1204
1205 const Vector<AppliedTextDecoration>& LayoutStyle::appliedTextDecorations() const 1205 const Vector<AppliedTextDecoration>& ComputedStyle::appliedTextDecorations() con st
1206 { 1206 {
1207 if (!inherited_flags.m_textUnderline && !rareInheritedData->appliedTextDecor ations) { 1207 if (!inherited_flags.m_textUnderline && !rareInheritedData->appliedTextDecor ations) {
1208 DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, empty, ()); 1208 DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, empty, ());
1209 return empty; 1209 return empty;
1210 } 1210 }
1211 if (inherited_flags.m_textUnderline) { 1211 if (inherited_flags.m_textUnderline) {
1212 DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, underline, (1, Applie dTextDecoration(TextDecorationUnderline))); 1212 DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, underline, (1, Applie dTextDecoration(TextDecorationUnderline)));
1213 return underline; 1213 return underline;
1214 } 1214 }
1215 1215
1216 return rareInheritedData->appliedTextDecorations->vector(); 1216 return rareInheritedData->appliedTextDecorations->vector();
1217 } 1217 }
1218 1218
1219 float LayoutStyle::wordSpacing() const { return fontDescription().wordSpacing(); } 1219 float ComputedStyle::wordSpacing() const { return fontDescription().wordSpacing( ); }
1220 float LayoutStyle::letterSpacing() const { return fontDescription().letterSpacin g(); } 1220 float ComputedStyle::letterSpacing() const { return fontDescription().letterSpac ing(); }
1221 1221
1222 bool LayoutStyle::setFontDescription(const FontDescription& v) 1222 bool ComputedStyle::setFontDescription(const FontDescription& v)
1223 { 1223 {
1224 if (inherited->font.fontDescription() != v) { 1224 if (inherited->font.fontDescription() != v) {
1225 inherited.access()->font = Font(v); 1225 inherited.access()->font = Font(v);
1226 return true; 1226 return true;
1227 } 1227 }
1228 return false; 1228 return false;
1229 } 1229 }
1230 1230
1231 const Length& LayoutStyle::specifiedLineHeight() const { return inherited->line_ height; } 1231 const Length& ComputedStyle::specifiedLineHeight() const { return inherited->lin e_height; }
1232 Length LayoutStyle::lineHeight() const 1232 Length ComputedStyle::lineHeight() const
1233 { 1233 {
1234 const Length& lh = inherited->line_height; 1234 const Length& lh = inherited->line_height;
1235 // Unlike fontDescription().computedSize() and hence fontSize(), this is 1235 // Unlike fontDescription().computedSize() and hence fontSize(), this is
1236 // recalculated on demand as we only store the specified line height. 1236 // recalculated on demand as we only store the specified line height.
1237 // FIXME: Should consider scaling the fixed part of any calc expressions 1237 // FIXME: Should consider scaling the fixed part of any calc expressions
1238 // too, though this involves messily poking into CalcExpressionLength. 1238 // too, though this involves messily poking into CalcExpressionLength.
1239 float multiplier = textAutosizingMultiplier(); 1239 float multiplier = textAutosizingMultiplier();
1240 if (multiplier > 1 && lh.isFixed()) 1240 if (multiplier > 1 && lh.isFixed())
1241 return Length(TextAutosizer::computeAutosizedFontSize(lh.value(), multip lier), Fixed); 1241 return Length(TextAutosizer::computeAutosizedFontSize(lh.value(), multip lier), Fixed);
1242 1242
1243 return lh; 1243 return lh;
1244 } 1244 }
1245 1245
1246 void LayoutStyle::setLineHeight(const Length& specifiedLineHeight) { SET_VAR(inh erited, line_height, specifiedLineHeight); } 1246 void ComputedStyle::setLineHeight(const Length& specifiedLineHeight) { SET_VAR(i nherited, line_height, specifiedLineHeight); }
1247 1247
1248 int LayoutStyle::computedLineHeight() const 1248 int ComputedStyle::computedLineHeight() const
1249 { 1249 {
1250 const Length& lh = lineHeight(); 1250 const Length& lh = lineHeight();
1251 1251
1252 // Negative value means the line height is not set. Use the font's built-in spacing. 1252 // Negative value means the line height is not set. Use the font's built-in spacing.
1253 if (lh.isNegative()) 1253 if (lh.isNegative())
1254 return fontMetrics().lineSpacing(); 1254 return fontMetrics().lineSpacing();
1255 1255
1256 if (lh.isPercent()) 1256 if (lh.isPercent())
1257 return minimumValueForLength(lh, fontSize()); 1257 return minimumValueForLength(lh, fontSize());
1258 1258
1259 return lh.value(); 1259 return lh.value();
1260 } 1260 }
1261 1261
1262 void LayoutStyle::setWordSpacing(float wordSpacing) 1262 void ComputedStyle::setWordSpacing(float wordSpacing)
1263 { 1263 {
1264 FontSelector* currentFontSelector = font().fontSelector(); 1264 FontSelector* currentFontSelector = font().fontSelector();
1265 FontDescription desc(fontDescription()); 1265 FontDescription desc(fontDescription());
1266 desc.setWordSpacing(wordSpacing); 1266 desc.setWordSpacing(wordSpacing);
1267 setFontDescription(desc); 1267 setFontDescription(desc);
1268 font().update(currentFontSelector); 1268 font().update(currentFontSelector);
1269 } 1269 }
1270 1270
1271 void LayoutStyle::setLetterSpacing(float letterSpacing) 1271 void ComputedStyle::setLetterSpacing(float letterSpacing)
1272 { 1272 {
1273 FontSelector* currentFontSelector = font().fontSelector(); 1273 FontSelector* currentFontSelector = font().fontSelector();
1274 FontDescription desc(fontDescription()); 1274 FontDescription desc(fontDescription());
1275 desc.setLetterSpacing(letterSpacing); 1275 desc.setLetterSpacing(letterSpacing);
1276 setFontDescription(desc); 1276 setFontDescription(desc);
1277 font().update(currentFontSelector); 1277 font().update(currentFontSelector);
1278 } 1278 }
1279 1279
1280 void LayoutStyle::setTextAutosizingMultiplier(float multiplier) 1280 void ComputedStyle::setTextAutosizingMultiplier(float multiplier)
1281 { 1281 {
1282 SET_VAR(inherited, textAutosizingMultiplier, multiplier); 1282 SET_VAR(inherited, textAutosizingMultiplier, multiplier);
1283 1283
1284 float size = specifiedFontSize(); 1284 float size = specifiedFontSize();
1285 1285
1286 ASSERT(std::isfinite(size)); 1286 ASSERT(std::isfinite(size));
1287 if (!std::isfinite(size) || size < 0) 1287 if (!std::isfinite(size) || size < 0)
1288 size = 0; 1288 size = 0;
1289 else 1289 else
1290 size = std::min(maximumAllowedFontSize, size); 1290 size = std::min(maximumAllowedFontSize, size);
1291 1291
1292 FontSelector* currentFontSelector = font().fontSelector(); 1292 FontSelector* currentFontSelector = font().fontSelector();
1293 FontDescription desc(fontDescription()); 1293 FontDescription desc(fontDescription());
1294 desc.setSpecifiedSize(size); 1294 desc.setSpecifiedSize(size);
1295 desc.setComputedSize(size); 1295 desc.setComputedSize(size);
1296 1296
1297 if (multiplier > 1) { 1297 if (multiplier > 1) {
1298 float autosizedFontSize = TextAutosizer::computeAutosizedFontSize(size, multiplier); 1298 float autosizedFontSize = TextAutosizer::computeAutosizedFontSize(size, multiplier);
1299 desc.setComputedSize(std::min(maximumAllowedFontSize, autosizedFontSize) ); 1299 desc.setComputedSize(std::min(maximumAllowedFontSize, autosizedFontSize) );
1300 } 1300 }
1301 1301
1302 setFontDescription(desc); 1302 setFontDescription(desc);
1303 font().update(currentFontSelector); 1303 font().update(currentFontSelector);
1304 } 1304 }
1305 1305
1306 void LayoutStyle::addAppliedTextDecoration(const AppliedTextDecoration& decorati on) 1306 void ComputedStyle::addAppliedTextDecoration(const AppliedTextDecoration& decora tion)
1307 { 1307 {
1308 RefPtr<AppliedTextDecorationList>& list = rareInheritedData.access()->applie dTextDecorations; 1308 RefPtr<AppliedTextDecorationList>& list = rareInheritedData.access()->applie dTextDecorations;
1309 1309
1310 if (!list) 1310 if (!list)
1311 list = AppliedTextDecorationList::create(); 1311 list = AppliedTextDecorationList::create();
1312 else if (!list->hasOneRef()) 1312 else if (!list->hasOneRef())
1313 list = list->copy(); 1313 list = list->copy();
1314 1314
1315 if (inherited_flags.m_textUnderline) { 1315 if (inherited_flags.m_textUnderline) {
1316 inherited_flags.m_textUnderline = false; 1316 inherited_flags.m_textUnderline = false;
1317 list->append(AppliedTextDecoration(TextDecorationUnderline)); 1317 list->append(AppliedTextDecoration(TextDecorationUnderline));
1318 } 1318 }
1319 1319
1320 list->append(decoration); 1320 list->append(decoration);
1321 } 1321 }
1322 1322
1323 void LayoutStyle::applyTextDecorations() 1323 void ComputedStyle::applyTextDecorations()
1324 { 1324 {
1325 if (textDecoration() == TextDecorationNone) 1325 if (textDecoration() == TextDecorationNone)
1326 return; 1326 return;
1327 1327
1328 TextDecorationStyle style = textDecorationStyle(); 1328 TextDecorationStyle style = textDecorationStyle();
1329 StyleColor styleColor = decorationColorIncludingFallback(insideLink() == Ins ideVisitedLink); 1329 StyleColor styleColor = decorationColorIncludingFallback(insideLink() == Ins ideVisitedLink);
1330 1330
1331 int decorations = textDecoration(); 1331 int decorations = textDecoration();
1332 1332
1333 if (decorations & TextDecorationUnderline) { 1333 if (decorations & TextDecorationUnderline) {
1334 // To save memory, we don't use AppliedTextDecoration objects in the 1334 // To save memory, we don't use AppliedTextDecoration objects in the
1335 // common case of a single simple underline. 1335 // common case of a single simple underline.
1336 AppliedTextDecoration underline(TextDecorationUnderline, style, styleCol or); 1336 AppliedTextDecoration underline(TextDecorationUnderline, style, styleCol or);
1337 1337
1338 if (!rareInheritedData->appliedTextDecorations && underline.isSimpleUnde rline()) 1338 if (!rareInheritedData->appliedTextDecorations && underline.isSimpleUnde rline())
1339 inherited_flags.m_textUnderline = true; 1339 inherited_flags.m_textUnderline = true;
1340 else 1340 else
1341 addAppliedTextDecoration(underline); 1341 addAppliedTextDecoration(underline);
1342 } 1342 }
1343 if (decorations & TextDecorationOverline) 1343 if (decorations & TextDecorationOverline)
1344 addAppliedTextDecoration(AppliedTextDecoration(TextDecorationOverline, s tyle, styleColor)); 1344 addAppliedTextDecoration(AppliedTextDecoration(TextDecorationOverline, s tyle, styleColor));
1345 if (decorations & TextDecorationLineThrough) 1345 if (decorations & TextDecorationLineThrough)
1346 addAppliedTextDecoration(AppliedTextDecoration(TextDecorationLineThrough , style, styleColor)); 1346 addAppliedTextDecoration(AppliedTextDecoration(TextDecorationLineThrough , style, styleColor));
1347 } 1347 }
1348 1348
1349 void LayoutStyle::clearAppliedTextDecorations() 1349 void ComputedStyle::clearAppliedTextDecorations()
1350 { 1350 {
1351 inherited_flags.m_textUnderline = false; 1351 inherited_flags.m_textUnderline = false;
1352 1352
1353 if (rareInheritedData->appliedTextDecorations) 1353 if (rareInheritedData->appliedTextDecorations)
1354 rareInheritedData.access()->appliedTextDecorations = nullptr; 1354 rareInheritedData.access()->appliedTextDecorations = nullptr;
1355 } 1355 }
1356 1356
1357 void LayoutStyle::clearMultiCol() 1357 void ComputedStyle::clearMultiCol()
1358 { 1358 {
1359 rareNonInheritedData.access()->m_multiCol = nullptr; 1359 rareNonInheritedData.access()->m_multiCol = nullptr;
1360 rareNonInheritedData.access()->m_multiCol.init(); 1360 rareNonInheritedData.access()->m_multiCol.init();
1361 } 1361 }
1362 1362
1363 StyleColor LayoutStyle::decorationColorIncludingFallback(bool visitedLink) const 1363 StyleColor ComputedStyle::decorationColorIncludingFallback(bool visitedLink) con st
1364 { 1364 {
1365 StyleColor styleColor = visitedLink ? visitedLinkTextDecorationColor() : tex tDecorationColor(); 1365 StyleColor styleColor = visitedLink ? visitedLinkTextDecorationColor() : tex tDecorationColor();
1366 1366
1367 if (!styleColor.isCurrentColor()) 1367 if (!styleColor.isCurrentColor())
1368 return styleColor; 1368 return styleColor;
1369 1369
1370 if (textStrokeWidth()) { 1370 if (textStrokeWidth()) {
1371 // Prefer stroke color if possible, but not if it's fully transparent. 1371 // Prefer stroke color if possible, but not if it's fully transparent.
1372 StyleColor textStrokeStyleColor = visitedLink ? visitedLinkTextStrokeCol or() : textStrokeColor(); 1372 StyleColor textStrokeStyleColor = visitedLink ? visitedLinkTextStrokeCol or() : textStrokeColor();
1373 if (!textStrokeStyleColor.isCurrentColor() && textStrokeStyleColor.color ().alpha()) 1373 if (!textStrokeStyleColor.isCurrentColor() && textStrokeStyleColor.color ().alpha())
1374 return textStrokeStyleColor; 1374 return textStrokeStyleColor;
1375 } 1375 }
1376 1376
1377 return visitedLink ? visitedLinkTextFillColor() : textFillColor(); 1377 return visitedLink ? visitedLinkTextFillColor() : textFillColor();
1378 } 1378 }
1379 1379
1380 Color LayoutStyle::colorIncludingFallback(int colorProperty, bool visitedLink) c onst 1380 Color ComputedStyle::colorIncludingFallback(int colorProperty, bool visitedLink) const
1381 { 1381 {
1382 StyleColor result(StyleColor::currentColor()); 1382 StyleColor result(StyleColor::currentColor());
1383 EBorderStyle borderStyle = BNONE; 1383 EBorderStyle borderStyle = BNONE;
1384 switch (colorProperty) { 1384 switch (colorProperty) {
1385 case CSSPropertyBackgroundColor: 1385 case CSSPropertyBackgroundColor:
1386 result = visitedLink ? visitedLinkBackgroundColor() : backgroundColor(); 1386 result = visitedLink ? visitedLinkBackgroundColor() : backgroundColor();
1387 break; 1387 break;
1388 case CSSPropertyBorderLeftColor: 1388 case CSSPropertyBorderLeftColor:
1389 result = visitedLink ? visitedLinkBorderLeftColor() : borderLeftColor(); 1389 result = visitedLink ? visitedLinkBorderLeftColor() : borderLeftColor();
1390 borderStyle = borderLeftStyle(); 1390 borderStyle = borderLeftStyle();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1442 if (!result.isCurrentColor()) 1442 if (!result.isCurrentColor())
1443 return result.color(); 1443 return result.color();
1444 1444
1445 // FIXME: Treating styled borders with initial color differently causes prob lems 1445 // FIXME: Treating styled borders with initial color differently causes prob lems
1446 // See crbug.com/316559, crbug.com/276231 1446 // See crbug.com/316559, crbug.com/276231
1447 if (!visitedLink && (borderStyle == INSET || borderStyle == OUTSET || border Style == RIDGE || borderStyle == GROOVE)) 1447 if (!visitedLink && (borderStyle == INSET || borderStyle == OUTSET || border Style == RIDGE || borderStyle == GROOVE))
1448 return Color(238, 238, 238); 1448 return Color(238, 238, 238);
1449 return visitedLink ? visitedLinkColor() : color(); 1449 return visitedLink ? visitedLinkColor() : color();
1450 } 1450 }
1451 1451
1452 Color LayoutStyle::visitedDependentColor(int colorProperty) const 1452 Color ComputedStyle::visitedDependentColor(int colorProperty) const
1453 { 1453 {
1454 Color unvisitedColor = colorIncludingFallback(colorProperty, false); 1454 Color unvisitedColor = colorIncludingFallback(colorProperty, false);
1455 if (insideLink() != InsideVisitedLink) 1455 if (insideLink() != InsideVisitedLink)
1456 return unvisitedColor; 1456 return unvisitedColor;
1457 1457
1458 Color visitedColor = colorIncludingFallback(colorProperty, true); 1458 Color visitedColor = colorIncludingFallback(colorProperty, true);
1459 1459
1460 // FIXME: Technically someone could explicitly specify the color transparent , but for now we'll just 1460 // FIXME: Technically someone could explicitly specify the color transparent , but for now we'll just
1461 // assume that if the background color is transparent that it wasn't set. No te that it's weird that 1461 // assume that if the background color is transparent that it wasn't set. No te that it's weird that
1462 // we're returning unvisited info for a visited link, but given our restrict ion that the alpha values 1462 // we're returning unvisited info for a visited link, but given our restrict ion that the alpha values
1463 // have to match, it makes more sense to return the unvisited background col or if specified than it 1463 // have to match, it makes more sense to return the unvisited background col or if specified than it
1464 // does to return black. This behavior matches what Firefox 4 does as well. 1464 // does to return black. This behavior matches what Firefox 4 does as well.
1465 if (colorProperty == CSSPropertyBackgroundColor && visitedColor == Color::tr ansparent) 1465 if (colorProperty == CSSPropertyBackgroundColor && visitedColor == Color::tr ansparent)
1466 return unvisitedColor; 1466 return unvisitedColor;
1467 1467
1468 // Take the alpha from the unvisited color, but get the RGB values from the visited color. 1468 // Take the alpha from the unvisited color, but get the RGB values from the visited color.
1469 return Color(visitedColor.red(), visitedColor.green(), visitedColor.blue(), unvisitedColor.alpha()); 1469 return Color(visitedColor.red(), visitedColor.green(), visitedColor.blue(), unvisitedColor.alpha());
1470 } 1470 }
1471 1471
1472 const BorderValue& LayoutStyle::borderBefore() const 1472 const BorderValue& ComputedStyle::borderBefore() const
1473 { 1473 {
1474 switch (writingMode()) { 1474 switch (writingMode()) {
1475 case TopToBottomWritingMode: 1475 case TopToBottomWritingMode:
1476 return borderTop(); 1476 return borderTop();
1477 case BottomToTopWritingMode: 1477 case BottomToTopWritingMode:
1478 return borderBottom(); 1478 return borderBottom();
1479 case LeftToRightWritingMode: 1479 case LeftToRightWritingMode:
1480 return borderLeft(); 1480 return borderLeft();
1481 case RightToLeftWritingMode: 1481 case RightToLeftWritingMode:
1482 return borderRight(); 1482 return borderRight();
1483 } 1483 }
1484 ASSERT_NOT_REACHED(); 1484 ASSERT_NOT_REACHED();
1485 return borderTop(); 1485 return borderTop();
1486 } 1486 }
1487 1487
1488 const BorderValue& LayoutStyle::borderAfter() const 1488 const BorderValue& ComputedStyle::borderAfter() const
1489 { 1489 {
1490 switch (writingMode()) { 1490 switch (writingMode()) {
1491 case TopToBottomWritingMode: 1491 case TopToBottomWritingMode:
1492 return borderBottom(); 1492 return borderBottom();
1493 case BottomToTopWritingMode: 1493 case BottomToTopWritingMode:
1494 return borderTop(); 1494 return borderTop();
1495 case LeftToRightWritingMode: 1495 case LeftToRightWritingMode:
1496 return borderRight(); 1496 return borderRight();
1497 case RightToLeftWritingMode: 1497 case RightToLeftWritingMode:
1498 return borderLeft(); 1498 return borderLeft();
1499 } 1499 }
1500 ASSERT_NOT_REACHED(); 1500 ASSERT_NOT_REACHED();
1501 return borderBottom(); 1501 return borderBottom();
1502 } 1502 }
1503 1503
1504 const BorderValue& LayoutStyle::borderStart() const 1504 const BorderValue& ComputedStyle::borderStart() const
1505 { 1505 {
1506 if (isHorizontalWritingMode()) 1506 if (isHorizontalWritingMode())
1507 return isLeftToRightDirection() ? borderLeft() : borderRight(); 1507 return isLeftToRightDirection() ? borderLeft() : borderRight();
1508 return isLeftToRightDirection() ? borderTop() : borderBottom(); 1508 return isLeftToRightDirection() ? borderTop() : borderBottom();
1509 } 1509 }
1510 1510
1511 const BorderValue& LayoutStyle::borderEnd() const 1511 const BorderValue& ComputedStyle::borderEnd() const
1512 { 1512 {
1513 if (isHorizontalWritingMode()) 1513 if (isHorizontalWritingMode())
1514 return isLeftToRightDirection() ? borderRight() : borderLeft(); 1514 return isLeftToRightDirection() ? borderRight() : borderLeft();
1515 return isLeftToRightDirection() ? borderBottom() : borderTop(); 1515 return isLeftToRightDirection() ? borderBottom() : borderTop();
1516 } 1516 }
1517 1517
1518 unsigned short LayoutStyle::borderBeforeWidth() const 1518 unsigned short ComputedStyle::borderBeforeWidth() const
1519 { 1519 {
1520 switch (writingMode()) { 1520 switch (writingMode()) {
1521 case TopToBottomWritingMode: 1521 case TopToBottomWritingMode:
1522 return borderTopWidth(); 1522 return borderTopWidth();
1523 case BottomToTopWritingMode: 1523 case BottomToTopWritingMode:
1524 return borderBottomWidth(); 1524 return borderBottomWidth();
1525 case LeftToRightWritingMode: 1525 case LeftToRightWritingMode:
1526 return borderLeftWidth(); 1526 return borderLeftWidth();
1527 case RightToLeftWritingMode: 1527 case RightToLeftWritingMode:
1528 return borderRightWidth(); 1528 return borderRightWidth();
1529 } 1529 }
1530 ASSERT_NOT_REACHED(); 1530 ASSERT_NOT_REACHED();
1531 return borderTopWidth(); 1531 return borderTopWidth();
1532 } 1532 }
1533 1533
1534 unsigned short LayoutStyle::borderAfterWidth() const 1534 unsigned short ComputedStyle::borderAfterWidth() const
1535 { 1535 {
1536 switch (writingMode()) { 1536 switch (writingMode()) {
1537 case TopToBottomWritingMode: 1537 case TopToBottomWritingMode:
1538 return borderBottomWidth(); 1538 return borderBottomWidth();
1539 case BottomToTopWritingMode: 1539 case BottomToTopWritingMode:
1540 return borderTopWidth(); 1540 return borderTopWidth();
1541 case LeftToRightWritingMode: 1541 case LeftToRightWritingMode:
1542 return borderRightWidth(); 1542 return borderRightWidth();
1543 case RightToLeftWritingMode: 1543 case RightToLeftWritingMode:
1544 return borderLeftWidth(); 1544 return borderLeftWidth();
1545 } 1545 }
1546 ASSERT_NOT_REACHED(); 1546 ASSERT_NOT_REACHED();
1547 return borderBottomWidth(); 1547 return borderBottomWidth();
1548 } 1548 }
1549 1549
1550 unsigned short LayoutStyle::borderStartWidth() const 1550 unsigned short ComputedStyle::borderStartWidth() const
1551 { 1551 {
1552 if (isHorizontalWritingMode()) 1552 if (isHorizontalWritingMode())
1553 return isLeftToRightDirection() ? borderLeftWidth() : borderRightWidth() ; 1553 return isLeftToRightDirection() ? borderLeftWidth() : borderRightWidth() ;
1554 return isLeftToRightDirection() ? borderTopWidth() : borderBottomWidth(); 1554 return isLeftToRightDirection() ? borderTopWidth() : borderBottomWidth();
1555 } 1555 }
1556 1556
1557 unsigned short LayoutStyle::borderEndWidth() const 1557 unsigned short ComputedStyle::borderEndWidth() const
1558 { 1558 {
1559 if (isHorizontalWritingMode()) 1559 if (isHorizontalWritingMode())
1560 return isLeftToRightDirection() ? borderRightWidth() : borderLeftWidth() ; 1560 return isLeftToRightDirection() ? borderRightWidth() : borderLeftWidth() ;
1561 return isLeftToRightDirection() ? borderBottomWidth() : borderTopWidth(); 1561 return isLeftToRightDirection() ? borderBottomWidth() : borderTopWidth();
1562 } 1562 }
1563 1563
1564 void LayoutStyle::setMarginStart(const Length& margin) 1564 void ComputedStyle::setMarginStart(const Length& margin)
1565 { 1565 {
1566 if (isHorizontalWritingMode()) { 1566 if (isHorizontalWritingMode()) {
1567 if (isLeftToRightDirection()) 1567 if (isLeftToRightDirection())
1568 setMarginLeft(margin); 1568 setMarginLeft(margin);
1569 else 1569 else
1570 setMarginRight(margin); 1570 setMarginRight(margin);
1571 } else { 1571 } else {
1572 if (isLeftToRightDirection()) 1572 if (isLeftToRightDirection())
1573 setMarginTop(margin); 1573 setMarginTop(margin);
1574 else 1574 else
1575 setMarginBottom(margin); 1575 setMarginBottom(margin);
1576 } 1576 }
1577 } 1577 }
1578 1578
1579 void LayoutStyle::setMarginEnd(const Length& margin) 1579 void ComputedStyle::setMarginEnd(const Length& margin)
1580 { 1580 {
1581 if (isHorizontalWritingMode()) { 1581 if (isHorizontalWritingMode()) {
1582 if (isLeftToRightDirection()) 1582 if (isLeftToRightDirection())
1583 setMarginRight(margin); 1583 setMarginRight(margin);
1584 else 1584 else
1585 setMarginLeft(margin); 1585 setMarginLeft(margin);
1586 } else { 1586 } else {
1587 if (isLeftToRightDirection()) 1587 if (isLeftToRightDirection())
1588 setMarginBottom(margin); 1588 setMarginBottom(margin);
1589 else 1589 else
1590 setMarginTop(margin); 1590 setMarginTop(margin);
1591 } 1591 }
1592 } 1592 }
1593 1593
1594 void LayoutStyle::setMotionPath(PassRefPtr<StyleMotionPath> path) 1594 void ComputedStyle::setMotionPath(PassRefPtr<StyleMotionPath> path)
1595 { 1595 {
1596 ASSERT(path); 1596 ASSERT(path);
1597 rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = path; 1597 rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = path;
1598 } 1598 }
1599 1599
1600 void LayoutStyle::resetMotionPath() 1600 void ComputedStyle::resetMotionPath()
1601 { 1601 {
1602 rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = nullp tr; 1602 rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = nullp tr;
1603 } 1603 }
1604 1604
1605 bool LayoutStyle::columnRuleEquivalent(const LayoutStyle* otherStyle) const 1605 bool ComputedStyle::columnRuleEquivalent(const ComputedStyle* otherStyle) const
1606 { 1606 {
1607 return columnRuleStyle() == otherStyle->columnRuleStyle() 1607 return columnRuleStyle() == otherStyle->columnRuleStyle()
1608 && columnRuleWidth() == otherStyle->columnRuleWidth() 1608 && columnRuleWidth() == otherStyle->columnRuleWidth()
1609 && visitedDependentColor(CSSPropertyWebkitColumnRuleColor) == otherStyle ->visitedDependentColor(CSSPropertyWebkitColumnRuleColor); 1609 && visitedDependentColor(CSSPropertyWebkitColumnRuleColor) == otherStyle ->visitedDependentColor(CSSPropertyWebkitColumnRuleColor);
1610 } 1610 }
1611 1611
1612 TextEmphasisMark LayoutStyle::textEmphasisMark() const 1612 TextEmphasisMark ComputedStyle::textEmphasisMark() const
1613 { 1613 {
1614 TextEmphasisMark mark = static_cast<TextEmphasisMark>(rareInheritedData->tex tEmphasisMark); 1614 TextEmphasisMark mark = static_cast<TextEmphasisMark>(rareInheritedData->tex tEmphasisMark);
1615 if (mark != TextEmphasisMarkAuto) 1615 if (mark != TextEmphasisMarkAuto)
1616 return mark; 1616 return mark;
1617 1617
1618 if (isHorizontalWritingMode()) 1618 if (isHorizontalWritingMode())
1619 return TextEmphasisMarkDot; 1619 return TextEmphasisMarkDot;
1620 1620
1621 return TextEmphasisMarkSesame; 1621 return TextEmphasisMarkSesame;
1622 } 1622 }
1623 1623
1624 Color LayoutStyle::initialTapHighlightColor() 1624 Color ComputedStyle::initialTapHighlightColor()
1625 { 1625 {
1626 return LayoutTheme::tapHighlightColor(); 1626 return LayoutTheme::tapHighlightColor();
1627 } 1627 }
1628 1628
1629 #if ENABLE(OILPAN) 1629 #if ENABLE(OILPAN)
1630 const FilterOperations& LayoutStyle::initialFilter() 1630 const FilterOperations& ComputedStyle::initialFilter()
1631 { 1631 {
1632 DEFINE_STATIC_LOCAL(Persistent<FilterOperationsWrapper>, ops, (FilterOperati onsWrapper::create())); 1632 DEFINE_STATIC_LOCAL(Persistent<FilterOperationsWrapper>, ops, (FilterOperati onsWrapper::create()));
1633 return ops->operations(); 1633 return ops->operations();
1634 } 1634 }
1635 #endif 1635 #endif
1636 1636
1637 LayoutRectOutsets LayoutStyle::imageOutsets(const NinePieceImage& image) const 1637 LayoutRectOutsets ComputedStyle::imageOutsets(const NinePieceImage& image) const
1638 { 1638 {
1639 return LayoutRectOutsets( 1639 return LayoutRectOutsets(
1640 NinePieceImage::computeOutset(image.outset().top(), borderTopWidth()), 1640 NinePieceImage::computeOutset(image.outset().top(), borderTopWidth()),
1641 NinePieceImage::computeOutset(image.outset().right(), borderRightWidth() ), 1641 NinePieceImage::computeOutset(image.outset().right(), borderRightWidth() ),
1642 NinePieceImage::computeOutset(image.outset().bottom(), borderBottomWidth ()), 1642 NinePieceImage::computeOutset(image.outset().bottom(), borderBottomWidth ()),
1643 NinePieceImage::computeOutset(image.outset().left(), borderLeftWidth())) ; 1643 NinePieceImage::computeOutset(image.outset().left(), borderLeftWidth())) ;
1644 } 1644 }
1645 1645
1646 void LayoutStyle::setBorderImageSource(PassRefPtr<StyleImage> image) 1646 void ComputedStyle::setBorderImageSource(PassRefPtr<StyleImage> image)
1647 { 1647 {
1648 if (surround->border.m_image.image() == image.get()) 1648 if (surround->border.m_image.image() == image.get())
1649 return; 1649 return;
1650 surround.access()->border.m_image.setImage(image); 1650 surround.access()->border.m_image.setImage(image);
1651 } 1651 }
1652 1652
1653 void LayoutStyle::setBorderImageSlices(const LengthBox& slices) 1653 void ComputedStyle::setBorderImageSlices(const LengthBox& slices)
1654 { 1654 {
1655 if (surround->border.m_image.imageSlices() == slices) 1655 if (surround->border.m_image.imageSlices() == slices)
1656 return; 1656 return;
1657 surround.access()->border.m_image.setImageSlices(slices); 1657 surround.access()->border.m_image.setImageSlices(slices);
1658 } 1658 }
1659 1659
1660 void LayoutStyle::setBorderImageSlicesFill(bool fill) 1660 void ComputedStyle::setBorderImageSlicesFill(bool fill)
1661 { 1661 {
1662 if (surround->border.m_image.fill() == fill) 1662 if (surround->border.m_image.fill() == fill)
1663 return; 1663 return;
1664 surround.access()->border.m_image.setFill(fill); 1664 surround.access()->border.m_image.setFill(fill);
1665 } 1665 }
1666 1666
1667 void LayoutStyle::setBorderImageWidth(const BorderImageLengthBox& slices) 1667 void ComputedStyle::setBorderImageWidth(const BorderImageLengthBox& slices)
1668 { 1668 {
1669 if (surround->border.m_image.borderSlices() == slices) 1669 if (surround->border.m_image.borderSlices() == slices)
1670 return; 1670 return;
1671 surround.access()->border.m_image.setBorderSlices(slices); 1671 surround.access()->border.m_image.setBorderSlices(slices);
1672 } 1672 }
1673 1673
1674 void LayoutStyle::setBorderImageOutset(const BorderImageLengthBox& outset) 1674 void ComputedStyle::setBorderImageOutset(const BorderImageLengthBox& outset)
1675 { 1675 {
1676 if (surround->border.m_image.outset() == outset) 1676 if (surround->border.m_image.outset() == outset)
1677 return; 1677 return;
1678 surround.access()->border.m_image.setOutset(outset); 1678 surround.access()->border.m_image.setOutset(outset);
1679 } 1679 }
1680 1680
1681 bool LayoutStyle::borderObscuresBackground() const 1681 bool ComputedStyle::borderObscuresBackground() const
1682 { 1682 {
1683 if (!hasBorder()) 1683 if (!hasBorder())
1684 return false; 1684 return false;
1685 1685
1686 // Bail if we have any border-image for now. We could look at the image alph a to improve this. 1686 // Bail if we have any border-image for now. We could look at the image alph a to improve this.
1687 if (borderImage().image()) 1687 if (borderImage().image())
1688 return false; 1688 return false;
1689 1689
1690 BorderEdge edges[4]; 1690 BorderEdge edges[4];
1691 getBorderEdgeInfo(edges); 1691 getBorderEdgeInfo(edges);
1692 1692
1693 for (int i = BSTop; i <= BSLeft; ++i) { 1693 for (int i = BSTop; i <= BSLeft; ++i) {
1694 const BorderEdge& currEdge = edges[i]; 1694 const BorderEdge& currEdge = edges[i];
1695 if (!currEdge.obscuresBackground()) 1695 if (!currEdge.obscuresBackground())
1696 return false; 1696 return false;
1697 } 1697 }
1698 1698
1699 return true; 1699 return true;
1700 } 1700 }
1701 1701
1702 void LayoutStyle::getBorderEdgeInfo(BorderEdge edges[], bool includeLogicalLeftE dge, bool includeLogicalRightEdge) const 1702 void ComputedStyle::getBorderEdgeInfo(BorderEdge edges[], bool includeLogicalLef tEdge, bool includeLogicalRightEdge) const
1703 { 1703 {
1704 bool horizontal = isHorizontalWritingMode(); 1704 bool horizontal = isHorizontalWritingMode();
1705 1705
1706 edges[BSTop] = BorderEdge(borderTopWidth(), 1706 edges[BSTop] = BorderEdge(borderTopWidth(),
1707 visitedDependentColor(CSSPropertyBorderTopColor), 1707 visitedDependentColor(CSSPropertyBorderTopColor),
1708 borderTopStyle(), 1708 borderTopStyle(),
1709 borderTopIsTransparent(), 1709 borderTopIsTransparent(),
1710 horizontal || includeLogicalLeftEdge); 1710 horizontal || includeLogicalLeftEdge);
1711 1711
1712 edges[BSRight] = BorderEdge(borderRightWidth(), 1712 edges[BSRight] = BorderEdge(borderRightWidth(),
1713 visitedDependentColor(CSSPropertyBorderRightColor), 1713 visitedDependentColor(CSSPropertyBorderRightColor),
1714 borderRightStyle(), 1714 borderRightStyle(),
1715 borderRightIsTransparent(), 1715 borderRightIsTransparent(),
1716 !horizontal || includeLogicalRightEdge); 1716 !horizontal || includeLogicalRightEdge);
1717 1717
1718 edges[BSBottom] = BorderEdge(borderBottomWidth(), 1718 edges[BSBottom] = BorderEdge(borderBottomWidth(),
1719 visitedDependentColor(CSSPropertyBorderBottomColor), 1719 visitedDependentColor(CSSPropertyBorderBottomColor),
1720 borderBottomStyle(), 1720 borderBottomStyle(),
1721 borderBottomIsTransparent(), 1721 borderBottomIsTransparent(),
1722 horizontal || includeLogicalRightEdge); 1722 horizontal || includeLogicalRightEdge);
1723 1723
1724 edges[BSLeft] = BorderEdge(borderLeftWidth(), 1724 edges[BSLeft] = BorderEdge(borderLeftWidth(),
1725 visitedDependentColor(CSSPropertyBorderLeftColor), 1725 visitedDependentColor(CSSPropertyBorderLeftColor),
1726 borderLeftStyle(), 1726 borderLeftStyle(),
1727 borderLeftIsTransparent(), 1727 borderLeftIsTransparent(),
1728 !horizontal || includeLogicalLeftEdge); 1728 !horizontal || includeLogicalLeftEdge);
1729 } 1729 }
1730 1730
1731 } // namespace blink 1731 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/style/ComputedStyle.h ('k') | Source/core/layout/style/ComputedStyleConstants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698