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