OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "config.h" | 29 #include "config.h" |
30 #include "core/css/resolver/StyleAdjuster.h" | 30 #include "core/css/resolver/StyleAdjuster.h" |
31 | 31 |
32 #include "HTMLNames.h" | 32 #include "HTMLNames.h" |
33 #include "SVGNames.h" | 33 #include "SVGNames.h" |
34 #include "core/dom/ContainerNode.h" | 34 #include "core/dom/ContainerNode.h" |
35 #include "core/dom/Document.h" | 35 #include "core/dom/Document.h" |
36 #include "core/dom/Element.h" | 36 #include "core/dom/Element.h" |
37 #include "core/html/HTMLIFrameElement.h" | 37 #include "core/html/HTMLIFrameElement.h" |
38 #include "core/html/HTMLInputElement.h" | 38 #include "core/html/HTMLInputElement.h" |
| 39 #include "core/html/HTMLTableCellElement.h" |
39 #include "core/html/HTMLTextAreaElement.h" | 40 #include "core/html/HTMLTextAreaElement.h" |
40 #include "core/frame/FrameView.h" | 41 #include "core/frame/FrameView.h" |
41 #include "core/frame/Settings.h" | 42 #include "core/frame/Settings.h" |
42 #include "core/rendering/RenderTheme.h" | 43 #include "core/rendering/RenderTheme.h" |
43 #include "core/rendering/style/GridPosition.h" | 44 #include "core/rendering/style/GridPosition.h" |
44 #include "core/rendering/style/RenderStyle.h" | 45 #include "core/rendering/style/RenderStyle.h" |
45 #include "core/rendering/style/RenderStyleConstants.h" | 46 #include "core/rendering/style/RenderStyleConstants.h" |
| 47 #include "core/svg/SVGSVGElement.h" |
46 #include "platform/Length.h" | 48 #include "platform/Length.h" |
47 #include "platform/transforms/TransformOperations.h" | 49 #include "platform/transforms/TransformOperations.h" |
48 #include "wtf/Assertions.h" | 50 #include "wtf/Assertions.h" |
49 | 51 |
50 namespace WebCore { | 52 namespace WebCore { |
51 | 53 |
52 using namespace HTMLNames; | 54 using namespace HTMLNames; |
53 | 55 |
54 // FIXME: This is duplicated with StyleResolver.cpp | 56 // FIXME: This is duplicated with StyleResolver.cpp |
55 // Perhaps this should move onto ElementResolveContext or even Element? | 57 // Perhaps this should move onto ElementResolveContext or even Element? |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 198 |
197 if (style->display() != NONE) { | 199 if (style->display() != NONE) { |
198 // If we have a <td> that specifies a float property, in quirks mode we
just drop the float | 200 // If we have a <td> that specifies a float property, in quirks mode we
just drop the float |
199 // property. | 201 // property. |
200 // Sites also commonly use display:inline/block on <td>s and <table>s. I
n quirks mode we force | 202 // Sites also commonly use display:inline/block on <td>s and <table>s. I
n quirks mode we force |
201 // these tags to retain their display types. | 203 // these tags to retain their display types. |
202 if (m_useQuirksModeStyles && e) { | 204 if (m_useQuirksModeStyles && e) { |
203 if (e->hasTagName(tdTag)) { | 205 if (e->hasTagName(tdTag)) { |
204 style->setDisplay(TABLE_CELL); | 206 style->setDisplay(TABLE_CELL); |
205 style->setFloating(NoFloat); | 207 style->setFloating(NoFloat); |
206 } else if (e->hasTagName(tableTag)) { | 208 } else if (isHTMLTableElement(*e)) { |
207 style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE :
TABLE); | 209 style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE :
TABLE); |
208 } | 210 } |
209 } | 211 } |
210 | 212 |
211 if (e && (e->hasTagName(tdTag) || e->hasTagName(thTag))) { | 213 if (e && isHTMLTableCellElement(*e)) { |
212 if (style->whiteSpace() == KHTML_NOWRAP) { | 214 if (style->whiteSpace() == KHTML_NOWRAP) { |
213 // Figure out if we are really nowrapping or if we should just | 215 // Figure out if we are really nowrapping or if we should just |
214 // use normal instead. If the width of the cell is fixed, then | 216 // use normal instead. If the width of the cell is fixed, then |
215 // we don't actually use NOWRAP. | 217 // we don't actually use NOWRAP. |
216 if (style->width().isFixed()) | 218 if (style->width().isFixed()) |
217 style->setWhiteSpace(NORMAL); | 219 style->setWhiteSpace(NORMAL); |
218 else | 220 else |
219 style->setWhiteSpace(NOWRAP); | 221 style->setWhiteSpace(NOWRAP); |
220 } | 222 } |
221 } | 223 } |
222 | 224 |
223 // Tables never support the -webkit-* values for text-align and will res
et back to the default. | 225 // Tables never support the -webkit-* values for text-align and will res
et back to the default. |
224 if (e && e->hasTagName(tableTag) && (style->textAlign() == WEBKIT_LEFT |
| style->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT)) | 226 if (isHTMLTableElement(e) && (style->textAlign() == WEBKIT_LEFT || style
->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT)) |
225 style->setTextAlign(TASTART); | 227 style->setTextAlign(TASTART); |
226 | 228 |
227 // Frames and framesets never honor position:relative or position:absolu
te. This is necessary to | 229 // Frames and framesets never honor position:relative or position:absolu
te. This is necessary to |
228 // fix a crash where a site tries to position these objects. They also n
ever honor display. | 230 // fix a crash where a site tries to position these objects. They also n
ever honor display. |
229 if (e && (e->hasTagName(frameTag) || e->hasTagName(framesetTag))) { | 231 if (e && (isHTMLFrameElement(*e) || isHTMLFrameSetElement(*e))) { |
230 style->setPosition(StaticPosition); | 232 style->setPosition(StaticPosition); |
231 style->setDisplay(BLOCK); | 233 style->setDisplay(BLOCK); |
232 } | 234 } |
233 | 235 |
234 // Ruby text does not support float or position. This might change with
evolution of the specification. | 236 // Ruby text does not support float or position. This might change with
evolution of the specification. |
235 if (e && e->hasTagName(rtTag)) { | 237 if (isHTMLRTElement(e)) { |
236 style->setPosition(StaticPosition); | 238 style->setPosition(StaticPosition); |
237 style->setFloating(NoFloat); | 239 style->setFloating(NoFloat); |
238 } | 240 } |
239 | 241 |
240 // FIXME: We shouldn't be overriding start/-webkit-auto like this. Do it
in html.css instead. | 242 // FIXME: We shouldn't be overriding start/-webkit-auto like this. Do it
in html.css instead. |
241 // Table headers with a text-align of -webkit-auto will change the text-
align to center. | 243 // Table headers with a text-align of -webkit-auto will change the text-
align to center. |
242 if (e && e->hasTagName(thTag) && style->textAlign() == TASTART) | 244 if (e && e->hasTagName(thTag) && style->textAlign() == TASTART) |
243 style->setTextAlign(CENTER); | 245 style->setTextAlign(CENTER); |
244 | 246 |
245 if (e && e->hasTagName(legendTag)) | 247 if (isHTMLLegendElement(e)) |
246 style->setDisplay(BLOCK); | 248 style->setDisplay(BLOCK); |
247 | 249 |
248 // Per the spec, position 'static' and 'relative' in the top layer compu
te to 'absolute'. | 250 // Per the spec, position 'static' and 'relative' in the top layer compu
te to 'absolute'. |
249 if (isInTopLayer(e, style) && (style->position() == StaticPosition || st
yle->position() == RelativePosition)) | 251 if (isInTopLayer(e, style) && (style->position() == StaticPosition || st
yle->position() == RelativePosition)) |
250 style->setPosition(AbsolutePosition); | 252 style->setPosition(AbsolutePosition); |
251 | 253 |
252 // Absolute/fixed positioned elements, floating elements and the documen
t element need block-like outside display. | 254 // Absolute/fixed positioned elements, floating elements and the documen
t element need block-like outside display. |
253 if (style->hasOutOfFlowPosition() || style->isFloating() || (e && e->doc
ument().documentElement() == e)) | 255 if (style->hasOutOfFlowPosition() || style->isFloating() || (e && e->doc
ument().documentElement() == e)) |
254 style->setDisplay(equivalentBlockDisplay(style->display(), style->is
Floating(), !m_useQuirksModeStyles)); | 256 style->setDisplay(equivalentBlockDisplay(style->display(), style->is
Floating(), !m_useQuirksModeStyles)); |
255 | 257 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 style->setZIndex(0); | 311 style->setZIndex(0); |
310 | 312 |
311 // will-change:transform should result in the same rendering behavior as hav
ing a transform, | 313 // will-change:transform should result in the same rendering behavior as hav
ing a transform, |
312 // including the creation of a containing block for fixed position descendan
ts. | 314 // including the creation of a containing block for fixed position descendan
ts. |
313 if (!style->hasTransform() && style->willChangeProperties().contains(CSSProp
ertyWebkitTransform)) { | 315 if (!style->hasTransform() && style->willChangeProperties().contains(CSSProp
ertyWebkitTransform)) { |
314 bool makeIdentity = true; | 316 bool makeIdentity = true; |
315 style->setTransform(TransformOperations(makeIdentity)); | 317 style->setTransform(TransformOperations(makeIdentity)); |
316 } | 318 } |
317 | 319 |
318 // Textarea considers overflow visible as auto. | 320 // Textarea considers overflow visible as auto. |
319 if (e && e->hasTagName(textareaTag)) { | 321 if (isHTMLTextAreaElement(e)) { |
320 style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->over
flowX()); | 322 style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->over
flowX()); |
321 style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->over
flowY()); | 323 style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->over
flowY()); |
322 } | 324 } |
323 | 325 |
324 // For now, <marquee> requires an overflow clip to work properly. | 326 // For now, <marquee> requires an overflow clip to work properly. |
325 if (e && e->hasTagName(marqueeTag)) { | 327 if (isHTMLMarqueeElement(e)) { |
326 style->setOverflowX(OHIDDEN); | 328 style->setOverflowX(OHIDDEN); |
327 style->setOverflowY(OHIDDEN); | 329 style->setOverflowY(OHIDDEN); |
328 } | 330 } |
329 | 331 |
330 if (doesNotInheritTextDecoration(style, e)) | 332 if (doesNotInheritTextDecoration(style, e)) |
331 style->setTextDecorationsInEffect(style->textDecoration()); | 333 style->setTextDecorationsInEffect(style->textDecoration()); |
332 else | 334 else |
333 style->addToTextDecorationsInEffect(style->textDecoration()); | 335 style->addToTextDecorationsInEffect(style->textDecoration()); |
334 | 336 |
335 // If either overflow value is not visible, change to auto. | 337 // If either overflow value is not visible, change to auto. |
(...skipping 24 matching lines...) Expand all Loading... |
360 | 362 |
361 // Cull out any useless layers and also repeat patterns into additional laye
rs. | 363 // Cull out any useless layers and also repeat patterns into additional laye
rs. |
362 style->adjustBackgroundLayers(); | 364 style->adjustBackgroundLayers(); |
363 style->adjustMaskLayers(); | 365 style->adjustMaskLayers(); |
364 | 366 |
365 // Important: Intrinsic margins get added to controls before the theme has a
djusted the style, since the theme will | 367 // Important: Intrinsic margins get added to controls before the theme has a
djusted the style, since the theme will |
366 // alter fonts and heights/widths. | 368 // alter fonts and heights/widths. |
367 if (e && e->isFormControlElement() && style->fontSize() >= 11) { | 369 if (e && e->isFormControlElement() && style->fontSize() >= 11) { |
368 // Don't apply intrinsic margins to image buttons. The designer knows ho
w big the images are, | 370 // Don't apply intrinsic margins to image buttons. The designer knows ho
w big the images are, |
369 // so we have to treat all image buttons as though they were explicitly
sized. | 371 // so we have to treat all image buttons as though they were explicitly
sized. |
370 if (!e->hasTagName(inputTag) || !toHTMLInputElement(e)->isImageButton()) | 372 if (!isHTMLInputElement(*e) || !toHTMLInputElement(e)->isImageButton()) |
371 addIntrinsicMargins(style); | 373 addIntrinsicMargins(style); |
372 } | 374 } |
373 | 375 |
374 // Let the theme also have a crack at adjusting the style. | 376 // Let the theme also have a crack at adjusting the style. |
375 if (style->hasAppearance()) | 377 if (style->hasAppearance()) |
376 RenderTheme::theme().adjustStyle(style, e, m_cachedUAStyle); | 378 RenderTheme::theme().adjustStyle(style, e, m_cachedUAStyle); |
377 | 379 |
378 // If we have first-letter pseudo style, do not share this style. | 380 // If we have first-letter pseudo style, do not share this style. |
379 if (style->hasPseudoStyle(FIRST_LETTER)) | 381 if (style->hasPseudoStyle(FIRST_LETTER)) |
380 style->setUnique(); | 382 style->setUnique(); |
(...skipping 12 matching lines...) Expand all Loading... |
393 style->setOverflowY(OHIDDEN); | 395 style->setOverflowY(OHIDDEN); |
394 else if (style->overflowY() == OAUTO) | 396 else if (style->overflowY() == OAUTO) |
395 style->setOverflowY(OVISIBLE); | 397 style->setOverflowY(OVISIBLE); |
396 | 398 |
397 if (style->overflowX() == OSCROLL) | 399 if (style->overflowX() == OSCROLL) |
398 style->setOverflowX(OHIDDEN); | 400 style->setOverflowX(OHIDDEN); |
399 else if (style->overflowX() == OAUTO) | 401 else if (style->overflowX() == OAUTO) |
400 style->setOverflowX(OVISIBLE); | 402 style->setOverflowX(OVISIBLE); |
401 | 403 |
402 // Only the root <svg> element in an SVG document fragment tree honors c
ss position | 404 // Only the root <svg> element in an SVG document fragment tree honors c
ss position |
403 if (!(e->hasTagName(SVGNames::svgTag) && e->parentNode() && !e->parentNo
de()->isSVGElement())) | 405 if (!(isSVGSVGElement(*e) && e->parentNode() && !e->parentNode()->isSVGE
lement())) |
404 style->setPosition(RenderStyle::initialPosition()); | 406 style->setPosition(RenderStyle::initialPosition()); |
405 | 407 |
406 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb
ject content should | 408 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb
ject content should |
407 // not be scaled again. | 409 // not be scaled again. |
408 if (e->hasTagName(SVGNames::foreignObjectTag)) | 410 if (isSVGForeignObjectElement(*e)) |
409 style->setEffectiveZoom(RenderStyle::initialZoom()); | 411 style->setEffectiveZoom(RenderStyle::initialZoom()); |
410 | 412 |
411 // SVG text layout code expects us to be a block-level style element. | 413 // SVG text layout code expects us to be a block-level style element. |
412 if ((e->hasTagName(SVGNames::foreignObjectTag) || e->hasTagName(SVGNames
::textTag)) && style->isDisplayInlineType()) | 414 if ((isSVGForeignObjectElement(*e) || isSVGTextElement(*e)) && style->is
DisplayInlineType()) |
413 style->setDisplay(BLOCK); | 415 style->setDisplay(BLOCK); |
414 } | 416 } |
415 } | 417 } |
416 | 418 |
417 void StyleAdjuster::adjustGridItemPosition(RenderStyle* style, RenderStyle* pare
ntStyle) const | 419 void StyleAdjuster::adjustGridItemPosition(RenderStyle* style, RenderStyle* pare
ntStyle) const |
418 { | 420 { |
419 const GridPosition& columnStartPosition = style->gridColumnStart(); | 421 const GridPosition& columnStartPosition = style->gridColumnStart(); |
420 const GridPosition& columnEndPosition = style->gridColumnEnd(); | 422 const GridPosition& columnEndPosition = style->gridColumnEnd(); |
421 const GridPosition& rowStartPosition = style->gridRowStart(); | 423 const GridPosition& rowStartPosition = style->gridRowStart(); |
422 const GridPosition& rowEndPosition = style->gridRowEnd(); | 424 const GridPosition& rowEndPosition = style->gridRowEnd(); |
(...skipping 16 matching lines...) Expand all Loading... |
439 if (prop.isNamedGridArea() && !map.contains(prop.namedGridLine())) \ | 441 if (prop.isNamedGridArea() && !map.contains(prop.namedGridLine())) \ |
440 style->setGrid##Prop(GridPosition()); | 442 style->setGrid##Prop(GridPosition()); |
441 | 443 |
442 CLEAR_UNKNOWN_NAMED_AREA(columnStartPosition, ColumnStart); | 444 CLEAR_UNKNOWN_NAMED_AREA(columnStartPosition, ColumnStart); |
443 CLEAR_UNKNOWN_NAMED_AREA(columnEndPosition, ColumnEnd); | 445 CLEAR_UNKNOWN_NAMED_AREA(columnEndPosition, ColumnEnd); |
444 CLEAR_UNKNOWN_NAMED_AREA(rowStartPosition, RowStart); | 446 CLEAR_UNKNOWN_NAMED_AREA(rowStartPosition, RowStart); |
445 CLEAR_UNKNOWN_NAMED_AREA(rowEndPosition, RowEnd); | 447 CLEAR_UNKNOWN_NAMED_AREA(rowEndPosition, RowEnd); |
446 } | 448 } |
447 | 449 |
448 } | 450 } |
OLD | NEW |