1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/*
2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) Research In Motion Limited 2011. All rights reserved.
11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved.
12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * This library is free software; you can redistribute it and/or
14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modify it under the terms of the GNU Library General Public
15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * License as published by the Free Software Foundation; either
16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * version 2 of the License, or (at your option) any later version.
17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * This library is distributed in the hope that it will be useful,
19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Library General Public License for more details.
22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * You should have received a copy of the GNU Library General Public License
24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Boston, MA 02110-1301, USA.
27e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */
28e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "config.h"
30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/resolver/StyleAdjuster.h"
31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/SVGNames.h"
347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/dom/ContainerNode.h"
357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/dom/Document.h"
367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/dom/Element.h"
37aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "core/dom/NodeRenderStyle.h"
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLIFrameElement.h"
39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLInputElement.h"
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/html/HTMLPlugInElement.h"
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLTableCellElement.h"
42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/html/HTMLTextAreaElement.h"
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h"
459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/rendering/RenderReplaced.h"
46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/RenderTheme.h"
477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/rendering/style/GridPosition.h"
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/RenderStyle.h"
49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/RenderStyleConstants.h"
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/svg/SVGSVGElement.h"
51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/Length.h"
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/transforms/TransformOperations.h"
537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/Assertions.h"
54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochusing namespace HTMLNames;
58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic EDisplay equivalentBlockDisplay(EDisplay display, bool isFloating, bool strictParsing)
60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    switch (display) {
62e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case BLOCK:
63e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE:
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case BOX:
65e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case FLEX:
66e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case GRID:
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return display;
68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case LIST_ITEM:
70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // It is a WinIE bug that floated list items lose their bullets, so we'll emulate the quirk, but only in quirks mode.
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!strictParsing && isFloating)
72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return BLOCK;
73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return display;
74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE_TABLE:
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return TABLE;
76e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE_BOX:
77e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return BOX;
78e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE_FLEX:
79e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return FLEX;
80e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE_GRID:
81e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return GRID;
82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE:
84e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case INLINE_BLOCK:
85e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_ROW_GROUP:
86e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_HEADER_GROUP:
87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_FOOTER_GROUP:
88e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_ROW:
89e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_COLUMN_GROUP:
90e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_COLUMN:
91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_CELL:
92e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case TABLE_CAPTION:
93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return BLOCK;
94e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case NONE:
95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ASSERT_NOT_REACHED();
96e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return NONE;
97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
98e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT_NOT_REACHED();
99e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return BLOCK;
100e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
101e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
102e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// CSS requires text-decoration to be reset at each DOM element for tables,
10319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)// inline blocks, inline tables, shadow DOM crossings, floating elements,
104e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// and absolute or relatively positioned elements.
105e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic bool doesNotInheritTextDecoration(const RenderStyle* style, const Element* e)
106e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
10719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return style->display() == TABLE || style->display() == INLINE_TABLE
108e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->display() == INLINE_BLOCK || style->display() == INLINE_BOX || isAtShadowBoundary(e)
109e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->isFloating() || style->hasOutOfFlowPosition();
110e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
112e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// FIXME: This helper is only needed because pseudoStyleForElement passes a null
113e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// element to adjustRenderStyle, so we can't just use element->isInTopLayer().
114e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic bool isInTopLayer(const Element* element, const RenderStyle* style)
115e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
116e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return (element && element->isInTopLayer()) || (style && style->styleType() == BACKDROP);
117e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
118e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)static bool parentStyleForcesZIndexToCreateStackingContext(const RenderStyle* parentStyle)
1208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return parentStyle->isDisplayFlexibleOrGridBox();
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
124323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)static bool hasWillChangeThatCreatesStackingContext(const RenderStyle* style)
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < style->willChangeProperties().size(); ++i) {
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (style->willChangeProperties()[i]) {
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyOpacity:
129aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSPropertyTransform:
130d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitTransform:
13107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        case CSSPropertyTransformStyle:
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitTransformStyle:
133aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSPropertyPerspective:
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitPerspective:
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitMask:
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitMaskBoxImage:
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitClipPath:
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitBoxReflect:
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitFilter:
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyZIndex:
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyPosition:
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyMixBlendMode:
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyIsolation:
145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (RuntimeEnabledFeatures::cssCompositingEnabled())
146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return true;
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        default:
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void StyleAdjuster::adjustRenderStyle(RenderStyle* style, RenderStyle* parentStyle, Element *e, const CachedUAStyle* cachedUAStyle)
156e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
157e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    ASSERT(parentStyle);
158e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
159e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (style->display() != NONE) {
16043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (e)
16143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            adjustStyleForTagName(style, parentStyle, *e);
162e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
163e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Per the spec, position 'static' and 'relative' in the top layer compute to 'absolute'.
164e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (isInTopLayer(e, style) && (style->position() == StaticPosition || style->position() == RelativePosition))
165e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            style->setPosition(AbsolutePosition);
166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Absolute/fixed positioned elements, floating elements and the document element need block-like outside display.
1688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (style->hasOutOfFlowPosition() || style->isFloating() || (e && e->document().documentElement() == e))
169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            style->setDisplay(equivalentBlockDisplay(style->display(), style->isFloating(), !m_useQuirksModeStyles));
170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
17143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        adjustStyleForDisplay(style, parentStyle);
172e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
173e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Make sure our z-index value is only applied if the object is positioned.
1758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (style->position() == StaticPosition && !parentStyleForcesZIndexToCreateStackingContext(parentStyle))
176e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        style->setHasAutoZIndex();
177e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
178e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Auto z-index becomes 0 for the root element and transparent objects. This prevents
179e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // cases where objects that should be blended as a single unit end up with a non-transparent
180e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // object wedged in between them. Auto z-index also becomes 0 for objects that specify transforms/masks/reflections.
1818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (style->hasAutoZIndex() && ((e && e->document().documentElement() == e)
182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || style->hasOpacity()
183e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->hasTransformRelatedProperty()
184e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->hasMask()
185e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->clipPath()
186e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->boxReflect()
187e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->hasFilter()
188e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->hasBlendMode()
18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        || style->hasIsolation()
19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        || style->position() == FixedPosition
191e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || isInTopLayer(e, style)
192323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        || hasWillChangeThatCreatesStackingContext(style)))
193e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        style->setZIndex(0);
194e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // will-change:transform should result in the same rendering behavior as having a transform,
196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // including the creation of a containing block for fixed position descendants.
197aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (!style->hasTransform() && (style->willChangeProperties().contains(CSSPropertyWebkitTransform) || style->willChangeProperties().contains(CSSPropertyTransform))) {
198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool makeIdentity = true;
199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        style->setTransform(TransformOperations(makeIdentity));
200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
202e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (doesNotInheritTextDecoration(style, e))
203d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        style->clearAppliedTextDecorations();
204d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
205d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    style->applyTextDecorations();
206e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
20707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (style->overflowX() != OVISIBLE || style->overflowY() != OVISIBLE)
208323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        adjustOverflow(style);
209e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
210e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Cull out any useless layers and also repeat patterns into additional layers.
211e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    style->adjustBackgroundLayers();
212e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    style->adjustMaskLayers();
213e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
214e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // Let the theme also have a crack at adjusting the style.
215e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (style->hasAppearance())
2165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderTheme::theme().adjustStyle(style, e, cachedUAStyle);
217e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
21843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // If we have first-letter pseudo style, transitions, or animations, do not share this style.
21943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (style->hasPseudoStyle(FIRST_LETTER) || style->transitions() || style->animations())
220e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        style->setUnique();
221e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
222e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // FIXME: when dropping the -webkit prefix on transform-style, we should also have opacity < 1 cause flattening.
223e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (style->preserves3D() && (style->overflowX() != OVISIBLE
224e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->overflowY() != OVISIBLE
225e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        || style->hasFilter()))
226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        style->setTransformStyle3D(TransformStyle3DFlat);
227e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (e && e->isSVGElement()) {
229e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // Only the root <svg> element in an SVG document fragment tree honors css position
230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!(isSVGSVGElement(*e) && e->parentNode() && !e->parentNode()->isSVGElement()))
231e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            style->setPosition(RenderStyle::initialPosition());
232e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
23351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // SVG text layout code expects us to be a block-level style element.
234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if ((isSVGForeignObjectElement(*e) || isSVGTextElement(*e)) && style->isDisplayInlineType())
23551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            style->setDisplay(BLOCK);
236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
237aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
238aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (e && e->renderStyle() && e->renderStyle()->textAutosizingMultiplier() != 1) {
239aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        // Preserve the text autosizing multiplier on style recalc.
240aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        // (The autosizer will update it during layout if it needs to be changed.)
241aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        style->setTextAutosizingMultiplier(e->renderStyle()->textAutosizingMultiplier());
242aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        style->setUnique();
243aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
244c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    adjustStyleForAlignment(*style, *parentStyle);
246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void StyleAdjuster::adjustStyleForAlignment(RenderStyle& style, const RenderStyle& parentStyle)
249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool isFlexOrGrid = style.isDisplayFlexibleOrGridBox();
251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool absolutePositioned = style.position() == AbsolutePosition;
252c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // If the inherited value of justify-items includes the legacy keyword, 'auto'
254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // computes to the the inherited value.
255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Otherwise, auto computes to:
256c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    //  - 'stretch' for flex containers and grid containers.
257c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    //  - 'start' for everything else.
258c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (style.justifyItems() == ItemPositionAuto) {
259c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (parentStyle.justifyItemsPositionType() == LegacyPosition) {
260c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifyItems(parentStyle.justifyItems());
261c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifyItemsPositionType(parentStyle.justifyItemsPositionType());
262c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else if (isFlexOrGrid) {
263c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifyItems(ItemPositionStretch);
264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
265c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
266c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
267c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // The 'auto' keyword computes to 'stretch' on absolutely-positioned elements,
268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // and to the computed value of justify-items on the parent (minus
269c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // any legacy keywords) on all other boxes.
270c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (style.justifySelf() == ItemPositionAuto) {
271c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (absolutePositioned) {
272c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifySelf(ItemPositionStretch);
273c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else {
274c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifySelf(parentStyle.justifyItems());
275c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setJustifySelfOverflowAlignment(parentStyle.justifyItemsOverflowAlignment());
276c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
277c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
278c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
279c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // The 'auto' keyword computes to:
280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    //  - 'stretch' for flex containers and grid containers,
281c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    //  - 'start' for everything else.
282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (style.alignItems() == ItemPositionAuto) {
283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (isFlexOrGrid)
284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setAlignItems(ItemPositionStretch);
285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // The 'auto' keyword computes to 'stretch' on absolutely-positioned elements,
288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // and to the computed value of align-items on the parent (minus
289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // any 'legacy' keywords) on all other boxes.
290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (style.alignSelf() == ItemPositionAuto) {
291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (absolutePositioned) {
292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setAlignSelf(ItemPositionStretch);
293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else {
294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setAlignSelf(parentStyle.alignItems());
295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            style.setAlignSelfOverflowAlignment(parentStyle.alignItemsOverflowAlignment());
296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
298e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
299e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
30043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void StyleAdjuster::adjustStyleForTagName(RenderStyle* style, RenderStyle* parentStyle, Element& element)
30143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
30243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // <div> and <span> are the most common elements on the web, we skip all the work for them.
30343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLDivElement(element) || isHTMLSpanElement(element))
30443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
30543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
30643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLTableCellElement(element)) {
30743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // If we have a <td> that specifies a float property, in quirks mode we just drop the float property.
30843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // FIXME: Why is this only <td> and not <th>?
30943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (element.hasTagName(tdTag) && m_useQuirksModeStyles) {
31043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            style->setDisplay(TABLE_CELL);
31143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            style->setFloating(NoFloat);
31243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        }
31343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // FIXME: We shouldn't be overriding start/-webkit-auto like this. Do it in html.css instead.
31443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // Table headers with a text-align of -webkit-auto will change the text-align to center.
31543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (element.hasTagName(thTag) && style->textAlign() == TASTART)
31643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            style->setTextAlign(CENTER);
31743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (style->whiteSpace() == KHTML_NOWRAP) {
31843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            // Figure out if we are really nowrapping or if we should just
31943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            // use normal instead. If the width of the cell is fixed, then
32043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            // we don't actually use NOWRAP.
32143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            if (style->width().isFixed())
32243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)                style->setWhiteSpace(NORMAL);
32343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            else
32443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)                style->setWhiteSpace(NOWRAP);
32543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        }
32643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
32743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
32843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
32943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLTableElement(element)) {
33043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // Sites commonly use display:inline/block on <td>s and <table>s. In quirks mode we force
33143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // these tags to retain their display types.
33243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (m_useQuirksModeStyles)
33343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE : TABLE);
33443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // Tables never support the -webkit-* values for text-align and will reset back to the default.
33543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (style->textAlign() == WEBKIT_LEFT || style->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT)
33643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            style->setTextAlign(TASTART);
33743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
33843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
33943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
34043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLFrameElement(element) || isHTMLFrameSetElement(element)) {
34143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // Frames and framesets never honor position:relative or position:absolute. This is necessary to
34243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // fix a crash where a site tries to position these objects. They also never honor display.
34343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setPosition(StaticPosition);
34443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setDisplay(BLOCK);
34543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
34643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
34743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
34843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLRTElement(element)) {
34943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // Ruby text does not support float or position. This might change with evolution of the specification.
35043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setPosition(StaticPosition);
35143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setFloating(NoFloat);
35243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
35343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
35443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
35543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLLegendElement(element)) {
35643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setDisplay(BLOCK);
35743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
35843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
35943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
36043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLMarqueeElement(element)) {
36143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        // For now, <marquee> requires an overflow clip to work properly.
36243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setOverflowX(OHIDDEN);
36343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setOverflowY(OHIDDEN);
36443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
36543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
36643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (isHTMLTextAreaElement(element)) {
368197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // Textarea considers overflow visible as auto.
369197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->overflowX());
370197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->overflowY());
37143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
37243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
3735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
3745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (isHTMLPlugInElement(element)) {
3755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        style->setRequiresAcceleratedCompositingForExternalReasons(toHTMLPlugInElement(element).shouldAccelerate());
3769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // Plugins should get the standard replaced width/height instead of 'auto'.
3789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        // Replaced renderers get this for free, and fallback content doesn't count.
3799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (toHTMLPlugInElement(element).usePlaceholderContent()) {
3809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            if (style->width().isAuto())
3819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                style->setWidth(Length(RenderReplaced::defaultWidth, Fixed));
3829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            if (style->height().isAuto())
3839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)                style->setHeight(Length(RenderReplaced::defaultHeight, Fixed));
3849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        }
3859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
3865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
3875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
38843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
38943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
390323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleAdjuster::adjustOverflow(RenderStyle* style)
39107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
39207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(style->overflowX() != OVISIBLE || style->overflowY() != OVISIBLE);
39307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
39407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // If either overflow value is not visible, change to auto.
39507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (style->overflowX() == OVISIBLE && style->overflowY() != OVISIBLE) {
39607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // FIXME: Once we implement pagination controls, overflow-x should default to hidden
39707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // if overflow-y is set to -webkit-paged-x or -webkit-page-y. For now, we'll let it
39807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        // default to auto so we can at least scroll through the pages.
39907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        style->setOverflowX(OAUTO);
40007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    } else if (style->overflowY() == OVISIBLE && style->overflowX() != OVISIBLE) {
40107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        style->setOverflowY(OAUTO);
40207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
40307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
40407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Table rows, sections and the table itself will support overflow:hidden and will ignore scroll/auto.
40507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // FIXME: Eventually table sections will support auto and scroll.
40607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (style->display() == TABLE || style->display() == INLINE_TABLE
40707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        || style->display() == TABLE_ROW_GROUP || style->display() == TABLE_ROW) {
40807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (style->overflowX() != OVISIBLE && style->overflowX() != OHIDDEN)
40907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            style->setOverflowX(OVISIBLE);
41007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (style->overflowY() != OVISIBLE && style->overflowY() != OHIDDEN)
41107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            style->setOverflowY(OVISIBLE);
41207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
41307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
41407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Menulists should have visible overflow
41507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (style->appearance() == MenulistPart) {
41607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        style->setOverflowX(OVISIBLE);
41707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        style->setOverflowY(OVISIBLE);
41807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
41907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
42007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
42143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void StyleAdjuster::adjustStyleForDisplay(RenderStyle* style, RenderStyle* parentStyle)
42243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
42343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (style->display() == BLOCK && !style->isFloating())
42443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
42543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
42643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // FIXME: Don't support this mutation for pseudo styles like first-letter or first-line, since it's not completely
42743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // clear how that should work.
42843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (style->display() == INLINE && style->styleType() == NOPSEUDO && style->writingMode() != parentStyle->writingMode())
42943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setDisplay(INLINE_BLOCK);
43043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
43143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // After performing the display mutation, check table rows. We do not honor position: relative table rows or cells.
43243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // This has been established for position: relative in CSS2.1 (and caused a crash in containingBlock()
43343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // on some sites).
43443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if ((style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW_GROUP
43543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        || style->display() == TABLE_FOOTER_GROUP || style->display() == TABLE_ROW)
43643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        && style->position() == RelativePosition)
43743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setPosition(StaticPosition);
43843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
43943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // writing-mode does not apply to table row groups, table column groups, table rows, and table columns.
44043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // FIXME: Table cells should be allowed to be perpendicular or flipped with respect to the table, though.
44143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (style->display() == TABLE_COLUMN || style->display() == TABLE_COLUMN_GROUP || style->display() == TABLE_FOOTER_GROUP
44243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        || style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW || style->display() == TABLE_ROW_GROUP
44343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        || style->display() == TABLE_CELL)
44443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setWritingMode(parentStyle->writingMode());
44543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
44643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // FIXME: Since we don't support block-flow on flexible boxes yet, disallow setting
44743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // of block-flow to anything other than TopToBottomWritingMode.
44843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    // https://bugs.webkit.org/show_bug.cgi?id=46418 - Flexible box support.
44943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (style->writingMode() != TopToBottomWritingMode && (style->display() == BOX || style->display() == INLINE_BOX))
45043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setWritingMode(TopToBottomWritingMode);
45143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
452197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (parentStyle->isDisplayFlexibleOrGridBox()) {
45343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setFloating(NoFloat);
45443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        style->setDisplay(equivalentBlockDisplay(style->display(), style->isFloating(), !m_useQuirksModeStyles));
45543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
45643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
45743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
458e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
459