CSSStyleSelector.cpp revision 6fc495ad78b1663298d1395115dc316eeb537036
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ContentData.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CounterContent.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CursorList.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSBorderImageValue.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSCursorImageValue.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSFontFaceRule.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSImportRule.h"
382bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSLineBoxContainValue.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSMediaRule.h"
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "CSSPageRule.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPrimitiveValueMappings.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSReflectValue.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSRuleList.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSSelector.h"
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CSSSelectorList.h"
482bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSStyleApplyProperty.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleRule.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSTimingFunctionValue.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueList.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Counter.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontFamilyValue.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontValue.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLDocument.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLElement.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLInputElement.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLTextAreaElement.h"
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "KeyframeList.h"
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "LinkHash.h"
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Matrix3DTransformOperation.h"
68e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "MatrixTransformOperation.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaList.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaQueryEvaluator.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeRenderStyle.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h"
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Pair.h"
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "PerspectiveTransformOperation.h"
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "QuotesData.h"
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Rect.h"
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderScrollbar.h"
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderScrollbarTheme.h"
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderStyleConstants.h"
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTheme.h"
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RotateTransformOperation.h"
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScaleTransformOperation.h"
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ShadowData.h"
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ShadowValue.h"
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkewTransformOperation.h"
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleCachedImage.h"
905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "StylePendingImage.h"
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleGeneratedImage.h"
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleSheetList.h"
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Text.h"
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformationMatrix.h"
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TranslateTransformOperation.h"
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "UserAgentStyleSheets.h"
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframeRule.h"
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframesRule.h"
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSTransformValue.h"
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XMLNames.h"
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#if USE(PLATFORM_STRATEGIES)
105db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "PlatformStrategies.h"
106db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "VisitedLinkStrategy.h"
107db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
108db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DashboardRegion.h"
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XLinkNames.h"
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h"
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h"
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(QT)
1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <qwebhistoryinterface.h>
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT(prop, Prop) \
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(m_parentStyle->prop()); \
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_AND_INITIAL(prop, Prop) \
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_INHERIT(prop, Prop) \
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInitial) { \
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Prop()); \
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(prop, Prop, Value) \
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_INHERIT(prop, Prop) \
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInitial) { \
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Value());\
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return;\
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(prop, Prop) \
1535f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHANDLE_INHERIT_AND_INITIAL(prop, Prop) \
1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianif (primitiveValue) \
1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_style->set##Prop(*primitiveValue);
1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(prop, Prop, Value) \
1585f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHANDLE_INHERIT_AND_INITIAL_WITH_VALUE(prop, Prop, Value) \
1595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianif (primitiveValue) \
1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_style->set##Prop(*primitiveValue);
1615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_ANIMATION_INHERIT_AND_INITIAL(prop, Prop) \
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessAnimations(); \
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AnimationList* parentList = m_parentStyle->animations(); \
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t i = 0, parentSize = parentList ? parentList->size() : 0; \
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < parentSize && parentList->animation(i)->is##Prop##Set(); ++i) { \
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list->size() <= i) \
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->set##Prop(parentList->animation(i)->prop()); \
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    \
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset any remaining animations to not have the property set. */ \
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < list->size(); ++i) \
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->clear##Prop(); \
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else if (isInitial) { \
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessAnimations(); \
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    list->animation(0)->set##Prop(Animation::initialAnimation##Prop()); \
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 1; i < list->size(); ++i) \
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(0)->clear##Prop(); \
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_ANIMATION_VALUE(prop, Prop, value) { \
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_ANIMATION_INHERIT_AND_INITIAL(prop, Prop) \
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit || isInitial) \
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationList* list = m_style->accessAnimations(); \
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsize_t childIndex = 0; \
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (value->isValueList()) { \
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Walk each value and put it into an animation, creating new animations as needed. */ \
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSValueList* valueList = static_cast<CSSValueList*>(value); \
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = 0; i < valueList->length(); i++) { \
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (childIndex <= list->size()) \
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mapAnimation##Prop(list->animation(childIndex), valueList->itemWithoutBoundsCheck(i)); \
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++childIndex; \
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else { \
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mapAnimation##Prop(list->animation(childIndex), value); \
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    childIndex = 1; \
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor ( ; childIndex < list->size(); ++childIndex) { \
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset all remaining animations to not have the property set. */ \
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list->animation(childIndex)->clear##Prop(); \
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_TRANSITION_INHERIT_AND_INITIAL(prop, Prop) \
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessTransitions(); \
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AnimationList* parentList = m_parentStyle->transitions(); \
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t i = 0, parentSize = parentList ? parentList->size() : 0; \
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < parentSize && parentList->animation(i)->is##Prop##Set(); ++i) { \
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list->size() <= i) \
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->set##Prop(parentList->animation(i)->prop()); \
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    \
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset any remaining transitions to not have the property set. */ \
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < list->size(); ++i) \
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->clear##Prop(); \
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else if (isInitial) { \
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessTransitions(); \
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    list->animation(0)->set##Prop(Animation::initialAnimation##Prop()); \
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 1; i < list->size(); ++i) \
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(0)->clear##Prop(); \
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_TRANSITION_VALUE(prop, Prop, value) { \
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_TRANSITION_INHERIT_AND_INITIAL(prop, Prop) \
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit || isInitial) \
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationList* list = m_style->accessTransitions(); \
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsize_t childIndex = 0; \
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (value->isValueList()) { \
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Walk each value and put it into a transition, creating new animations as needed. */ \
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSValueList* valueList = static_cast<CSSValueList*>(value); \
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = 0; i < valueList->length(); i++) { \
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (childIndex <= list->size()) \
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mapAnimation##Prop(list->animation(childIndex), valueList->itemWithoutBoundsCheck(i)); \
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++childIndex; \
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else { \
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mapAnimation##Prop(list->animation(childIndex), value); \
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    childIndex = 1; \
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor ( ; childIndex < list->size(); ++childIndex) { \
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset all remaining transitions to not have the property set. */ \
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list->animation(childIndex)->clear##Prop(); \
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_COND(propID, prop, Prop) \
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(m_parentStyle->prop()); \
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_COND_WITH_BACKUP(propID, prop, propAlt, Prop) \
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_parentStyle->prop().isValid()) \
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->set##Prop(m_parentStyle->prop()); \
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else \
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->set##Prop(m_parentStyle->propAlt()); \
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INITIAL_COND(propID, Prop) \
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Prop()); \
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INITIAL_COND_WITH_VALUE(propID, Prop, Value) \
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Value()); \
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass RuleData {
290cad810f21b803229eb11403f9209855525a25d57Steve Blockpublic:
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleData(CSSStyleRule*, CSSSelector*, unsigned position);
292cad810f21b803229eb11403f9209855525a25d57Steve Block
2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned position() const { return m_position; }
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSStyleRule* rule() const { return m_rule; }
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector* selector() const { return m_selector; }
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasFastCheckableSelector() const { return m_hasFastCheckableSelector; }
2982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasMultipartSelector() const { return m_hasMultipartSelector; }
2992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasTopSelectorMatchingHTMLBasedOnRuleHash() const { return m_hasTopSelectorMatchingHTMLBasedOnRuleHash; }
30081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity() const { return m_specificity; }
3012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Try to balance between memory usage (there can be lots of RuleData objects) and good filtering performance.
3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const unsigned maximumIdentifierCount = 4;
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const unsigned* descendantSelectorIdentifierHashes() const { return m_descendantSelectorIdentifierHashes; }
305cad810f21b803229eb11403f9209855525a25d57Steve Block
306cad810f21b803229eb11403f9209855525a25d57Steve Blockprivate:
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void collectDescendantSelectorIdentifierHashes();
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void collectIdentifierHashes(const CSSSelector*, unsigned& identifierCount);
3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
310cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSStyleRule* m_rule;
311cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSSelector* m_selector;
31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned m_specificity;
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned m_position : 29;
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasFastCheckableSelector : 1;
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasMultipartSelector : 1;
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasTopSelectorMatchingHTMLBasedOnRuleHash : 1;
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Use plain array instead of a Vector to minimize memory overhead.
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned m_descendantSelectorIdentifierHashes[maximumIdentifierCount];
319cad810f21b803229eb11403f9209855525a25d57Steve Block};
320cad810f21b803229eb11403f9209855525a25d57Steve Block
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass RuleSet {
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WTF_MAKE_NONCOPYABLE(RuleSet);
323cad810f21b803229eb11403f9209855525a25d57Steve Blockpublic:
3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet();
3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ~RuleSet();
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    typedef HashMap<AtomicStringImpl*, Vector<RuleData>*> AtomRuleMap;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addRulesFromSheet(CSSStyleSheet*, const MediaQueryEvaluator&, CSSStyleSelector* = 0);
330545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
3316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void addStyleRule(CSSStyleRule* item);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addRule(CSSStyleRule* rule, CSSSelector* sel);
33321939df44de1705786c545cd1bf519d47250322dBen Murdoch    void addPageRule(CSSStyleRule* rule, CSSSelector* sel);
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                      CSSStyleRule* rule, CSSSelector* sel);
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void shrinkToFit();
3372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void disableAutoShrinkToFit() { m_autoShrinkToFitEnabled = false; }
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void collectFeatures(CSSStyleSelector::Features&) const;
340ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getIDRules(AtomicStringImpl* key) const { return m_idRules.get(key); }
3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getClassRules(AtomicStringImpl* key) const { return m_classRules.get(key); }
3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getTagRules(AtomicStringImpl* key) const { return m_tagRules.get(key); }
3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getPseudoRules(AtomicStringImpl* key) const { return m_pseudoRules.get(key); }
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getUniversalRules() const { return &m_universalRules; }
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getPageRules() const { return &m_pageRules; }
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_idRules;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_classRules;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_tagRules;
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AtomRuleMap m_pseudoRules;
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData> m_universalRules;
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData> m_pageRules;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_ruleCount;
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_autoShrinkToFitEnabled;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultStyle;
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultQuirksStyle;
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultPrintStyle;
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultViewSourceStyle;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CSSStyleSheet* simpleDefaultStyleSheet;
364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* siblingRulesInDefaultStyle;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderStyle* CSSStyleSelector::s_styleNotYetAvailable;
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadFullDefaultStyle();
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadSimpleDefaultStyle();
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: It would be nice to use some mechanism that guarantees this is in sync with the real UA stylesheet.
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const char* simpleUserAgentStyleSheet = "html,body,div{display:block}head{display:none}body{margin:8px}div:focus,span:focus{outline:auto 5px -webkit-focus-ring-color}a:-webkit-any-link{color:-webkit-link;text-decoration:underline}a:-webkit-any-link:active{color:-webkit-activelink}";
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
374ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline bool elementCanUseSimpleDefaultStyle(Element* e)
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return e->hasTagName(htmlTag) || e->hasTagName(headTag) || e->hasTagName(bodyTag) || e->hasTagName(divTag) || e->hasTagName(spanTag) || e->hasTagName(brTag) || e->hasTagName(aTag);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
379ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline void collectSiblingRulesInDefaultStyle()
380ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSStyleSelector::Features features;
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    defaultStyle->collectFeatures(features);
38381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(features.idsInRules.isEmpty());
384ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    delete siblingRulesInDefaultStyle;
38581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    siblingRulesInDefaultStyle = features.siblingRules.leakPtr();
386ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
387ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
388ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline void assertNoSiblingRulesInDefaultStyle()
389ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
390ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#ifndef NDEBUG
391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (siblingRulesInDefaultStyle)
392ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
393ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    collectSiblingRulesInDefaultStyle();
394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ASSERT(!siblingRulesInDefaultStyle);
395ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
396ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
397ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const MediaQueryEvaluator& screenEval()
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticScreenEval, ("screen"));
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return staticScreenEval;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const MediaQueryEvaluator& printEval()
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticPrintEval, ("print"));
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return staticPrintEval;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic CSSMutableStyleDeclaration* leftToRightDeclaration()
41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_STATIC_LOCAL(RefPtr<CSSMutableStyleDeclaration>, leftToRightDecl, (CSSMutableStyleDeclaration::create()));
41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!leftToRightDecl->length()) {
41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        leftToRightDecl->setProperty(CSSPropertyDirection, "ltr", false, false);
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        leftToRightDecl->setStrictParsing(false);
41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return leftToRightDecl.get();
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
41981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
42081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic CSSMutableStyleDeclaration* rightToLeftDeclaration()
42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_STATIC_LOCAL(RefPtr<CSSMutableStyleDeclaration>, rightToLeftDecl, (CSSMutableStyleDeclaration::create()));
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!rightToLeftDecl->length()) {
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rightToLeftDecl->setProperty(CSSPropertyDirection, "rtl", false, false);
42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rightToLeftDecl->setStrictParsing(false);
42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return rightToLeftDecl.get();
42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
42981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenCSSStyleSelector::CSSStyleSelector(Document* document, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet,
431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                   CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets,
432231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                   bool strictParsing, bool matchAuthorAndUserStyles)
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_backgroundData(BackgroundFillLayer)
4345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_checker(document, strictParsing)
4356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_element(0)
4366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_styledElement(0)
4376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_elementLinkState(NotInsideLink)
4385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_fontSelector(CSSFontSelector::create(document))
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_applyProperty(CSSStyleApplyProperty::sharedCSSStyleApplyProperty())
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchAuthorAndUserStyles = matchAuthorAndUserStyles;
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Element* root = document->documentElement();
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!defaultStyle) {
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!root || elementCanUseSimpleDefaultStyle(root))
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadSimpleDefaultStyle();
4484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        else {
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadFullDefaultStyle();
4504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // construct document root element default style. this is needed
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to evaluate media queries that contain relative constraints, like "screen and (max-width: 10em)"
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is here instead of constructor, because when constructor is run,
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // document doesn't have documentElement
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NOTE: this assumes that element that gets passed to styleForElement -call
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is always from the document that owns the style selector
4595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    FrameView* view = document->view();
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (view)
4615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType()));
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator("all"));
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root)
466d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_rootDefaultStyle = styleForElement(root, 0, false, true); // don't ref, because the RenderStyle is allocated from global heap
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_rootDefaultStyle && view)
4695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType(), view->frame(), m_rootDefaultStyle.get()));
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle = adoptPtr(new RuleSet);
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Adding rules from multiple sheets, shrink at the end.
4732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle->disableAutoShrinkToFit();
474f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This sucks! The user sheet is reparsed every time!
4762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnPtr<RuleSet> tempUserStyle = adoptPtr(new RuleSet);
477f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pageUserSheet)
478f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        tempUserStyle->addRulesFromSheet(pageUserSheet, *m_medium, this);
479f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pageGroupUserSheets) {
480f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned length = pageGroupUserSheets->size();
481f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        for (unsigned i = 0; i < length; i++) {
482f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (pageGroupUserSheets->at(i)->isUserStyleSheet())
483f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                tempUserStyle->addRulesFromSheet(pageGroupUserSheets->at(i).get(), *m_medium, this);
484f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            else
485f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                m_authorStyle->addRulesFromSheet(pageGroupUserSheets->at(i).get(), *m_medium, this);
486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (tempUserStyle->m_ruleCount > 0 || tempUserStyle->m_pageRules.size() > 0)
4905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_userStyle = tempUserStyle.release();
491f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
492d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Add rules from elements like SVG's <font-face>
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mappedElementSheet)
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_authorStyle->addRulesFromSheet(mappedElementSheet, *m_medium, this);
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
496f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // add stylesheets from document
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned length = styleSheets->length();
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < length; i++) {
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StyleSheet* sheet = styleSheets->item(i);
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sheet->isCSSStyleSheet() && !sheet->disabled())
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_authorStyle->addRulesFromSheet(static_cast<CSSStyleSheet*>(sheet), *m_medium, this);
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
503ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Collect all ids and rules using sibling selectors (:first-child and similar)
504ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // in the current set of stylesheets. Style sharing code uses this information to reject
505ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // sharing candidates.
506ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Usually there are no sibling rules in the default style but the MathML sheet has some.
507ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (siblingRulesInDefaultStyle)
50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        siblingRulesInDefaultStyle->collectFeatures(m_features);
50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_authorStyle->collectFeatures(m_features);
510ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_userStyle)
51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_userStyle->collectFeatures(m_features);
512f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle->shrinkToFit();
51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_features.siblingRules)
51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_features.siblingRules->shrinkToFit();
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (document->renderer() && document->renderer()->style())
5185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        document->renderer()->style()->font().update(fontSelector());
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is a simplified style setting function for keyframe styles
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addKeyframeStyle(PassRefPtr<WebKitCSSKeyframesRule> rule)
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString s(rule->name());
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_keyframesRuleMap.add(s.impl(), rule);
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleSelector::~CSSStyleSelector()
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontSelector->clearDocument();
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_viewportDependentMediaQueryResults);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
53481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochCSSStyleSelector::Features::Features()
53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : usesFirstLineRules(false)
53681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , usesBeforeAfterRules(false)
53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , usesLinkRules(false)
53881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
53981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
54181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochCSSStyleSelector::Features::~Features()
54281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
54381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
545635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CSSStyleSheet* parseUASheet(const String& str)
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSStyleSheet* sheet = CSSStyleSheet::create().releaseRef(); // leak the sheet on purpose
548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sheet->parseString(str);
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sheet;
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CSSStyleSheet* parseUASheet(const char* characters, unsigned size)
553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return parseUASheet(String(characters, size));
555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadFullDefaultStyle()
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (simpleDefaultStyleSheet) {
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(defaultStyle);
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete defaultStyle;
56206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        simpleDefaultStyleSheet->deref();
5632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultStyle = new RuleSet;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        simpleDefaultStyleSheet = 0;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!defaultStyle);
5672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultStyle = new RuleSet;
5682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultPrintStyle = new RuleSet;
5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultQuirksStyle = new RuleSet;
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Strict-mode rules.
5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String defaultRules = String(htmlUserAgentStyleSheet, sizeof(htmlUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraDefaultStyleSheet();
574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CSSStyleSheet* defaultSheet = parseUASheet(defaultRules);
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultStyle->addRulesFromSheet(defaultSheet, screenEval());
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultPrintStyle->addRulesFromSheet(defaultSheet, printEval());
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Quirks-mode rules.
5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraQuirksStyleSheet();
580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CSSStyleSheet* quirksSheet = parseUASheet(quirksRules);
581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    defaultQuirksStyle->addRulesFromSheet(quirksSheet, screenEval());
5824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
5834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadSimpleDefaultStyle()
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!defaultStyle);
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!simpleDefaultStyleSheet);
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultStyle = new RuleSet;
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultPrintStyle = new RuleSet;
5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultQuirksStyle = new RuleSet;
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultStyle->addRulesFromSheet(simpleDefaultStyleSheet, screenEval());
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadViewSourceStyle()
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!defaultViewSourceStyle);
6022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultViewSourceStyle = new RuleSet;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultViewSourceStyle->addRulesFromSheet(parseUASheet(sourceUserAgentStyleSheet, sizeof(sourceUserAgentStyleSheet)), screenEval());
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6062fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void collectElementIdentifierHashes(const Element* element, Vector<unsigned, 4>& identifierHashes)
6072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    identifierHashes.append(element->localName().impl()->existingHash());
6092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (element->hasID())
6102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        identifierHashes.append(element->idForStyleResolution().impl()->existingHash());
6112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const StyledElement* styledElement = element->isStyledElement() ? static_cast<const StyledElement*>(element) : 0;
6122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (styledElement && styledElement->hasClass()) {
6132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const SpaceSplitString& classNames = styledElement->classNames();
6142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        size_t count = classNames.size();
6152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (size_t i = 0; i < count; ++i)
6162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            identifierHashes.append(classNames[i].impl()->existingHash());
6172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6202fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::pushParentStackFrame(Element* parent)
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
6232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_parentStack.isEmpty() || m_parentStack.last().element == parent->parentElement());
6242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_parentStack.isEmpty() || !parent->parentElement());
6252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_parentStack.append(ParentStackFrame(parent));
6262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ParentStackFrame& parentFrame = m_parentStack.last();
6272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Mix tags, class names and ids into some sort of weird bouillabaisse.
6282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The filter is used for fast rejection of child and descendant selectors.
6292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectElementIdentifierHashes(parent, parentFrame.identifierHashes);
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    size_t count = parentFrame.identifierHashes.size();
6312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (size_t i = 0; i < count; ++i)
6322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->add(parentFrame.identifierHashes[i]);
6332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::popParentStackFrame()
6362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_parentStack.isEmpty());
6382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
6392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const ParentStackFrame& parentFrame = m_parentStack.last();
6402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    size_t count = parentFrame.identifierHashes.size();
6412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (size_t i = 0; i < count; ++i)
6422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->remove(parentFrame.identifierHashes[i]);
6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_parentStack.removeLast();
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty()) {
6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter->likelyEmpty());
6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter.clear();
6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::pushParent(Element* parent)
6512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty()) {
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(!m_ancestorIdentifierFilter);
6542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter = adoptPtr(new BloomFilter<bloomFilterKeyBits>);
6552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // If the element is not the root itself, build the stack starting from the root.
6562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (parent->parentElement()) {
6572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Vector<Element*, 30> ancestors;
6582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (Element* ancestor = parent; ancestor; ancestor = ancestor->parentElement())
6592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                ancestors.append(ancestor);
6602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int count = ancestors.size();
6612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (int n = count - 1; n >= 0; --n)
6622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                pushParentStackFrame(ancestors[n]);
6632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
6642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
6652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else if (!parent->parentElement()) {
6662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We are not always invoked consistently. For example, script execution can cause us to enter
6672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // style recalc in the middle of tree building. Reset the stack if we see a new root element.
6682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter);
6692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->clear();
6702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_parentStack.resize(0);
6712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else {
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter);
6732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We may get invoked for some random elements in some wacky cases during style resolve.
6742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Pause maintaining the stack in this case.
6752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_parentStack.last().element != parent->parentElement())
6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
6772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    pushParentStackFrame(parent);
6792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::popParent(Element* parent)
6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty() || m_parentStack.last().element != parent)
6842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    popParentStackFrame();
6862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addMatchedDeclaration(CSSMutableStyleDeclaration* decl)
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_matchedDecls.append(decl);
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchRules(RuleSet* rules, int& firstRuleIndex, int& lastRuleIndex, bool includeEmptyRules)
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchedRules.clear();
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules || !m_element)
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We need to collect the rules for id, class, tag, and everything else into a buffer and
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // then sort the buffer.
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_element->hasID())
70368513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRulesForList(rules->getIDRules(m_element->idForStyleResolution().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_element->hasClass()) {
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_styledElement);
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const SpaceSplitString& classNames = m_styledElement->classNames();
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size_t size = classNames.size();
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < size; ++i)
70968513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRulesForList(rules->getClassRules(classNames[i].impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_element->shadowPseudoId().isEmpty()) {
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_styledElement);
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        matchRulesForList(rules->getPseudoRules(m_element->shadowPseudoId().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
71568513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRulesForList(rules->getTagRules(m_element->localName().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
71668513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRulesForList(rules->getUniversalRules(), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we didn't match any rules, we're done.
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchedRules.isEmpty())
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Sort the set of matched rules.
72381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sortMatchedRules();
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now transfer the set of matched rules over to our list of decls.
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_checker.m_collectRulesOnly) {
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < m_matchedRules.size(); i++)
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < m_matchedRules.size(); i++) {
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_ruleList)
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_ruleList = CSSRuleList::create();
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_ruleList->append(m_matchedRules[i]->rule());
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7382fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSStyleSelector::fastRejectSelector(const RuleData& ruleData) const
7392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
7412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const unsigned* descendantSelectorIdentifierHashes = ruleData.descendantSelectorIdentifierHashes();
7422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned n = 0; n < RuleData::maximumIdentifierCount && descendantSelectorIdentifierHashes[n]; ++n) {
7432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_ancestorIdentifierFilter->mayContain(descendantSelectorIdentifierHashes[n]))
7442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return true;
7452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
7462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return false;
7472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchRulesForList(const Vector<RuleData>* rules, int& firstRuleIndex, int& lastRuleIndex, bool includeEmptyRules)
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules)
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // In some cases we may end up looking up style for random elements in the middle of a recursive tree resolve.
7542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Ancestor identifier filter won't be up-to-date in that case and we can't use the fast path.
7552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool canUseFastReject = !m_parentStack.isEmpty() && m_parentStack.last().element == m_parentNode;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules->size();
7582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
7592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules->at(i);
7602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (canUseFastReject && fastRejectSelector(ruleData))
7612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            continue;
7622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (checkSelector(ruleData)) {
76368513a70bcd92384395513322f1b801e7bf9c729Steve Block            // If the rule has no properties to apply, then ignore it in the non-debug mode.
7642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            CSSStyleRule* rule = ruleData.rule();
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMutableStyleDeclaration* decl = rule->declaration();
76668513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (!decl || (!decl->length() && !includeEmptyRules))
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
7682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (m_checker.m_sameOriginOnly && !m_checker.m_document->securityOrigin()->canRequest(rule->baseURL()))
7692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                continue;
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // If we're matching normal rules, set a pseudo bit if
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // we really just matched a pseudo-element.
7728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (m_dynamicPseudo != NOPSEUDO && m_checker.m_pseudoStyle == NOPSEUDO) {
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_checker.m_collectRulesOnly)
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    continue;
7758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (m_dynamicPseudo < FIRST_INTERNAL_PSEUDOID)
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setHasPseudoStyle(m_dynamicPseudo);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Update our first/last rule indices in the matched rules array.
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                lastRuleIndex = m_matchedDecls.size() + m_matchedRules.size();
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (firstRuleIndex == -1)
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstRuleIndex = lastRuleIndex;
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Add this rule to our list of matched rules.
7842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                addMatchedRule(&ruleData);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline bool compareRules(const RuleData* r1, const RuleData* r2)
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
79281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity1 = r1->specificity();
79381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity2 = r2->specificity();
79481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return (specificity1 == specificity2) ? r1->position() < r2->position() : specificity1 < specificity2;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid CSSStyleSelector::sortMatchedRules()
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
79981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    std::sort(m_matchedRules.begin(), m_matchedRules.end(), compareRules);
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline EInsideLink CSSStyleSelector::SelectorChecker::determineLinkState(Element* element) const
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!element || !element->isLink())
8056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return NotInsideLink;
8066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return determineLinkStateSlowCase(element);
8076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
8086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline void CSSStyleSelector::initElement(Element* e)
8106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
8116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_element != e) {
8126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_element = e;
8136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_styledElement = m_element && m_element->isStyledElement() ? static_cast<StyledElement*>(m_element) : 0;
8146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_elementLinkState = m_checker.determineLinkState(m_element);
815e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (e && e == e->document()->documentElement()) {
816e14391e94c850b8bd03680c23b38978db68687a8John Reck            e->document()->setDirectionSetOnDocumentElement(false);
817e14391e94c850b8bd03680c23b38978db68687a8John Reck            e->document()->setWritingModeSetOnDocumentElement(false);
818e14391e94c850b8bd03680c23b38978db68687a8John Reck        }
8196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82221939df44de1705786c545cd1bf519d47250322dBen Murdochinline void CSSStyleSelector::initForStyleResolve(Element* e, RenderStyle* parentStyle, PseudoId pseudoID)
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_pseudoStyle = pseudoID;
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_parentNode = e ? e->parentNodeForRenderingAndStyle() : 0;
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentStyle)
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = parentStyle;
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = m_parentNode ? m_parentNode->renderStyle() : 0;
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Node* docElement = e ? e->document()->documentElement() : 0;
8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderStyle* docStyle = m_checker.m_document->renderStyle();
8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_rootElementStyle = docElement && e != docElement ? docElement->renderStyle() : docStyle;
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = 0;
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchedDecls.clear();
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_pendingImageProperties.clear();
8425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ruleList = 0;
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontDirty = false;
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline const AtomicString* linkAttribute(Node* node)
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node->isLink())
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(node->isElementNode());
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* element = static_cast<Element*>(node);
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (element->isHTMLElement())
8566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(hrefAttr);
857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
859635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (element->isWMLElement()) {
860635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // <anchor> elements don't have href attributes, but we still want to
861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // appear as link, so linkAttribute() has to return a non-null value!
862635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (element->hasTagName(WMLNames::anchorTag))
863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return &emptyAtom;
864635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(hrefAttr);
866635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
867635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (element->isSVGElement())
8716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(XLinkNames::hrefAttr);
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
873635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleSelector::SelectorChecker::SelectorChecker(Document* document, bool strictParsing)
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_document(document)
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_strictParsing(strictParsing)
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_collectRulesOnly(false)
881e14391e94c850b8bd03680c23b38978db68687a8John Reck    , m_sameOriginOnly(false)
8828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , m_pseudoStyle(NOPSEUDO)
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_documentIsHTML(document->isHTMLDocument())
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_matchVisitedPseudoClass(false)
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88821939df44de1705786c545cd1bf519d47250322dBen MurdochEInsideLink CSSStyleSelector::SelectorChecker::determineLinkStateSlowCase(Element* element) const
88921939df44de1705786c545cd1bf519d47250322dBen Murdoch{
89021939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(element->isLink());
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString* attr = linkAttribute(element);
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attr || attr->isNull())
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return NotInsideLink;
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(QT)
8975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Vector<UChar, 512> url;
8985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    visitedURL(m_document->baseURL(), *attr, url);
8995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (url.isEmpty())
900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // If the Qt4.4 interface for the history is used, we will have to fallback
9035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // to the old global history.
9045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    QWebHistoryInterface* iface = QWebHistoryInterface::defaultInterface();
9055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (iface)
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return iface->historyContains(QString(reinterpret_cast<QChar*>(url.data()), url.size())) ? InsideVisitedLink : InsideUnvisitedLink;
9075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    LinkHash hash = visitedLinkHash(url.data(), url.size());
9095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!hash)
910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    LinkHash hash = visitedLinkHash(m_document->baseURL(), *attr);
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!hash)
914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_document->frame();
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = frame->page();
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!page)
923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_linksCheckedForVisitedState.add(hash);
926db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
927db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#if USE(PLATFORM_STRATEGIES)
928db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return platformStrategies()->visitedLinkStrategy()->isLinkVisited(page, hash) ? InsideVisitedLink : InsideUnvisitedLink;
929db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#else
930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return page->group().isLinkVisited(hash) ? InsideVisitedLink : InsideUnvisitedLink;
931db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* element) const
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    PseudoId dynamicPseudo = NOPSEUDO;
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return checkSelector(sel, element, 0, dynamicPseudo, false, false) == SelectorMatches;
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned cStyleSearchThreshold = 10;
94181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic const unsigned cStyleSearchLevelThreshold = 10;
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
94381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochNode* CSSStyleSelector::locateCousinList(Element* parent, unsigned& visitedNodeCount) const
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
94581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (visitedNodeCount >= cStyleSearchThreshold * cStyleSearchLevelThreshold)
94681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return 0;
947ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!parent || !parent->isStyledElement())
948ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
949ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    StyledElement* p = static_cast<StyledElement*>(parent);
950ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (p->inlineStyleDecl())
951ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
95281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (p->hasID() && m_features.idsInRules.contains(p->idForStyleResolution().impl()))
953ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
95481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
95581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RenderStyle* parentStyle = p->renderStyle();
956ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unsigned subcount = 0;
95781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* thisCousin = p;
95881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* currentNode = p->previousSibling();
95981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
96081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Reserve the tries for this level. This effectively makes sure that the algorithm
96181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // will never go deeper than cStyleSearchLevelThreshold levels into recursion.
96281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    visitedNodeCount += cStyleSearchThreshold;
96381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (thisCousin) {
96481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (currentNode) {
96581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ++subcount;
96681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (currentNode->renderStyle() == parentStyle && currentNode->lastChild()) {
96781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // Adjust for unused reserved tries.
96881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                visitedNodeCount -= cStyleSearchThreshold - subcount;
96981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return currentNode->lastChild();
97081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
97181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (subcount >= cStyleSearchThreshold)
97281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return 0;
97381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            currentNode = currentNode->previousSibling();
97481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
97581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        currentNode = locateCousinList(thisCousin->parentElement(), visitedNodeCount);
97681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        thisCousin = currentNode;
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
97881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
982ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool CSSStyleSelector::matchesSiblingRules()
983ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
984ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    int firstSiblingRule = -1, lastSiblingRule = -1;
98581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    matchRules(m_features.siblingRules.get(), firstSiblingRule, lastSiblingRule, false);
986ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_matchedDecls.isEmpty())
987ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return false;
988ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_matchedDecls.clear();
989ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return true;
990ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
991ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
99281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool CSSStyleSelector::canShareStyleWithElement(Node* node) const
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
99481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!node->isStyledElement())
99581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
9968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
99781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    StyledElement* element = static_cast<StyledElement*>(node);
99881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RenderStyle* style = element->renderStyle();
999231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
100081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!style)
100181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->unique())
100381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->tagQName() != m_element->tagQName())
100581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasClass() != m_element->hasClass())
100781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->inlineStyleDecl())
100981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasMappedAttributes() != m_styledElement->hasMappedAttributes())
101181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->isLink() != m_element->isLink())
101381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->affectedByAttributeSelectors())
101581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hovered() != m_element->hovered())
101781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->active() != m_element->active())
101981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->focused() != m_element->focused())
102181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->shadowPseudoId() != m_element->shadowPseudoId())
102381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element == element->document()->cssTarget())
102581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_element == m_element->document()->cssTarget())
102781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(typeAttr) != m_element->fastGetAttribute(typeAttr))
102981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(XMLNames::langAttr) != m_element->fastGetAttribute(XMLNames::langAttr))
103181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(langAttr) != m_element->fastGetAttribute(langAttr))
103381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(readonlyAttr) != m_element->fastGetAttribute(readonlyAttr))
103581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(cellpaddingAttr) != m_element->fastGetAttribute(cellpaddingAttr))
103781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
1038cad810f21b803229eb11403f9209855525a25d57Steve Block
103981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasID() && m_features.idsInRules.contains(element->idForStyleResolution().impl()))
104081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
1041cad810f21b803229eb11403f9209855525a25d57Steve Block
104281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool isControl = element->isFormControlElement();
10438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
104481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (isControl != m_element->isFormControlElement())
104581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
104681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
104781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (isControl) {
10482bde8e466a4451c7319e3a072d118917957d6554Steve Block        InputElement* thisInputElement = element->toInputElement();
10492bde8e466a4451c7319e3a072d118917957d6554Steve Block        InputElement* otherInputElement = m_element->toInputElement();
105081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
105181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!thisInputElement || !otherInputElement)
105281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
105481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isAutofilled() != otherInputElement->isAutofilled())
105581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isChecked() != otherInputElement->isChecked())
105781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isIndeterminate() != otherInputElement->isIndeterminate())
105981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isEnabledFormControl() != m_element->isEnabledFormControl())
106281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isDefaultButtonForForm() != m_element->isDefaultButtonForForm())
106581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!m_element->document()->containsValidityStyleRules())
106881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        bool willValidate = element->willValidate();
107181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (willValidate != m_element->willValidate())
107381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
107481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (willValidate && (element->isValidFormControlElement() != m_element->isValidFormControlElement()))
107681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
107781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isInRange() != m_element->isInRange())
107981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
108081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
108181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isOutOfRange() != m_element->isOutOfRange())
108281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
108381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
108481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
108581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->transitions() || style->animations())
108681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
108828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING)
108981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Turn off style sharing for elements that can gain layers for reasons outside of the style system.
109081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // See comments in RenderObject::setStyle().
10912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (element->hasTagName(iframeTag) || element->hasTagName(frameTag) || element->hasTagName(embedTag) || element->hasTagName(objectTag) || element->hasTagName(appletTag))
109281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
109328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif
109428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
109581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (equalIgnoringCase(element->fastGetAttribute(dirAttr), "auto") || equalIgnoringCase(m_element->fastGetAttribute(dirAttr), "auto"))
109681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
109781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
109881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasClass() && m_element->fastGetAttribute(classAttr) != element->fastGetAttribute(classAttr))
109981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasMappedAttributes() && !element->attributeMap()->mappedMapsEquivalent(m_styledElement->attributeMap()))
110281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->isLink() && m_elementLinkState != style->insideLink())
110581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return true;
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1110ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochinline Node* CSSStyleSelector::findSiblingForStyleSharing(Node* node, unsigned& count) const
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1112ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (; node; node = node->previousSibling()) {
1113ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (!node->isElementNode())
1114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            continue;
1115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (canShareStyleWithElement(node))
1116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            break;
1117ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (count++ == cStyleSearchThreshold)
1118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return 0;
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1120ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return node;
1121ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1122ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
11232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool parentStylePreventsSharing(const RenderStyle* parentStyle)
11242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return parentStyle->childrenAffectedByPositionalRules()
11262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByFirstChildRules()
11272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByLastChildRules()
11282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByDirectAdjacentRules();
11292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1131ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochALWAYS_INLINE RenderStyle* CSSStyleSelector::locateSharedStyle()
1132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
1133ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_styledElement || !m_parentStyle)
1134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // If the element has inline style it is probably unique.
1136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_styledElement->inlineStyleDecl())
1137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Ids stop style sharing if they show up in the stylesheets.
113981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_styledElement->hasID() && m_features.idsInRules.contains(m_styledElement->idForStyleResolution().impl()))
1140ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
11412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (parentStylePreventsSharing(m_parentStyle))
11422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
114381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
114481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Check previous siblings and their cousins.
1145ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unsigned count = 0;
114681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned visitedNodeCount = 0;
114781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* shareNode = 0;
114881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* cousinList = m_styledElement->previousSibling();
114981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (cousinList) {
115081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        shareNode = findSiblingForStyleSharing(cousinList, count);
115181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (shareNode)
115281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            break;
115381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cousinList = locateCousinList(cousinList->parentElement(), visitedNodeCount);
1154ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
115581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
115681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // If we have exhausted all our budget or our cousins.
115781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!shareNode)
115881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return 0;
115981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1160ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Can't share if sibling rules apply. This is checked at the end as it should rarely fail.
1161ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (matchesSiblingRules())
1162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1163ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Tracking child index requires unique style for each node. This may get set by the sibling rule match above.
11642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (parentStylePreventsSharing(m_parentStyle))
1165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1166ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return shareNode->renderStyle();
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::matchUARules(int& firstUARule, int& lastUARule)
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First we match rules from the user agent sheet.
11722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet* userAgentStyleSheet = m_medium->mediaTypeMatchSpecific("print")
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ? defaultPrintStyle : defaultStyle;
117468513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRules(userAgentStyleSheet, firstUARule, lastUARule, false);
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In quirks mode, we match rules from the quirks user agent sheet.
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_checker.m_strictParsing)
117868513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(defaultQuirksStyle, firstUARule, lastUARule, false);
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // If document uses view source styles (in view source mode or in xml viewer mode), then we match rules from the view source style sheet.
118181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_checker.m_document->usesViewSourceStyles()) {
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!defaultViewSourceStyle)
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadViewSourceStyle();
118468513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(defaultViewSourceStyle, firstUARule, lastUARule, false);
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188d0825bca7fe65beaee391d30da42e937db621564Steve BlockPassRefPtr<RenderStyle> CSSStyleSelector::styleForDocument(Document* document)
1189d0825bca7fe65beaee391d30da42e937db621564Steve Block{
119068513a70bcd92384395513322f1b801e7bf9c729Steve Block    Frame* frame = document->frame();
11915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1192d0825bca7fe65beaee391d30da42e937db621564Steve Block    RefPtr<RenderStyle> documentStyle = RenderStyle::create();
1193d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setDisplay(BLOCK);
1194d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setVisuallyOrdered(document->visuallyOrdered());
119568513a70bcd92384395513322f1b801e7bf9c729Steve Block    documentStyle->setZoom(frame ? frame->pageZoomFactor() : 1);
1196e14391e94c850b8bd03680c23b38978db68687a8John Reck    documentStyle->setPageScaleTransform(frame ? frame->pageScaleFactor() : 1);
11976fc495ad78b1663298d1395115dc316eeb537036Steve Block    documentStyle->setUserModify(document->inDesignMode() ? READ_WRITE : READ_ONLY);
11986fc495ad78b1663298d1395115dc316eeb537036Steve Block
1199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Element* docElement = document->documentElement();
1200e14391e94c850b8bd03680c23b38978db68687a8John Reck    RenderObject* docElementRenderer = docElement ? docElement->renderer() : 0;
1201e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (docElementRenderer) {
1202e14391e94c850b8bd03680c23b38978db68687a8John Reck        // Use the direction and writing-mode of the body to set the
1203e14391e94c850b8bd03680c23b38978db68687a8John Reck        // viewport's direction and writing-mode unless the property is set on the document element.
1204e14391e94c850b8bd03680c23b38978db68687a8John Reck        // If there is no body, then use the document element.
1205e14391e94c850b8bd03680c23b38978db68687a8John Reck        RenderObject* bodyRenderer = document->body() ? document->body()->renderer() : 0;
1206e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (bodyRenderer && !document->writingModeSetOnDocumentElement())
1207e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setWritingMode(bodyRenderer->style()->writingMode());
1208e14391e94c850b8bd03680c23b38978db68687a8John Reck        else
1209e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setWritingMode(docElementRenderer->style()->writingMode());
1210e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (bodyRenderer && !document->directionSetOnDocumentElement())
1211e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setDirection(bodyRenderer->style()->direction());
1212e14391e94c850b8bd03680c23b38978db68687a8John Reck        else
1213e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setDirection(docElementRenderer->style()->direction());
1214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
1215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1216d0825bca7fe65beaee391d30da42e937db621564Steve Block    FontDescription fontDescription;
1217d0825bca7fe65beaee391d30da42e937db621564Steve Block    fontDescription.setUsePrinterFont(document->printing());
1218d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (Settings* settings = document->settings()) {
1219d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setRenderingMode(settings->fontRenderingMode());
1220d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (document->printing() && !settings->shouldPrintBackgrounds())
1221d0825bca7fe65beaee391d30da42e937db621564Steve Block            documentStyle->setForceBackgroundsToWhite(true);
1222d0825bca7fe65beaee391d30da42e937db621564Steve Block        const AtomicString& stdfont = settings->standardFontFamily();
1223d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!stdfont.isEmpty()) {
1224d0825bca7fe65beaee391d30da42e937db621564Steve Block            fontDescription.firstFamily().setFamily(stdfont);
1225d0825bca7fe65beaee391d30da42e937db621564Steve Block            fontDescription.firstFamily().appendFamily(0);
1226d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
1227d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
1228d0825bca7fe65beaee391d30da42e937db621564Steve Block        int size = CSSStyleSelector::fontSizeForKeyword(document, CSSValueMedium, false);
1229d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setSpecifiedSize(size);
1230692e5dbf12901edacf14812a6fae25462920af42Steve Block        bool useSVGZoomRules = document->isSVGDocument();
1231692e5dbf12901edacf14812a6fae25462920af42Steve Block        fontDescription.setComputedSize(CSSStyleSelector::getComputedSizeFromSpecifiedSize(document, documentStyle.get(), fontDescription.isAbsoluteSize(), size, useSVGZoomRules));
1232d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1233d0825bca7fe65beaee391d30da42e937db621564Steve Block
1234d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setFontDescription(fontDescription);
1235d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->font().update(0);
1236d0825bca7fe65beaee391d30da42e937db621564Steve Block
1237d0825bca7fe65beaee391d30da42e937db621564Steve Block    return documentStyle.release();
1238d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1239d0825bca7fe65beaee391d30da42e937db621564Steve Block
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// If resolveForRootDefault is true, style based on user agent style sheet only. This is used in media queries, where
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// relative units are interpreted according to document root element style, styled only with UA stylesheet
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* e, RenderStyle* defaultParent, bool allowSharing, bool resolveForRootDefault, bool matchVisitedPseudoClass)
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Once an element has a renderer, we don't try to destroy it, since otherwise the renderer
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // will vanish if a style recalc happens during loading.
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing && !e->document()->haveStylesheetsLoaded() && !e->renderer()) {
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!s_styleNotYetAvailable) {
124921939df44de1705786c545cd1bf519d47250322dBen Murdoch            s_styleNotYetAvailable = RenderStyle::create().releaseRef();
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->ref();
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->setDisplay(NONE);
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->font().update(m_fontSelector);
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s_styleNotYetAvailable->ref();
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        e->document()->setHasNodesWithPlaceholderStyle();
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return s_styleNotYetAvailable;
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
1260ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    initForStyleResolve(e, defaultParent);
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing) {
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderStyle* sharedStyle = locateSharedStyle();
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sharedStyle)
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return sharedStyle;
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Compute our style allowing :visited to match first.
1268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
12696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && m_parentStyle && (m_parentStyle->insideLink() || e->isLink()) && e->document()->usesLinkRules()) {
1270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style.
1271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentStyle = m_parentStyle;
1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!e->isLink()) {
1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Use the parent's visited style if one exists.
1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RenderStyle* parentVisitedStyle = m_parentStyle->getCachedPseudoStyle(VISITED_LINK);
1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (parentVisitedStyle)
1276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                parentStyle = parentVisitedStyle;
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = styleForElement(e, parentStyle, false, false, true);
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initForStyleResolve(e, defaultParent);
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = RenderStyle::create();
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_parentStyle)
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->inheritFrom(m_parentStyle);
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = style();
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (e->isLink()) {
1292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->setIsLink(true);
12936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_style->setInsideLink(m_elementLinkState);
1294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (visitedStyle) {
12972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Copy any pseudo bits that the visited style has to the primary style so that
12982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // pseudo element styles will continue to work for pseudo elements inside :visited
12992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // links.
13002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (unsigned pseudo = FIRST_PUBLIC_PSEUDOID; pseudo < FIRST_INTERNAL_PSEUDOID; ++pseudo) {
13012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (visitedStyle->hasPseudoStyle(static_cast<PseudoId>(pseudo)))
13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                m_style->setHasPseudoStyle(static_cast<PseudoId>(pseudo));
13032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
13042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_elementLinkState == InsideUnvisitedLink)
13052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle = 0;  // We made the style to avoid timing attacks. Just throw it away now that we did that, since we don't need it.
13062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
13072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
13082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (simpleDefaultStyleSheet && !elementCanUseSimpleDefaultStyle(e)) {
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadFullDefaultStyle();
1312ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool loadedSVGUserAgentSheet;
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e->isSVGElement() && !loadedSVGUserAgentSheet) {
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // SVG rules.
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadedSVGUserAgentSheet = true;
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSStyleSheet* svgSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultStyle->addRulesFromSheet(svgSheet, screenEval());
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(svgSheet, printEval());
1323ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(MATHML)
1328231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static bool loadedMathMLUserAgentSheet;
1329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (e->isMathMLElement() && !loadedMathMLUserAgentSheet) {
1330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // MathML rules.
1331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        loadedMathMLUserAgentSheet = true;
1332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSStyleSheet* mathMLSheet = parseUASheet(mathmlUserAgentStyleSheet, sizeof(mathmlUserAgentStyleSheet));
1333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultStyle->addRulesFromSheet(mathMLSheet, screenEval());
1334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultPrintStyle->addRulesFromSheet(mathMLSheet, printEval());
1335ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        // There are some sibling rules here.
1336ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        collectSiblingRulesInDefaultStyle();
1337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedWMLUserAgentSheet;
1342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (e->isWMLElement() && !loadedWMLUserAgentSheet) {
1343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // WML rules.
1344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedWMLUserAgentSheet = true;
1345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* wmlSheet = parseUASheet(wmlUserAgentStyleSheet, sizeof(wmlUserAgentStyleSheet));
1346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(wmlSheet, screenEval());
1347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(wmlSheet, printEval());
1348ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(VIDEO)
1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedMediaStyleSheet;
1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!loadedMediaStyleSheet && (e->hasTagName(videoTag) || e->hasTagName(audioTag))) {
1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedMediaStyleSheet = true;
1356cad810f21b803229eb11403f9209855525a25d57Steve Block        String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::themeForPage(e->document()->page())->extraMediaControlsStyleSheet();
1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* mediaControlsSheet = parseUASheet(mediaRules);
1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(mediaControlsSheet, screenEval());
1359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(mediaControlsSheet, printEval());
1360ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
13642bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API)
13652bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool loadedFullScreenStyleSheet;
13662bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!loadedFullScreenStyleSheet && e->document()->webkitIsFullScreen()) {
13672bde8e466a4451c7319e3a072d118917957d6554Steve Block        loadedFullScreenStyleSheet = true;
13682bde8e466a4451c7319e3a072d118917957d6554Steve Block        String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraFullScreenStyleSheet();
13692bde8e466a4451c7319e3a072d118917957d6554Steve Block        CSSStyleSheet* fullscreenSheet = parseUASheet(fullscreenRules);
13702bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13712bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultQuirksStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13722bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
13732bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
13742bde8e466a4451c7319e3a072d118917957d6554Steve Block
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1;
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUserRule = -1, lastUserRule = -1;
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstAuthorRule = -1, lastAuthorRule = -1;
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 4. Now we check user sheet rules.
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
138368513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 5. Now check author rules, beginning first with presentational attributes
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // mapped from HTML.
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_styledElement) {
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ask if the HTML element has mapped attributes.
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->hasMappedAttributes()) {
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Walk our attribute list and add in each decl.
1391e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                const NamedNodeMap* map = m_styledElement->attributeMap();
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned i = 0; i < map->length(); i++) {
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Attribute* attr = map->attributeItem(i);
1394e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    if (attr->isMappedAttribute() && attr->decl()) {
1395e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        lastAuthorRule = m_matchedDecls.size();
1396e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        if (firstAuthorRule == -1)
1397e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                            firstAuthorRule = lastAuthorRule;
1398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        addMatchedDeclaration(attr->decl());
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Now we check additional mapped declarations.
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Tables and table cells share an additional mapped rule that must be applied
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // after all attributes, since their mapped style depends on the values of multiple attributes.
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->canHaveAdditionalAttributeStyleDecls()) {
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_additionalAttributeStyleDecls.clear();
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_styledElement->additionalAttributeStyleDecls(m_additionalAttributeStyleDecls);
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_additionalAttributeStyleDecls.isEmpty()) {
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    unsigned additionalDeclsSize = m_additionalAttributeStyleDecls.size();
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstAuthorRule == -1)
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstAuthorRule = m_matchedDecls.size();
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    lastAuthorRule = m_matchedDecls.size() + additionalDeclsSize - 1;
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    for (unsigned i = 0; i < additionalDeclsSize; i++)
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addMatchedDeclaration(m_additionalAttributeStyleDecls[i]);
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
141881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_styledElement->isHTMLElement()) {
141981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                bool isAuto;
142081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                TextDirection textDirection = toHTMLElement(m_styledElement)->directionalityIfhasDirAutoAttribute(isAuto);
142181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (isAuto)
142281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    addMatchedDeclaration(textDirection == LTR ? leftToRightDeclaration() : rightToLeftDeclaration());
142381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 6. Check the rules in author sheets next.
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
142868513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 7. Now check our inline style attribute.
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles && m_styledElement) {
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMutableStyleDeclaration* inlineDecl = m_styledElement->inlineStyleDecl();
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (inlineDecl) {
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                lastAuthorRule = m_matchedDecls.size();
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (firstAuthorRule == -1)
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstAuthorRule = lastAuthorRule;
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addMatchedDeclaration(inlineDecl);
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
14436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now we have all of the matched rules in the appropriate order.  Walk the rules and apply
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // high-priority properties first, i.e., those properties that other properties depend on.
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and (4) normal important.
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
145021939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
145221939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
145321939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstUserRule, lastUserRule);
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
145521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority UA properties.
146621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the author and user normal priority properties and all the !important properties.
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
147321939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
147421939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
147521939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstUserRule, lastUserRule);
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
147721939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
14785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
14795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(!m_fontDirty);
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), m_parentStyle, e);
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
14895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
14905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we have first-letter pseudo style, do not share this style
14928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_style->hasPseudoStyle(FIRST_LETTER))
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setUnique();
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle) {
1496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Add the visited style off the main style.
1497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
15006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass)
15016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        initElement(0); // Clear out for the next resolve.
15026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForKeyframe(const RenderStyle* elementStyle, const WebKitCSSKeyframeRule* keyframeRule, KeyframeValue& keyframe)
1508ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
1509ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1510ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        addMatchedDeclaration(keyframeRule->style());
1511ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1512ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(!m_style);
1513ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1514ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Create the style
1515ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style = RenderStyle::clone(elementStyle);
1516ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1517ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_lineHeightValue = 0;
1518ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1519ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // We don't need to bother with !important. Since there is only ever one
1520ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // decl, there's nothing to override. So just add the first properties.
1521ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1522ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
1523ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1524ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied, go ahead and update it now.
1525ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1526ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1527ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1528ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Line-height is set when we are sure we decided on the font-size
1529ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_lineHeightValue)
1530ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
1531ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1532ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Now do rest of the properties.
1533ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1534ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
1535ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1536ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied by one of the non-essential font props,
1537ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // go ahead and update it a second time.
1538ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1539ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1540ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
15425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
15435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Add all the animating properties to the keyframe.
1545ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style()) {
1546ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        CSSMutableStyleDeclaration::const_iterator end = keyframeRule->style()->end();
1547ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        for (CSSMutableStyleDeclaration::const_iterator it = keyframeRule->style()->begin(); it != end; ++it) {
1548ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            int property = (*it).id();
1549ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Timing-function within keyframes is special, because it is not animated; it just
1550ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // describes the timing function between this keyframe and the next.
1551ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (property != CSSPropertyWebkitAnimationTimingFunction)
15525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                keyframe.addProperty(property);
1553ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
1554ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1555ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1556ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return m_style.release();
1557ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
1558ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::keyframeStylesForAnimation(Element* e, const RenderStyle* elementStyle, KeyframeList& list)
15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list.clear();
15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the keyframesRule for this name
15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || list.animationName().isEmpty())
15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1566d0825bca7fe65beaee391d30da42e937db621564Steve Block
1567d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_keyframesRuleMap.checkConsistency();
1568d0825bca7fe65beaee391d30da42e937db621564Steve Block
15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_keyframesRuleMap.contains(list.animationName().impl()))
15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebKitCSSKeyframesRule* rule = m_keyframesRuleMap.find(list.animationName().impl()).get()->second.get();
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Construct and populate the style for each keyframe
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < rule->length(); ++i) {
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Apply the declaration to the style. This is a simplified version of the logic in styleForElement
1577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initElement(e);
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        initForStyleResolve(e);
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1580ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        const WebKitCSSKeyframeRule* keyframeRule = rule->item(i);
15815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
15835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule, keyframe));
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Add this keyframe style to all the indicated key times
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<float> keys;
1587ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        keyframeRule->getKeys(keys);
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t keyIndex = 0; keyIndex < keys.size(); ++keyIndex) {
15895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            keyframe.setKey(keys[keyIndex]);
15905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            list.insert(keyframe);
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1594ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 0% keyframe is missing, create it (but only if there is at least one other keyframe)
1595ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int initialListSize = list.size();
15965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && list[0].key() != 0) {
15975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
15985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("0%");
15995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
16005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1602ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1603ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1604ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 100% keyframe is missing, create it (but only if there is at least one other keyframe)
16055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && (list[list.size() - 1].key() != 1)) {
16065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
16075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("100%");
16085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(1, 0);
16095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1611ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo, Element* e, RenderStyle* parentStyle, bool matchVisitedPseudoClass)
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
16206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Compute our :visited style first, so that we know whether or not we'll need to create a normal style just to hang it
1622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // off of.
1623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
16246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && parentStyle && parentStyle->insideLink()) {
1625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style with :visited in effect.
1626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentVisitedStyle = parentStyle->getCachedPseudoStyle(VISITED_LINK);
1627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = pseudoStyleForElement(pseudo, e, parentVisitedStyle ? parentVisitedStyle : parentStyle, true);
16282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (visitedStyle)
16292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
1630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(e, parentStyle, pseudo);
163368513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_style = RenderStyle::create();
163468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (parentStyle)
163568513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_style->inheritFrom(parentStyle);
163668513a70bcd92384395513322f1b801e7bf9c729Steve Block
16376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Since we don't use pseudo-elements in any of our quirk/print user agent rules, don't waste time walking
16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // those rules.
16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check UA, user and author rules.
16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1, firstUserRule = -1, lastUserRule = -1, firstAuthorRule = -1, lastAuthorRule = -1;
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
164768513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
164868513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchedDecls.isEmpty() && !visitedStyle)
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_style->setStyleType(pseudo);
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
1657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
16596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // High-priority properties.
166221939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
166321939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
166421939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUserRule, lastUserRule);
166521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority properties.
167621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
168121939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
168221939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
168321939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUserRule, lastUserRule);
168421939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
1690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1692bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), parentStyle, 0);
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
16955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
16965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Hang our visited style off m_style.
1698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle)
1699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
17038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
170506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForPage(int pageIndex)
170606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
17076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    initForStyleResolve(m_checker.m_document->documentElement()); // m_rootElementStyle will be set to the document style.
170806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
170906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style = RenderStyle::create();
171006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->inheritFrom(m_rootElementStyle);
171106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
171206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isLeft = isLeftPage(pageIndex);
171306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isFirst = isFirstPage(pageIndex);
171406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const String page = pageName(pageIndex);
171506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRules(defaultPrintStyle, isLeft, isFirst, page);
17165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_userStyle.get(), isLeft, isFirst, page);
17175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_authorStyle.get(), isLeft, isFirst, page);
171806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_lineHeightValue = 0;
171906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
172006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If our font got dirtied, go ahead and update it now.
172206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_fontDirty)
172306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        updateFont();
172406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Line-height is set when we are sure we decided on the font-size
172606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_lineHeightValue)
172706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
172806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
173006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
17325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
17335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
173406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now return the style.
173506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return m_style.release();
173606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
173706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(DATAGRID)
17390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumn(DataGridColumn*, RenderStyle*)
17410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumnHeader(DataGridColumn*, RenderStyle*)
17470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
17530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addIntrinsicMargins(RenderStyle* style)
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Intrinsic margin value.
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int intrinsicMargin = 2 * style->effectiveZoom();
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using width/height alone and not also dealing with min-width/max-width is flawed.
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using "quirk" to decide the margin wasn't set is kind of lame.
17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->width().isIntrinsicOrAuto()) {
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginLeft().quirk())
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginLeft(Length(intrinsicMargin, Fixed));
17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginRight().quirk())
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginRight(Length(intrinsicMargin, Fixed));
17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->height().isAuto()) {
17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginTop().quirk())
17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginTop(Length(intrinsicMargin, Fixed));
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginBottom().quirk())
17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginBottom(Length(intrinsicMargin, Fixed));
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool isAtShadowBoundary(Element* element)
17772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
17782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!element)
17792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return false;
17802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
17812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ContainerNode* parentNode = element->parentNode();
17822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return parentNode && parentNode->isShadowBoundary();
17832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
17842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1785bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid CSSStyleSelector::adjustRenderStyle(RenderStyle* style, RenderStyle* parentStyle, Element *e)
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our original display.
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setOriginalDisplay(style->display());
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() != NONE) {
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we have a <td> that specifies a float property, in quirks mode we just drop the float
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // property.
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Sites also commonly use display:inline/block on <td>s and <table>s.  In quirks mode we force
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // these tags to retain their display types.
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_checker.m_strictParsing && e) {
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (e->hasTagName(tdTag)) {
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE_CELL);
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setFloating(FNONE);
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (e->hasTagName(tableTag))
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE : TABLE);
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(tdTag) || e->hasTagName(thTag))) {
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->whiteSpace() == KHTML_NOWRAP) {
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Figure out if we are really nowrapping or if we should just
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // use normal instead.  If the width of the cell is fixed, then
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // we don't actually use NOWRAP.
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (style->width().isFixed())
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NORMAL);
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NOWRAP);
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Tables never support the -webkit-* values for text-align and will reset back to the default.
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(tableTag) && (style->textAlign() == WEBKIT_LEFT || style->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT))
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(TAAUTO);
18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Frames and framesets never honor position:relative or position:absolute.  This is necessary to
18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fix a crash where a site tries to position these objects.  They also never honor display.
18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(frameTag) || e->hasTagName(framesetTag))) {
18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setDisplay(BLOCK);
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Table headers with a text-align of auto will change the text-align to center.
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(thTag) && style->textAlign() == TAAUTO)
18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(CENTER);
18308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (e && e->hasTagName(legendTag))
18328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            style->setDisplay(BLOCK);
18338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Mutate the display to BLOCK or TABLE for certain cases, e.g., if someone attempts to
18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // position or float an inline, compact, or run-in.  Cache the original display, since it
18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // may be needed for positioned elements that have to compute their static normal flow
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // positions.  We also force inline-level roots to be block-level.
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->display() != BLOCK && style->display() != TABLE && style->display() != BOX &&
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (style->position() == AbsolutePosition || style->position() == FixedPosition || style->floating() != FNONE ||
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (e && e->document()->documentElement() == e))) {
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->display() == INLINE_TABLE)
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE);
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == INLINE_BOX)
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BOX);
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == LIST_ITEM) {
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // It is a WinIE bug that floated list items lose their bullets, so we'll emulate the quirk,
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // but only in quirks mode.
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_checker.m_strictParsing && style->floating() != FNONE)
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setDisplay(BLOCK);
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BLOCK);
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1855bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // FIXME: Don't support this mutation for pseudo styles like first-letter or first-line, since it's not completely
1856bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // clear how that should work.
1857a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (style->display() == INLINE && style->styleType() == NOPSEUDO && parentStyle && style->writingMode() != parentStyle->writingMode())
1858bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            style->setDisplay(INLINE_BLOCK);
1859bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // After performing the display mutation, check table rows.  We do not honor position:relative on
18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // table rows or cells.  This has been established in CSS2.1 (and caused a crash in containingBlock()
18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // on some sites).
18632bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW_GROUP
18642bde8e466a4451c7319e3a072d118917957d6554Steve Block             || style->display() == TABLE_FOOTER_GROUP || style->display() == TABLE_ROW) &&
18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             style->position() == RelativePosition)
18668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
186728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
186828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // writing-mode does not apply to table row groups, table column groups, table rows, and table columns.
186928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Table cells should be allowed to be perpendicular or flipped with respect to the table, though.
187028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->display() == TABLE_COLUMN || style->display() == TABLE_COLUMN_GROUP || style->display() == TABLE_FOOTER_GROUP
187128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW || style->display() == TABLE_ROW_GROUP
187228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_CELL)
187328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            style->setWritingMode(parentStyle->writingMode());
187428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
187528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Since we don't support block-flow on flexible boxes yet, disallow setting
1876a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // of block-flow to anything other than TopToBottomWritingMode.
1877bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // https://bugs.webkit.org/show_bug.cgi?id=46418 - Flexible box support.
187828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->writingMode() != TopToBottomWritingMode && (style->display() == BOX || style->display() == INLINE_BOX))
1879a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            style->setWritingMode(TopToBottomWritingMode);
18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make sure our z-index value is only applied if the object is positioned.
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->position() == StaticPosition)
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setHasAutoZIndex();
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Auto z-index becomes 0 for the root element and transparent objects.  This prevents
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // cases where objects that should be blended as a single unit end up with a non-transparent
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // object wedged in between them.  Auto z-index also becomes 0 for objects that specify transforms/masks/reflections.
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAutoZIndex() && ((e && e->document()->documentElement() == e) || style->opacity() < 1.0f ||
18908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        style->hasTransformRelatedProperty() || style->hasMask() || style->boxReflect()))
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setZIndex(0);
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1894f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && (e->hasTagName(WMLNames::insertedLegendTag)
1895f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick              || e->hasTagName(WMLNames::inputTag))
1896f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            && style->width().isAuto())
1897f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setWidth(Length(Intrinsic));
1898635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1899f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1900f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Textarea considers overflow visible as auto.
1901f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && e->hasTagName(textareaTag)) {
1902f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->overflowX());
1903f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->overflowY());
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Finally update our text decorations in effect, but don't allow text-decoration to percolate through
19072bde8e466a4451c7319e3a072d118917957d6554Steve Block    // tables, inline blocks, inline tables, run-ins, or shadow DOM.
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE || style->display() == RUN_IN
19092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        || style->display() == INLINE_BLOCK || style->display() == INLINE_BOX || isAtShadowBoundary(e))
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setTextDecorationsInEffect(style->textDecoration());
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->addToTextDecorationsInEffect(style->textDecoration());
19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If either overflow value is not visible, change to auto.
19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->overflowX() == OMARQUEE && style->overflowY() != OMARQUEE)
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OMARQUEE);
19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OMARQUEE && style->overflowX() != OMARQUEE)
19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OMARQUEE);
19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowX() == OVISIBLE && style->overflowY() != OVISIBLE)
19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OAUTO);
19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OVISIBLE && style->overflowX() != OVISIBLE)
19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OAUTO);
19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Table rows, sections and the table itself will support overflow:hidden and will ignore scroll/auto.
19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Eventually table sections will support auto and scroll.
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE ||
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->display() == TABLE_ROW_GROUP || style->display() == TABLE_ROW) {
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() != OVISIBLE && style->overflowX() != OHIDDEN)
19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() != OVISIBLE && style->overflowY() != OHIDDEN)
19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Menulists should have visible overflow
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->appearance() == MenulistPart) {
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OVISIBLE);
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OVISIBLE);
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cull out any useless layers and also repeat patterns into additional layers.
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustBackgroundLayers();
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustMaskLayers();
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Do the same for animations and transitions.
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustAnimations();
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustTransitions();
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Important: Intrinsic margins get added to controls before the theme has adjusted the style, since the theme will
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // alter fonts and heights/widths.
19508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (e && e->isFormControlElement() && style->fontSize() >= 11) {
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Don't apply intrinsic margins to image buttons.  The designer knows how big the images are,
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // so we have to treat all image buttons as though they were explicitly sized.
195368513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!e->hasTagName(inputTag) || !static_cast<HTMLInputElement*>(e)->isImageButton())
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addIntrinsicMargins(style);
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Let the theme also have a crack at adjusting the style.
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAppearance())
19590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RenderTheme::defaultTheme()->adjustStyle(this, style, e, m_hasUAAppearance, m_borderData, m_backgroundData, m_backgroundColor);
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e && e->isSVGElement()) {
19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Spec: http://www.w3.org/TR/SVG/masking.html#OverflowProperty
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() == OSCROLL)
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OHIDDEN);
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowY() == OAUTO)
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() == OSCROLL)
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OHIDDEN);
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowX() == OAUTO)
19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only the root <svg> element in an SVG document fragment tree honors css position
19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!(e->hasTagName(SVGNames::svgTag) && e->parentNode() && !e->parentNode()->isSVGElement()))
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(RenderStyle::initialPosition());
19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::updateFont()
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForTextSizeAdjust();
19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForGenericFamilyChange(style(), m_parentStyle);
19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForZoomChange(style(), m_parentStyle);
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->font().update(m_fontSelector);
19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontDirty = false;
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::cacheBorderAndBackground()
19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasUAAppearance = m_style->hasAppearance();
19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasUAAppearance) {
19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_borderData = m_style->border();
19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundData = *m_style->backgroundLayers();
19968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundColor = m_style->backgroundColor();
19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2000e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::styleRulesForElement(Element* e, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2002e14391e94c850b8bd03680c23b38978db68687a8John Reck    return pseudoStyleRulesForElement(e, NOPSEUDO, authorOnly, includeEmptyRules, filter);
2003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2005e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::pseudoStyleRulesForElement(Element* e, PseudoId pseudoId, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
2006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || !e->document()->haveStylesheetsLoaded())
20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = true;
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(e);
2013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initForStyleResolve(e, 0, pseudoId);
20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!authorOnly) {
20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstUARule = -1, lastUARule = -1;
20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First we match rules from the user agent sheet.
20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        matchUARules(firstUARule, lastUARule);
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we check user sheet rules.
20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles) {
20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int firstUserRule = -1, lastUserRule = -1;
202368513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, includeEmptyRules);
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
2028e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = (filter == SameOriginCSSRulesOnly);
2029e14391e94c850b8bd03680c23b38978db68687a8John Reck
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check the rules in author sheets.
20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstAuthorRule = -1, lastAuthorRule = -1;
203268513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, includeEmptyRules);
2033e14391e94c850b8bd03680c23b38978db68687a8John Reck
2034e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = false;
20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = false;
2038e14391e94c850b8bd03680c23b38978db68687a8John Reck
20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_ruleList.release();
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20422fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSStyleSelector::checkSelector(const RuleData& ruleData)
20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_dynamicPseudo = NOPSEUDO;
20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
204681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Let the slow path handle SVG as it has some additional rules regarding shadow trees.
204781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (ruleData.hasFastCheckableSelector() && !m_element->isSVGElement()) {
20482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know this selector does not include any pseudo selectors.
20492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_checker.m_pseudoStyle != NOPSEUDO)
20502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know a sufficiently simple single part selector matches simply because we found it from the rule hash.
20522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // This is limited to HTML only so we don't need to check the namespace.
20532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (ruleData.hasTopSelectorMatchingHTMLBasedOnRuleHash() && !ruleData.hasMultipartSelector() && m_element->isHTMLElement())
20542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return true;
20552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return SelectorChecker::fastCheckSelector(ruleData.selector(), m_element);
20562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Slow path.
20592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    SelectorMatch match = m_checker.checkSelector(ruleData.selector(), m_element, &m_selectorAttrs, m_dynamicPseudo, false, false, style(), m_parentNode ? m_parentNode->renderStyle() : 0);
20608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (match != SelectorMatches)
20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_checker.m_pseudoStyle != NOPSEUDO && m_checker.m_pseudoStyle != m_dynamicPseudo)
20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
20652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool selectorTagMatches(const Element* element, const CSSSelector* selector)
20682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selector->hasTag())
20702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
20712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
20722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom && localName != element->localName())
20732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
20742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& namespaceURI = selector->tag().namespaceURI();
20752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return namespaceURI == starAtom || namespaceURI == element->namespaceURI();
20762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20782fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isFastCheckableSelector(const CSSSelector* selector)
20792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (; selector; selector = selector->tagHistory()) {
208181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (selector->relation() != CSSSelector::Descendant && selector->relation() != CSSSelector::Child && selector->relation() != CSSSelector::SubSelector)
20822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (selector->m_match != CSSSelector::None && selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
20842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
208881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
208981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate <class ValueChecker>
209081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool fastCheckSingleSelector(const CSSSelector*& selector, const Element*& element, const CSSSelector*& topChildOrSubselector, const Element*& topChildOrSubselectorMatchElement)
209181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
209281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    AtomicStringImpl* value = selector->value().impl();
209381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (; element; element = element->parentElement()) {
209481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (ValueChecker::checkValue(element, value) && selectorTagMatches(element, selector)) {
209581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() == CSSSelector::Descendant)
209681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = 0;
209781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            else if (!topChildOrSubselector) {
209881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector);
209981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = selector;
210081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselectorMatchElement = element;
210181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
210281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() != CSSSelector::SubSelector)
210381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                element = element->parentElement();
210481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = selector->tagHistory();
210581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
210681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
210781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (topChildOrSubselector) {
210881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Child or subselector check failed.
210981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // If the match element is null, topChildOrSubselector was also the very topmost selector and had to match
211081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // the original element we were checking.
211181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!topChildOrSubselectorMatchElement)
211281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
211381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // There may be other matches down the ancestor chain.
211481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Rewind to the topmost child or subselector and the element it matched, continue checking ancestors.
211581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = topChildOrSubselector;
211681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            element = topChildOrSubselectorMatchElement->parentElement();
211781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            topChildOrSubselector = 0;
211881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
211981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
212081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
212181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
212281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
212381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
212481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct ClassCheck {
212581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
212681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
212781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasClass() && static_cast<const StyledElement*>(element)->classNames().contains(value);
212881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
212981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
213081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct IdCheck {
213181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
213281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasID() && element->idForStyleResolution().impl() == value;
213481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
213581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
213681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct TagCheck {
213781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element*, AtomicStringImpl*)
213881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
214081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
214181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool CSSStyleSelector::SelectorChecker::fastCheckSelector(const CSSSelector* selector, const Element* element)
21442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
21452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(isFastCheckableSelector(selector));
21462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The top selector requires tag check only as rule hashes have already handled id and class matches.
21482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(element, selector))
21492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
21502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
215181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const CSSSelector* topChildOrSubselector = 0;
215281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const Element* topChildOrSubselectorMatchElement = 0;
215381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector)
215481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        topChildOrSubselector = selector;
215581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
215681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() != CSSSelector::SubSelector)
215781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        element = element->parentElement();
215881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
21592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    selector = selector->tagHistory();
216081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
216181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We know this compound selector has descendant, child and subselector combinators only and all components are simple.
216281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (selector) {
21632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (selector->m_match) {
21642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Class:
216581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<ClassCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
216681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Id:
216981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<IdCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::None:
217381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<TagCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        default:
21772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ASSERT_NOT_REACHED();
21782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
21792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
21802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
21812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
21822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Recursive check of selectors and combinators
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// It can return 3 different values:
21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorMatches         - the selector matches the element e
21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsLocally    - the selector fails for the element e
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsCompletely - the selector fails for e and any sibling or ancestor of e
2188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCSSStyleSelector::SelectorMatch CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Spec: CSS2 selectors cannot be applied to the (conceptually) cloned DOM tree
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // because its contents are not part of the formal document structure.
2193f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isSVGElement() && e->isShadowRoot())
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsCompletely;
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // first selector has to match
21982bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!checkOneSelector(sel, e, selectorAttrs, dynamicPseudo, isSubSelector, encounteredLink, elementStyle, elementParentStyle))
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsLocally;
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The rest of the selectors has to match
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSSelector::Relation relation = sel->relation();
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Prepare next sel
2205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sel = sel->tagHistory();
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sel)
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorMatches;
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (relation != CSSSelector::SubSelector)
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Bail-out if this selector is irrelevant for the pseudoStyle
22118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (m_pseudoStyle != NOPSEUDO && m_pseudoStyle != dynamicPseudo)
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SelectorFailsCompletely;
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Check for nested links.
2215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchVisitedPseudoClass && !isSubSelector) {
2216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* currentStyle = elementStyle ? elementStyle : e->renderStyle();
2217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (currentStyle && currentStyle->insideLink() && e->isLink()) {
2218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (encounteredLink)
2219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false; // This link is not relevant to the style being resolved, so disable matching.
2220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            else
2221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                encounteredLink = true;
2222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (relation) {
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Descendant:
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
2228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ContainerNode* n = e->parentNode();
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n || !n->isElementNode())
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsCompletely;
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Child:
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2239a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ContainerNode* n = e->parentNode();
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n || !n->isElementNode())
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::DirectAdjacent:
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByDirectAdjacentRules();
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Node* n = e->previousSibling();
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (n && !n->isElementNode())
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n = n->previousSibling();
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n)
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsLocally;
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_matchVisitedPseudoClass = false;
2259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::IndirectAdjacent:
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByForwardPositionalRules();
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Node* n = e->previousSibling();
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                while (n && !n->isElementNode())
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    n = n->previousSibling();
22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n)
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsLocally;
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false;
2275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::SubSelector:
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // a selector is invalid if something follows a pseudo-element
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We make an exception for scrollbar pseudo elements and allow a set of pseudo classes (but nothing else)
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to follow the pseudo elements.
2284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ((elementStyle || m_collectRulesOnly) && dynamicPseudo != NOPSEUDO && dynamicPseudo != SELECTION &&
22858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                !((RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER) && sel->m_match == CSSSelector::PseudoClass))
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
2287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle);
228865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case CSSSelector::ShadowDescendant:
228965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
229065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Node* shadowHostNode = e->shadowAncestorNode();
229165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (shadowHostNode == e || !shadowHostNode->isElementNode())
229265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                return SelectorFailsCompletely;
229365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            e = static_cast<Element*>(shadowHostNode);
229465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
229565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SelectorFailsCompletely;
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    set->add(qName.localName().impl());
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Mozilla treats all other values as case-sensitive, thus so do we.
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, accept_charsetAttr);
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, acceptAttr);
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alignAttr);
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alinkAttr);
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, axisAttr);
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, bgcolorAttr);
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, charsetAttr);
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, checkedAttr);
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, clearAttr);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, codetypeAttr);
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, colorAttr);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, compactAttr);
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, declareAttr);
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, deferAttr);
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, dirAttr);
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, disabledAttr);
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, enctypeAttr);
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, faceAttr);
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, frameAttr);
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, hreflangAttr);
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, http_equivAttr);
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, langAttr);
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, languageAttr);
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, linkAttr);
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, mediaAttr);
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, methodAttr);
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, multipleAttr);
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nohrefAttr);
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noresizeAttr);
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noshadeAttr);
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nowrapAttr);
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, readonlyAttr);
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, relAttr);
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, revAttr);
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, rulesAttr);
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scopeAttr);
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scrollingAttr);
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, selectedAttr);
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, shapeAttr);
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, targetAttr);
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, textAttr);
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, typeAttr);
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valignAttr);
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valuetypeAttr);
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, vlinkAttr);
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attrSet;
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr)
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isPossibleHTMLAttr = !attr.hasPrefix() && (attr.namespaceURI() == nullAtom);
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return isPossibleHTMLAttr && htmlCaseInsensitiveAttributesSet->contains(attr.localName().impl());
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23682bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2370cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(e);
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(e, sel))
23752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->hasAttribute()) {
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Class)
23792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasClass() && static_cast<StyledElement*>(e)->classNames().contains(sel->value());
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Id)
23822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasID() && e->idForStyleResolution() == sel->value();
2383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const QualifiedName& attr = sel->attribute();
23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Handle the case were elementStyle is 0.
2387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (elementStyle && (!e->isStyledElement() || (!static_cast<StyledElement*>(e)->isMappedAttribute(attr) && attr != typeAttr && attr != readonlyAttr))) {
23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            elementStyle->setAffectedByAttributeSelectors(); // Special-case the "type" and "readonly" attributes so input form controls can share style.
23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (selectorAttrs)
2390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                selectorAttrs->add(attr.localName().impl());
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const AtomicString& value = e->getAttribute(attr);
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value.isNull())
23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false; // attribute is not set
23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool caseSensitive = !m_documentIsHTML || !htmlAttributeHasCaseInsensitiveValue(attr);
23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->m_match) {
24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Exact:
24012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (caseSensitive ? sel->value() != value : !equalIgnoringCase(sel->value(), value))
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::List:
24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ignore empty selectors or selectors containing spaces
24072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (sel->value().contains(' ') || sel->value().isEmpty())
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2410f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            unsigned startSearchAt = 0;
24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
24122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                size_t foundPos = value.find(sel->value(), startSearchAt, caseSensitive);
2413f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == notFound)
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
2415f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == 0 || value[foundPos - 1] == ' ') {
24162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    unsigned endStr = foundPos + sel->value().length();
24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (endStr == value.length() || value[endStr] == ' ')
24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break; // We found a match.
24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2421f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                // No match. Keep looking.
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                startSearchAt = foundPos + 1;
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Contain:
24272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.contains(sel->value(), caseSensitive) || sel->value().isEmpty())
24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Begin:
24312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(sel->value(), caseSensitive) || sel->value().isEmpty())
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::End:
24352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.endsWith(sel->value(), caseSensitive) || sel->value().isEmpty())
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Hyphen:
24392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() < sel->value().length())
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(sel->value(), caseSensitive))
24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // It they start the same, check for exact match or following '-':
24442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() != sel->value().length() && value[sel->value().length()] != '-')
24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoClass:
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoElement:
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoClass) {
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle :not up front.
24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->pseudoType() == CSSSelector::PseudoNot) {
24572bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(sel->selectorList());
24582bde8e466a4451c7319e3a072d118917957d6554Steve Block            for (CSSSelector* subSel = sel->selectorList()->first(); subSel; subSel = subSel->tagHistory()) {
24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // :not cannot nest. I don't really know why this is a
24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // restriction in CSS3, but it is, so let's honor it.
24618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                // the parser enforces that this never occurs
24622bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(subSel->pseudoType() != CSSSelector::PseudoNot);
24638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
24642bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!checkOneSelector(subSel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle))
24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo != NOPSEUDO && (RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER)) {
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // CSS scrollbars match a specific subset of pseudo classes, and they have specialized rules for each
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // (since there are no elements involved).
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return checkScrollbarPseudoClass(sel, dynamicPseudo);
24718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo == SELECTION) {
24728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
24738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return !m_document->page()->focusController()->isActive();
24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Normal element pseudo class checking.
24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->pseudoType()) {
24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Pseudo classes:
24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNot:
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break; // Already handled up above.
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEmpty: {
24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bool result = true;
24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (Node* n = e->firstChild(); n; n = n->nextSibling()) {
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (n->isElementNode()) {
24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = false;
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (n->isTextNode()) {
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Text* textNode = static_cast<Text*>(n);
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!textNode->data().isEmpty()) {
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = false;
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_collectRulesOnly) {
24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setEmptyState(result);
24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle() && (e->document()->usesSiblingRules() || e->renderStyle()->unique()))
24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setEmptyState(result);
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return result;
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstChild: {
25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-child matches the first child that is an element
25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstOfType: {
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-of-type matches the first element of its type
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastChild: {
25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-child matches the last child that is an element
2548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
2550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (parentElement->isFinishedParsingChildren()) {
25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Node* n = e->nextSibling();
25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = true;
25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2559635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastOfType: {
25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-of-type matches the last element of its type
2571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyChild: {
2594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
25978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
2603635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (firstChild && parentElement->isFinishedParsingChildren()) {
26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (firstChild && childStyle)
26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (lastChild && childStyle)
26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
26218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyOfType: {
26278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: This selector is very slow.
2628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
26348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
26398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
26408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
26418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
26458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstChild) {
26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n) {
26528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthChild: {
2664635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
26658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
26688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode()) {
26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            RenderStyle* s = n->renderStyle();
26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned index = s ? s->childIndex() : 0;
26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (index) {
26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                count += index;
26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            }
26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2684635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (childStyle)
26868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setChildIndex(count);
26878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
26888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2691635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
26928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthOfType: {
2697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
26988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2699635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
27038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
27078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastChild: {
2721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode())
27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2738635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastOfType: {
2744635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2746635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2748635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2762635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoTarget:
27688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (e == e->document()->cssTarget())
27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27712bde8e466a4451c7319e3a072d118917957d6554Steve Block            case CSSSelector::PseudoAny:
27722bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* selector = sel->selectorList()->first(); selector; selector = CSSSelectorList::next(selector)) {
27732bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (checkSelector(selector, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle) == SelectorMatches)
27742bde8e466a4451c7319e3a072d118917957d6554Steve Block                        return true;
27752bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
27762bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
27778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoAnyLink:
2778dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
27798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoAutofill: {
27828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
27838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
27842bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (InputElement* inputElement = e->toInputElement())
27858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return inputElement->isAutofilled();
27868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
27888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLink:
2789dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2790dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return !m_matchVisitedPseudoClass;
27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoVisited:
2793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return m_matchVisitedPseudoClass;
27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDrag: {
27978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (elementStyle)
27988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    elementStyle->setAffectedByDragRules(true);
27998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (e->renderStyle())
28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    e->renderStyle()->setAffectedByDragRules(true);
28018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->renderer() && e->renderer()->isDragging())
28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFocus:
2806dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                if (e && e->focused() && e->document()->frame() && e->document()->frame()->selection()->isFocusedAndActive())
28078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoHover: {
28108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then hover should never match anchors with no
28118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:hover should not match anything.  This is important for sites like wsj.com.
28128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByHoverRules(true);
28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByHoverRules(true);
28178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->hovered())
28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoActive:
28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then :active should never match anchors with no
28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:active should not match anything.
28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByActiveRules(true);
28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByActiveRules(true);
28308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->active())
28318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEnabled:
2835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return e->isEnabledFormControl();
28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFullPageMedia:
28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return e && e->document() && e->document()->isMediaDocument();
28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
2841231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSSelector::PseudoDefault:
2842231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return e && e->isDefaultButtonForForm();
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDisabled:
2844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return !e->isEnabledFormControl();
28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadOnly: {
28488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && e->isReadOnlyFormControl();
28518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadWrite: {
28538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && !e->isReadOnlyFormControl();
28568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoOptional:
28580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isOptionalFormControl();
28590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoRequired:
28600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isRequiredFormControl();
2861d0825bca7fe65beaee391d30da42e937db621564Steve Block            case CSSSelector::PseudoValid: {
2862d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2863d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2864d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
2865d0825bca7fe65beaee391d30da42e937db621564Steve Block                return e->willValidate() && e->isValidFormControlElement();
2866d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoInvalid: {
2867d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2868d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2869d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
28705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return (e->willValidate() && !e->isValidFormControlElement()) || e->hasUnacceptableValue();
2871d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoChecked: {
28728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Even though WinIE allows checked and indeterminate to co-exist, the CSS selector spec says that
28758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // you can't be both checked and indeterminate.  We will behave like WinIE behind the scenes and just
28768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // obey the CSS spec here in the test for matching the pseudo.
28772bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isChecked() && !inputElement->isIndeterminate())
28798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoIndeterminate: {
28838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28852bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isIndeterminate())
28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoRoot:
28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e == e->document()->documentElement())
28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLang: {
28955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                AtomicString value = e->computeInheritedLanguage();
2896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                const AtomicString& argument = sel->argument();
2897f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (value.isEmpty() || !value.startsWith(argument, false))
28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (value.length() != argument.length() && value[argument.length()] != '-')
29008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
29028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
29035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
29045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreen:
29055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, and the document's current fullscreen
29065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // element is an element in the document, the 'full-screen' pseudoclass applies to
29075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // that element. Also, an <iframe>, <object> or <embed> element whose child browsing
29085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // context's Document is in the fullscreen state has the 'full-screen' pseudoclass applied.
2909cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (e != e->document()->webkitCurrentFullScreenElement())
29125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreenDocument:
29155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
2916cad810f21b803229eb11403f9209855525a25d57Steve Block                // to all elements of that Document.
2917cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
2921cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoInRange:
2922cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2923cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2924cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2925cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isInRange();
2926cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoOutOfRange:
2927cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2928cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2929cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2930cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isOutOfRange();
29318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoUnknown:
29328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNotParsed:
29338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
29348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
29368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoElement) {
2940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!elementStyle && !m_collectRulesOnly)
29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PseudoId pseudoId = CSSSelector::pseudoId(sel->pseudoType());
2944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pseudoId == FIRST_LETTER) {
2945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (Document* document = e->document())
2946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                document->setUsesFirstLetterRules(true);
2947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
294865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (pseudoId != NOPSEUDO)
2949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            dynamicPseudo = pseudoId;
29508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ### add the rest of the checks...
29528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
29538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass(CSSSelector* sel, PseudoId&) const
29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderScrollbar* scrollbar = RenderScrollbar::scrollbarForStyleResolve();
29588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarPart part = RenderScrollbar::partForStyleResolve();
29598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This is a temporary hack for resizers and scrollbar corners.  Eventually :window-inactive should become a real
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // pseudo class and just apply to everything.
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !m_document->page()->focusController()->isActive();
29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!scrollbar)
29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(sel->m_match == CSSSelector::PseudoClass);
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (sel->pseudoType()) {
29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnabled:
29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->enabled();
29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDisabled:
29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return !scrollbar->enabled();
29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHover: {
29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart hoveredPart = scrollbar->hoveredPart();
29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart != NoPart;
29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart == BackTrackPart || hoveredPart == ForwardTrackPart || hoveredPart == ThumbPart;
29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == hoveredPart;
29818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoActive: {
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart pressedPart = scrollbar->pressedPart();
29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart != NoPart;
29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart == BackTrackPart || pressedPart == ForwardTrackPart || pressedPart == ThumbPart;
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == pressedPart;
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHorizontal:
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == HorizontalScrollbar;
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoVertical:
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == VerticalScrollbar;
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDecrement:
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == BackButtonEndPart || part == BackTrackPart;
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoIncrement:
29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == ForwardButtonStartPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoStart:
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart;
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnd:
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDoubleButton: {
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart)
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleStart || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart)
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleEnd || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoSingleButton: {
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonEndPart || part == BackTrackPart || part == ForwardTrackPart)
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsSingle;
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoNoButton: {
30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackTrackPart)
30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleEnd;
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ForwardTrackPart)
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleStart;
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoCornerPresent:
30252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return scrollbar->scrollableArea()->isScrollCornerVisible();
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -----------------------------------------------------------------
30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30332fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* selector)
30342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& selectorNamespace = selector->tag().namespaceURI();
30362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selectorNamespace != starAtom && selectorNamespace != xhtmlNamespaceURI)
30372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match == CSSSelector::None)
30392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
30402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
30412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return selector->tag() == starAtom;
30432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30452fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleData::RuleData(CSSStyleRule* rule, CSSSelector* selector, unsigned position)
30462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_rule(rule)
30472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_selector(selector)
304881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_specificity(selector->specificity())
30492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_position(position)
30502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasFastCheckableSelector(isFastCheckableSelector(selector))
30512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasMultipartSelector(selector->tagHistory())
30522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasTopSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector))
30532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectDescendantSelectorIdentifierHashes();
30552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30572fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectIdentifierHashes(const CSSSelector* selector, unsigned& identifierCount)
30582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ((selector->m_match == CSSSelector::Id || selector->m_match == CSSSelector::Class) && !selector->value().isEmpty())
30602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = selector->value().impl()->existingHash();
30612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (identifierCount == maximumIdentifierCount)
30622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
30632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
30642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom)
30652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = localName.impl()->existingHash();
30662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30682fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectDescendantSelectorIdentifierHashes()
30692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned identifierCount = 0;
30712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector::Relation relation = m_selector->relation();
30722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Skip the topmost selector. It is handled quickly by the rule hashes.
30742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool skipOverSubselectors = true;
30752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (const CSSSelector* selector = m_selector->tagHistory(); selector; selector = selector->tagHistory()) {
30762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Only collect identifiers that match ancestors.
30772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (relation) {
30782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::SubSelector:
30792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!skipOverSubselectors)
30802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                collectIdentifierHashes(selector, identifierCount);
30812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::DirectAdjacent:
30832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::IndirectAdjacent:
30842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::ShadowDescendant:
30852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = true;
30862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Descendant:
30882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Child:
30892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = false;
30902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            collectIdentifierHashes(selector, identifierCount);
30912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
30932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (identifierCount == maximumIdentifierCount)
30942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
30952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        relation = selector->relation();
30962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
30972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_descendantSelectorIdentifierHashes[identifierCount] = 0;
30982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
31002fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::RuleSet()
31015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    : m_ruleCount(0)
31022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_autoShrinkToFitEnabled(true)
31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31062fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::~RuleSet()
31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_idRules);
31098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_classRules);
31102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    deleteAllValues(m_pseudoRules);
31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_tagRules);
31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31152fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              CSSStyleRule* rule, CSSSelector* sel)
31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!key) return;
31192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData>* rules = map.get(key);
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules) {
31212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rules = new Vector<RuleData>;
31228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        map.set(key, rules);
31232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
31242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    rules->append(RuleData(rule, sel, m_ruleCount++));
31258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31272fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRule(CSSStyleRule* rule, CSSSelector* sel)
31288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Id) {
31302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_idRules, rule, sel);
31318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Class) {
31342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_classRules, rule, sel);
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
313865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (sel->isUnknownPseudoElement()) {
31392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_pseudoRules, rule, sel);
314065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
314165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
314265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = sel->tag().localName();
31448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (localName != starAtom) {
31458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addToRuleSet(localName.impl(), m_tagRules, rule, sel);
31468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
314865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.append(RuleData(rule, sel, m_ruleCount++));
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31522fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addPageRule(CSSStyleRule* rule, CSSSelector* sel)
315321939df44de1705786c545cd1bf519d47250322dBen Murdoch{
31542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.append(RuleData(rule, sel, m_pageRules.size()));
315521939df44de1705786c545cd1bf519d47250322dBen Murdoch}
315621939df44de1705786c545cd1bf519d47250322dBen Murdoch
31572fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRulesFromSheet(CSSStyleSheet* sheet, const MediaQueryEvaluator& medium, CSSStyleSelector* styleSelector)
31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sheet)
31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No media implies "all", but if a media list exists it must
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // contain our current medium
31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sheet->media() && !medium.eval(sheet->media(), styleSelector))
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return; // the style sheet doesn't apply
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = sheet->length();
31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StyleBase* item = sheet->item(i);
31716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (item->isStyleRule())
31726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            addStyleRule(static_cast<CSSStyleRule*>(item));
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isImportRule()) {
31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSImportRule* import = static_cast<CSSImportRule*>(item);
31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!import->media() || medium.eval(import->media(), styleSelector))
31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addRulesFromSheet(import->styleSheet(), medium, styleSelector);
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isMediaRule()) {
31798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMediaRule* r = static_cast<CSSMediaRule*>(item);
31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSRuleList* rules = r->cssRules();
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((!r->media() || medium.eval(r->media(), styleSelector)) && rules) {
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Traverse child elements of the @media rule.
31848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned j = 0; j < rules->length(); j++) {
31858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    CSSRule *childItem = rules->item(j);
31868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (childItem->isStyleRule()) {
31878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // It is a StyleRule, so append it to our list
31886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        addStyleRule(static_cast<CSSStyleRule*>(childItem));
31898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isFontFaceRule() && styleSelector) {
31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this font face to our set.
31918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(childItem);
31928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isKeyframesRule() && styleSelector) {
31948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this keyframe rule to our set.
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(childItem));
31968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }   // for rules
31988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }   // if rules
31998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isFontFaceRule() && styleSelector) {
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Add this font face to our set.
32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(item);
32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isKeyframesRule())
32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(item));
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_autoShrinkToFitEnabled)
32072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        shrinkToFit();
32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32102fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addStyleRule(CSSStyleRule* rule)
3211545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
32126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (rule->isPageRule()) {
32136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPageRule* pageRule = static_cast<CSSPageRule*>(rule);
3214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        addPageRule(pageRule, pageRule->selectorList().first());
3215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else {
3216545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s))
3217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addRule(rule, s);
3218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
3219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
322081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
322181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline void collectFeaturesFromSelector(CSSStyleSelector::Features& features, const CSSSelector* selector)
322281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
322381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->m_match == CSSSelector::Id && !selector->value().isEmpty())
322481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.idsInRules.add(selector->value().impl());
322581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (selector->pseudoType()) {
322681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoFirstLine:
322781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesFirstLineRules = true;
322881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
322981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoBefore:
323081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoAfter:
323181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesBeforeAfterRules = true;
323281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoLink:
323481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoVisited:
323581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesLinkRules = true;
323681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    default:
323881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
324081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
3241545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
324281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void collectFeaturesFromList(CSSStyleSelector::Features& features, const Vector<RuleData>& rules)
3243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
32442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules.size();
32452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
32462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules[i];
3247ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        bool foundSiblingSelector = false;
32482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (CSSSelector* selector = ruleData.selector(); selector; selector = selector->tagHistory()) {
324981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            collectFeaturesFromSelector(features, selector);
32502bde8e466a4451c7319e3a072d118917957d6554Steve Block
32512bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (CSSSelectorList* selectorList = selector->selectorList()) {
32522bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* subSelector = selectorList->first(); subSelector; subSelector = CSSSelectorList::next(subSelector)) {
32532bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (selector->isSiblingSelector())
32542bde8e466a4451c7319e3a072d118917957d6554Steve Block                        foundSiblingSelector = true;
32552bde8e466a4451c7319e3a072d118917957d6554Steve Block                    collectFeaturesFromSelector(features, subSelector);
32562bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
32572bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else if (selector->isSiblingSelector())
3258ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                foundSiblingSelector = true;
3259ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3260ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (foundSiblingSelector) {
326181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!features.siblingRules)
326281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                features.siblingRules = adoptPtr(new RuleSet);
326381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            features.siblingRules->addRule(ruleData.rule(), ruleData.selector());
3264ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3265ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
3266ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3267ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
326881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid RuleSet::collectFeatures(CSSStyleSelector::Features& features) const
3269ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
3270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    AtomRuleMap::const_iterator end = m_idRules.end();
3271ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_idRules.begin(); it != end; ++it)
327281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3273ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_classRules.end();
3274ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_classRules.begin(); it != end; ++it)
327581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3276ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_tagRules.end();
3277ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_tagRules.begin(); it != end; ++it)
327881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3279ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_pseudoRules.end();
3280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_pseudoRules.begin(); it != end; ++it)
328181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
328281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    collectFeaturesFromList(features, m_universalRules);
32832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void shrinkMapVectorsToFit(RuleSet::AtomRuleMap& map)
32862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet::AtomRuleMap::iterator end = map.end();
32882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (RuleSet::AtomRuleMap::iterator it = map.begin(); it != end; ++it)
32892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        it->second->shrinkToFit();
32902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::shrinkToFit()
32932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_idRules);
32952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_classRules);
32962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_tagRules);
32972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_pseudoRules);
32982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.shrinkToFit();
32992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.shrinkToFit();
3300ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3301ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
33028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------------------------------------------------------------------------------------
33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// this is mostly boring stuff on how to apply a certain rule to the renderstyle...
33048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33052bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, bool toFloat, double multiplier = 1, bool *ok = 0)
33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This function is tolerant of a null style value. The only place style is used is in
3308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // length measurements, like 'ems' and 'px'. And in those cases style is only used
3309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // when the units are EMS or EXS. So we will just fail in those cases.
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!primitiveValue) {
33128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ok)
33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
3316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!style && (type == CSSPrimitiveValue::CSS_EMS || type == CSSPrimitiveValue::CSS_EXS || type == CSSPrimitiveValue::CSS_REMS)) {
3318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (ok)
3319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                *ok = false;
33202bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
33212bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (toFloat)
33222bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthDouble(style, rootStyle, multiplier), Fixed);
33232bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
33242bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthIntForLength(style, rootStyle, multiplier), Fixed);
33252bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
33268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
33288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ok)
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return l;
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33352bde8e466a4451c7319e3a072d118917957d6554Steve Block
33362bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToIntLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33372bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33382bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, false, multiplier, ok);
33392bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33402bde8e466a4451c7319e3a072d118917957d6554Steve Block
33412bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToFloatLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33422bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33432bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, true, multiplier, ok);
33442bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
334621939df44de1705786c545cd1bf519d47250322dBen Murdochtemplate <bool applyFirst>
334721939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSStyleSelector::applyDeclarations(bool isImportant, int startIndex, int endIndex)
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (startIndex == -1)
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = startIndex; i <= endIndex; i++) {
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSMutableStyleDeclaration* decl = m_matchedDecls[i];
3354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSMutableStyleDeclaration::const_iterator end = decl->end();
3355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (CSSMutableStyleDeclaration::const_iterator it = decl->begin(); it != end; ++it) {
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSProperty& current = *it;
33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isImportant == current.isImportant()) {
335821939df44de1705786c545cd1bf519d47250322dBen Murdoch                int property = current.id();
335921939df44de1705786c545cd1bf519d47250322dBen Murdoch
336021939df44de1705786c545cd1bf519d47250322dBen Murdoch                if (applyFirst) {
336121939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(firstCSSProperty == CSSPropertyColor, CSS_color_is_first_property);
33622bde8e466a4451c7319e3a072d118917957d6554Steve Block                    COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyColor + 14, CSS_zoom_is_end_of_first_prop_range);
336321939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyZoom + 1, CSS_line_height_is_after_zoom);
336421939df44de1705786c545cd1bf519d47250322dBen Murdoch
336521939df44de1705786c545cd1bf519d47250322dBen Murdoch                    // give special priority to font-xxx, color properties, etc
336621939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property <= CSSPropertyLineHeight) {
336721939df44de1705786c545cd1bf519d47250322dBen Murdoch                        // we apply line-height later
336821939df44de1705786c545cd1bf519d47250322dBen Murdoch                        if (property == CSSPropertyLineHeight)
336921939df44de1705786c545cd1bf519d47250322dBen Murdoch                            m_lineHeightValue = current.value();
337021939df44de1705786c545cd1bf519d47250322dBen Murdoch                        else
337121939df44de1705786c545cd1bf519d47250322dBen Murdoch                            applyProperty(current.id(), current.value());
337221939df44de1705786c545cd1bf519d47250322dBen Murdoch                    }
337321939df44de1705786c545cd1bf519d47250322dBen Murdoch                } else {
337421939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property > CSSPropertyLineHeight)
337521939df44de1705786c545cd1bf519d47250322dBen Murdoch                        applyProperty(current.id(), current.value());
33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
33778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33822fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRules(RuleSet* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
338306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
338406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_matchedRules.clear();
338506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
338606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
338706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
338806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
338906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRulesForList(rules->getPageRules(), isLeftPage, isFirstPage, pageName);
339006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If we didn't match any rules, we're done.
339206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_matchedRules.isEmpty())
339306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
339406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Sort the set of matched rules.
339681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sortMatchedRules();
339706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now transfer the set of matched rules over to our list of decls.
339906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    for (unsigned i = 0; i < m_matchedRules.size(); i++)
340006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
340106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
340206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34032fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRulesForList(const Vector<RuleData>* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
340406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
340506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
340606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
340706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules->size();
34092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
34102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules->at(i);
34112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSStyleRule* rule = ruleData.rule();
34122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const AtomicString& selectorLocalName = ruleData.selector()->tag().localName();
341306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (selectorLocalName != starAtom && selectorLocalName != pageName)
341406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
34152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSSelector::PseudoType pseudoType = ruleData.selector()->pseudoType();
341606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ((pseudoType == CSSSelector::PseudoLeftPage && !isLeftPage)
341706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoRightPage && isLeftPage)
341806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoFirstPage && !isFirstPage))
341906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
342106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // If the rule has no properties to apply, then ignore it.
342206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSMutableStyleDeclaration* decl = rule->declaration();
342306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!decl || !decl->length())
342406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
342606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // Add this rule to our list of matched rules.
34272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addMatchedRule(&ruleData);
342806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
342906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
343006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
343106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isLeftPage(int pageIndex) const
343206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
343306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isFirstPageLeft = false;
3434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_rootElementStyle->isLeftToRightDirection())
343506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        isFirstPageLeft = true;
343606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
343706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (pageIndex + (isFirstPageLeft ? 1 : 0)) % 2;
343806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
343906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isFirstPage(int pageIndex) const
344106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
344206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: In case of forced left/right page, page at index 1 (not 0) can be the first page.
344306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (!pageIndex);
344406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
344506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenString CSSStyleSelector::pageName(int /* pageIndex */) const
344706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
344806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Implement page index to page name mapping.
344906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return "";
345006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
345106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void applyCounterList(RenderStyle* style, CSSValueList* list, bool isReset)
34538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CounterDirectiveMap& map = style->accessCounterDirectives();
34558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef CounterDirectiveMap::iterator Iterator;
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Iterator end = map.end();
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Iterator it = map.begin(); it != end; ++it)
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset)
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_reset = false;
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_increment = false;
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = list ? list->length() : 0;
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < length; ++i) {
34666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
34676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isPrimitiveValue())
34686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        Pair* pair = static_cast<CSSPrimitiveValue*>(currValue)->getPairValue();
34716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
34726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        AtomicString identifier = static_cast<CSSPrimitiveValue*>(pair->first())->getStringValue();
34758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: What about overflow?
34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = static_cast<CSSPrimitiveValue*>(pair->second())->getIntValue();
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CounterDirectives& directives = map.add(identifier.impl(), CounterDirectives()).first->second;
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset) {
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_reset = true;
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_resetValue = value;
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (directives.m_increment)
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue += value;
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_increment = true;
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue = value;
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyPropertyToStyle(int id, CSSValue *value, RenderStyle* style)
34938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(0);
34958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(0, style);
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = style;
349728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (value)
349828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        applyProperty(id, value);
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline bool isValidVisitedLinkProperty(int id)
35026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
35036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    switch(static_cast<CSSPropertyID>(id)) {
35046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackgroundColor:
35056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeftColor:
35066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRightColor:
35076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTopColor:
35086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottomColor:
35096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyColor:
35106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutlineColor:
35116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRuleColor:
3512f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case CSSPropertyWebkitTextEmphasisColor:
35136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextFillColor:
35146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextStrokeColor:
35156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Also allow shorthands so that inherit/initial still work.
35166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackground:
35176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeft:
35186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRight:
35196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTop:
35206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottom:
35216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutline:
35226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRule:
35236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(SVG)
35246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyFill:
35256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyStroke:
35266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
35276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return true;
35286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        default:
35296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            break;
35306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return false;
35336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
35346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// SVG handles zooming in a different way compared to CSS. The whole document is scaled instead
35362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// of each individual length value in the render style / tree. CSSPrimitiveValue::computeLength*()
35372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// multiplies each resolved length with the zoom multiplier - so for SVG we need to disable that.
35382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// Though all CSS values that can be applied to outermost <svg> elements (width/height/border/padding...)
35392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// need to respect the scaling. RenderBox (the parent class of RenderSVGRoot) grabs values like
35402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// width/height/border/padding/... from the RenderStyle -> for SVG these values would never scale,
35412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// if we'd pass a 1.0 zoom factor everyhwere. So we only pass a zoom factor of 1.0 for specific
35422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// properties that are NOT allowed to scale within a zoomed SVG document (letter/word-spacing/font-size).
35432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool useSVGZoomRules(const Element* e)
35442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
35452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return e && e->isSVGElement();
35462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
35472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
35488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyProperty(int id, CSSValue *value)
35498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = 0;
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue())
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        primitiveValue = static_cast<CSSPrimitiveValue*>(value);
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool apply = false;
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned short valueType = value->cssValueType();
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInherit = m_parentNode && valueType == CSSValue::CSS_INHERIT;
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInitial = valueType == CSSValue::CSS_INITIAL || (!m_parentNode && valueType == CSSValue::CSS_INHERIT);
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3564a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    id = CSSProperty::resolveDirectionAwareProperty(id, m_style->direction(), m_style->writingMode());
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_checker.m_matchVisitedPseudoClass && !isValidVisitedLinkProperty(id)) {
35676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Limit the properties that can be applied to only the ones honored by :visited.
35686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
35696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35712bde8e466a4451c7319e3a072d118917957d6554Steve Block    CSSPropertyID property = static_cast<CSSPropertyID>(id);
35722bde8e466a4451c7319e3a072d118917957d6554Steve Block
35732bde8e466a4451c7319e3a072d118917957d6554Steve Block    // check lookup table for implementations and use when available
35742bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_applyProperty.implements(property)) {
35752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (isInherit)
35762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInheritValue(property, this);
35772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else if (isInitial)
35782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInitialValue(property, this);
35792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
35802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyValue(property, this, value);
35812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
35822bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
35832bde8e466a4451c7319e3a072d118917957d6554Steve Block
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // What follows is a list that maps the CSS properties into their corresponding front-end
35858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RenderStyle values.  Shorthands (e.g. border, background) occur in this list as well and
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // are only hit when mapping "inherit" or "initial" into front-end values.
35875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    switch (property) {
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ident only properties
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderCollapse:
35908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderCollapse, BorderCollapse)
35918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
35938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueCollapse:
35958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(true);
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueSeparate:
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(false);
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineStyle:
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(outlineStyle, OutlineStyle, BorderStyle)
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent() == CSSValueAuto)
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(DOTTED, true);
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(*primitiveValue);
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCaptionSide:
36145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(captionSide, CaptionSide)
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClear:
36175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(clear, Clear)
36188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDisplay:
36205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(display, Display)
3621231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
3622231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue) {
3623231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (primitiveValue->getIdent() == CSSValueWapMarquee) {
3624d0825bca7fe65beaee391d30da42e937db621564Steve Block                // Initialize WAP Marquee style
3625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowX(OMARQUEE);
3626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowY(OMARQUEE);
3627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setWhiteSpace(NOWRAP);
3628231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
3629231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeSpeed(85); // Normal speed
3630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeLoopCount(1);
3631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeBehavior(MSCROLL);
3632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                if (m_parentStyle)
3634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(m_parentStyle->display());
3635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                else
3636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(*primitiveValue);
3637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            } else
3638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setDisplay(*primitiveValue);
3639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
36418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyEmptyCells:
36435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(emptyCells, EmptyCells)
36448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFloat:
36465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(floating, Floating)
36478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStyle:
36498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(m_parentStyle->fontDescription().italic());
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(false);
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
36598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueOblique:
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: oblique is the same as italic for the moment...
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueItalic:
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(true);
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(false);
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
36698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontVariant:
36778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(m_parentStyle->fontDescription().smallCaps());
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(false);
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int id = primitiveValue->getIdent();
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueNormal)
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(false);
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (id == CSSValueSmallCaps)
36908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(true);
36918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
36968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontWeight:
37008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(m_parentStyle->fontDescription().weight());
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(FontWeightNormal);
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent()) {
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBolder:
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.bolderWeight());
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLighter:
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.lighterWeight());
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBold:
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue700:
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightBold);
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNormal:
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue400:
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightNormal);
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue900:
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight900);
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue800:
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight800);
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue600:
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight600);
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue500:
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight500);
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue300:
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight300);
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue200:
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight200);
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue100:
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight100);
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStylePosition:
37585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStylePosition, ListStylePosition)
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleType:
37615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStyleType, ListStyleType)
37628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakBefore:
37645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakBefore, PageBreakBefore, PageBreak)
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakAfter:
37675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakAfter, PageBreakAfter, PageBreak)
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakInside: {
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(pageBreakInside, PageBreakInside, PageBreak)
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pageBreak = *primitiveValue;
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pageBreak != PBALWAYS)
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPageBreakInside(pageBreak);
37768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPosition:
37805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(position, Position)
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTableLayout: {
37838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(tableLayout, TableLayout)
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ETableLayout l = *primitiveValue;
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (l == TAUTO)
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = RenderStyle::initialTableLayout();
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTableLayout(l);
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyUnicodeBidi:
37945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(unicodeBidi, UnicodeBidi)
37958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyTextTransform:
37975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textTransform, TextTransform)
37988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVisibility:
38005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(visibility, Visibility)
38018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWhiteSpace:
38035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(whiteSpace, WhiteSpace)
38048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderSpacing: {
38068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(m_parentStyle->horizontalBorderSpacing());
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(m_parentStyle->verticalBorderSpacing());
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(0);
38128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(0);
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderHorizontalSpacing: {
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(horizontalBorderSpacing, HorizontalBorderSpacing)
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHorizontalBorderSpacing(spacing);
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderVerticalSpacing: {
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalBorderSpacing, VerticalBorderSpacing)
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVerticalBorderSpacing(spacing);
38308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCursor:
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(m_parentStyle->cursor());
38358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursorList(m_parentStyle->cursors());
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->clearCursorList();
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(RenderStyle::initialCursor());
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->isValueList()) {
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList* list = static_cast<CSSValueList*>(value);
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(CURSOR_AUTO);
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++) {
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue* item = list->itemWithoutBoundsCheck(i);
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!item->isPrimitiveValue())
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int type = primitiveValue->primitiveType();
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (type == CSSPrimitiveValue::CSS_URI) {
38546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (primitiveValue->isCursorImageValue()) {
38556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        CSSCursorImageValue* image = static_cast<CSSCursorImageValue*>(primitiveValue);
38566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (image->updateIfSVGCursorIsUsed(m_element)) // Elements with SVG cursors are not allowed to share style.
38576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            m_style->setUnique();
38586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        m_style->addCursor(cachedOrPendingFromValue(CSSPropertyCursor, image), image->hotSpot());
38596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    }
38608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else if (type == CSSPrimitiveValue::CSS_IDENT)
38618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setCursor(*primitiveValue);
38628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
3865635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_IDENT && m_style->cursor() != ECursor(*primitiveValue))
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setCursor(*primitiveValue);
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// uri || inherit
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleImage:
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(listStyleImage, ListStyleImage)
38745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_style->setListStyleImage(styleImage(CSSPropertyListStyleImage, value));
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length
38798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopWidth:
38808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightWidth:
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomWidth:
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftWidth:
38838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineWidth:
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleWidth:
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderTopWidth, borderTopWidth, BorderTopWidth)
38888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderRightWidth, borderRightWidth, BorderRightWidth)
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderBottomWidth, borderBottomWidth, BorderBottomWidth)
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderLeftWidth, borderLeftWidth, BorderLeftWidth)
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyOutlineWidth, outlineWidth, OutlineWidth)
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitColumnRuleWidth, columnRuleWidth, ColumnRuleWidth)
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopWidth, BorderTopWidth, BorderWidth)
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderRightWidth, BorderRightWidth, BorderWidth)
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomWidth, BorderBottomWidth, BorderWidth)
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderLeftWidth, BorderLeftWidth, BorderWidth)
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyOutlineWidth, OutlineWidth, BorderWidth)
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitColumnRuleWidth, ColumnRuleWidth, BorderWidth)
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short width = 3;
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThin:
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 1;
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMedium:
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 3;
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThick:
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 5;
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInvalid:
39190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            width = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
39208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0) return;
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderTopWidth:
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(width);
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderRightWidth:
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(width);
39328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderBottomWidth:
39348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(width);
39358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderLeftWidth:
39378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(width);
39388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyOutlineWidth:
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(width);
39418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitColumnRuleWidth:
39438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(width);
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
39498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3951231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitFontSmoothing: {
3952231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
3953231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
3954231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(m_parentStyle->fontDescription().fontSmoothing());
3955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
3956231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(AutoSmoothing);
3957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
3958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
3959231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
3960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            int id = primitiveValue->getIdent();
3961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            FontSmoothingMode smoothing;
3962231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (id) {
3963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAuto:
3964231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueNone:
3967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = NoSmoothing;
3968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAntialiased:
3970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = Antialiased;
3971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueSubpixelAntialiased:
3973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = SubpixelAntialiased;
3974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                default:
3976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    ASSERT_NOT_REACHED();
3977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3978231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
3979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(smoothing);
3980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3981231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
3982231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
3983231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
3984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
3985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
39868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLetterSpacing:
39878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordSpacing:
39888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
39898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
39908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLetterSpacing, letterSpacing, LetterSpacing)
39918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWordSpacing, wordSpacing, WordSpacing)
39928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
39958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLetterSpacing, LetterSpacing, LetterWordSpacing)
39968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWordSpacing, WordSpacing, LetterWordSpacing)
39978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int width = 0;
40010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNormal) {
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 0;
40038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
40048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
40058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
40062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            width = primitiveValue->computeLengthInt(style(), m_rootElementStyle, useSVGZoomRules(m_element) ? 1.0f : zoomFactor);
40078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
40098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyLetterSpacing:
40108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLetterSpacing(width);
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWordSpacing:
40138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setWordSpacing(width);
40148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ### needs the definitions in renderstyle
40168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: break;
40178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordBreak:
40225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordBreak, WordBreak)
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordWrap:
40255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordWrap, WordWrap)
40268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitNbspMode:
40285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(nbspMode, NBSPMode)
40298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineBreak:
40315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(khtmlLineBreak, KHTMLLineBreak)
40328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
40345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(matchNearestMailBlockquoteColor, MatchNearestMailBlockquoteColor)
40358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyResize:
40388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(resize, Resize)
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue->getIdent())
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EResize r = RESIZE_NONE;
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueAuto) {
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (Settings* settings = m_checker.m_document->settings())
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                r = settings->textAreasAreResizable() ? RESIZE_BOTH : RESIZE_NONE;
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            r = *primitiveValue;
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setResize(r);
40528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // length, percent
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxWidth:
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +none +inherit
405881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
405981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            l = Length(undefinedLength, Fixed);
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
406181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
40628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTop:
40638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLeft:
40648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyRight:
40658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBottom:
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidth:
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinWidth:
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginTop:
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginRight:
40708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginBottom:
40718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginLeft:
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit +auto
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWidth || id == CSSPropertyMinWidth || id == CSSPropertyMaxWidth) {
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
40758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(Intrinsic);
40768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
40798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(MinIntrinsic);
40808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSPropertyMaxWidth && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
40848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
40858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingTop:
40868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingRight:
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingBottom:
40888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingLeft:
40898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextIndent:
40908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
40938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxWidth, maxWidth, MaxWidth)
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBottom, bottom, Bottom)
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTop, top, Top)
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLeft, left, Left)
40978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyRight, right, Right)
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWidth, width, Width)
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinWidth, minWidth, MinWidth)
41008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingTop, paddingTop, PaddingTop)
41018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingRight, paddingRight, PaddingRight)
41028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingBottom, paddingBottom, PaddingBottom)
41038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingLeft, paddingLeft, PaddingLeft)
41048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginTop, marginTop, MarginTop)
41058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginRight, marginRight, MarginRight)
41068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginBottom, marginBottom, MarginBottom)
41078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginLeft, marginLeft, MarginLeft)
41088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTextIndent, textIndent, TextIndent)
41098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
41128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxWidth, MaxWidth, MaxSize)
41138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBottom, Bottom, Offset)
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyTop, Top, Offset)
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLeft, Left, Offset)
41168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyRight, Right, Offset)
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWidth, Width, Size)
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinWidth, MinWidth, MinSize)
41198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingTop, PaddingTop, Padding)
41208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingRight, PaddingRight, Padding)
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingBottom, PaddingBottom, Padding)
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingLeft, PaddingLeft, Padding)
41238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginTop, MarginTop, Margin)
41248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginRight, MarginRight, Margin)
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginBottom, MarginBottom, Margin)
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginLeft, MarginLeft, Margin)
41278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND(CSSPropertyTextIndent, TextIndent)
41288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
41338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
41348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle our quirky margin units if we have them.
41350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed,
41368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           primitiveValue->isQuirkValue());
41378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
41388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
41408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
414106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            apply = true;
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!apply) return;
41448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
41458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMaxWidth:
41468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMaxWidth(l);
41478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyBottom:
41498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBottom(l);
41508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTop:
41528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTop(l);
41538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyLeft:
41558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setLeft(l);
41568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyRight:
41588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setRight(l);
41598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyWidth:
41618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setWidth(l);
41628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMinWidth:
41648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMinWidth(l);
41658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingTop:
41678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingTop(l);
41688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingRight:
41708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingRight(l);
41718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingBottom:
41738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingBottom(l);
41748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingLeft:
41768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingLeft(l);
41778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginTop:
41798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginTop(l);
41808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginRight:
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginRight(l);
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginBottom:
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginBottom(l);
41868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginLeft:
41888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginLeft(l);
41898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTextIndent:
41918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextIndent(l);
41928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
41948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
41978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
41988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxHeight:
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
42018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(undefinedLength, Fixed);
42028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyHeight:
42058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinHeight:
42068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
42078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(Intrinsic);
42088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
42108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(MinIntrinsic);
42118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (id != CSSPropertyMaxHeight && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
42138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
42158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxHeight, maxHeight, MaxHeight)
42168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyHeight, height, Height)
42178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinHeight, minHeight, MinHeight)
42188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
42218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxHeight, MaxHeight, MaxSize)
42228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyHeight, Height, Size)
42238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinHeight, MinHeight, MinSize)
42248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
42288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned short type = primitiveValue->primitiveType();
42298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
42300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
42338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
42348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
42358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (apply)
42388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (id) {
42398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMaxHeight:
42408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMaxHeight(l);
42418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyHeight:
42438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setHeight(l);
42448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMinHeight:
42468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMinHeight(l);
42478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVerticalAlign:
42528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalAlign, VerticalAlign)
42538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
42548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
42568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          EVerticalAlign align;
42578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          switch (primitiveValue->getIdent()) {
42598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTop:
42608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TOP; break;
42618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBottom:
42628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BOTTOM; break;
42638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMiddle:
42648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = MIDDLE; break;
42658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBaseline:
42668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE; break;
42678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextBottom:
42688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_BOTTOM; break;
42698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextTop:
42708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_TOP; break;
42718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSub:
42728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUB; break;
42738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSuper:
42748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUPER; break;
42758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitBaselineMiddle:
42768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE_MIDDLE; break;
42778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
42788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
42798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(align);
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          return;
42828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
42838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          int type = primitiveValue->primitiveType();
42848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          Length l;
42858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian          if (CSSPrimitiveValue::isUnitTypeLength(type))
42860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
42898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(LENGTH);
42918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlignLength(l);
42928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontSize:
42968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
42978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setKeywordSize(0);
42998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float oldSize = 0;
43008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float size = 0;
43018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parentIsAbsoluteSize = false;
43038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_parentNode) {
43048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            oldSize = m_parentStyle->fontDescription().specifiedSize();
43058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parentIsAbsoluteSize = m_parentStyle->fontDescription().isAbsoluteSize();
43068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            size = oldSize;
43108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentNode)
43118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setKeywordSize(m_parentStyle->fontDescription().keywordSize());
43128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
4313d0825bca7fe65beaee391d30da42e937db621564Steve Block            size = fontSizeForKeyword(m_checker.m_document, CSSValueMedium, fontDescription.useFixedDefaultSize());
43148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
43158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent()) {
43168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Keywords are being used.
43178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
43188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxSmall:
43198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXSmall:
43208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
43218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMedium:
43228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
43238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXLarge:
43248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxLarge:
43258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitXxxLarge:
4326d0825bca7fe65beaee391d30da42e937db621564Steve Block                    size = fontSizeForKeyword(m_checker.m_document, primitiveValue->getIdent(), fontDescription.useFixedDefaultSize());
43278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setKeywordSize(primitiveValue->getIdent() - CSSValueXxSmall + 1);
43288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarger:
43305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = largerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmaller:
43335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = smallerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
43368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
43378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
43388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize &&
43408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (primitiveValue->getIdent() == CSSValueLarger ||
43418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               primitiveValue->getIdent() == CSSValueSmaller));
43428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
43438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
43448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize ||
43458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (type != CSSPrimitiveValue::CSS_PERCENTAGE &&
43468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               type != CSSPrimitiveValue::CSS_EMS &&
43470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_EXS &&
43480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_REMS));
43498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
43500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                size = primitiveValue->computeLengthFloat(m_parentStyle, m_rootElementStyle, true);
43518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
43528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size = (primitiveValue->getFloatValue() * oldSize) / 100.0f;
43538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
43558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (size < 0)
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setFontSize(fontDescription, size);
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZIndex: {
43678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoZIndex())
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoZIndex();
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZIndex(m_parentStyle->zIndex());
43728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
43748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoZIndex();
43758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Should clamp all sorts of other integer properties too.
43792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_style->setZIndex(clampToInteger(primitiveValue->getDoubleValue()));
43808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidows:
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(widows, Widows)
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setWidows(primitiveValue->getIntValue());
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOrphans:
43928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(orphans, Orphans)
43948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOrphans(primitiveValue->getIntValue());
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length, percent, number
44018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLineHeight:
44028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineHeight, LineHeight)
44048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length lineHeight;
44078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
44088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
44098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(-100.0, Percent);
44108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
4411692e5dbf12901edacf14812a6fae25462920af42Steve Block            double multiplier = zoomFactor;
44125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (m_style->textSizeAdjust()) {
441368513a70bcd92384395513322f1b801e7bf9c729Steve Block                if (Frame* frame = m_checker.m_document->frame())
441468513a70bcd92384395513322f1b801e7bf9c729Steve Block                    multiplier *= frame->textZoomFactor();
44155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            }
44160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            lineHeight = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle,  multiplier), Fixed);
44178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
44188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length((m_style->fontSize() * primitiveValue->getIntValue()) / 100, Fixed);
44198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
44208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setLineHeight(lineHeight);
44248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// string
44288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextAlign:
44298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textAlign, TextAlign)
44318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44332bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (primitiveValue->getIdent() == CSSValueWebkitMatchParent) {
44342bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (m_parentStyle->textAlign() == TASTART)
44352bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? LEFT : RIGHT);
44362bde8e466a4451c7319e3a072d118917957d6554Steve Block            else if (m_parentStyle->textAlign() == TAEND)
44372bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? RIGHT : LEFT);
44382bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
44392bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->textAlign());
44402bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
44412bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
44422bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_style->setTextAlign(*primitiveValue);
44438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClip:
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length top;
44508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length right;
44518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length bottom;
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length left;
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasClip = true;
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
44558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasClip()) {
44568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = m_parentStyle->clipTop();
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                right = m_parentStyle->clipRight();
44588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bottom = m_parentStyle->clipBottom();
44598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                left = m_parentStyle->clipLeft();
44608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else {
44618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                hasClip = false;
44628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = right = bottom = left = Length();
44638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
44648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
44658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hasClip = false;
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            top = right = bottom = left = Length();
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (!primitiveValue) {
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RECT) {
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect* rect = primitiveValue->getRectValue();
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!rect)
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
44732bde8e466a4451c7319e3a072d118917957d6554Steve Block            top = convertToIntLength(rect->top(), style(), m_rootElementStyle, zoomFactor);
44742bde8e466a4451c7319e3a072d118917957d6554Steve Block            right = convertToIntLength(rect->right(), style(), m_rootElementStyle, zoomFactor);
44752bde8e466a4451c7319e3a072d118917957d6554Steve Block            bottom = convertToIntLength(rect->bottom(), style(), m_rootElementStyle, zoomFactor);
44762bde8e466a4451c7319e3a072d118917957d6554Steve Block            left = convertToIntLength(rect->left(), style(), m_rootElementStyle, zoomFactor);
44778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent() != CSSValueAuto) {
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setClip(top, right, bottom, left);
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHasClip(hasClip);
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // rect, ident
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// lists
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyContent:
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of string, uri, counter, attr, i
44908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: In CSS3, it will be possible to inherit content.  In CSS2 it is not.  This
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // note is a reminder that eventually "inherit" needs to be supported.
44938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
44968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList* list = static_cast<CSSValueList*>(value);
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool didSet = false;
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* item = list->itemWithoutBoundsCheck(i);
45088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->isImageGeneratorValue()) {
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setContent(static_cast<CSSImageGeneratorValue*>(item)->generatedImage(), didSet);
45108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                didSet = true;
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!item->isPrimitiveValue())
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
45176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            switch (contentValue->primitiveType()) {
451881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_STRING:
451981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(contentValue->getStringValue().impl(), didSet);
452081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
452181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
452281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_ATTR: {
452381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // FIXME: Can a namespace be specified for an attr(foo)?
452481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (m_style->styleType() == NOPSEUDO)
452581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setUnique();
452681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                else
452781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_parentStyle->setUnique();
452881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                QualifiedName attr(nullAtom, contentValue->getStringValue().impl(), nullAtom);
452981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(m_element->getAttribute(attr).impl(), didSet);
453081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
453181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // register the fact that the attribute value affects the style
453281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_selectorAttrs.add(attr.localName().impl());
453381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
453481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
453581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_URI: {
453681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (!contentValue->isImageValue())
453781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
453881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(cachedOrPendingFromValue(CSSPropertyContent, static_cast<CSSImageValue*>(contentValue)), didSet);
453981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
454081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
454181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
454281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_COUNTER: {
454381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                Counter* counterValue = contentValue->getCounterValue();
454481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                OwnPtr<CounterContent> counter = adoptPtr(new CounterContent(counterValue->identifier(),
454581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    (EListStyleType)counterValue->listStyleNumber(), counterValue->separator()));
454681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(counter.release(), didSet);
454781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
454881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
454981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
455081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_IDENT:
455181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                switch (contentValue->getIdent()) {
455281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueOpenQuote:
455381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(OPEN_QUOTE, didSet);
45548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
455681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueCloseQuote:
455781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(CLOSE_QUOTE, didSet);
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoOpenQuote:
456181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_OPEN_QUOTE, didSet);
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoCloseQuote:
456581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_CLOSE_QUOTE, didSet);
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
456781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
456881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                default:
456981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    // normal and none do not have any effect.
457081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    {}
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
45728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!didSet)
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
457881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyQuotes:
457981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInherit) {
458081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_parentStyle)
458181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(m_parentStyle->quotes());
458281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
458381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
458481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInitial) {
458581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(0);
458681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
458781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
458881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (value->isValueList()) {
458981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
459081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            size_t length = list->length();
459181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QuotesData* data = QuotesData::create(length);
459281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!data)
459381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return; // Out of memory
459481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            String* quotes = data->data();
459581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            for (size_t i = 0; i < length; i++) {
459681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                CSSValue* item = list->itemWithoutBoundsCheck(i);
459781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(item->isPrimitiveValue());
459881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
459981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING);
460081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                quotes[i] = primitiveValue->getStringValue();
460181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
460281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(adoptRef(data));
460381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        } else if (primitiveValue) {
460481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT);
460581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (primitiveValue->getIdent() == CSSValueNone)
460681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(adoptRef(QuotesData::create(0)));
460781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
460881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
46098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterIncrement:
46118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, false);
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterReset:
46148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, true);
46158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontFamily: {
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of strings and ids
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription parentFontDescription = m_parentStyle->fontDescription();
46218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(parentFontDescription.genericFamily());
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setFamily(parentFontDescription.firstFamily());
46240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            fontDescription.setIsSpecifiedFont(parentFontDescription.isSpecifiedFont());
46258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
4628231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (isInitial) {
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription initialDesc = FontDescription();
46308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We need to adjust the size to account for the generic family change from monospace
46328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to non-monospace.
4633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize())
4634d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, false));
46358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(initialDesc.genericFamily());
46368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!initialDesc.firstFamily().familyIsEmpty())
46378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setFamily(initialDesc.firstFamily());
46388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!value->isValueList())
4644231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
4646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSValueList* list = static_cast<CSSValueList*>(value);
46478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontFamily& firstFamily = fontDescription.firstFamily();
4649231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontFamily* currFamily = 0;
46508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Before mapping in a new font-family property, we should reset the generic family.
4652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool oldFamilyUsedFixedDefaultSize = fontDescription.useFixedDefaultSize();
46538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setGenericFamily(FontDescription::NoFamily);
46548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
4656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            CSSValue* item = list->itemWithoutBoundsCheck(i);
4657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!item->isPrimitiveValue())
4658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                continue;
46596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
46608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AtomicString face;
46618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
46626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
46636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (contentValue->isFontFamilyValue())
46646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    face = static_cast<FontFamilyValue*>(contentValue)->familyName();
46656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            } else if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && settings) {
46666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                switch (contentValue->getIdent()) {
46678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueWebkitBody:
46688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = settings->standardFontFamily();
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSerif:
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-serif";
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SerifFamily);
46738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSansSerif:
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-sans-serif";
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SansSerifFamily);
46778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueCursive:
46798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-cursive";
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::CursiveFamily);
46818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueFantasy:
46838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-fantasy";
46848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::FantasyFamily);
46858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueMonospace:
46878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-monospace";
46888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::MonospaceFamily);
46898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4692231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!face.isEmpty()) {
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!currFamily) {
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Filling in the first family.
46968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstFamily.setFamily(face);
4697231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    firstFamily.appendFamily(0); // Remove any inherited family-fallback list.
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = &firstFamily;
46990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    fontDescription.setIsSpecifiedFont(fontDescription.genericFamily() == FontDescription::NoFamily);
4700231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                } else {
47018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create();
47028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    newFamily->setFamily(face);
47038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily->appendFamily(newFamily);
47048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = newFamily.get();
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4708231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4709231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // We can't call useFixedDefaultSize() until all new font families have been added
4710231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If currFamily is non-zero then we set at least one family on this description.
4711231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (currFamily) {
4712231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize() != oldFamilyUsedFixedDefaultSize)
4713d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, !oldFamilyUsedFixedDefaultSize));
4714231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4715231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (m_style->setFontDescription(fontDescription))
4716231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_fontDirty = true;
4717231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
4718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextDecoration: {
47218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of ident
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textDecoration, TextDecoration)
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int t = RenderStyle::initialTextDecoration();
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // do nothing
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
47276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!value->isValueList())
47286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                return;
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList *list = static_cast<CSSValueList*>(value);
47308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
47318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++)
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
47338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue *item = list->itemWithoutBoundsCheck(i);
47346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!item->isPrimitiveValue())
47356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    continue;
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
47378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
47388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNone:
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t = TDNONE; break;
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueUnderline:
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= UNDERLINE; break;
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueOverline:
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= OVERLINE; break;
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLineThrough:
47458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= LINE_THROUGH; break;
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBlink:
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= BLINK; break;
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextDecoration(t);
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZoom:
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Reset the zoom in effect before we do anything.  This allows the setZoom method to accurately compute a new
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // zoom in effect.
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setEffectiveZoom(m_parentStyle ? m_parentStyle->effectiveZoom() : RenderStyle::initialZoom());
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we can handle inherit and initial.
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(zoom, Zoom)
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle normal/reset, numbers and percentages.
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
47708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->getIdent() == CSSValueReset) {
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setEffectiveZoom(RenderStyle::initialZoom());
47738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
4774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else if (primitiveValue->getIdent() == CSSValueDocument) {
4775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            float docZoom = m_checker.m_document->renderer()->style()->zoom();
4776635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setEffectiveZoom(docZoom);
4777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setZoom(docZoom);
47788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE) {
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue() / 100.0f);
47818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_NUMBER) {
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue());
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// shorthand properties
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackground:
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearBackgroundLayers();
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(Color());
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit) {
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritBackgroundLayers(*m_parentStyle->backgroundLayers());
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(m_parentStyle->backgroundColor());
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMask:
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearMaskLayers();
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritMaskLayers(*m_parentStyle->maskLayers());
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorder:
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderStyle:
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderWidth:
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderColor:
48118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderColor)
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor(): m_parentStyle->color());
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(Color()); // Reset to invalid color so currentColor is used instead.
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(Color());
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(Color());
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(Color());
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderStyle)
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(RenderStyle::initialBorderStyle());
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(RenderStyle::initialBorderStyle());
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(RenderStyle::initialBorderStyle());
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(RenderStyle::initialBorderStyle());
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderWidth)
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(RenderStyle::initialBorderWidth());
48518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(RenderStyle::initialBorderWidth());
48528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(RenderStyle::initialBorderWidth());
48538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(RenderStyle::initialBorderWidth());
48548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTop:
48588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderTop();
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRight:
48678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor() : m_parentStyle->color());
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRight();
48748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottom:
48768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderBottom();
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeft:
48858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderLeft();
48928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMargin:
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginTop(m_parentStyle->marginTop());
48968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginBottom(m_parentStyle->marginBottom());
48978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginLeft(m_parentStyle->marginLeft());
48988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginRight(m_parentStyle->marginRight());
48998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetMargin();
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPadding:
49048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingTop(m_parentStyle->paddingTop());
49068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingBottom(m_parentStyle->paddingBottom());
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingLeft(m_parentStyle->paddingLeft());
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingRight(m_parentStyle->paddingRight());
49098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetPadding();
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFont:
49148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_parentStyle->fontDescription();
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(m_parentStyle->lineHeight());
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
49228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (!settings)
49248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
49258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(FontDescription::StandardFamily);
49278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setRenderingMode(settings->fontRenderingMode());
49288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const AtomicString& standardFontFamily = m_checker.m_document->settings()->standardFontFamily();
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!standardFontFamily.isEmpty()) {
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().setFamily(standardFontFamily);
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().appendFamily(0);
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
4935d0825bca7fe65beaee391d30da42e937db621564Steve Block            setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueMedium, false));
49368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
49418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RenderTheme::defaultTheme()->systemFont(primitiveValue->getIdent(), fontDescription);
49460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
49478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Double-check and see if the theme did anything.  If not, don't bother updating the font.
49488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (fontDescription.isAbsoluteSize()) {
49498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Make sure the rendering mode and printer font settings are updated.
49508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Settings* settings = m_checker.m_document->settings();
49518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!settings)
49538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return;
49548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setRenderingMode(settings->fontRenderingMode());
49558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle the zoom factor.
49582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), fontDescription.specifiedSize(), useSVGZoomRules(m_element)));
49598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_style->setFontDescription(fontDescription))
49608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_fontDirty = true;
49618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->isFontValue()) {
49638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontValue *font = static_cast<FontValue*>(value);
49648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!font->style || !font->variant || !font->weight ||
49658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 !font->size || !font->lineHeight || !font->family)
49668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
49678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontStyle, font->style.get());
49688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontVariant, font->variant.get());
49698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontWeight, font->weight.get());
49708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontSize, font->size.get());
49718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = font->lineHeight.get();
49738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontFamily, font->family.get());
49758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyle:
49798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(m_parentStyle->listStyleType());
49818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(m_parentStyle->listStyleImage());
49828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(m_parentStyle->listStylePosition());
49838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
49858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(RenderStyle::initialListStyleType());
49868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(RenderStyle::initialListStyleImage());
49878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(RenderStyle::initialListStylePosition());
49888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutline:
49918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(m_parentStyle->outlineWidth());
49938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineColor(m_parentStyle->outlineColor().isValid() ? m_parentStyle->outlineColor() : m_parentStyle->color());
49948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineStyle(m_parentStyle->outlineStyle());
49958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetOutline();
49988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // CSS3 Properties
50018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAppearance: {
50028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(appearance, Appearance)
50038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setAppearance(*primitiveValue);
50068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderImage:
50108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskBoxImage: {
50118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitBorderImage, borderImage, BorderImage)
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitMaskBoxImage, maskBoxImage, MaskBoxImage)
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitBorderImage, BorderImage, NinePieceImage)
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitMaskBoxImage, MaskBoxImage, NinePieceImage)
50188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage image;
50225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, value, image);
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWebkitBorderImage)
50258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderImage(image);
50268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
50278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMaskBoxImage(image);
50288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderRadius:
50328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderRadius:
50338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopLeftRadius(m_parentStyle->borderTopLeftRadius());
50358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopRightRadius(m_parentStyle->borderTopRightRadius());
50368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomLeftRadius(m_parentStyle->borderBottomLeftRadius());
50378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomRightRadius(m_parentStyle->borderBottomRightRadius());
50388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRadius();
50428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fall through
50450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopLeftRadius:
50460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopRightRadius:
50470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomLeftRadius:
50480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomRightRadius: {
50498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopLeftRadius, borderTopLeftRadius, BorderTopLeftRadius)
50510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopRightRadius, borderTopRightRadius, BorderTopRightRadius)
50520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomLeftRadius, borderBottomLeftRadius, BorderBottomLeftRadius)
50530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomRightRadius, borderBottomRightRadius, BorderBottomRightRadius)
50548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopLeftRadius, BorderTopLeftRadius, BorderRadius)
50590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopRightRadius, BorderTopRightRadius, BorderRadius)
50600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomLeftRadius, BorderBottomLeftRadius, BorderRadius)
50610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomRightRadius, BorderBottomRightRadius, BorderRadius)
50628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Pair* pair = primitiveValue->getPairValue();
50696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
50708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusWidth;
50735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusHeight;
50745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->first()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(pair->first()->getDoubleValue(), Percent);
50765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(max(intMinForLength, min(intMaxForLength, pair->first()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->second()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(pair->second()->getDoubleValue(), Percent);
50805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(max(intMinForLength, min(intMaxForLength, pair->second()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50822bde8e466a4451c7319e3a072d118917957d6554Steve Block        int width = radiusWidth.value();
50832bde8e466a4451c7319e3a072d118917957d6554Steve Block        int height = radiusHeight.value();
50848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0 || height < 0)
50858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width == 0)
50875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = radiusWidth; // Null out the other value.
50888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (height == 0)
50895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = radiusHeight; // Null out the other value.
50908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        LengthSize size(radiusWidth, radiusHeight);
50928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
50930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopLeftRadius:
50948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopLeftRadius(size);
50958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
50960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopRightRadius:
50978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopRightRadius(size);
50988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
50990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomLeftRadius:
51008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomLeftRadius(size);
51018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomRightRadius:
51038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomRightRadius(size);
51048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRadius(size);
51078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineOffset:
51138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(outlineOffset, OutlineOffset)
51140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setOutlineOffset(primitiveValue->computeLengthInt(style(), m_rootElementStyle, zoomFactor));
51158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5116231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyTextRendering: {
5117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
5118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
5119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(m_parentStyle->fontDescription().textRenderingMode());
5120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
5121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(AutoTextRendering);
5122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
5123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
5124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
5125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(*primitiveValue);
5126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
5128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
5129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
51318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextShadow:
5132cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSPropertyBoxShadow:
5133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitBoxShadow: {
51348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
51358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return m_style->setTextShadow(m_parentStyle->textShadow() ? new ShadowData(*m_parentStyle->textShadow()) : 0);
51378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_style->setBoxShadow(m_parentStyle->boxShadow() ? new ShadowData(*m_parentStyle->boxShadow()) : 0);
51388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial || primitiveValue) // initial | none
51408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return id == CSSPropertyTextShadow ? m_style->setTextShadow(0) : m_style->setBoxShadow(0);
51418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList *list = static_cast<CSSValueList*>(value);
51468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
51478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
51486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSValue* currValue = list->itemWithoutBoundsCheck(i);
51496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!currValue->isShadowValue())
51506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                continue;
51518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShadowValue* item = static_cast<ShadowValue*>(list->itemWithoutBoundsCheck(i));
51520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int x = item->x->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int y = item->y->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int blur = item->blur ? item->blur->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int spread = item->spread ? item->spread->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ShadowStyle shadowStyle = item->style && item->style->getIdent() == CSSValueInset ? Inset : Normal;
51578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Color color;
51588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->color)
51598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                color = getColorFromPrimitiveValue(item->color.get());
5160cad810f21b803229eb11403f9209855525a25d57Steve Block            ShadowData* shadowData = new ShadowData(x, y, blur, spread, shadowStyle, id == CSSPropertyWebkitBoxShadow, color.isValid() ? color : Color::transparent);
51618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextShadow(shadowData, i != 0);
51638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBoxShadow(shadowData, i != 0);
51658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxReflect: {
51698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxReflect, BoxReflect)
51708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
51718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxReflect(RenderStyle::initialBoxReflect());
51728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!value->isReflectValue())
51766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
51776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSReflectValue* reflectValue = static_cast<CSSReflectValue*>(value);
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<StyleReflection> reflection = StyleReflection::create();
51808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setDirection(reflectValue->direction());
51818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (reflectValue->offset()) {
51828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = reflectValue->offset()->primitiveType();
51838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
51848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                reflection->setOffset(Length(reflectValue->offset()->getDoubleValue(), Percent));
51858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                reflection->setOffset(Length(reflectValue->offset()->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed));
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage mask;
51895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, reflectValue->mask(), mask);
51908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setMask(mask);
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxReflect(reflection.release());
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOpacity:
51968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(opacity, Opacity)
51978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
51988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Clamp opacity to the range 0-1
52008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOpacity(min(1.0f, max(0.0f, primitiveValue->getFloatValue())));
52018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxAlign:
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxAlign, BoxAlign)
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxAlignment = *primitiveValue;
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxAlignment != BJUSTIFY)
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxAlign(boxAlignment);
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertySrc: // Only used in @font-face rules.
52138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyUnicodeRange: // Only used in @font-face rules.
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitBackfaceVisibility:
52178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(backfaceVisibility, BackfaceVisibility)
52188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
52198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setBackfaceVisibility((primitiveValue->getIdent() == CSSValueVisible) ? BackfaceVisibilityVisible : BackfaceVisibilityHidden);
52208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxDirection:
52225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxDirection, BoxDirection)
52238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxLines:
52255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxLines, BoxLines)
52268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrient:
52285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxOrient, BoxOrient)
52298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxPack:
52318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxPack, BoxPack)
52338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxPack = *primitiveValue;
52368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxPack != BSTRETCH && boxPack != BBASELINE)
52378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxPack(boxPack);
52388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlex:
52418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlex, BoxFlex)
52428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlex(primitiveValue->getFloatValue());
52458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlexGroup:
52478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlexGroup, BoxFlexGroup)
52488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlexGroup((unsigned int)(primitiveValue->getDoubleValue()));
52518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrdinalGroup:
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxOrdinalGroup, BoxOrdinalGroup)
52548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxOrdinalGroup((unsigned int)(primitiveValue->getDoubleValue()));
52578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
525828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case CSSPropertyBoxSizing:
52598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxSizing, BoxSizing)
52608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueContentBox)
52638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(CONTENT_BOX);
52648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
52658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(BORDER_BOX);
52668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnCount: {
52688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnCount())
52708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnCount();
52718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnCount(m_parentStyle->columnCount());
52738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
52758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnCount();
52768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
52788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setColumnCount(static_cast<unsigned short>(primitiveValue->getDoubleValue()));
52798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnGap: {
52828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasNormalColumnGap())
52848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasNormalColumnGap();
52858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnGap(m_parentStyle->columnGap());
52878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueNormal) {
52898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasNormalColumnGap();
52908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
52920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnGap(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
52938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5295e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitColumnSpan: {
5296e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        HANDLE_INHERIT_AND_INITIAL(columnSpan, ColumnSpan)
5297e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_style->setColumnSpan(primitiveValue->getIdent() == CSSValueAll);
5298e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
5299e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
53008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnWidth: {
53018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
53088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnWidth(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
53128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleStyle:
53155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnRuleStyle, ColumnRuleStyle, BorderStyle)
53168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakBefore:
53185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakBefore, ColumnBreakBefore, PageBreak)
53198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakAfter:
53215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakAfter, ColumnBreakAfter, PageBreak)
53228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakInside: {
53248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(columnBreakInside, ColumnBreakInside, PageBreak)
53258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pb = *primitiveValue;
53268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pb != PBALWAYS)
53278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnBreakInside(pb);
53288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     case CSSPropertyWebkitColumnRule:
53318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleColor(m_parentStyle->columnRuleColor().isValid() ? m_parentStyle->columnRuleColor() : m_parentStyle->color());
53338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleStyle(m_parentStyle->columnRuleStyle());
53348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(m_parentStyle->columnRuleWidth());
53358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
53378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetColumnRule();
53388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumns:
53408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(m_parentStyle->columnCount());
53468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
53478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(RenderStyle::initialColumnCount());
53498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarquee:
53528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (valueType != CSSValue::CSS_INHERIT || !m_parentNode) return;
53538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeDirection(m_parentStyle->marqueeDirection());
53548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeIncrement(m_parentStyle->marqueeIncrement());
53558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeSpeed(m_parentStyle->marqueeSpeed());
53568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeLoopCount(m_parentStyle->marqueeLoopCount());
53578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeBehavior(m_parentStyle->marqueeBehavior());
53588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeLoop:
5361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeRepetition: {
53638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeLoopCount, MarqueeLoopCount)
53648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueInfinite)
53678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(-1); // -1 means repeat forever.
53688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER)
53698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(primitiveValue->getIntValue());
53708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeSpeed:
5374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeSpeed: {
53768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeSpeed, MarqueeSpeed)
53778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
53808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
53818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSlow:
53828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(500); // 500 msec.
53838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
53858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(85); // 85msec. The WinIE default.
53868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueFast:
53888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(10); // 10msec. Super fast.
53898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
53918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
53938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(1000 * primitiveValue->getIntValue());
53948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
53958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
53968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER) // For scrollamount support.
53978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
53988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeIncrement: {
54018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeIncrement, MarqueeIncrement)
54028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
54038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
54058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
54068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
54078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(1, Fixed)); // 1px.
54088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
54108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(6, Fixed)); // 6px. The WinIE default.
54118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
54138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(36, Fixed)); // 36px.
54148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
54168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
54188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            bool ok = true;
54192bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length marqueeLength = convertToIntLength(primitiveValue, style(), m_rootElementStyle, 1, &ok);
54208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (ok)
54212bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setMarqueeIncrement(marqueeLength);
54228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5425231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5426231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeStyle:
5427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeStyle:
54295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeBehavior, MarqueeBehavior)
54308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5432231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeDir:
5433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        HANDLE_INHERIT_AND_INITIAL(marqueeDirection, MarqueeDirection)
5434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue && primitiveValue->getIdent()) {
5435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (primitiveValue->getIdent()) {
5436231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueLtr:
5437231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MRIGHT);
5438231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5439231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueRtl:
5440231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
5441231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5442231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            default:
5443231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(*primitiveValue);
5444231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5445231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
5446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5447231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeDirection:
54505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeDirection, MarqueeDirection)
54518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserDrag:
54535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userDrag, UserDrag)
54548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserModify:
54565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userModify, UserModify)
54578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserSelect:
54595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userSelect, UserSelect)
54608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
54628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverflow: {
54638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This property is supported by WinIE, and so we leave off the "-webkit-" in order to
54648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // work with WinIE-specific pages that use the property.
54658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textOverflow, TextOverflow)
54668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
54678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextOverflow(primitiveValue->getIdent() == CSSValueEllipsis);
54698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginCollapse: {
54728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
5473bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(m_parentStyle->marginBeforeCollapse());
5474bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(m_parentStyle->marginAfterCollapse());
54758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
5477bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(MCOLLAPSE);
5478bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(MCOLLAPSE);
54798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5483bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginBeforeCollapse:
54845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginTopCollapse:
5485bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginBeforeCollapse, MarginBeforeCollapse)
54868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginAfterCollapse:
54885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginBottomCollapse:
5489bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginAfterCollapse, MarginAfterCollapse)
54908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineClamp: {
54928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineClamp, LineClamp)
54938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
54948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int type = primitiveValue->primitiveType();
5496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (type == CSSPrimitiveValue::CSS_NUMBER)
5497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), LineClampLineCount));
5498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
5499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_PERCENTAGE), LineClampPercentage));
55008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitHighlight: {
55038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(highlight, Highlight);
55048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone)
55058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(nullAtom);
55068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(primitiveValue->getStringValue());
55088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
551006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphens: {
551106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        HANDLE_INHERIT_AND_INITIAL(hyphens, Hyphens);
551206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        m_style->setHyphens(*primitiveValue);
551306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
551406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
551506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphenateCharacter: {
5516dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationString, HyphenationString);
551706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (primitiveValue->getIdent() == CSSValueAuto)
5518dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(nullAtom);
551906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        else
5520dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(primitiveValue->getStringValue());
5521dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
5522dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
552381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitAfter: {
552481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitAfter, HyphenationLimitAfter);
552581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
552681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(-1);
552781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
552881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
552981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
553081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
553181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitBefore: {
553281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitBefore, HyphenationLimitBefore);
5533dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
553481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(-1);
5535dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        else
553681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
553781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
553881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
553981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitLocale: {
554081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(locale, Locale);
554181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
554281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(nullAtom);
554381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
554481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(primitiveValue->getStringValue());
554506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
554606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
55478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderFit: {
55488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderFit, BorderFit);
55498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueBorder)
55508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitBorder);
55518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitLines);
55538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSizeAdjust: {
55568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textSizeAdjust, TextSizeAdjust)
55578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent()) return;
55588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextSizeAdjust(primitiveValue->getIdent() == CSSValueAuto);
55598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
55608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitTextSecurity:
55635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textSecurity, TextSecurity)
55648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
55668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
55678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitDashboardRegion: {
55688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(dashboardRegions, DashboardRegions)
55698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
55708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone) {
55738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setDashboardRegions(RenderStyle::noneDashboardRegions());
55748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
55768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *region = primitiveValue->getDashboardRegionValue();
55788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!region)
55798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *first = region;
55828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (region) {
55832bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length top = convertToIntLength(region->top(), style(), m_rootElementStyle);
55842bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length right = convertToIntLength(region->right(), style(), m_rootElementStyle);
55852bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length bottom = convertToIntLength(region->bottom(), style(), m_rootElementStyle);
55862bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length left = convertToIntLength(region->left(), style(), m_rootElementStyle);
55878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (region->m_isCircle)
55888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Circle, region->m_label, top, right, bottom, left, region == first ? false : true);
55898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (region->m_isRectangle)
55908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Rectangle, region->m_label, top, right, bottom, left, region == first ? false : true);
55918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = region->m_next.get();
55928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
55938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_element->document()->setHasDashboardRegions(true);
55958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
55998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitRtlOrdering:
56008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(visuallyOrdered, VisuallyOrdered)
56018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
56028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVisuallyOrdered(primitiveValue->getIdent() == CSSValueVisual);
56048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeWidth: {
56068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textStrokeWidth, TextStrokeWidth)
56078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float width = 0;
56088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
56098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThin:
56108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueMedium:
56118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThick: {
56128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                double result = 1.0 / 48;
56138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (primitiveValue->getIdent() == CSSValueMedium)
56148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 3;
56158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (primitiveValue->getIdent() == CSSValueThick)
56168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 5;
56170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = CSSPrimitiveValue::create(result, CSSPrimitiveValue::CSS_EMS)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
56208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
56210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextStrokeWidth(width);
56258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransform: {
56288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transform, Transform);
56298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TransformOperations operations;
56300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        createTransformOperations(value, style(), m_rootElementStyle, operations);
56318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransform(operations);
56328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOrigin:
56358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginX: {
56408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginX(l);
56528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginY: {
56558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginY(l);
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginZ: {
56708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        float f;
56748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
56758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            f = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle));
56778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
56788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
56798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setTransformOriginZ(f);
56808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
56818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
56828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformStyle:
56838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformStyle3D, TransformStyle3D)
56848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
56858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setTransformStyle3D((primitiveValue->getIdent() == CSSValuePreserve3d) ? TransformStyle3DPreserve3D : TransformStyle3DFlat);
56868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
56878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspective: {
56888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspective, Perspective)
56898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
56908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(0);
56918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
56928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
56930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
56940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        float perspectiveValue;
56950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int type = primitiveValue->primitiveType();
56960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (CSSPrimitiveValue::isUnitTypeLength(type))
56970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor));
56980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_NUMBER) {
56990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // For backward compatibility, treat valueless numbers as px.
57000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = CSSPrimitiveValue::create(primitiveValue->getDoubleValue(), CSSPrimitiveValue::CSS_PX)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
57010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else
57028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
57048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (perspectiveValue >= 0.0f)
57058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(perspectiveValue);
57068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOrigin:
57098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginX: {
57138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginX(l);
57258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginY: {
57288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginY(l);
57408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimation:
57438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearAnimations();
57458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritAnimations(m_parentStyle->animations());
57478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDelay:
57498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(delay, Delay, value)
57508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDirection:
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(direction, Direction, value)
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDuration:
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(duration, Duration, value)
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5757dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSPropertyWebkitAnimationFillMode:
5758dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        HANDLE_ANIMATION_VALUE(fillMode, FillMode, value)
5759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
57608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationIterationCount:
57618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(iterationCount, IterationCount, value)
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationName:
57648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(name, Name, value)
57658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitAnimationPlayState:
57670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HANDLE_ANIMATION_VALUE(playState, PlayState, value)
57680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
57698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationTimingFunction:
57708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(timingFunction, TimingFunction, value)
57718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransition:
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearTransitions();
57758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritTransitions(m_parentStyle->transitions());
57778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDelay:
57798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(delay, Delay, value)
57808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDuration:
57828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(duration, Duration, value)
57838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionProperty:
57858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(property, Property, value)
57868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionTimingFunction:
57888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(timingFunction, TimingFunction, value)
57898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5790635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyPointerEvents:
5791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
5792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
5793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // <rdar://problem/6561077> Work around the Stocks widget's misuse of the
5794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // pointer-events property by not applying it in Dashboard.
5795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
5796635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (settings && settings->usesDashboardBackwardCompatibilityMode())
5797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
5799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(pointerEvents, PointerEvents)
5800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!primitiveValue)
5801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_style->setPointerEvents(*primitiveValue);
5803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
5804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
5805643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case CSSPropertyWebkitColorCorrection:
5806643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (isInherit)
5807643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(m_parentStyle->colorSpace());
5808643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (isInitial)
5809a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_style->setColorSpace(ColorSpaceDeviceRGB);
5810643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else {
5811643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!primitiveValue)
5812643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return;
5813643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(*primitiveValue);
5814643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
5815643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
581606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertySize:
581706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyPageSizeProperty(value);
581806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
5819a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
5820a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CSSPropertySpeak:
5821a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL(speak, Speak);
58226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
58236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
5824a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_style->setSpeak(*primitiveValue);
5825a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
5826a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
58278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyInvalid:
58288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5829967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
5830967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Directional properties are resolved by resolveDirectionAwareProperty() before the switch.
5831967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEnd:
5832967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
5833967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndStyle:
5834967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndWidth:
5835967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStart:
5836967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
5837967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartStyle:
5838967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartWidth:
583968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBefore:
584068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeColor:
584168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeStyle:
584268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeWidth:
584368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfter:
584468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterColor:
584568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterStyle:
584668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterWidth:
5847967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginEnd:
5848967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginStart:
584968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginBefore:
585068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginAfter:
5851967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingEnd:
5852967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingStart:
585368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingBefore:
585468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingAfter:
585568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalWidth:
585668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalHeight:
585768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalWidth:
585868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalHeight:
585968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalWidth:
586068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalHeight:
5861967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        ASSERT_NOT_REACHED();
5862967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
5863967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
58648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStretch:
58658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPage:
58668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThrough:
58678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughColor:
58688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughMode:
58698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughStyle:
58708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughWidth:
58718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverline:
58728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineColor:
58738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineMode:
58748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineStyle:
58758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineWidth:
58768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderline:
58778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineColor:
58788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineMode:
58798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineStyle:
58808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineWidth:
58818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitFontSizeDelta:
58828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextDecorationsInEffect:
58838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStroke:
5884f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasis:
58858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
588621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
588721939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputFormat:
588821939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->hasTagName(WebCore::inputTag)) {
588921939df44de1705786c545cd1bf519d47250322dBen Murdoch            String mask = primitiveValue->getStringValue();
589021939df44de1705786c545cd1bf519d47250322dBen Murdoch            static_cast<HTMLInputElement*>(m_element)->setWapInputFormat(mask);
589121939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
589221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
589321939df44de1705786c545cd1bf519d47250322dBen Murdoch
589421939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputRequired:
589521939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->isFormControlElement()) {
589621939df44de1705786c545cd1bf519d47250322dBen Murdoch            HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(m_element);
589721939df44de1705786c545cd1bf519d47250322dBen Murdoch            bool required = primitiveValue->getStringValue() == "true";
589821939df44de1705786c545cd1bf519d47250322dBen Murdoch            element->setRequired(required);
589921939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
590021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
590121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
590221939df44de1705786c545cd1bf519d47250322dBen Murdoch
59038de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    // CSS Text Layout Module Level 3: Vertical writing support
5904e14391e94c850b8bd03680c23b38978db68687a8John Reck    case CSSPropertyWebkitWritingMode: {
5905a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(writingMode, WritingMode)
5906e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (!isInherit && !isInitial && m_element && m_element == m_element->document()->documentElement())
5907e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_element->document()->setWritingModeSetOnDocumentElement(true);
5908e14391e94c850b8bd03680c23b38978db68687a8John Reck        FontDescription fontDescription = m_style->fontDescription();
5909e14391e94c850b8bd03680c23b38978db68687a8John Reck        fontDescription.setOrientation(m_style->isHorizontalWritingMode() ? Horizontal : Vertical);
5910e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (m_style->setFontDescription(fontDescription))
5911e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_fontDirty = true;
59128de7ac488df2f39f82e56811541f4847b3f2e952Steve Block        return;
59134326279fef480892cd059ad1c738f1320601d33fJohn Reck    }
59148de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
5915a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    case CSSPropertyWebkitTextCombine:
5916a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textCombine, TextCombine)
5917a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        return;
5918a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu
5919e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisPosition:
5920e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textEmphasisPosition, TextEmphasisPosition)
5921e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5922e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5923e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisStyle:
5924e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisFill, TextEmphasisFill)
5925e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisMark, TextEmphasisMark)
5926e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisCustomMark, TextEmphasisCustomMark)
5927e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (isInherit || isInitial)
5928e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5929e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5930e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (value->isValueList()) {
5931e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
5932e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            ASSERT(list->length() == 2);
5933e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            if (list->length() != 2)
5934e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                return;
5935e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            for (unsigned i = 0; i < 2; ++i) {
59362bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSValue* item = list->itemWithoutBoundsCheck(i);
59372bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!item->isPrimitiveValue())
59382bde8e466a4451c7319e3a072d118917957d6554Steve Block                    continue;
59392bde8e466a4451c7319e3a072d118917957d6554Steve Block
59402bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSPrimitiveValue* value = static_cast<CSSPrimitiveValue*>(item);
5941e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                if (value->getIdent() == CSSValueFilled || value->getIdent() == CSSValueOpen)
5942e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisFill(*value);
5943e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                else
5944e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisMark(*value);
5945e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            }
5946e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(nullAtom);
5947e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5948e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5949e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5950e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (!primitiveValue)
5951e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5952e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5953e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
5954e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5955e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkCustom);
5956e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(primitiveValue->getStringValue());
5957e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5958e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5959e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5960e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        m_style->setTextEmphasisCustomMark(nullAtom);
5961e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5962e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->getIdent() == CSSValueFilled || primitiveValue->getIdent() == CSSValueOpen) {
5963e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(*primitiveValue);
5964e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkAuto);
5965e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        } else {
5966e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5967e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(*primitiveValue);
5968e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5969e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5970e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5971e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
597274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextOrientation: {
597374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!isInherit && !isInitial && !primitiveValue)
597474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
597574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
597674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        TextOrientation result;
597774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (isInherit)
597874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = m_parentStyle->fontDescription().textOrientation();
597974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else if (isInitial)
598074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = RenderStyle::initialTextOrientation();
598174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else
598274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = *primitiveValue;
598374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
598474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        FontDescription fontDescription = m_style->fontDescription();
598574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (fontDescription.textOrientation() != result) {
598674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            fontDescription.setTextOrientation(result);
598774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            if (m_style->setFontDescription(fontDescription))
598874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block                m_fontDirty = true;
598974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
599074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
599174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
599274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
599374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitLineBoxContain: {
599474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        HANDLE_INHERIT_AND_INITIAL(lineBoxContain, LineBoxContain)
599574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
599674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            m_style->setLineBoxContain(LineBoxContainNone);
599774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
599874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
599974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!value->isCSSLineBoxContainValue())
600174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
600274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        CSSLineBoxContainValue* lineBoxContainValue = static_cast<CSSLineBoxContainValue*>(value);
600474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        m_style->setLineBoxContain(lineBoxContainValue->value());
600574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
600674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
600774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    // These properties are implemented in the CSSStyleApplyProperty lookup table.
600974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyColor:
60102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyDirection:
60112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundAttachment:
60122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundClip:
60132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundClip:
60142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundComposite:
60152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundOrigin:
60162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundOrigin:
60172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundImage:
60182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundSize:
60192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundSize:
60202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskAttachment:
60212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskClip:
60222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskComposite:
60232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskOrigin:
60242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskImage:
60252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskSize:
602674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBackgroundColor:
602774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderBottomColor:
602874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderLeftColor:
602974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderRightColor:
603074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderTopColor:
60312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderTopStyle:
60322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderRightStyle:
60332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderBottomStyle:
60342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderLeftStyle:
603574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyOutlineColor:
603674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitColumnRuleColor:
603774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextEmphasisColor:
603874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextFillColor:
603974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextStrokeColor:
60402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPosition:
60412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionX:
60422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionY:
60432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPosition:
60442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionX:
60452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionY:
60462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeat:
60472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatX:
60482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatY:
60492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeat:
60502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatX:
60512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatY:
60522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflow:
60532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowX:
60542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowY:
605574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        ASSERT_NOT_REACHED();
605674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
605774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
605857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
605957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    case CSSPropertyWebkitTapHighlightColor: {
606057a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(tapHighlightColor, TapHighlightColor);
606157a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        if (!primitiveValue)
606257a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch            break;
606357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
606457a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        Color col = getColorFromPrimitiveValue(primitiveValue).blendWithWhite();
606557a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        m_style->setTapHighlightColor(col);
606657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        return;
606757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    }
606857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif
606957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
60708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
60718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
60728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Try the SVG properties
60738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applySVGProperty(id, value);
60742bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
60758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
60768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
607906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid CSSStyleSelector::applyPageSizeProperty(CSSValue* value)
608006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
6081ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->resetPageSizeType();
608206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!value->isValueList())
608306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
608406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CSSValueList* valueList = static_cast<CSSValueList*>(value);
608506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length width;
608606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length height;
6087ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    PageSizeType pageSizeType = PAGE_SIZE_AUTO;
608806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    switch (valueList->length()) {
608906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 2: {
609006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length>{2} | <page-size> <orientation>
6091ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        pageSizeType = PAGE_SIZE_RESOLVED;
609206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue() || !valueList->item(1)->isPrimitiveValue())
609306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
609406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue0 = static_cast<CSSPrimitiveValue*>(valueList->item(0));
609506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue1 = static_cast<CSSPrimitiveValue*>(valueList->item(1));
609606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type0 = primitiveValue0->primitiveType();
609706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type1 = primitiveValue1->primitiveType();
609806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type0)) {
609906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>{2}
610006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!CSSPrimitiveValue::isUnitTypeLength(type1))
610106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
610206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = Length(primitiveValue0->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
610306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            height = Length(primitiveValue1->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
610406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
610506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <page-size> <orientation>
610606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // The value order is guaranteed. See CSSParser::parseSizeParameter.
610706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!pageSizeFromName(primitiveValue0, primitiveValue1, width, height))
610806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
610906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
611006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
611106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
611206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 1: {
611306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length> | auto | <page-size> | [ portrait | landscape]
611406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue())
611506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
611606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(valueList->item(0));
611706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type = primitiveValue->primitiveType();
611806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type)) {
611906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>
6120ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            pageSizeType = PAGE_SIZE_RESOLVED;
612106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = height = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
612206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
612306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (type != CSSPrimitiveValue::CSS_IDENT)
612406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
612506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            switch (primitiveValue->getIdent()) {
612606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueAuto:
6127ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO;
612806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
612906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValuePortrait:
6130ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_PORTRAIT;
6131ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                break;
613206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueLandscape:
6133ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_LANDSCAPE;
613406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
613506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            default:
6136ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                // <page-size>
6137ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_RESOLVED;
613806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if (!pageSizeFromName(primitiveValue, 0, width, height))
613906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    return;
614006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
614106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
614206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
614306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
614406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
614506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
614606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6147ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->setPageSizeType(pageSizeType);
614806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->setPageSize(LengthSize(width, height));
614906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return;
615006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
615106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
615206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::pageSizeFromName(CSSPrimitiveValue* pageSizeName, CSSPrimitiveValue* pageOrientation, Length& width, Length& height)
615306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
615406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a5Width = mmLength(148), a5Height = mmLength(210);
615506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a4Width = mmLength(210), a4Height = mmLength(297);
615606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a3Width = mmLength(297), a3Height = mmLength(420);
615706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b5Width = mmLength(176), b5Height = mmLength(250);
615806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b4Width = mmLength(250), b4Height = mmLength(353);
615906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length letterWidth = inchLength(8.5), letterHeight = inchLength(11);
616006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length legalWidth = inchLength(8.5), legalHeight = inchLength(14);
616106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length ledgerWidth = inchLength(11), ledgerHeight = inchLength(17);
616206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6163ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!pageSizeName || pageSizeName->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6164ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return false;
616506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6166ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    switch (pageSizeName->getIdent()) {
616706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA5:
616806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a5Width;
616906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a5Height;
617006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
617106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA4:
617206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a4Width;
617306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a4Height;
617406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
617506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA3:
617606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a3Width;
617706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a3Height;
617806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
617906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB5:
618006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b5Width;
618106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b5Height;
618206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB4:
618406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b4Width;
618506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b4Height;
618606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLetter:
618806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = letterWidth;
618906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = letterHeight;
619006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLegal:
619206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = legalWidth;
619306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = legalHeight;
619406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLedger:
619606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = ledgerWidth;
619706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = ledgerHeight;
619806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
620006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
620106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6202ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6203ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (pageOrientation) {
6204ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (pageOrientation->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6205ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6206ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        switch (pageOrientation->getIdent()) {
6207ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValueLandscape:
6208ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            std::swap(width, height);
6209ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6210ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValuePortrait:
6211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Nothing to do.
6212ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6213ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        default:
6214ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6215ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
6216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
621706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return true;
621806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
621906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6220cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::mmLength(double mm) const
622106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
622206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(mm, CSSPrimitiveValue::CSS_MM)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
622306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
622406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6225cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::inchLength(double inch) const
622606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
622706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(inch, CSSPrimitiveValue::CSS_IN)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
622806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
622906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
62305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillAttachment(CSSPropertyID, FillLayer* layer, CSSValue* value)
62318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setAttachment(FillLayer::initialFillAttachment(layer->type()));
62348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (primitiveValue->getIdent()) {
62428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueFixed:
62430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(FixedBackgroundAttachment);
62448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueScroll:
62460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(ScrollBackgroundAttachment);
62470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
62480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case CSSValueLocal:
62490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(LocalBackgroundAttachment);
62508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
62528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
62538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillClip(CSSPropertyID, FillLayer* layer, CSSValue* value)
62578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setClip(FillLayer::initialFillClip(layer->type()));
62608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setClip(*primitiveValue);
62688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillComposite(CSSPropertyID, FillLayer* layer, CSSValue* value)
62718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setComposite(FillLayer::initialFillComposite(layer->type()));
62748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setComposite(*primitiveValue);
62828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillOrigin(CSSPropertyID, FillLayer* layer, CSSValue* value)
62858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setOrigin(FillLayer::initialFillOrigin(layer->type()));
62888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setOrigin(*primitiveValue);
62968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value)
62998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageValue())
63015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return cachedOrPendingFromValue(property, static_cast<CSSImageValue*>(value));
63025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageGeneratorValue())
63048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<CSSImageGeneratorValue*>(value)->generatedImage();
63055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
63078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value)
63105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
63115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    StyleImage* image = value->cachedOrPendingImage();
63125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (image && image->isPendingImage())
63135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_pendingImageProperties.add(property);
63145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return image;
63155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
63165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillImage(CSSPropertyID property, FillLayer* layer, CSSValue* value)
63188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
63208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setImage(FillLayer::initialFillImage(layer->type()));
63218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    layer->setImage(styleImage(property, value));
63258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatX(CSSPropertyID, FillLayer* layer, CSSValue* value)
63288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatX(FillLayer::initialFillRepeatX(layer->type()));
63318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatX(*primitiveValue);
63398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatY(CSSPropertyID, FillLayer* layer, CSSValue* value)
63428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6344231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatY(FillLayer::initialFillRepeatY(layer->type()));
63458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6350231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6351231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6352231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatY(*primitiveValue);
6353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
6354231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillSize(CSSPropertyID, FillLayer* layer, CSSValue* value)
6356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6357231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!value->isPrimitiveValue()) {
6358231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeNone);
6359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6363231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (primitiveValue->getIdent() == CSSValueContain)
6364231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Contain);
6365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (primitiveValue->getIdent() == CSSValueCover)
6366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Cover);
6367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
6368231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeLength);
6369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6370231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    LengthSize b = FillLayer::initialFillSizeLength(layer->type());
6371231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL || primitiveValue->getIdent() == CSSValueContain
6373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        || primitiveValue->getIdent() == CSSValueCover) {
6374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeLength(b);
6375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6376231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6377231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Pair* pair = primitiveValue->getPairValue();
63796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!pair || !pair->first() || !pair->second())
63808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* first = static_cast<CSSPrimitiveValue*>(pair->first());
63838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* second = static_cast<CSSPrimitiveValue*>(pair->second());
63848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length firstLength, secondLength;
63868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstType = first->primitiveType();
63878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int secondType = second->primitiveType();
63888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
63908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (firstType == CSSPrimitiveValue::CSS_UNKNOWN)
63928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(Auto);
63938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(firstType))
63940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        firstLength = Length(first->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
63958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (firstType == CSSPrimitiveValue::CSS_PERCENTAGE)
63968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(first->getDoubleValue(), Percent);
63978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
63988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (secondType == CSSPrimitiveValue::CSS_UNKNOWN)
64018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(Auto);
64028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(secondType))
64030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        secondLength = Length(second->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (secondType == CSSPrimitiveValue::CSS_PERCENTAGE)
64058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(second->getDoubleValue(), Percent);
64068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setWidth(firstLength);
64108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setHeight(secondLength);
6411231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setSizeLength(b);
64128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillXPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setXPosition(FillLayer::initialFillXPosition(layer->type()));
64188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setXPosition(l);
64368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillYPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setYPosition(FillLayer::initialFillYPosition(layer->type()));
64428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setYPosition(l);
64608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDelay(Animation* animation, CSSValue* value)
64638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(Animation::initialAnimationDelay());
64668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
6474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue());
6475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue()/1000.0f);
64778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDirection(Animation* layer, CSSValue* value)
64808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6482635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setDirection(Animation::initialAnimationDirection());
64838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    layer->setDirection(primitiveValue->getIdent() == CSSValueAlternate ? Animation::AnimationDirectionAlternate : Animation::AnimationDirectionNormal);
64918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDuration(Animation* animation, CSSValue* value)
64948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6496635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDuration(Animation::initialAnimationDuration());
64978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
65058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue());
65068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
65078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue()/1000.0f);
65088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSStyleSelector::mapAnimationFillMode(Animation* layer, CSSValue* value)
6511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(Animation::initialAnimationFillMode());
6514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
6515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (primitiveValue->getIdent()) {
6522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueNone:
6523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeNone);
6524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueForwards:
6526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeForwards);
6527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBackwards:
6529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBackwards);
6530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBoth:
6532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBoth);
6533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationIterationCount(Animation* animation, CSSValue* value)
65388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setIterationCount(Animation::initialAnimationIterationCount());
65418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueInfinite)
65498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(-1);
65508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(int(primitiveValue->getFloatValue()));
65528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationName(Animation* layer, CSSValue* value)
65558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setName(Animation::initialAnimationName());
65588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueNone)
65668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setIsNoneAnimation(true);
65678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setName(primitiveValue->getStringValue());
65698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid CSSStyleSelector::mapAnimationPlayState(Animation* layer, CSSValue* value)
65720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
65730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
65740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        layer->setPlayState(Animation::initialAnimationPlayState());
65750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
65760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
65770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    EAnimPlayState playState = (primitiveValue->getIdent() == CSSValuePaused) ? AnimPlayStatePaused : AnimPlayStatePlaying;
65830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    layer->setPlayState(playState);
65840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
65850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationProperty(Animation* animation, CSSValue* value)
65878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(Animation::initialAnimationProperty());
65908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueAll)
6598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateAll);
6599635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (primitiveValue->getIdent() == CSSValueNone)
6600635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateNone);
6601635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(static_cast<CSSPropertyID>(primitiveValue->getIdent()));
66038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationTimingFunction(Animation* animation, CSSValue* value)
66068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setTimingFunction(Animation::initialAnimationTimingFunction());
66098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue()) {
66138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
66148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
66158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueLinear:
66165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(LinearTimingFunction::create());
66178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEase:
66195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create());
66208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseIn:
66225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 1.0, 1.0));
66238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseOut:
66255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.0, 0.0, 0.58, 1.0));
66268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseInOut:
66285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 0.58, 1.0));
66295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepStart:
66315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, true));
66325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepEnd:
66345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, false));
66358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
66378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isTimingFunctionValue()) {
66418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSTimingFunctionValue* timingFunction = static_cast<CSSTimingFunctionValue*>(value);
66425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (timingFunction->isCubicBezierTimingFunctionValue()) {
66435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSCubicBezierTimingFunctionValue* cubicTimingFunction = static_cast<CSSCubicBezierTimingFunctionValue*>(value);
66445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(CubicBezierTimingFunction::create(cubicTimingFunction->x1(), cubicTimingFunction->y1(), cubicTimingFunction->x2(), cubicTimingFunction->y2()));
66455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else if (timingFunction->isStepsTimingFunctionValue()) {
66465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSStepsTimingFunctionValue* stepsTimingFunction = static_cast<CSSStepsTimingFunctionValue*>(value);
66475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(StepsTimingFunction::create(stepsTimingFunction->numberOfSteps(), stepsTimingFunction->stepAtStart()));
66485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else
66495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(LinearTimingFunction::create());
66508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapNinePieceImage(CSSPropertyID property, CSSValue* value, NinePieceImage& image)
66548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we're a primitive value, then we are "none" and don't need to alter the empty image at all.
66566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value || value->isPrimitiveValue() || !value->isBorderImageValue())
66578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Retrieve the border image value.
66608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSBorderImageValue* borderImage = static_cast<CSSBorderImageValue*>(value);
66618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the image (this kicks off the load).
66635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    image.setImage(styleImage(property, borderImage->imageValue()));
66648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set up a length box to represent our image slices.
6666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    LengthBox l;
66678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Rect* r = borderImage->m_imageSliceRect.get();
66688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->top()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getDoubleValue(), Percent);
66708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->bottom()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length(r->bottom()->getDoubleValue(), Percent);
66748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length((int)r->bottom()->getFloatValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->left()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getDoubleValue(), Percent);
66788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->right()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getDoubleValue(), Percent);
66828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
6684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setSlices(l);
6685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the appropriate rules for stretch/round/repeat of the slices
6687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule horizontalRule;
66888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_horizontalSizeRule) {
66898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = StretchImageRule;
66918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
66928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RoundImageRule;
66948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
66958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RepeatImageRule;
66978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
66988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setHorizontalRule(horizontalRule);
67008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule verticalRule;
67028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_verticalSizeRule) {
67038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = StretchImageRule;
67058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RoundImageRule;
67088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RepeatImageRule;
67118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setVerticalRule(verticalRule);
67148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForTextSizeAdjust()
67178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_style->textSizeAdjust())
67198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6720aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck
6721aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    /* TODO: Remove this when a fix for webkit bug 56543 is submitted and can
6722aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * be cherry picked.
6723aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * This is a quick fix for Android to prevent sites from using
6724aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * -webkit-text-size-adjust: none; which breaks font size accessibility
6725aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * options on all platforms. The purpose of the property is to prevent
6726aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the automatic font size changes done by platforms like iOS when the
6727aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * rotation changes. Since Android doesn't do this, we can safely ignore
6728aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the 'none' option.
6729aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     */
6730aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#if PLATFORM(ANDROID)
6731aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    return;
6732aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#endif
67338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(m_style->fontDescription());
67358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFontDescription.setComputedSize(newFontDescription.specifiedSize());
67368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->setFontDescription(newFontDescription);
67378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForZoomChange(RenderStyle* style, RenderStyle* parentStyle)
67408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->effectiveZoom() == parentStyle->effectiveZoom())
67428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, childFont.specifiedSize());
67478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForGenericFamilyChange(RenderStyle* style, RenderStyle* parentStyle)
67518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.isAbsoluteSize() || !parentStyle)
67558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& parentFont = parentStyle->fontDescription();
6758231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.useFixedDefaultSize() == parentFont.useFixedDefaultSize())
67598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For now, lump all families but monospace together.
67628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.genericFamily() != FontDescription::MonospaceFamily &&
67638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parentFont.genericFamily() != FontDescription::MonospaceFamily)
67648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We know the parent is monospace or the child is monospace, and that font
67678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // size was unspecified.  We want to scale our font size as appropriate.
67688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the font uses a keyword size, then we refetch from the table rather than
67698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // multiplying by our scale factor.
67708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float size;
6771231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.keywordSize())
6772d0825bca7fe65beaee391d30da42e937db621564Steve Block        size = fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + childFont.keywordSize() - 1, childFont.useFixedDefaultSize());
6773231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
67748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
67758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float fixedScaleFactor = settings
67768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ? static_cast<float>(settings->defaultFixedFontSize()) / settings->defaultFontSize()
67778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : 1;
6778231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        size = parentFont.useFixedDefaultSize() ?
6779231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() / fixedScaleFactor :
6780231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() * fixedScaleFactor;
67818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, size);
67858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::setFontSize(FontDescription& fontDescription, float size)
67898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setSpecifiedSize(size);
6791692e5dbf12901edacf14812a6fae25462920af42Steve Block
6792692e5dbf12901edacf14812a6fae25462920af42Steve Block    bool useSVGZoomRules = m_element && m_element->isSVGElement();
6793692e5dbf12901edacf14812a6fae25462920af42Steve Block    fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), size, useSVGZoomRules));
67948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6796692e5dbf12901edacf14812a6fae25462920af42Steve Blockfloat CSSStyleSelector::getComputedSizeFromSpecifiedSize(Document* document, RenderStyle* style, bool isAbsoluteSize, float specifiedSize, bool useSVGZoomRules)
67978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Text with a 0px font size should not be visible and therefore needs to be
67992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // exempt from minimum font size rules. Acid3 relies on this for pixel-perfect
68002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // rendering. This is also compatible with other browsers that have minimum
68012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // font size settings (e.g. Firefox).
68022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (fabsf(specifiedSize) < std::numeric_limits<float>::epsilon())
68032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0.0f;
68042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6805692e5dbf12901edacf14812a6fae25462920af42Steve Block    float zoomFactor = 1.0f;
6806692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!useSVGZoomRules) {
6807692e5dbf12901edacf14812a6fae25462920af42Steve Block        zoomFactor = style->effectiveZoom();
680868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (Frame* frame = document->frame())
680968513a70bcd92384395513322f1b801e7bf9c729Steve Block            zoomFactor *= frame->textZoomFactor();
6810692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
6811692e5dbf12901edacf14812a6fae25462920af42Steve Block
68128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We support two types of minimum font size.  The first is a hard override that applies to
68138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // all fonts.  This is "minSize."  The second type of minimum font size is a "smart minimum"
68148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that is applied only when the Web page can't know what size it really asked for, e.g.,
68158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when it uses logical sizes like "small" or expresses the font-size as a percentage of
68168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the user's default font setting.
68178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With the smart minimum, we never want to get smaller than the minimum font size to keep fonts readable.
68198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // However we always allow the page to set an explicit pixel size that is smaller,
68208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // since sites will mis-render otherwise (e.g., http://www.gamespot.com with a 9px minimum).
68218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6822d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
68238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
68248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
68258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minSize = settings->minimumFontSize();
68278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minLogicalSize = settings->minimumLogicalFontSize();
68288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomedSize = specifiedSize * zoomFactor;
68298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apply the hard minimum first.  We only apply the hard minimum if after zooming we're still too small.
68318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minSize)
68328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minSize;
68338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now apply the "smart minimum."  This minimum is also only applied if we're still too small
68358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // after zooming.  The font size must either be relative to the user default or the original size
68368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // must have been acceptable.  In other words, we only apply the smart minimum whenever we're positive
68378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // doing so won't disrupt the layout.
68388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minLogicalSize && (specifiedSize >= minLogicalSize || !isAbsoluteSize))
68398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minLogicalSize;
68408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also clamp to a reasonable maximum to prevent insane font sizes from causing crashes on various
68428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // platforms (I'm looking at you, Windows.)
68436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return min(1000000.0f, zoomedSize);
68448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
68458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMax = 16;
68478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMin = 9;
68488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int totalKeywords = 8;
68498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WinIE/Nav4 table for font sizes.  Designed to match the legacy font mapping system of HTML.
68518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int quirksFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    28 },
68548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    31 },
68558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    11,    13,    17,    22,    34 },
68568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    37 },
68578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    13,    16,    20,    26,    40 }, // fixed font default (13)
68588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    11,    14,    17,    21,    28,    42 },
68598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    15,    17,    23,    30,    45 },
68608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Strict mode table matches MacIE and Mozilla's settings exactly.
68688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int strictFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    27 },
68718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    30 },
68728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    11,    13,    17,    22,    33 },
68738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    36 },
68748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    13,    16,    20,    26,    39 }, // fixed font default (13)
68758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    14,    17,    21,    28,    42 },
68768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    15,    18,    23,    30,    45 },
68778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For values outside the range of the table, we use Todd Fahrner's suggested scale
68858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// factors for each keyword value.
68868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float fontSizeFactors[totalKeywords] = { 0.60f, 0.75f, 0.89f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f };
68878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickfloat CSSStyleSelector::fontSizeForKeyword(Document* document, int keyword, bool shouldUseFixedDefaultSize)
68898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6890d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
68918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
68928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
68938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool quirksMode = document->inQuirksMode();
68955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
68968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
68978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Look up the entry in the table.
68988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int row = mediumSize - fontSizeTableMin;
68998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int col = (keyword - CSSValueXxSmall);
69008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return quirksMode ? quirksFontSizeTable[row][col] : strictFontSizeTable[row][col];
69018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Value is outside the range of the table. Apply the scale factor instead.
69048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float minLogicalSize = max(settings->minimumLogicalFontSize(), 1);
69058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return max(fontSizeFactors[keyword - CSSValueXxSmall]*mediumSize, minLogicalSize);
69068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate<typename T>
69095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic int findNearestLegacyFontSize(int pixelFontSize, const T* table, int multiplier)
69105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Ignore table[0] because xx-small does not correspond to any legacy font size.
69125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    for (int i = 1; i < totalKeywords - 1; i++) {
69135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (pixelFontSize * 2 < (table[i] + table[i + 1]) * multiplier)
69145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return i;
69155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return totalKeywords - 1;
69175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickint CSSStyleSelector::legacyFontSize(Document* document, int pixelFontSize, bool shouldUseFixedDefaultSize)
69205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    Settings* settings = document->settings();
69225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!settings)
69235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 1;
69245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool quirksMode = document->inQuirksMode();
69265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
69275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
69285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        int row = mediumSize - fontSizeTableMin;
69295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return findNearestLegacyFontSize<int>(pixelFontSize, quirksMode ? quirksFontSizeTable[row] : strictFontSizeTable[row], 1);
69305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return findNearestLegacyFontSize<float>(pixelFontSize, fontSizeFactors, mediumSize);
69335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
6935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::largerFontSize(float size, bool) const
69368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale up to
69388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size * 1.2f;
69408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6942635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::smallerFontSize(float size, bool) const
69438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale down to
69458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size / 1.2f;
69478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Color colorForCSSValue(int cssValueId)
69508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct ColorValue {
69528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int cssValueId;
69538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RGBA32 color;
69548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static const ColorValue colorValues[] = {
69578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueAqua, 0xFF00FFFF },
69588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlack, 0xFF000000 },
69598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlue, 0xFF0000FF },
69608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueFuchsia, 0xFFFF00FF },
69618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGray, 0xFF808080 },
69628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGreen, 0xFF008000  },
69638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGrey, 0xFF808080 },
69648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueLime, 0xFF00FF00 },
69658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueMaroon, 0xFF800000 },
69668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueNavy, 0xFF000080 },
69678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOlive, 0xFF808000  },
69688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOrange, 0xFFFFA500 },
69698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValuePurple, 0xFF800080 },
69708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueRed, 0xFFFF0000 },
69718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueSilver, 0xFFC0C0C0 },
69728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTeal, 0xFF008080  },
69738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTransparent, 0x00000000 },
69748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueWhite, 0xFFFFFFFF },
69758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueYellow, 0xFFFFFF00 },
69768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { 0, 0 }
69778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (const ColorValue* col = colorValues; col->cssValueId; ++col) {
69808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (col->cssValueId == cssValueId)
69818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return col->color;
69828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return RenderTheme::defaultTheme()->systemColor(cssValueId);
69848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6986cad810f21b803229eb11403f9209855525a25d57Steve BlockColor CSSStyleSelector::getColorFromPrimitiveValue(CSSPrimitiveValue* primitiveValue) const
69878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color col;
69898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int ident = primitiveValue->getIdent();
69908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ident) {
69918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ident == CSSValueWebkitText)
69928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->textColor();
6993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitLink)
6994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            col = m_element->isLink() && m_checker.m_matchVisitedPseudoClass ? m_element->document()->visitedLinkColor() : m_element->document()->linkColor();
6995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitActivelink)
69968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->activeLinkColor();
69978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueWebkitFocusRingColor)
69980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            col = RenderTheme::focusRingColor();
69998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueCurrentcolor)
70008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_style->color();
70018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
70028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = colorForCSSValue(ident);
70038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RGBCOLOR)
70040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        col.setRGB(primitiveValue->getRGBA32Value());
70058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return col;
70068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSStyleSelector::hasSelectorForAttribute(const AtomicString &attrname) const
70098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_selectorAttrs.contains(attrname.impl());
70118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addViewportDependentMediaQueryResult(const MediaQueryExp* expr, bool result)
70148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewportDependentMediaQueryResults.append(new MediaQueryResult(*expr, result));
70168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSStyleSelector::affectedByViewportChange() const
70198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned s = m_viewportDependentMediaQueryResults.size();
70218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < s; i++) {
70228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expression) != m_viewportDependentMediaQueryResults[i]->m_result)
70238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
70248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
70268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::allVisitedStateChanged()
70298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_linksCheckedForVisitedState.isEmpty())
70318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->isLink())
70345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7038635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::visitedStateChanged(LinkHash visitedHash)
70398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_linksCheckedForVisitedState.contains(visitedHash))
70418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const AtomicString* attr = linkAttribute(node);
7044635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (attr && visitedLinkHash(m_document->baseURL(), *attr) == visitedHash)
70455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7049635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic TransformOperation::OperationType getTransformOperationType(WebKitCSSTransformValue::TransformOperationType type)
70508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (type) {
70528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleTransformOperation:          return TransformOperation::SCALE;
70538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleXTransformOperation:         return TransformOperation::SCALE_X;
70548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleYTransformOperation:         return TransformOperation::SCALE_Y;
70558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::ScaleZTransformOperation:         return TransformOperation::SCALE_Z;
70568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Scale3DTransformOperation:        return TransformOperation::SCALE_3D;
70578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateTransformOperation:      return TransformOperation::TRANSLATE;
70588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateXTransformOperation:     return TransformOperation::TRANSLATE_X;
70598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateYTransformOperation:     return TransformOperation::TRANSLATE_Y;
70608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::TranslateZTransformOperation:     return TransformOperation::TRANSLATE_Z;
70618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Translate3DTransformOperation:    return TransformOperation::TRANSLATE_3D;
70628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::RotateTransformOperation:         return TransformOperation::ROTATE;
70638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateXTransformOperation:        return TransformOperation::ROTATE_X;
70648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateYTransformOperation:        return TransformOperation::ROTATE_Y;
70658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateZTransformOperation:        return TransformOperation::ROTATE_Z;
70668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Rotate3DTransformOperation:       return TransformOperation::ROTATE_3D;
70678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewTransformOperation:           return TransformOperation::SKEW;
70688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewXTransformOperation:          return TransformOperation::SKEW_X;
70698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewYTransformOperation:          return TransformOperation::SKEW_Y;
70708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::MatrixTransformOperation:         return TransformOperation::MATRIX;
70718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Matrix3DTransformOperation:       return TransformOperation::MATRIX_3D;
70728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::PerspectiveTransformOperation:    return TransformOperation::PERSPECTIVE;
70738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::UnknownTransformOperation:        return TransformOperation::NONE;
70748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return TransformOperation::NONE;
70768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSStyleSelector::createTransformOperations(CSSValue* inValue, RenderStyle* style, RenderStyle* rootStyle, TransformOperations& outOperations)
70798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!inValue || !inValue->isValueList()) {
70816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        outOperations.clear();
70826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
70836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
70848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
70856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    float zoomFactor = style ? style->effectiveZoom() : 1;
70868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TransformOperations operations;
70876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    CSSValueList* list = static_cast<CSSValueList*>(inValue);
70886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned size = list->length();
70896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    for (unsigned i = 0; i < size; i++) {
70906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
70916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isWebKitCSSTransformValue())
70926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
70936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
70946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        WebKitCSSTransformValue* transformValue = static_cast<WebKitCSSTransformValue*>(list->itemWithoutBoundsCheck(i));
70956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!transformValue->length())
70966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
70976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
70986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        bool haveNonPrimitiveValue = false;
70996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        for (unsigned j = 0; j < transformValue->length(); ++j) {
71006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!transformValue->itemWithoutBoundsCheck(j)->isPrimitiveValue()) {
71016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                haveNonPrimitiveValue = true;
71026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        }
71056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (haveNonPrimitiveValue)
71066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPrimitiveValue* firstValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0));
71096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        switch (transformValue->operationType()) {
71116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleTransformOperation:
71126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleXTransformOperation:
71136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleYTransformOperation: {
71146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
71278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
71286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, 1.0, getTransformOperationType(transformValue->operationType())));
71296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleZTransformOperation:
71326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Scale3DTransformOperation: {
71336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sz = 1.0;
71366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleZTransformOperation)
71376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sz = firstValue->getDoubleValue();
71386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
71446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
71456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sz = thirdValue->getDoubleValue();
71468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
71546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, sz, getTransformOperationType(transformValue->operationType())));
71556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateTransformOperation:
71586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateXTransformOperation:
71596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateYTransformOperation: {
71606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71642bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71662bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
71686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71702bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
71718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
71748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
71766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
71778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, Length(0, Fixed), getTransformOperationType(transformValue->operationType())));
71796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateZTransformOperation:
71826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Translate3DTransformOperation: {
71836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tz = Length(0, Fixed);
71876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateZTransformOperation)
71882bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tz = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71902bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71922bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
71946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
71956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
71962bde8e466a4451c7319e3a072d118917957d6554Steve Block                            tz = convertToFloatLength(thirdValue, style, rootStyle, zoomFactor, &ok);
71976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        }
71986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72002bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
72018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
72048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
72066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
72078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, tz, getTransformOperationType(transformValue->operationType())));
72096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateTransformOperation: {
72126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(0, 0, 1, angle, getTransformOperationType(transformValue->operationType())));
72216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateXTransformOperation:
72246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateYTransformOperation:
72256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateZTransformOperation: {
72266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = 0;
72276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = 0;
72286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = 0;
72296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::RotateXTransformOperation)
72366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    x = 1;
72376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::RotateYTransformOperation)
72386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    y = 1;
72396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else
72406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    z = 1;
72416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Rotate3DTransformOperation: {
72456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 4)
72468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
72476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
72496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* fourthValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3));
72506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = firstValue->getDoubleValue();
72516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = secondValue->getDoubleValue();
72526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = thirdValue->getDoubleValue();
72536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = fourthValue->getDoubleValue();
72546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewTransformOperation:
72626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewXTransformOperation:
72636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewYTransformOperation: {
72646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleX = 0;
72656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleY = 0;
72666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::SkewYTransformOperation)
72746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleY = angle;
72756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
72766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleX = angle;
72776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() == WebKitCSSTransformValue::SkewTransformOperation) {
72786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
72796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            angleY = secondValue->getDoubleValue();
72816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = rad2deg(angleY);
72836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = grad2deg(angleY);
72856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = turn2deg(angleY);
72878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
72906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(SkewTransformOperation::create(angleX, angleY, getTransformOperationType(transformValue->operationType())));
72916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::MatrixTransformOperation: {
72946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 6)
72958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
72966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double a = firstValue->getDoubleValue();
72976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double b = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue();
72986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double c = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue();
72996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double d = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue();
7300f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double e = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue();
7301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double f = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue();
73026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(MatrixTransformOperation::create(a, b, c, d, e, f));
73036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Matrix3DTransformOperation: {
73066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 16)
73078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
73086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                TransformationMatrix matrix(static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0))->getDoubleValue(),
73096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue(),
73106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue(),
73116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue(),
73126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue(),
73136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue(),
73146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(6))->getDoubleValue(),
73156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(7))->getDoubleValue(),
73166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(8))->getDoubleValue(),
73176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(9))->getDoubleValue(),
73186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(10))->getDoubleValue(),
73196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(11))->getDoubleValue(),
7320f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(12))->getDoubleValue(),
7321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(13))->getDoubleValue(),
73226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(14))->getDoubleValue(),
73236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(15))->getDoubleValue());
73246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(Matrix3DTransformOperation::create(matrix));
73256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::PerspectiveTransformOperation: {
73282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                bool ok = true;
73292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                Length p = Length(0, Fixed);
73302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (CSSPrimitiveValue::isUnitTypeLength(firstValue->primitiveType()))
73312bde8e466a4451c7319e3a072d118917957d6554Steve Block                    p = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
73322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                else {
73332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    // This is a quirk that should go away when 3d transforms are finalized.
73342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    double val = firstValue->getDoubleValue();
73352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    ok = val >= 0;
73362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    val = clampToPositiveInteger(val);
73372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    p = Length(static_cast<int>(val), Fixed);
73382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                }
73392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (!ok)
73416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
73422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(PerspectiveTransformOperation::create(p));
73446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
73466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::UnknownTransformOperation:
73476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                ASSERT_NOT_REACHED();
73486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
73508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
73516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
73528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outOperations = operations;
73538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
73548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
73558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
73565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::loadPendingImages()
73575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
73585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_pendingImageProperties.isEmpty())
73595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
73605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HashSet<int>::const_iterator end = m_pendingImageProperties.end();
73625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (HashSet<int>::const_iterator it = m_pendingImageProperties.begin(); it != end; ++it) {
73635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSPropertyID currentProperty = static_cast<CSSPropertyID>(*it);
73645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        CachedResourceLoader* cachedResourceLoader = m_element->document()->cachedResourceLoader();
73665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        switch (currentProperty) {
73685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyBackgroundImage: {
73695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* backgroundLayer = m_style->accessBackgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next()) {
73705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) {
73715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(backgroundLayer->image())->cssImageValue();
73725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        backgroundLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
73735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyContent: {
73795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (ContentData* contentData = const_cast<ContentData*>(m_style->contentData()); contentData; contentData = contentData->next()) {
73805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (contentData->isImage() && contentData->image()->isPendingImage()) {
73815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(contentData->image())->cssImageValue();
7382a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        if (StyleCachedImage* cachedImage = imageValue->cachedImage(cachedResourceLoader))
7383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                            contentData->setImage(cachedImage);
73845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyCursor: {
73905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (CursorList* cursorList = m_style->cursors()) {
73915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    for (size_t i = 0; i < cursorList->size(); ++i) {
7392e14391e94c850b8bd03680c23b38978db68687a8John Reck                        CursorData& currentCursor = cursorList->at(i);
7393e14391e94c850b8bd03680c23b38978db68687a8John Reck                        if (StyleImage* image = currentCursor.image()) {
7394e14391e94c850b8bd03680c23b38978db68687a8John Reck                            if (image->isPendingImage()) {
7395e14391e94c850b8bd03680c23b38978db68687a8John Reck                                CSSImageValue* imageValue = static_cast<StylePendingImage*>(image)->cssImageValue();
7396e14391e94c850b8bd03680c23b38978db68687a8John Reck                                currentCursor.setImage(imageValue->cachedImage(cachedResourceLoader));
7397e14391e94c850b8bd03680c23b38978db68687a8John Reck                            }
73985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        }
73995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyListStyleImage: {
74055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (m_style->listStyleImage() && m_style->listStyleImage()->isPendingImage()) {
74065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(m_style->listStyleImage())->cssImageValue();
74075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setListStyleImage(imageValue->cachedImage(cachedResourceLoader));
74085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBorderImage: {
74135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& borderImage = m_style->borderImage();
74145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (borderImage.image() && borderImage.image()->isPendingImage()) {
74155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(borderImage.image())->cssImageValue();
74165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setBorderImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), borderImage.slices(), borderImage.horizontalRule(), borderImage.verticalRule()));
74175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBoxReflect: {
7422f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (StyleReflection* reflection = m_style->boxReflect()) {
7423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    const NinePieceImage& maskImage = reflection->mask();
7424f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    if (maskImage.image() && maskImage.image()->isPendingImage()) {
7425f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskImage.image())->cssImageValue();
7426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        reflection->setMask(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskImage.slices(), maskImage.horizontalRule(), maskImage.verticalRule()));
7427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    }
74285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskBoxImage: {
74335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& maskBoxImage = m_style->maskBoxImage();
74345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (maskBoxImage.image() && maskBoxImage.image()->isPendingImage()) {
74355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskBoxImage.image())->cssImageValue();
74365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setMaskBoxImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskBoxImage.slices(), maskBoxImage.horizontalRule(), maskBoxImage.verticalRule()));
74375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskImage: {
74425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* maskLayer = m_style->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) {
74435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (maskLayer->image() && maskLayer->image()->isPendingImage()) {
74445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskLayer->image())->cssImageValue();
74455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        maskLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
74465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            default:
74515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                ASSERT_NOT_REACHED();
74525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
74535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
74545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_pendingImageProperties.clear();
74565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
74575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
7459