15267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)/*
25267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) Research In Motion Limited 2011. All rights reserved.
125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * modification, are permitted provided that the following conditions are
145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * met:
155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * in the documentation and/or other materials provided with the
215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * distribution.
225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * this software without specific prior written permission.
255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) *
265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) */
385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "config.h"
405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h"
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/StyleBuilderFunctions.h"
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/StylePropertyShorthand.h"
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/BasicShapeFunctions.h"
46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSAspectRatioValue.h"
47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSCursorImageValue.h"
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/css/CSSFontValue.h"
497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/css/CSSGradientValue.h"
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/CSSGridTemplateAreasValue.h"
51a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/css/CSSHelper.h"
52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSImageSetValue.h"
53e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSLineBoxContainValue.h"
54e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/CSSPrimitiveValueMappings.h"
55e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/css/CSSPropertyMetadata.h"
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/Counter.h"
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/Pair.h"
58f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/css/StylePropertySet.h"
591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/css/StyleRule.h"
60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/resolver/ElementStyleResources.h"
61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/resolver/FilterOperationResolver.h"
627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/css/resolver/FontBuilder.h"
633c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/css/resolver/StyleBuilder.h"
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/css/resolver/TransformBuilder.h"
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h"
67e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/CounterContent.h"
68e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/QuotesData.h"
69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/RenderStyle.h"
70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/RenderStyleConstants.h"
71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/SVGRenderStyle.h"
72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/rendering/style/StyleGeneratedImage.h"
73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontDescription.h"
74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/MathExtras.h"
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/StdLibExtras.h"
76e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h"
77e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
80d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)namespace {
81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static inline bool isValidVisitedLinkProperty(CSSPropertyID id)
83d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
84d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    switch (id) {
85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBackgroundColor:
86d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderLeftColor:
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderRightColor:
88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderTopColor:
89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyBorderBottomColor:
90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyColor:
91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyFill:
92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyOutlineColor:
93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyStroke:
94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyTextDecorationColor:
95d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWebkitColumnRuleColor:
96d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWebkitTextEmphasisColor:
97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWebkitTextFillColor:
98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    case CSSPropertyWebkitTextStrokeColor:
99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return true;
100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    default:
101d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return false;
102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} // namespace
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
107d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilder::applyProperty(CSSPropertyID id, StyleResolverState& state, CSSValue* value)
108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT_WITH_MESSAGE(!isExpandedShorthand(id), "Shorthand property id = %d wasn't expanded at parsing time", id);
110d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool isInherit = state.parentNode() && value->isInheritedValue();
112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool isInitial = value->isInitialValue() || (!state.parentNode() && value->isInheritedValue());
113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
114d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT(!isInherit || !isInitial); // isInherit -> !isInitial && isInitial -> !isInherit
115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT(!isInherit || (state.parentNode() && state.parentStyle())); // isInherit -> (state.parentNode() && state.parentStyle())
116d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!state.applyPropertyToRegularStyle() && (!state.applyPropertyToVisitedLinkStyle() || !isValidVisitedLinkProperty(id))) {
118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Limit the properties that can be applied to only the ones honored by :visited.
119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
122e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (isInherit && !state.parentStyle()->hasExplicitlyInheritedProperties() && !CSSPropertyMetadata::isInheritedProperty(id))
123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.parentStyle()->setHasExplicitlyInheritedProperties();
124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
125d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    StyleBuilder::applyProperty(id, state, value, isInitial, isInherit);
126d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyColor(StyleResolverState& state)
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
13009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color color = RenderStyle::initialColor();
13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToRegularStyle())
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        state.style()->setColor(color);
13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToVisitedLinkStyle())
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        state.style()->setVisitedLinkColor(color);
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyColor(StyleResolverState& state)
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color color = state.parentStyle()->color();
14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToRegularStyle())
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        state.style()->setColor(color);
14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToVisitedLinkStyle())
14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        state.style()->setVisitedLinkColor(color);
14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
14609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyColor(StyleResolverState& state, CSSValue* value)
14709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
14809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
14909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // As per the spec, 'color: currentColor' is treated as 'color: inherit'
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (primitiveValue->getValueID() == CSSValueCurrentcolor) {
15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        applyInheritCSSPropertyColor(state);
15209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
15309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
15509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToRegularStyle())
156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        state.style()->setColor(StyleBuilderConverter::convertColor(state, value));
15709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (state.applyPropertyToVisitedLinkStyle())
158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        state.style()->setVisitedLinkColor(StyleBuilderConverter::convertColor(state, value, true));
15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid StyleBuilderFunctions::applyInitialCSSPropertyJustifyItems(StyleResolverState& state)
162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItems(RenderStyle::initialJustifyItems());
164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItemsOverflowAlignment(RenderStyle::initialJustifyItemsOverflowAlignment());
165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItemsPositionType(RenderStyle::initialJustifyItemsPositionType());
166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
168197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid StyleBuilderFunctions::applyInheritCSSPropertyJustifyItems(StyleResolverState& state)
169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItems(state.parentStyle()->justifyItems());
171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItemsOverflowAlignment(state.parentStyle()->justifyItemsOverflowAlignment());
172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setJustifyItemsPositionType(state.parentStyle()->justifyItemsPositionType());
173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
174197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
175197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid StyleBuilderFunctions::applyValueCSSPropertyJustifyItems(StyleResolverState& state, CSSValue* value)
176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
178197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (Pair* pairValue = primitiveValue->getPairValue()) {
180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (pairValue->first()->getValueID() == CSSValueLegacy) {
181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            state.style()->setJustifyItemsPositionType(LegacyPosition);
182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            state.style()->setJustifyItems(*pairValue->second());
183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else {
184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            state.style()->setJustifyItems(*pairValue->first());
185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            state.style()->setJustifyItemsOverflowAlignment(*pairValue->second());
186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else {
188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        state.style()->setJustifyItems(*primitiveValue);
189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
190197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
192f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyCursor(StyleResolverState& state)
193e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
194e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->clearCursorList();
195e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setCursor(RenderStyle::initialCursor());
196e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
197e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
198f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyCursor(StyleResolverState& state)
199e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
200e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setCursor(state.parentStyle()->cursor());
201e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setCursorList(state.parentStyle()->cursors());
202e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
203e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
204f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyCursor(StyleResolverState& state, CSSValue* value)
205e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
206e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->clearCursorList();
207e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (value->isValueList()) {
208e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSValueList* list = toCSSValueList(value);
209e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        int len = list->length();
210e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setCursor(CURSOR_AUTO);
211e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        for (int i = 0; i < len; i++) {
212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            CSSValue* item = list->item(i);
213e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (item->isCursorImageValue()) {
2141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                CSSCursorImageValue* image = toCSSCursorImageValue(item);
215e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                if (image->updateIfSVGCursorIsUsed(state.element())) // Elements with SVG cursors are not allowed to share style.
216e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                    state.style()->setUnique();
217e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                state.style()->addCursor(state.styleImage(CSSPropertyCursor, image), image->hotSpot());
218d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            } else {
219d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setCursor(*toCSSPrimitiveValue(item));
220e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            }
221e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
222d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else {
223d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setCursor(*toCSSPrimitiveValue(value));
224e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
225e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
226e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
227f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyDirection(StyleResolverState& state, CSSValue* value)
228e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
229e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setDirection(*toCSSPrimitiveValue(value));
230e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Element* element = state.element();
2318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (element && element == element->document().documentElement())
2328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        element->document().setDirectionSetOnDocumentElement(true);
233e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
234e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
235f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyFontFamily(StyleResolverState& state)
236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.fontBuilder().setFontFamilyInitial();
238e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
239e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
240f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyFontFamily(StyleResolverState& state)
241e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
2420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    state.fontBuilder().setFontFamilyInherit(state.parentFontDescription());
243e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
244e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
245f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyFontFamily(StyleResolverState& state, CSSValue* value)
246e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.fontBuilder().setFontFamilyValue(value);
248e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
249e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
250323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyGlyphOrientationVertical(StyleResolverState& state, CSSValue* value)
251323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
252323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (value->isPrimitiveValue() && toCSSPrimitiveValue(value)->getValueID() == CSSValueAuto)
253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        state.style()->accessSVGStyle().setGlyphOrientationVertical(GO_AUTO);
254323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    else
255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        state.style()->accessSVGStyle().setGlyphOrientationVertical(StyleBuilderConverter::convertGlyphOrientation(state, value));
256323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
257323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
258323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyGridTemplateAreas(StyleResolverState& state)
259323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
260323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridArea(RenderStyle::initialNamedGridArea());
261323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaRowCount(RenderStyle::initialNamedGridAreaCount());
262323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaColumnCount(RenderStyle::initialNamedGridAreaCount());
263323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
264323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
265323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyGridTemplateAreas(StyleResolverState& state)
266323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
267323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridArea(state.parentStyle()->namedGridArea());
268323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaRowCount(state.parentStyle()->namedGridAreaRowCount());
269323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaColumnCount(state.parentStyle()->namedGridAreaColumnCount());
270323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
271323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
272323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyGridTemplateAreas(StyleResolverState& state, CSSValue* value)
273323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
274323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (value->isPrimitiveValue()) {
275323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        // FIXME: Shouldn't we clear the grid-area values
276323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        ASSERT(toCSSPrimitiveValue(value)->getValueID() == CSSValueNone);
277323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return;
278323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
279323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
280323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    CSSGridTemplateAreasValue* gridTemplateAreasValue = toCSSGridTemplateAreasValue(value);
281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const NamedGridAreaMap& newNamedGridAreas = gridTemplateAreasValue->gridAreaMap();
282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    NamedGridLinesMap namedGridColumnLines = state.style()->namedGridColumnLines();
284d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    NamedGridLinesMap namedGridRowLines = state.style()->namedGridRowLines();
285d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea(newNamedGridAreas, namedGridColumnLines, ForColumns);
286d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    StyleBuilderConverter::createImplicitNamedGridLinesFromGridArea(newNamedGridAreas, namedGridRowLines, ForRows);
287d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setNamedGridColumnLines(namedGridColumnLines);
288d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setNamedGridRowLines(namedGridRowLines);
289d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
290d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setNamedGridArea(newNamedGridAreas);
291323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaRowCount(gridTemplateAreasValue->rowCount());
292323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setNamedGridAreaColumnCount(gridTemplateAreasValue->columnCount());
293323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
294323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
295f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyLineHeight(StyleResolverState& state, CSSValue* value)
296e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
297e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
298e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Length lineHeight;
299e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
300e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (primitiveValue->getValueID() == CSSValueNormal) {
301e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        lineHeight = RenderStyle::initialLineHeight();
302e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else if (primitiveValue->isLength()) {
303a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        float multiplier = state.style()->effectiveZoom();
304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (LocalFrame* frame = state.document().frame())
305e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            multiplier *= frame->textZoomFactor();
306a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        lineHeight = primitiveValue->computeLength<Length>(state.cssToLengthConversionData().copyWithAdjustedZoom(multiplier));
307e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else if (primitiveValue->isPercentage()) {
3081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        lineHeight = Length((state.style()->computedFontSize() * primitiveValue->getIntValue()) / 100.0, Fixed);
309e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else if (primitiveValue->isNumber()) {
310e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        lineHeight = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
31119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    } else if (primitiveValue->isCalculated()) {
31219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        double multiplier = state.style()->effectiveZoom();
313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (LocalFrame* frame = state.document().frame())
31419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            multiplier *= frame->textZoomFactor();
315a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        Length zoomedLength = Length(primitiveValue->cssCalcValue()->toCalcValue(state.cssToLengthConversionData().copyWithAdjustedZoom(multiplier)));
31619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        lineHeight = Length(valueForLength(zoomedLength, state.style()->fontSize()), Fixed);
317e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else {
318e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
319e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
320e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setLineHeight(lineHeight);
321e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
322e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
323f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyListStyleImage(StyleResolverState& state, CSSValue* value)
324e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
325e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setListStyleImage(state.styleImage(CSSPropertyListStyleImage, value));
326e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
327e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
328f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyOutlineStyle(StyleResolverState& state)
329e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
330e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyleIsAuto(RenderStyle::initialOutlineStyleIsAuto());
331e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyle(RenderStyle::initialBorderStyle());
332e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
333e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
334f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyOutlineStyle(StyleResolverState& state)
335e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
336e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyleIsAuto(state.parentStyle()->outlineStyleIsAuto());
337e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyle(state.parentStyle()->outlineStyle());
338e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
339e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
340f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyOutlineStyle(StyleResolverState& state, CSSValue* value)
341e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
342e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
343e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyleIsAuto(*primitiveValue);
344e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setOutlineStyle(*primitiveValue);
345e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
346e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
347f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyResize(StyleResolverState& state, CSSValue* value)
348e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
349e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
350e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
351e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    EResize r = RESIZE_NONE;
352d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (primitiveValue->getValueID() == CSSValueAuto) {
3538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (Settings* settings = state.document().settings())
354e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            r = settings->textAreasAreResizable() ? RESIZE_BOTH : RESIZE_NONE;
355d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else {
356e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        r = *primitiveValue;
357e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
358e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setResize(r);
359e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
360e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
361a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static Length mmLength(double mm) { return Length(mm * cssPixelsPerMillimeter, Fixed); }
362a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static Length inchLength(double inch) { return Length(inch * cssPixelsPerInch, Fixed); }
363e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic bool getPageSizeFromName(CSSPrimitiveValue* pageSizeName, CSSPrimitiveValue* pageOrientation, Length& width, Length& height)
364e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
365e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a5Width, (mmLength(148)));
366e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a5Height, (mmLength(210)));
367e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a4Width, (mmLength(210)));
368e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a4Height, (mmLength(297)));
369e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a3Width, (mmLength(297)));
370e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, a3Height, (mmLength(420)));
371e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, b5Width, (mmLength(176)));
372e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, b5Height, (mmLength(250)));
373e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, b4Width, (mmLength(250)));
374e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, b4Height, (mmLength(353)));
375e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, letterWidth, (inchLength(8.5)));
376e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, letterHeight, (inchLength(11)));
377e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, legalWidth, (inchLength(8.5)));
378e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, legalHeight, (inchLength(14)));
379e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, ledgerWidth, (inchLength(11)));
380e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DEFINE_STATIC_LOCAL(Length, ledgerHeight, (inchLength(17)));
381e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
382e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!pageSizeName)
383e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return false;
384e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
385e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    switch (pageSizeName->getValueID()) {
386e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueA5:
387e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = a5Width;
388e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = a5Height;
389e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
390e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueA4:
391e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = a4Width;
392e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = a4Height;
393e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
394e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueA3:
395e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = a3Width;
396e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = a3Height;
397e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
398e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueB5:
399e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = b5Width;
400e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = b5Height;
401e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
402e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueB4:
403e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = b4Width;
404e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = b4Height;
405e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
406e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueLetter:
407e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = letterWidth;
408e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = letterHeight;
409e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
410e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueLegal:
411e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = legalWidth;
412e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = legalHeight;
413e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
414e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case CSSValueLedger:
415e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        width = ledgerWidth;
416e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        height = ledgerHeight;
417e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
418e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    default:
419e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return false;
420e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
421e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
422e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (pageOrientation) {
423e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        switch (pageOrientation->getValueID()) {
424e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        case CSSValueLandscape:
425e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            std::swap(width, height);
426e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            break;
427e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        case CSSValuePortrait:
428e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // Nothing to do.
429e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            break;
430e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        default:
431e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return false;
432e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
433e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
434e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return true;
435e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
436e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
437f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertySize(StyleResolverState&) { }
438f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertySize(StyleResolverState&) { }
439f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertySize(StyleResolverState& state, CSSValue* value)
440e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
441e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->resetPageSizeType();
442e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Length width;
443e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Length height;
444e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    PageSizeType pageSizeType = PAGE_SIZE_AUTO;
445e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSValueListInspector inspector(value);
446e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    switch (inspector.length()) {
447e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case 2: {
448e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // <length>{2} | <page-size> <orientation>
449e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!inspector.first()->isPrimitiveValue() || !inspector.second()->isPrimitiveValue())
450e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return;
451e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue* first = toCSSPrimitiveValue(inspector.first());
452e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue* second = toCSSPrimitiveValue(inspector.second());
453e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (first->isLength()) {
454e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // <length>{2}
455e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (!second->isLength())
456e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                return;
457a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            width = first->computeLength<Length>(state.cssToLengthConversionData().copyWithAdjustedZoom(1.0));
458a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            height = second->computeLength<Length>(state.cssToLengthConversionData().copyWithAdjustedZoom(1.0));
459e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else {
460e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // <page-size> <orientation>
46109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // The value order is guaranteed. See BisonCSSParser::parseSizeParameter.
462e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (!getPageSizeFromName(first, second, width, height))
463e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                return;
464e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
465e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        pageSizeType = PAGE_SIZE_RESOLVED;
466e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
467e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
468e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    case 1: {
469e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        // <length> | auto | <page-size> | [ portrait | landscape]
470e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!inspector.first()->isPrimitiveValue())
471e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return;
472e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(inspector.first());
473e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (primitiveValue->isLength()) {
474e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // <length>
475e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            pageSizeType = PAGE_SIZE_RESOLVED;
476a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            width = height = primitiveValue->computeLength<Length>(state.cssToLengthConversionData().copyWithAdjustedZoom(1.0));
477e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else {
478e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            switch (primitiveValue->getValueID()) {
479e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            case 0:
480e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                return;
481e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            case CSSValueAuto:
482e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                pageSizeType = PAGE_SIZE_AUTO;
483e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                break;
484e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            case CSSValuePortrait:
485e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                pageSizeType = PAGE_SIZE_AUTO_PORTRAIT;
486e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                break;
487e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            case CSSValueLandscape:
488e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                pageSizeType = PAGE_SIZE_AUTO_LANDSCAPE;
489e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                break;
490e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            default:
491e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                // <page-size>
492e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                pageSizeType = PAGE_SIZE_RESOLVED;
493e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                if (!getPageSizeFromName(primitiveValue, 0, width, height))
494e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                    return;
495e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            }
496e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
497e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        break;
498e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
499e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    default:
500e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
501e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
502e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setPageSizeType(pageSizeType);
503e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setPageSize(LengthSize(width, height));
504e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
505e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
506f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyTextAlign(StyleResolverState& state, CSSValue* value)
507e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
508e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!value->isPrimitiveValue())
509e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
510e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
511e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
512f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // FIXME : Per http://www.w3.org/TR/css3-text/#text-align0 can now take <string> but this is not implemented in the
513f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    // rendering code.
514f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (primitiveValue->isString())
515f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return;
516e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
517f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (primitiveValue->isValueID() && primitiveValue->getValueID() != CSSValueWebkitMatchParent)
518e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextAlign(*primitiveValue);
519e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else if (state.parentStyle()->textAlign() == TASTART)
520e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextAlign(state.parentStyle()->isLeftToRightDirection() ? LEFT : RIGHT);
521e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else if (state.parentStyle()->textAlign() == TAEND)
522e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextAlign(state.parentStyle()->isLeftToRightDirection() ? RIGHT : LEFT);
523e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    else
524e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextAlign(state.parentStyle()->textAlign());
525e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
526e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
527f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyTextIndent(StyleResolverState& state)
528e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
529e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextIndent(state.parentStyle()->textIndent());
530e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextIndentLine(state.parentStyle()->textIndentLine());
53110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    state.style()->setTextIndentType(state.parentStyle()->textIndentType());
532e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
533e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
534f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyTextIndent(StyleResolverState& state)
535e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
536e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextIndent(RenderStyle::initialTextIndent());
537e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextIndentLine(RenderStyle::initialTextIndentLine());
53810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    state.style()->setTextIndentType(RenderStyle::initialTextIndentType());
539e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
540e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
541f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyTextIndent(StyleResolverState& state, CSSValue* value)
542e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
543e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!value->isValueList())
544e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
545e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
54610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    Length lengthOrPercentageValue;
54710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TextIndentLine textIndentLineValue = RenderStyle::initialTextIndentLine();
54810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TextIndentType textIndentTypeValue = RenderStyle::initialTextIndentType();
549e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
55010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    for (CSSValueListIterator i(value); i.hasMore(); i.advance()) {
55110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(i.value());
55210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (!primitiveValue->getValueID())
55310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            lengthOrPercentageValue = primitiveValue->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData());
55410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        else if (primitiveValue->getValueID() == CSSValueEachLine)
55510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            textIndentLineValue = TextIndentEachLine;
55610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        else if (primitiveValue->getValueID() == CSSValueHanging)
55710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            textIndentTypeValue = TextIndentHanging;
55810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        else
55910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            ASSERT_NOT_REACHED();
56010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
561e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
56210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    state.style()->setTextIndent(lengthOrPercentageValue);
56310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    state.style()->setTextIndentLine(textIndentLineValue);
56410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    state.style()->setTextIndentType(textIndentTypeValue);
565e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
566e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
567323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyTransform(StyleResolverState& state, CSSValue* value)
568323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
569323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TransformOperations operations;
570323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    TransformBuilder::createTransformOperations(value, state.cssToLengthConversionData(), operations);
571323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    state.style()->setTransform(operations);
572323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
573323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
574aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyInitialCSSPropertyTransformOrigin(StyleResolverState& state)
575aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
576aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInitialCSSPropertyWebkitTransformOriginX(state);
577aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInitialCSSPropertyWebkitTransformOriginY(state);
578aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInitialCSSPropertyWebkitTransformOriginZ(state);
579aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
580aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
581aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyInheritCSSPropertyTransformOrigin(StyleResolverState& state)
582aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
583aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInheritCSSPropertyWebkitTransformOriginX(state);
584aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInheritCSSPropertyWebkitTransformOriginY(state);
585aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInheritCSSPropertyWebkitTransformOriginZ(state);
586aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
587aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
588aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyValueCSSPropertyTransformOrigin(StyleResolverState& state, CSSValue* value)
589aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
590aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    CSSValueList* list = toCSSValueList(value);
591aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    ASSERT(list->length() == 3);
592aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(list->item(0));
593aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (primitiveValue->isValueID()) {
594aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        switch (primitiveValue->getValueID()) {
595aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueLeft:
596aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginX(Length(0, Percent));
597aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
598aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueRight:
599aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginX(Length(100, Percent));
600aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
601aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueCenter:
602aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginX(Length(50, Percent));
603aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
604aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        default:
605aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            ASSERT_NOT_REACHED();
606aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
607aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    } else {
608aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        state.style()->setTransformOriginX(StyleBuilderConverter::convertLength(state, primitiveValue));
609aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
610aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
611aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    primitiveValue = toCSSPrimitiveValue(list->item(1));
612aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (primitiveValue->isValueID()) {
613aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        switch (primitiveValue->getValueID()) {
614aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueTop:
615aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginY(Length(0, Percent));
616aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
617aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueBottom:
618aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginY(Length(100, Percent));
619aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
620aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueCenter:
621aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setTransformOriginY(Length(50, Percent));
622aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
623aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        default:
624aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            ASSERT_NOT_REACHED();
625aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
626aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    } else {
627aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        state.style()->setTransformOriginY(StyleBuilderConverter::convertLength(state, primitiveValue));
628aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
629aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
630aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    primitiveValue = toCSSPrimitiveValue(list->item(2));
631aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    state.style()->setTransformOriginZ(StyleBuilderConverter::convertComputedLength<float>(state, primitiveValue));
632aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
633aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
634aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyInitialCSSPropertyPerspectiveOrigin(StyleResolverState& state)
635aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
636aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInitialCSSPropertyWebkitPerspectiveOriginX(state);
637aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInitialCSSPropertyWebkitPerspectiveOriginY(state);
638aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
639aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
640aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyInheritCSSPropertyPerspectiveOrigin(StyleResolverState& state)
641aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
642aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInheritCSSPropertyWebkitPerspectiveOriginX(state);
643aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    applyInheritCSSPropertyWebkitPerspectiveOriginY(state);
644aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
645aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
646aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid StyleBuilderFunctions::applyValueCSSPropertyPerspectiveOrigin(StyleResolverState& state, CSSValue* value)
647aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
648aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    CSSValueList* list = toCSSValueList(value);
649aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    ASSERT(list->length() == 2);
650aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(list->item(0));
651aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (primitiveValue->isValueID()) {
652aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        switch (primitiveValue->getValueID()) {
653aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueLeft:
654aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginX(Length(0, Percent));
655aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
656aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueRight:
657aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginX(Length(100, Percent));
658aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
659aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueCenter:
660aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginX(Length(50, Percent));
661aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
662aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        default:
663aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            ASSERT_NOT_REACHED();
664aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
665aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    } else {
666aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        state.style()->setPerspectiveOriginX(StyleBuilderConverter::convertLength(state, primitiveValue));
667aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
668aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
669aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    primitiveValue = toCSSPrimitiveValue(list->item(1));
670aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (primitiveValue->isValueID()) {
671aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        switch (primitiveValue->getValueID()) {
672aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueTop:
673aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginY(Length(0, Percent));
674aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
675aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueBottom:
676aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginY(Length(100, Percent));
677aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
678aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSValueCenter:
679aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            state.style()->setPerspectiveOriginY(Length(50, Percent));
680aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            break;
681aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        default:
682aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            ASSERT_NOT_REACHED();
683aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        }
684aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    } else {
685aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        state.style()->setPerspectiveOriginY(StyleBuilderConverter::convertLength(state, primitiveValue));
686aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    }
687aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
688aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
689d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyVerticalAlign(StyleResolverState& state)
690d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
691d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EVerticalAlign verticalAlign = state.parentStyle()->verticalAlign();
692d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setVerticalAlign(verticalAlign);
693d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (verticalAlign == LENGTH)
694d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setVerticalAlignLength(state.parentStyle()->verticalAlignLength());
695d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
696d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
697f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyVerticalAlign(StyleResolverState& state, CSSValue* value)
698e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
699e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!value->isPrimitiveValue())
700e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
701e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
702e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
703e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
704d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (primitiveValue->getValueID()) {
705d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setVerticalAlign(*primitiveValue);
706d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
707d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
708e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
709a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.style()->setVerticalAlignLength(primitiveValue->convertToLength<FixedConversion | PercentConversion>(state.cssToLengthConversionData()));
710e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
711e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
712e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochstatic void resetEffectiveZoom(StyleResolverState& state)
7135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
7145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    // Reset the zoom in effect. This allows the setZoom method to accurately compute a new zoom in effect.
715e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.setEffectiveZoom(state.parentStyle() ? state.parentStyle()->effectiveZoom() : RenderStyle::initialZoom());
7165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
7175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
718f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyZoom(StyleResolverState& state)
7195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
720e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    resetEffectiveZoom(state);
721e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.setZoom(RenderStyle::initialZoom());
7225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
7235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
724f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyZoom(StyleResolverState& state)
7255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
726e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    resetEffectiveZoom(state);
727e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.setZoom(state.parentStyle()->zoom());
7285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
7295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
730f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyZoom(StyleResolverState& state, CSSValue* value)
7315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
7325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(value->isPrimitiveValue());
7335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
7345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
7355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (primitiveValue->getValueID() == CSSValueNormal) {
736e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        resetEffectiveZoom(state);
737e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.setZoom(RenderStyle::initialZoom());
7385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    } else if (primitiveValue->getValueID() == CSSValueReset) {
739e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.setEffectiveZoom(RenderStyle::initialZoom());
740e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.setZoom(RenderStyle::initialZoom());
7415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    } else if (primitiveValue->getValueID() == CSSValueDocument) {
742e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        float docZoom = state.rootElementStyle() ? state.rootElementStyle()->zoom() : RenderStyle::initialZoom();
743e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.setEffectiveZoom(docZoom);
744e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.setZoom(docZoom);
7455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    } else if (primitiveValue->isPercentage()) {
746e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        resetEffectiveZoom(state);
7475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (float percent = primitiveValue->getFloatValue())
748e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            state.setZoom(percent / 100.0f);
7495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    } else if (primitiveValue->isNumber()) {
750e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        resetEffectiveZoom(state);
7515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (float number = primitiveValue->getFloatValue())
752e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            state.setZoom(number);
753e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
754e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
755e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
756f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyWebkitAspectRatio(StyleResolverState& state)
757e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
758e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setHasAspectRatio(RenderStyle::initialHasAspectRatio());
759e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioDenominator(RenderStyle::initialAspectRatioDenominator());
760e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioNumerator(RenderStyle::initialAspectRatioNumerator());
761e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
762e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
763f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyWebkitAspectRatio(StyleResolverState& state)
764e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
765e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!state.parentStyle()->hasAspectRatio())
766e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
767e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setHasAspectRatio(true);
768e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioDenominator(state.parentStyle()->aspectRatioDenominator());
769e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioNumerator(state.parentStyle()->aspectRatioNumerator());
770e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
771e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
772f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitAspectRatio(StyleResolverState& state, CSSValue* value)
773e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
774e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!value->isAspectRatioValue()) {
775e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setHasAspectRatio(false);
776e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
777e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
77806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    CSSAspectRatioValue* aspectRatioValue = toCSSAspectRatioValue(value);
779e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setHasAspectRatio(true);
780e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioDenominator(aspectRatioValue->denominatorValue());
781e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setAspectRatioNumerator(aspectRatioValue->numeratorValue());
782e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
783e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
784a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitBorderImage(StyleResolverState& state, CSSValue* value)
785a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
786a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    NinePieceImage image;
787a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.styleMap().mapNinePieceImage(state.style(), CSSPropertyWebkitBorderImage, value, image);
788a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.style()->setBorderImage(image);
789a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
790a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
791f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitClipPath(StyleResolverState& state, CSSValue* value)
792e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
793e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (value->isPrimitiveValue()) {
794e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
795e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (primitiveValue->getValueID() == CSSValueNone) {
796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            state.style()->setClipPath(nullptr);
797e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else if (primitiveValue->isShape()) {
798e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            state.style()->setClipPath(ShapeClipPathOperation::create(basicShapeForValue(state, primitiveValue->getShapeValue())));
799e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_URI) {
800e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            String cssURLValue = primitiveValue->getStringValue();
8018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            KURL url = state.document().completeURL(cssURLValue);
802e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            // FIXME: It doesn't work with forward or external SVG references (see https://bugs.webkit.org/show_bug.cgi?id=90405)
80309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            state.style()->setClipPath(ReferenceClipPathOperation::create(cssURLValue, AtomicString(url.fragmentIdentifier())));
804e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
805e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
806e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
807e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
808323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitFilter(StyleResolverState& state, CSSValue* value)
809323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
810323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    FilterOperations operations;
811323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (FilterOperationResolver::createFilterOperations(value, state.cssToLengthConversionData(), operations, state))
812323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        state.style()->setFilter(operations);
813323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
814323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
815f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyWebkitTextEmphasisStyle(StyleResolverState& state)
816e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
817e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisFill(RenderStyle::initialTextEmphasisFill());
818e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisMark(RenderStyle::initialTextEmphasisMark());
819e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisCustomMark(RenderStyle::initialTextEmphasisCustomMark());
820e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
821e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
822f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyWebkitTextEmphasisStyle(StyleResolverState& state)
823e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
824e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisFill(state.parentStyle()->textEmphasisFill());
825e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisMark(state.parentStyle()->textEmphasisMark());
826e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisCustomMark(state.parentStyle()->textEmphasisCustomMark());
827e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
828e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
829f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitTextEmphasisStyle(StyleResolverState& state, CSSValue* value)
830e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
831e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (value->isValueList()) {
832e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        CSSValueList* list = toCSSValueList(value);
833e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ASSERT(list->length() == 2);
834e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (list->length() != 2)
835e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            return;
836e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        for (unsigned i = 0; i < 2; ++i) {
837197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            CSSValue* item = list->item(i);
838e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (!item->isPrimitiveValue())
839e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                continue;
840e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
841e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            CSSPrimitiveValue* value = toCSSPrimitiveValue(item);
842e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            if (value->getValueID() == CSSValueFilled || value->getValueID() == CSSValueOpen)
843e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                state.style()->setTextEmphasisFill(*value);
844e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            else
845e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                state.style()->setTextEmphasisMark(*value);
846e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
847e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisCustomMark(nullAtom);
848e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
849e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
850e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
851e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!value->isPrimitiveValue())
852e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
853e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
854e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
855e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (primitiveValue->isString()) {
856e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisFill(TextEmphasisFillFilled);
857e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisMark(TextEmphasisMarkCustom);
858a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        state.style()->setTextEmphasisCustomMark(AtomicString(primitiveValue->getStringValue()));
859e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
860e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
861e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
862e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    state.style()->setTextEmphasisCustomMark(nullAtom);
863e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
864e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (primitiveValue->getValueID() == CSSValueFilled || primitiveValue->getValueID() == CSSValueOpen) {
865e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisFill(*primitiveValue);
866e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisMark(TextEmphasisMarkAuto);
867e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    } else {
868e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisFill(TextEmphasisFillFilled);
869e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        state.style()->setTextEmphasisMark(*primitiveValue);
870e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
871e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
872e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyWillChange(StyleResolverState& state)
874d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
875d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeContents(false);
876d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeScrollPosition(false);
877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeProperties(Vector<CSSPropertyID>());
878f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    state.style()->setSubtreeWillChangeContents(state.parentStyle()->subtreeWillChangeContents());
879d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
880d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyWillChange(StyleResolverState& state)
882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
883d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeContents(state.parentStyle()->willChangeContents());
884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeScrollPosition(state.parentStyle()->willChangeScrollPosition());
885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeProperties(state.parentStyle()->willChangeProperties());
886f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    state.style()->setSubtreeWillChangeContents(state.parentStyle()->subtreeWillChangeContents());
887d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
888d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
889d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWillChange(StyleResolverState& state, CSSValue* value)
890d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
891d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(value->isValueList());
892d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool willChangeContents = false;
893d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool willChangeScrollPosition = false;
894d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Vector<CSSPropertyID> willChangeProperties;
895d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
896d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (CSSValueListIterator i(value); i.hasMore(); i.advance()) {
897d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(i.value());
898d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (CSSPropertyID propertyID = primitiveValue->getPropertyID())
899d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            willChangeProperties.append(propertyID);
900d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else if (primitiveValue->getValueID() == CSSValueContents)
901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            willChangeContents = true;
902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else if (primitiveValue->getValueID() == CSSValueScrollPosition)
903d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            willChangeScrollPosition = true;
904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else
905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            ASSERT_NOT_REACHED();
906d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
907d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeContents(willChangeContents);
908d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeScrollPosition(willChangeScrollPosition);
909d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.style()->setWillChangeProperties(willChangeProperties);
910f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    state.style()->setSubtreeWillChangeContents(willChangeContents || state.parentStyle()->subtreeWillChangeContents());
911d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
912d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
913d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyContent(StyleResolverState& state)
914e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
915d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->clearContent();
916e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
917e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
918d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyContent(StyleResolverState&)
919f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
920d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // FIXME: In CSS3, it will be possible to inherit content. In CSS2 it is not. This
921d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // note is a reminder that eventually "inherit" needs to be supported.
922f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
923f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
924d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyContent(StyleResolverState& state, CSSValue* value)
925f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
926d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // list of string, uri, counter, attr, i
927f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
928d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!value->isValueList())
929f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return;
930f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
931d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool didSet = false;
932d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (CSSValueListIterator i = value; i.hasMore(); i.advance()) {
933d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        CSSValue* item = i.value();
934d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (item->isImageGeneratorValue()) {
935d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (item->isGradientValue())
936d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(StyleGeneratedImage::create(toCSSGradientValue(item)->gradientWithStylesResolved(state.document().textLinkColors(), state.style()->color()).get()), didSet);
937d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            else
938d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(StyleGeneratedImage::create(toCSSImageGeneratorValue(item)), didSet);
939d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
940d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        } else if (item->isImageSetValue()) {
941d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.style()->setContent(state.elementStyleResources().setOrPendingFromValue(CSSPropertyContent, toCSSImageSetValue(item)), didSet);
942d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
943d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
9448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
945d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (item->isImageValue()) {
946d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.style()->setContent(state.elementStyleResources().cachedOrPendingFromValue(state.document(), CSSPropertyContent, toCSSImageValue(item)), didSet);
947d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
948d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            continue;
949d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
950f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
951d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (!item->isPrimitiveValue())
952d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            continue;
953f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
954d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        CSSPrimitiveValue* contentValue = toCSSPrimitiveValue(item);
955f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
956d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (contentValue->isString()) {
957d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.style()->setContent(contentValue->getStringValue().impl(), didSet);
958d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
959d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        } else if (contentValue->isAttr()) {
960d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            // FIXME: Can a namespace be specified for an attr(foo)?
961d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (state.style()->styleType() == NOPSEUDO)
962d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setUnique();
963d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            else
964d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.parentStyle()->setUnique();
965d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            QualifiedName attr(nullAtom, AtomicString(contentValue->getStringValue()), nullAtom);
966d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            const AtomicString& value = state.element()->getAttribute(attr);
967d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.style()->setContent(value.isNull() ? emptyString() : value.string(), didSet);
968d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
969d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            // register the fact that the attribute value affects the style
970d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.contentAttrValues().append(attr.localName());
971d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        } else if (contentValue->isCounter()) {
972d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            Counter* counterValue = contentValue->getCounterValue();
973d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            EListStyleType listStyleType = NoneListStyle;
974d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            CSSValueID listStyleIdent = counterValue->listStyleIdent();
975d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            if (listStyleIdent != CSSValueNone)
976d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                listStyleType = static_cast<EListStyleType>(listStyleIdent - CSSValueDisc);
977d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            OwnPtr<CounterContent> counter = adoptPtr(new CounterContent(AtomicString(counterValue->identifier()), listStyleType, AtomicString(counterValue->separator())));
978d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            state.style()->setContent(counter.release(), didSet);
979d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            didSet = true;
980d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        } else {
981d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            switch (contentValue->getValueID()) {
982d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            case CSSValueOpenQuote:
983d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(OPEN_QUOTE, didSet);
984d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                didSet = true;
985d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                break;
986d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            case CSSValueCloseQuote:
987d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(CLOSE_QUOTE, didSet);
988d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                didSet = true;
989d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                break;
990d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            case CSSValueNoOpenQuote:
991d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(NO_OPEN_QUOTE, didSet);
992d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                didSet = true;
993d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                break;
994d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            case CSSValueNoCloseQuote:
995d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                state.style()->setContent(NO_CLOSE_QUOTE, didSet);
996d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                didSet = true;
997d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                break;
998d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            default:
999d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                // normal and none do not have any effect.
1000d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                { }
1001d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            }
1002d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
1003d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1004d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!didSet)
1005d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->clearContent();
1006d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1007f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1008d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyFont(StyleResolverState&)
1009e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1010d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT_NOT_REACHED();
1011d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1012e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1013d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyFont(StyleResolverState&)
1014d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1015d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT_NOT_REACHED();
1016d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1017e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1018d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyFont(StyleResolverState& state, CSSValue* value)
1019d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1020d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Only System Font identifiers should come through this method
1021d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // all other values should have been handled when the shorthand
1022d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // was expanded by the parser.
1023d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // FIXME: System Font identifiers should not hijack this
1024d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // short-hand CSSProperty like this (crbug.com/353932)
1025d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setLineHeight(RenderStyle::initialLineHeight());
1026d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.setLineHeightValue(0);
1027d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.fontBuilder().fromSystemFont(toCSSPrimitiveValue(value)->getValueID(), state.style()->effectiveZoom());
1028d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1029e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1030d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitLocale(StyleResolverState& state, CSSValue* value)
1031d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1032d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!value->isPrimitiveValue())
1033e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
1034d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
1035d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (primitiveValue->getValueID() == CSSValueAuto)
1036d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setLocale(nullAtom);
1037d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    else
1038d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setLocale(AtomicString(primitiveValue->getStringValue()));
1039d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.fontBuilder().setScript(state.style()->locale());
1040d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1041e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1042d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyWebkitAppRegion(StyleResolverState&)
1043d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1044d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1045e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1046d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyWebkitAppRegion(StyleResolverState&)
1047d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1048d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1049e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1050d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitAppRegion(StyleResolverState& state, CSSValue* value)
1051d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1052d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!value->isPrimitiveValue())
1053e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
1054d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
1055d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!primitiveValue->getValueID())
1056e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
1057d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.style()->setDraggableRegionMode(primitiveValue->getValueID() == CSSValueDrag ? DraggableRegionDrag : DraggableRegionNoDrag);
1058d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    state.document().setHasAnnotatedRegions(true);
1059d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1060e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1061d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInitialCSSPropertyWebkitPerspective(StyleResolverState& state)
1062d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1063d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    applyInitialCSSPropertyPerspective(state);
1064d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1065e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1066d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyInheritCSSPropertyWebkitPerspective(StyleResolverState& state)
1067d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1068d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    applyInheritCSSPropertyPerspective(state);
1069d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1070e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1071d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitPerspective(StyleResolverState& state, CSSValue* value)
1072d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1073d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!value->isPrimitiveValue())
1074d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
1075d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
1076d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (primitiveValue->isNumber()) {
1077d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        float perspectiveValue = CSSPrimitiveValue::create(primitiveValue->getDoubleValue(), CSSPrimitiveValue::CSS_PX)->computeLength<float>(state.cssToLengthConversionData());
1078e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (perspectiveValue >= 0.0f)
1079e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            state.style()->setPerspective(perspectiveValue);
1080d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else {
1081d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        applyValueCSSPropertyPerspective(state, value);
1082e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
1083d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1084e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1085d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyPerspective(StyleResolverState& state, CSSValue* value)
1086d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1087d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!value->isPrimitiveValue())
1088d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
1089d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
1090d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (primitiveValue->getValueID() == CSSValueNone) {
1091d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setPerspective(0);
1092e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return;
1093e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
1094e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1095d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!primitiveValue->isLength())
1096d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
1097d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    float perspectiveValue = primitiveValue->computeLength<float>(state.cssToLengthConversionData());
1098d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (perspectiveValue >= 0.0f)
1099d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.style()->setPerspective(perspectiveValue);
1100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1101e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitWritingMode(StyleResolverState& state, CSSValue* value)
1103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (value->isPrimitiveValue())
1105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.setWritingMode(*toCSSPrimitiveValue(value));
1106e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1107d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // FIXME: It is not ok to modify document state while applying style.
1108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (state.element() && state.element() == state.document().documentElement())
1109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.document().setWritingModeSetOnDocumentElement(true);
1110d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyWebkitTextOrientation(StyleResolverState& state, CSSValue* value)
1113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1114d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (value->isPrimitiveValue())
1115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        state.setTextOrientation(*toCSSPrimitiveValue(value));
1116d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1117e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1118197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid StyleBuilderFunctions::applyInheritCSSPropertyBaselineShift(StyleResolverState& state)
1119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
1120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const SVGRenderStyle& parentSvgStyle = state.parentStyle()->svgStyle();
1121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EBaselineShift baselineShift = parentSvgStyle.baselineShift();
1122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    SVGRenderStyle& svgStyle = state.style()->accessSVGStyle();
1123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    svgStyle.setBaselineShift(baselineShift);
1124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (baselineShift == BS_LENGTH)
1125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        svgStyle.setBaselineShiftValue(parentSvgStyle.baselineShiftValue());
1126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
1127f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1128d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void StyleBuilderFunctions::applyValueCSSPropertyBaselineShift(StyleResolverState& state, CSSValue* value)
1129d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    SVGRenderStyle& svgStyle = state.style()->accessSVGStyle();
1131d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
11327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!primitiveValue->isValueID()) {
1133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        svgStyle.setBaselineShift(BS_LENGTH);
1134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        svgStyle.setBaselineShiftValue(SVGLength::fromCSSPrimitiveValue(primitiveValue));
11357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
11367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
11377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    switch (primitiveValue->getValueID()) {
11387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSValueBaseline:
11397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        svgStyle.setBaselineShift(BS_BASELINE);
11407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
11417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSValueSub:
11427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        svgStyle.setBaselineShift(BS_SUB);
11437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
11447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    case CSSValueSuper:
11457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        svgStyle.setBaselineShift(BS_SUPER);
11467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
11477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    default:
11487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT_NOT_REACHED();
11495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
11505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
11515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1152197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid StyleBuilderFunctions::applyValueCSSPropertyGridAutoFlow(StyleResolverState& state, CSSValue* value)
1153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
1154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(value->isValueList());
1155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    CSSValueList* list = toCSSValueList(value);
1156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    CSSPrimitiveValue* first = list->length() >= 1 ? toCSSPrimitiveValue(list->item(0)) : nullptr;
1158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!first) {
1160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        applyInitialCSSPropertyGridAutoFlow(state);
1161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return;
1162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    CSSPrimitiveValue* second = list->length() == 2 ? toCSSPrimitiveValue(list->item(1)) : nullptr;
1165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    GridAutoFlow autoFlow = RenderStyle::initialGridAutoFlow();
1167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    switch (first->getValueID()) {
1168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSValueRow:
1169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (second) {
1170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (second->getValueID() == CSSValueDense)
1171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                autoFlow = AutoFlowRowDense;
1172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            else
1173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                autoFlow = AutoFlowStackRow;
1174197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else {
1175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowRow;
1176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
1177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        break;
1178197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSValueColumn:
1179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (second) {
1180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (second->getValueID() == CSSValueDense)
1181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                autoFlow = AutoFlowColumnDense;
1182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            else
1183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                autoFlow = AutoFlowStackColumn;
1184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else {
1185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowColumn;
1186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
1187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        break;
1188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSValueDense:
1189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (second && second->getValueID() == CSSValueColumn)
1190197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowColumnDense;
1191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else
1192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowRowDense;
1193197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        break;
1194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    case CSSValueStack:
1195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (second && second->getValueID() == CSSValueColumn)
1196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowStackColumn;
1197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else
1198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            autoFlow = AutoFlowStackRow;
1199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        break;
1200197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    default:
1201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ASSERT_NOT_REACHED();
1202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        break;
1203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    state.style()->setGridAutoFlow(autoFlow);
1206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
1207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1208c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1209