CSSStyleSelector.cpp revision bb0dba49203d72577b8eac34537c9c671ba9bec7
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
1240d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Blockstatic inline bool isAtShadowBoundary(Element* element)
1241d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block{
1242d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block    if (!element)
1243d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block        return false;
1244d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block
1245d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block    ContainerNode* parentNode = element->parentNode();
1246d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block    return parentNode && parentNode->isShadowBoundary();
1247d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block}
1248d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// If resolveForRootDefault is true, style based on user agent style sheet only. This is used in media queries, where
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// relative units are interpreted according to document root element style, styled only with UA stylesheet
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* e, RenderStyle* defaultParent, bool allowSharing, bool resolveForRootDefault, bool matchVisitedPseudoClass)
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Once an element has a renderer, we don't try to destroy it, since otherwise the renderer
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // will vanish if a style recalc happens during loading.
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing && !e->document()->haveStylesheetsLoaded() && !e->renderer()) {
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!s_styleNotYetAvailable) {
125821939df44de1705786c545cd1bf519d47250322dBen Murdoch            s_styleNotYetAvailable = RenderStyle::create().releaseRef();
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->ref();
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->setDisplay(NONE);
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->font().update(m_fontSelector);
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s_styleNotYetAvailable->ref();
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        e->document()->setHasNodesWithPlaceholderStyle();
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return s_styleNotYetAvailable;
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
1269ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    initForStyleResolve(e, defaultParent);
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing) {
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderStyle* sharedStyle = locateSharedStyle();
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sharedStyle)
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return sharedStyle;
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Compute our style allowing :visited to match first.
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
12786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && m_parentStyle && (m_parentStyle->insideLink() || e->isLink()) && e->document()->usesLinkRules()) {
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style.
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentStyle = m_parentStyle;
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!e->isLink()) {
1282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Use the parent's visited style if one exists.
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RenderStyle* parentVisitedStyle = m_parentStyle->getCachedPseudoStyle(VISITED_LINK);
1284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (parentVisitedStyle)
1285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                parentStyle = parentVisitedStyle;
1286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = styleForElement(e, parentStyle, false, false, true);
1288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initForStyleResolve(e, defaultParent);
1289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1291d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block    // Don't propagate user-modify into shadow DOM
1292d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block    if (isAtShadowBoundary(e))
1293d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block        m_style->setUserModify(RenderStyle::initialUserModify());
1294d60e027437c746fb2412aef1c1cad6b1347c1b5eSteve Block
12956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = RenderStyle::create();
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_parentStyle)
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->inheritFrom(m_parentStyle);
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = style();
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (e->isLink()) {
1305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->setIsLink(true);
13066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_style->setInsideLink(m_elementLinkState);
1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
13092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (visitedStyle) {
13102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Copy any pseudo bits that the visited style has to the primary style so that
13112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // pseudo element styles will continue to work for pseudo elements inside :visited
13122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // links.
13132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (unsigned pseudo = FIRST_PUBLIC_PSEUDOID; pseudo < FIRST_INTERNAL_PSEUDOID; ++pseudo) {
13142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (visitedStyle->hasPseudoStyle(static_cast<PseudoId>(pseudo)))
13152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                m_style->setHasPseudoStyle(static_cast<PseudoId>(pseudo));
13162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
13172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_elementLinkState == InsideUnvisitedLink)
13182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben 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.
13192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
13202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
13212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (simpleDefaultStyleSheet && !elementCanUseSimpleDefaultStyle(e)) {
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadFullDefaultStyle();
1325ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool loadedSVGUserAgentSheet;
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e->isSVGElement() && !loadedSVGUserAgentSheet) {
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // SVG rules.
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadedSVGUserAgentSheet = true;
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSStyleSheet* svgSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultStyle->addRulesFromSheet(svgSheet, screenEval());
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(svgSheet, printEval());
1336ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(MATHML)
1341231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static bool loadedMathMLUserAgentSheet;
1342231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (e->isMathMLElement() && !loadedMathMLUserAgentSheet) {
1343231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // MathML rules.
1344231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        loadedMathMLUserAgentSheet = true;
1345231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSStyleSheet* mathMLSheet = parseUASheet(mathmlUserAgentStyleSheet, sizeof(mathmlUserAgentStyleSheet));
1346231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultStyle->addRulesFromSheet(mathMLSheet, screenEval());
1347231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultPrintStyle->addRulesFromSheet(mathMLSheet, printEval());
1348ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        // There are some sibling rules here.
1349ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        collectSiblingRulesInDefaultStyle();
1350231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1351231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1352231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedWMLUserAgentSheet;
1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (e->isWMLElement() && !loadedWMLUserAgentSheet) {
1356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // WML rules.
1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedWMLUserAgentSheet = true;
1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* wmlSheet = parseUASheet(wmlUserAgentStyleSheet, sizeof(wmlUserAgentStyleSheet));
1359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(wmlSheet, screenEval());
1360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(wmlSheet, printEval());
1361ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(VIDEO)
1366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedMediaStyleSheet;
1367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!loadedMediaStyleSheet && (e->hasTagName(videoTag) || e->hasTagName(audioTag))) {
1368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedMediaStyleSheet = true;
1369cad810f21b803229eb11403f9209855525a25d57Steve Block        String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::themeForPage(e->document()->page())->extraMediaControlsStyleSheet();
1370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* mediaControlsSheet = parseUASheet(mediaRules);
1371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(mediaControlsSheet, screenEval());
1372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(mediaControlsSheet, printEval());
1373ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
13772bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API)
13782bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool loadedFullScreenStyleSheet;
13792bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!loadedFullScreenStyleSheet && e->document()->webkitIsFullScreen()) {
13802bde8e466a4451c7319e3a072d118917957d6554Steve Block        loadedFullScreenStyleSheet = true;
13812bde8e466a4451c7319e3a072d118917957d6554Steve Block        String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraFullScreenStyleSheet();
13822bde8e466a4451c7319e3a072d118917957d6554Steve Block        CSSStyleSheet* fullscreenSheet = parseUASheet(fullscreenRules);
13832bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13842bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultQuirksStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13852bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
13862bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
13872bde8e466a4451c7319e3a072d118917957d6554Steve Block
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1;
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUserRule = -1, lastUserRule = -1;
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstAuthorRule = -1, lastAuthorRule = -1;
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 4. Now we check user sheet rules.
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
139668513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 5. Now check author rules, beginning first with presentational attributes
13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // mapped from HTML.
14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_styledElement) {
14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ask if the HTML element has mapped attributes.
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->hasMappedAttributes()) {
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Walk our attribute list and add in each decl.
1404e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                const NamedNodeMap* map = m_styledElement->attributeMap();
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned i = 0; i < map->length(); i++) {
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Attribute* attr = map->attributeItem(i);
1407e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    if (attr->isMappedAttribute() && attr->decl()) {
1408e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        lastAuthorRule = m_matchedDecls.size();
1409e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        if (firstAuthorRule == -1)
1410e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                            firstAuthorRule = lastAuthorRule;
1411e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        addMatchedDeclaration(attr->decl());
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Now we check additional mapped declarations.
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Tables and table cells share an additional mapped rule that must be applied
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // after all attributes, since their mapped style depends on the values of multiple attributes.
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->canHaveAdditionalAttributeStyleDecls()) {
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_additionalAttributeStyleDecls.clear();
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_styledElement->additionalAttributeStyleDecls(m_additionalAttributeStyleDecls);
14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_additionalAttributeStyleDecls.isEmpty()) {
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    unsigned additionalDeclsSize = m_additionalAttributeStyleDecls.size();
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstAuthorRule == -1)
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstAuthorRule = m_matchedDecls.size();
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    lastAuthorRule = m_matchedDecls.size() + additionalDeclsSize - 1;
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    for (unsigned i = 0; i < additionalDeclsSize; i++)
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addMatchedDeclaration(m_additionalAttributeStyleDecls[i]);
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
143181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_styledElement->isHTMLElement()) {
143281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                bool isAuto;
143381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                TextDirection textDirection = toHTMLElement(m_styledElement)->directionalityIfhasDirAutoAttribute(isAuto);
143481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (isAuto)
143581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    addMatchedDeclaration(textDirection == LTR ? leftToRightDeclaration() : rightToLeftDeclaration());
143681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 6. Check the rules in author sheets next.
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
144168513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 7. Now check our inline style attribute.
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles && m_styledElement) {
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMutableStyleDeclaration* inlineDecl = m_styledElement->inlineStyleDecl();
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (inlineDecl) {
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                lastAuthorRule = m_matchedDecls.size();
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (firstAuthorRule == -1)
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstAuthorRule = lastAuthorRule;
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addMatchedDeclaration(inlineDecl);
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
14566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now we have all of the matched rules in the appropriate order.  Walk the rules and apply
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // high-priority properties first, i.e., those properties that other properties depend on.
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and (4) normal important.
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
146321939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
146521939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
146621939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstUserRule, lastUserRule);
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
146821939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority UA properties.
147921939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the author and user normal priority properties and all the !important properties.
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
148621939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
148721939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
148821939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstUserRule, lastUserRule);
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
149021939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
14915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
14925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(!m_fontDirty);
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), m_parentStyle, e);
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
15025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
15035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we have first-letter pseudo style, do not share this style
15058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_style->hasPseudoStyle(FIRST_LETTER))
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setUnique();
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle) {
1509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Add the visited style off the main style.
1510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
15136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass)
15146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        initElement(0); // Clear out for the next resolve.
15156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForKeyframe(const RenderStyle* elementStyle, const WebKitCSSKeyframeRule* keyframeRule, KeyframeValue& keyframe)
1521ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
1522ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1523ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        addMatchedDeclaration(keyframeRule->style());
1524ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1525ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(!m_style);
1526ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1527ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Create the style
1528ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style = RenderStyle::clone(elementStyle);
1529ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1530ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_lineHeightValue = 0;
1531ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1532ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // We don't need to bother with !important. Since there is only ever one
1533ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // decl, there's nothing to override. So just add the first properties.
1534ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1535ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
1536ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1537ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied, go ahead and update it now.
1538ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1539ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1540ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1541ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Line-height is set when we are sure we decided on the font-size
1542ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_lineHeightValue)
1543ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
1544ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1545ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Now do rest of the properties.
1546ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1547ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
1548ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1549ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied by one of the non-essential font props,
1550ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // go ahead and update it a second time.
1551ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1552ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1553ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
15555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
15565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Add all the animating properties to the keyframe.
1558ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style()) {
1559ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        CSSMutableStyleDeclaration::const_iterator end = keyframeRule->style()->end();
1560ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        for (CSSMutableStyleDeclaration::const_iterator it = keyframeRule->style()->begin(); it != end; ++it) {
1561ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            int property = (*it).id();
1562ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Timing-function within keyframes is special, because it is not animated; it just
1563ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // describes the timing function between this keyframe and the next.
1564ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (property != CSSPropertyWebkitAnimationTimingFunction)
15655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                keyframe.addProperty(property);
1566ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
1567ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1568ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1569ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return m_style.release();
1570ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
1571ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::keyframeStylesForAnimation(Element* e, const RenderStyle* elementStyle, KeyframeList& list)
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list.clear();
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the keyframesRule for this name
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || list.animationName().isEmpty())
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1579d0825bca7fe65beaee391d30da42e937db621564Steve Block
1580d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_keyframesRuleMap.checkConsistency();
1581d0825bca7fe65beaee391d30da42e937db621564Steve Block
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_keyframesRuleMap.contains(list.animationName().impl()))
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebKitCSSKeyframesRule* rule = m_keyframesRuleMap.find(list.animationName().impl()).get()->second.get();
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Construct and populate the style for each keyframe
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < rule->length(); ++i) {
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Apply the declaration to the style. This is a simplified version of the logic in styleForElement
1590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initElement(e);
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        initForStyleResolve(e);
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1593ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        const WebKitCSSKeyframeRule* keyframeRule = rule->item(i);
15945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
15965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule, keyframe));
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Add this keyframe style to all the indicated key times
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<float> keys;
1600ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        keyframeRule->getKeys(keys);
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t keyIndex = 0; keyIndex < keys.size(); ++keyIndex) {
16025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            keyframe.setKey(keys[keyIndex]);
16035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            list.insert(keyframe);
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1607ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 0% keyframe is missing, create it (but only if there is at least one other keyframe)
1608ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int initialListSize = list.size();
16095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && list[0].key() != 0) {
16105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
16115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("0%");
16125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
16135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1615ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1616ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1617ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 100% keyframe is missing, create it (but only if there is at least one other keyframe)
16185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && (list[list.size() - 1].key() != 1)) {
16195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
16205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("100%");
16215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(1, 0);
16225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1624ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo, Element* e, RenderStyle* parentStyle, bool matchVisitedPseudoClass)
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
16336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve 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
1635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // off of.
1636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
16376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && parentStyle && parentStyle->insideLink()) {
1638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style with :visited in effect.
1639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentVisitedStyle = parentStyle->getCachedPseudoStyle(VISITED_LINK);
1640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = pseudoStyleForElement(pseudo, e, parentVisitedStyle ? parentVisitedStyle : parentStyle, true);
16412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (visitedStyle)
16422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
1643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(e, parentStyle, pseudo);
164668513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_style = RenderStyle::create();
164768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (parentStyle)
164868513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_style->inheritFrom(parentStyle);
164968513a70bcd92384395513322f1b801e7bf9c729Steve Block
16506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // those rules.
16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check UA, user and author rules.
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1, firstUserRule = -1, lastUserRule = -1, firstAuthorRule = -1, lastAuthorRule = -1;
16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
166068513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
166168513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchedDecls.isEmpty() && !visitedStyle)
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_style->setStyleType(pseudo);
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
1670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
16726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // High-priority properties.
167521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
167621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
167721939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUserRule, lastUserRule);
167821939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority properties.
168921939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
169421939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
169521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
169621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUserRule, lastUserRule);
169721939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
1703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1705bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), parentStyle, 0);
17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
17085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
17095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Hang our visited style off m_style.
1711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle)
1712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
171806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForPage(int pageIndex)
171906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
17206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    initForStyleResolve(m_checker.m_document->documentElement()); // m_rootElementStyle will be set to the document style.
172106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style = RenderStyle::create();
172306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->inheritFrom(m_rootElementStyle);
172406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isLeft = isLeftPage(pageIndex);
172606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isFirst = isFirstPage(pageIndex);
172706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const String page = pageName(pageIndex);
172806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRules(defaultPrintStyle, isLeft, isFirst, page);
17295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_userStyle.get(), isLeft, isFirst, page);
17305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_authorStyle.get(), isLeft, isFirst, page);
173106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_lineHeightValue = 0;
173206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
173306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
173406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If our font got dirtied, go ahead and update it now.
173506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_fontDirty)
173606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        updateFont();
173706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
173806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Line-height is set when we are sure we decided on the font-size
173906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_lineHeightValue)
174006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
174106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
174206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
174306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
17455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
17465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
174706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now return the style.
174806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return m_style.release();
174906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
175006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(DATAGRID)
17520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumn(DataGridColumn*, RenderStyle*)
17540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumnHeader(DataGridColumn*, RenderStyle*)
17600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
17660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addIntrinsicMargins(RenderStyle* style)
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Intrinsic margin value.
17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int intrinsicMargin = 2 * style->effectiveZoom();
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using width/height alone and not also dealing with min-width/max-width is flawed.
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using "quirk" to decide the margin wasn't set is kind of lame.
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->width().isIntrinsicOrAuto()) {
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginLeft().quirk())
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginLeft(Length(intrinsicMargin, Fixed));
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginRight().quirk())
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginRight(Length(intrinsicMargin, Fixed));
17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->height().isAuto()) {
17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginTop().quirk())
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginTop(Length(intrinsicMargin, Fixed));
17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginBottom().quirk())
17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginBottom(Length(intrinsicMargin, Fixed));
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1789bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid CSSStyleSelector::adjustRenderStyle(RenderStyle* style, RenderStyle* parentStyle, Element *e)
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our original display.
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setOriginalDisplay(style->display());
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() != NONE) {
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we have a <td> that specifies a float property, in quirks mode we just drop the float
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // property.
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Sites also commonly use display:inline/block on <td>s and <table>s.  In quirks mode we force
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // these tags to retain their display types.
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_checker.m_strictParsing && e) {
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (e->hasTagName(tdTag)) {
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE_CELL);
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setFloating(FNONE);
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (e->hasTagName(tableTag))
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE : TABLE);
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(tdTag) || e->hasTagName(thTag))) {
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->whiteSpace() == KHTML_NOWRAP) {
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Figure out if we are really nowrapping or if we should just
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // use normal instead.  If the width of the cell is fixed, then
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // we don't actually use NOWRAP.
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (style->width().isFixed())
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NORMAL);
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NOWRAP);
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Tables never support the -webkit-* values for text-align and will reset back to the default.
18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(tableTag) && (style->textAlign() == WEBKIT_LEFT || style->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT))
18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(TAAUTO);
18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Frames and framesets never honor position:relative or position:absolute.  This is necessary to
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fix a crash where a site tries to position these objects.  They also never honor display.
18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(frameTag) || e->hasTagName(framesetTag))) {
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setDisplay(BLOCK);
18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Table headers with a text-align of auto will change the text-align to center.
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(thTag) && style->textAlign() == TAAUTO)
18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(CENTER);
18348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (e && e->hasTagName(legendTag))
18368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            style->setDisplay(BLOCK);
18378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Mutate the display to BLOCK or TABLE for certain cases, e.g., if someone attempts to
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // position or float an inline, compact, or run-in.  Cache the original display, since it
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // may be needed for positioned elements that have to compute their static normal flow
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // positions.  We also force inline-level roots to be block-level.
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->display() != BLOCK && style->display() != TABLE && style->display() != BOX &&
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (style->position() == AbsolutePosition || style->position() == FixedPosition || style->floating() != FNONE ||
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (e && e->document()->documentElement() == e))) {
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->display() == INLINE_TABLE)
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE);
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == INLINE_BOX)
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BOX);
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == LIST_ITEM) {
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // It is a WinIE bug that floated list items lose their bullets, so we'll emulate the quirk,
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // but only in quirks mode.
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_checker.m_strictParsing && style->floating() != FNONE)
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setDisplay(BLOCK);
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BLOCK);
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1859bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // FIXME: Don't support this mutation for pseudo styles like first-letter or first-line, since it's not completely
1860bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // clear how that should work.
1861a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (style->display() == INLINE && style->styleType() == NOPSEUDO && parentStyle && style->writingMode() != parentStyle->writingMode())
1862bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            style->setDisplay(INLINE_BLOCK);
1863bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // After performing the display mutation, check table rows.  We do not honor position:relative on
18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // table rows or cells.  This has been established in CSS2.1 (and caused a crash in containingBlock()
18668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // on some sites).
18672bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW_GROUP
18682bde8e466a4451c7319e3a072d118917957d6554Steve Block             || style->display() == TABLE_FOOTER_GROUP || style->display() == TABLE_ROW) &&
18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             style->position() == RelativePosition)
18708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
187128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
187228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // writing-mode does not apply to table row groups, table column groups, table rows, and table columns.
187328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Table cells should be allowed to be perpendicular or flipped with respect to the table, though.
187428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->display() == TABLE_COLUMN || style->display() == TABLE_COLUMN_GROUP || style->display() == TABLE_FOOTER_GROUP
187528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW || style->display() == TABLE_ROW_GROUP
187628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_CELL)
187728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            style->setWritingMode(parentStyle->writingMode());
187828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
187928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Since we don't support block-flow on flexible boxes yet, disallow setting
1880a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // of block-flow to anything other than TopToBottomWritingMode.
1881bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // https://bugs.webkit.org/show_bug.cgi?id=46418 - Flexible box support.
188228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->writingMode() != TopToBottomWritingMode && (style->display() == BOX || style->display() == INLINE_BOX))
1883a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            style->setWritingMode(TopToBottomWritingMode);
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make sure our z-index value is only applied if the object is positioned.
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->position() == StaticPosition)
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setHasAutoZIndex();
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Auto z-index becomes 0 for the root element and transparent objects.  This prevents
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // cases where objects that should be blended as a single unit end up with a non-transparent
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // object wedged in between them.  Auto z-index also becomes 0 for objects that specify transforms/masks/reflections.
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAutoZIndex() && ((e && e->document()->documentElement() == e) || style->opacity() < 1.0f ||
18948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        style->hasTransformRelatedProperty() || style->hasMask() || style->boxReflect()))
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setZIndex(0);
18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1897635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1898f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && (e->hasTagName(WMLNames::insertedLegendTag)
1899f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick              || e->hasTagName(WMLNames::inputTag))
1900f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            && style->width().isAuto())
1901f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setWidth(Length(Intrinsic));
1902635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1903f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1904f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Textarea considers overflow visible as auto.
1905f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && e->hasTagName(textareaTag)) {
1906f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->overflowX());
1907f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->overflowY());
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Finally update our text decorations in effect, but don't allow text-decoration to percolate through
19112bde8e466a4451c7319e3a072d118917957d6554Steve Block    // tables, inline blocks, inline tables, run-ins, or shadow DOM.
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE || style->display() == RUN_IN
19132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        || style->display() == INLINE_BLOCK || style->display() == INLINE_BOX || isAtShadowBoundary(e))
19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setTextDecorationsInEffect(style->textDecoration());
19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->addToTextDecorationsInEffect(style->textDecoration());
19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If either overflow value is not visible, change to auto.
19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->overflowX() == OMARQUEE && style->overflowY() != OMARQUEE)
19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OMARQUEE);
19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OMARQUEE && style->overflowX() != OMARQUEE)
19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OMARQUEE);
19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowX() == OVISIBLE && style->overflowY() != OVISIBLE)
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OAUTO);
19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OVISIBLE && style->overflowX() != OVISIBLE)
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OAUTO);
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Table rows, sections and the table itself will support overflow:hidden and will ignore scroll/auto.
19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Eventually table sections will support auto and scroll.
19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE ||
19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->display() == TABLE_ROW_GROUP || style->display() == TABLE_ROW) {
19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() != OVISIBLE && style->overflowX() != OHIDDEN)
19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() != OVISIBLE && style->overflowY() != OHIDDEN)
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Menulists should have visible overflow
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->appearance() == MenulistPart) {
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OVISIBLE);
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OVISIBLE);
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cull out any useless layers and also repeat patterns into additional layers.
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustBackgroundLayers();
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustMaskLayers();
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Do the same for animations and transitions.
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustAnimations();
19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustTransitions();
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Important: Intrinsic margins get added to controls before the theme has adjusted the style, since the theme will
19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // alter fonts and heights/widths.
19548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (e && e->isFormControlElement() && style->fontSize() >= 11) {
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Don't apply intrinsic margins to image buttons.  The designer knows how big the images are,
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // so we have to treat all image buttons as though they were explicitly sized.
195768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!e->hasTagName(inputTag) || !static_cast<HTMLInputElement*>(e)->isImageButton())
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addIntrinsicMargins(style);
19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Let the theme also have a crack at adjusting the style.
19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAppearance())
19630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RenderTheme::defaultTheme()->adjustStyle(this, style, e, m_hasUAAppearance, m_borderData, m_backgroundData, m_backgroundColor);
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e && e->isSVGElement()) {
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Spec: http://www.w3.org/TR/SVG/masking.html#OverflowProperty
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() == OSCROLL)
19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OHIDDEN);
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowY() == OAUTO)
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() == OSCROLL)
19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OHIDDEN);
19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowX() == OAUTO)
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only the root <svg> element in an SVG document fragment tree honors css position
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!(e->hasTagName(SVGNames::svgTag) && e->parentNode() && !e->parentNode()->isSVGElement()))
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(RenderStyle::initialPosition());
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::updateFont()
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForTextSizeAdjust();
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForGenericFamilyChange(style(), m_parentStyle);
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForZoomChange(style(), m_parentStyle);
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->font().update(m_fontSelector);
19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontDirty = false;
19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::cacheBorderAndBackground()
19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasUAAppearance = m_style->hasAppearance();
19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasUAAppearance) {
19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_borderData = m_style->border();
19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundData = *m_style->backgroundLayers();
20008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundColor = m_style->backgroundColor();
20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2004e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::styleRulesForElement(Element* e, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
20058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2006e14391e94c850b8bd03680c23b38978db68687a8John Reck    return pseudoStyleRulesForElement(e, NOPSEUDO, authorOnly, includeEmptyRules, filter);
2007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2009e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::pseudoStyleRulesForElement(Element* e, PseudoId pseudoId, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
2010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || !e->document()->haveStylesheetsLoaded())
20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = true;
20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(e);
2017dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initForStyleResolve(e, 0, pseudoId);
20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!authorOnly) {
20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstUARule = -1, lastUARule = -1;
20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First we match rules from the user agent sheet.
20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        matchUARules(firstUARule, lastUARule);
20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we check user sheet rules.
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles) {
20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int firstUserRule = -1, lastUserRule = -1;
202768513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, includeEmptyRules);
20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
2032e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = (filter == SameOriginCSSRulesOnly);
2033e14391e94c850b8bd03680c23b38978db68687a8John Reck
20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check the rules in author sheets.
20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstAuthorRule = -1, lastAuthorRule = -1;
203668513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, includeEmptyRules);
2037e14391e94c850b8bd03680c23b38978db68687a8John Reck
2038e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = false;
20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = false;
2042e14391e94c850b8bd03680c23b38978db68687a8John Reck
20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_ruleList.release();
20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSStyleSelector::checkSelector(const RuleData& ruleData)
20478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_dynamicPseudo = NOPSEUDO;
20498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
205081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Let the slow path handle SVG as it has some additional rules regarding shadow trees.
205181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (ruleData.hasFastCheckableSelector() && !m_element->isSVGElement()) {
20522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know this selector does not include any pseudo selectors.
20532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_checker.m_pseudoStyle != NOPSEUDO)
20542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know a sufficiently simple single part selector matches simply because we found it from the rule hash.
20562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // This is limited to HTML only so we don't need to check the namespace.
20572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (ruleData.hasTopSelectorMatchingHTMLBasedOnRuleHash() && !ruleData.hasMultipartSelector() && m_element->isHTMLElement())
20582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return true;
20592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return SelectorChecker::fastCheckSelector(ruleData.selector(), m_element);
20602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Slow path.
20632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    SelectorMatch match = m_checker.checkSelector(ruleData.selector(), m_element, &m_selectorAttrs, m_dynamicPseudo, false, false, style(), m_parentNode ? m_parentNode->renderStyle() : 0);
20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (match != SelectorMatches)
20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_checker.m_pseudoStyle != NOPSEUDO && m_checker.m_pseudoStyle != m_dynamicPseudo)
20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
20692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20712fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool selectorTagMatches(const Element* element, const CSSSelector* selector)
20722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selector->hasTag())
20742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
20752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
20762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom && localName != element->localName())
20772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
20782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& namespaceURI = selector->tag().namespaceURI();
20792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return namespaceURI == starAtom || namespaceURI == element->namespaceURI();
20802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20822fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isFastCheckableSelector(const CSSSelector* selector)
20832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (; selector; selector = selector->tagHistory()) {
208581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (selector->relation() != CSSSelector::Descendant && selector->relation() != CSSSelector::Child && selector->relation() != CSSSelector::SubSelector)
20862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (selector->m_match != CSSSelector::None && selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
20882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
209281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
209381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate <class ValueChecker>
209481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool fastCheckSingleSelector(const CSSSelector*& selector, const Element*& element, const CSSSelector*& topChildOrSubselector, const Element*& topChildOrSubselectorMatchElement)
209581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
209681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    AtomicStringImpl* value = selector->value().impl();
209781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (; element; element = element->parentElement()) {
209881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (ValueChecker::checkValue(element, value) && selectorTagMatches(element, selector)) {
209981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() == CSSSelector::Descendant)
210081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = 0;
210181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            else if (!topChildOrSubselector) {
210281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector);
210381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = selector;
210481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselectorMatchElement = element;
210581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
210681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() != CSSSelector::SubSelector)
210781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                element = element->parentElement();
210881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = selector->tagHistory();
210981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
211081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
211181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (topChildOrSubselector) {
211281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Child or subselector check failed.
211381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // If the match element is null, topChildOrSubselector was also the very topmost selector and had to match
211481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // the original element we were checking.
211581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!topChildOrSubselectorMatchElement)
211681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
211781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // There may be other matches down the ancestor chain.
211881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Rewind to the topmost child or subselector and the element it matched, continue checking ancestors.
211981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = topChildOrSubselector;
212081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            element = topChildOrSubselectorMatchElement->parentElement();
212181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            topChildOrSubselector = 0;
212281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
212381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
212481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
212581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
212681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
212781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
212881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct ClassCheck {
212981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
213081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasClass() && static_cast<const StyledElement*>(element)->classNames().contains(value);
213281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
213381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
213481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct IdCheck {
213581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
213681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasID() && element->idForStyleResolution().impl() == value;
213881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
213981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
214081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct TagCheck {
214181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element*, AtomicStringImpl*)
214281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
214381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
214481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
214581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21472fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool CSSStyleSelector::SelectorChecker::fastCheckSelector(const CSSSelector* selector, const Element* element)
21482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
21492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(isFastCheckableSelector(selector));
21502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The top selector requires tag check only as rule hashes have already handled id and class matches.
21522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(element, selector))
21532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
21542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
215581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const CSSSelector* topChildOrSubselector = 0;
215681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const Element* topChildOrSubselectorMatchElement = 0;
215781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector)
215881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        topChildOrSubselector = selector;
215981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
216081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() != CSSSelector::SubSelector)
216181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        element = element->parentElement();
216281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
21632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    selector = selector->tagHistory();
216481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
216581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We know this compound selector has descendant, child and subselector combinators only and all components are simple.
216681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (selector) {
21672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (selector->m_match) {
21682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Class:
216981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<ClassCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Id:
217381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<IdCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::None:
217781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<TagCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        default:
21812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ASSERT_NOT_REACHED();
21822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
21832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
21842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
21852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
21862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Recursive check of selectors and combinators
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// It can return 3 different values:
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorMatches         - the selector matches the element e
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsLocally    - the selector fails for the element e
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsCompletely - the selector fails for e and any sibling or ancestor of e
2192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCSSStyleSelector::SelectorMatch CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Spec: CSS2 selectors cannot be applied to the (conceptually) cloned DOM tree
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // because its contents are not part of the formal document structure.
2197f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isSVGElement() && e->isShadowRoot())
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsCompletely;
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // first selector has to match
22022bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!checkOneSelector(sel, e, selectorAttrs, dynamicPseudo, isSubSelector, encounteredLink, elementStyle, elementParentStyle))
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsLocally;
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The rest of the selectors has to match
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSSelector::Relation relation = sel->relation();
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Prepare next sel
2209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sel = sel->tagHistory();
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sel)
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorMatches;
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (relation != CSSSelector::SubSelector)
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Bail-out if this selector is irrelevant for the pseudoStyle
22158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (m_pseudoStyle != NOPSEUDO && m_pseudoStyle != dynamicPseudo)
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SelectorFailsCompletely;
22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Check for nested links.
2219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchVisitedPseudoClass && !isSubSelector) {
2220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* currentStyle = elementStyle ? elementStyle : e->renderStyle();
2221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (currentStyle && currentStyle->insideLink() && e->isLink()) {
2222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (encounteredLink)
2223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false; // This link is not relevant to the style being resolved, so disable matching.
2224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            else
2225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                encounteredLink = true;
2226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (relation) {
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Descendant:
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
2232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ContainerNode* n = e->parentNode();
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n || !n->isElementNode())
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsCompletely;
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Child:
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2243a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ContainerNode* n = e->parentNode();
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n || !n->isElementNode())
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::DirectAdjacent:
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByDirectAdjacentRules();
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Node* n = e->previousSibling();
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (n && !n->isElementNode())
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n = n->previousSibling();
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n)
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsLocally;
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_matchVisitedPseudoClass = false;
2263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::IndirectAdjacent:
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByForwardPositionalRules();
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Node* n = e->previousSibling();
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                while (n && !n->isElementNode())
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    n = n->previousSibling();
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n)
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsLocally;
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false;
2279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::SubSelector:
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // a selector is invalid if something follows a pseudo-element
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We make an exception for scrollbar pseudo elements and allow a set of pseudo classes (but nothing else)
22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to follow the pseudo elements.
2288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ((elementStyle || m_collectRulesOnly) && dynamicPseudo != NOPSEUDO && dynamicPseudo != SELECTION &&
22898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                !((RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER) && sel->m_match == CSSSelector::PseudoClass))
22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
2291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle);
229265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case CSSSelector::ShadowDescendant:
229365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
229465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Node* shadowHostNode = e->shadowAncestorNode();
229565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (shadowHostNode == e || !shadowHostNode->isElementNode())
229665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                return SelectorFailsCompletely;
229765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            e = static_cast<Element*>(shadowHostNode);
229865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
229965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SelectorFailsCompletely;
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    set->add(qName.localName().impl());
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Mozilla treats all other values as case-sensitive, thus so do we.
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, accept_charsetAttr);
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, acceptAttr);
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alignAttr);
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alinkAttr);
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, axisAttr);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, bgcolorAttr);
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, charsetAttr);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, checkedAttr);
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, clearAttr);
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, codetypeAttr);
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, colorAttr);
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, compactAttr);
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, declareAttr);
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, deferAttr);
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, dirAttr);
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, disabledAttr);
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, enctypeAttr);
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, faceAttr);
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, frameAttr);
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, hreflangAttr);
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, http_equivAttr);
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, langAttr);
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, languageAttr);
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, linkAttr);
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, mediaAttr);
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, methodAttr);
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, multipleAttr);
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nohrefAttr);
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noresizeAttr);
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noshadeAttr);
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nowrapAttr);
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, readonlyAttr);
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, relAttr);
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, revAttr);
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, rulesAttr);
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scopeAttr);
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scrollingAttr);
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, selectedAttr);
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, shapeAttr);
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, targetAttr);
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, textAttr);
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, typeAttr);
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valignAttr);
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valuetypeAttr);
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, vlinkAttr);
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attrSet;
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr)
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isPossibleHTMLAttr = !attr.hasPrefix() && (attr.namespaceURI() == nullAtom);
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return isPossibleHTMLAttr && htmlCaseInsensitiveAttributesSet->contains(attr.localName().impl());
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23722bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2374cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(e);
23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(e, sel))
23792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->hasAttribute()) {
23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Class)
23832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasClass() && static_cast<StyledElement*>(e)->classNames().contains(sel->value());
23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Id)
23862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasID() && e->idForStyleResolution() == sel->value();
2387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const QualifiedName& attr = sel->attribute();
23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Handle the case were elementStyle is 0.
2391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (elementStyle && (!e->isStyledElement() || (!static_cast<StyledElement*>(e)->isMappedAttribute(attr) && attr != typeAttr && attr != readonlyAttr))) {
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            elementStyle->setAffectedByAttributeSelectors(); // Special-case the "type" and "readonly" attributes so input form controls can share style.
23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (selectorAttrs)
2394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                selectorAttrs->add(attr.localName().impl());
23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const AtomicString& value = e->getAttribute(attr);
23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value.isNull())
23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false; // attribute is not set
24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool caseSensitive = !m_documentIsHTML || !htmlAttributeHasCaseInsensitiveValue(attr);
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->m_match) {
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Exact:
24052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (caseSensitive ? sel->value() != value : !equalIgnoringCase(sel->value(), value))
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::List:
24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ignore empty selectors or selectors containing spaces
24112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (sel->value().contains(' ') || sel->value().isEmpty())
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2414f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            unsigned startSearchAt = 0;
24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
24162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                size_t foundPos = value.find(sel->value(), startSearchAt, caseSensitive);
2417f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == notFound)
24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
2419f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == 0 || value[foundPos - 1] == ' ') {
24202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    unsigned endStr = foundPos + sel->value().length();
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (endStr == value.length() || value[endStr] == ' ')
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break; // We found a match.
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2425f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                // No match. Keep looking.
24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                startSearchAt = foundPos + 1;
24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Contain:
24312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.contains(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::Begin:
24352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(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::End:
24392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.endsWith(sel->value(), caseSensitive) || sel->value().isEmpty())
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Hyphen:
24432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() < sel->value().length())
24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(sel->value(), caseSensitive))
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // It they start the same, check for exact match or following '-':
24482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() != sel->value().length() && value[sel->value().length()] != '-')
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoClass:
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoElement:
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoClass) {
24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle :not up front.
24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->pseudoType() == CSSSelector::PseudoNot) {
24612bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(sel->selectorList());
24622bde8e466a4451c7319e3a072d118917957d6554Steve Block            for (CSSSelector* subSel = sel->selectorList()->first(); subSel; subSel = subSel->tagHistory()) {
24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // :not cannot nest. I don't really know why this is a
24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // restriction in CSS3, but it is, so let's honor it.
24658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                // the parser enforces that this never occurs
24662bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(subSel->pseudoType() != CSSSelector::PseudoNot);
24678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
24682bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!checkOneSelector(subSel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle))
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo != NOPSEUDO && (RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER)) {
24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // CSS scrollbars match a specific subset of pseudo classes, and they have specialized rules for each
24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // (since there are no elements involved).
24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return checkScrollbarPseudoClass(sel, dynamicPseudo);
24758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo == SELECTION) {
24768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
24778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return !m_document->page()->focusController()->isActive();
24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Normal element pseudo class checking.
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->pseudoType()) {
24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Pseudo classes:
24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNot:
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break; // Already handled up above.
24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEmpty: {
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bool result = true;
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (Node* n = e->firstChild(); n; n = n->nextSibling()) {
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (n->isElementNode()) {
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = false;
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (n->isTextNode()) {
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Text* textNode = static_cast<Text*>(n);
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!textNode->data().isEmpty()) {
24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = false;
24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_collectRulesOnly) {
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setEmptyState(result);
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle() && (e->document()->usesSiblingRules() || e->renderStyle()->unique()))
25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setEmptyState(result);
25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return result;
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstChild: {
25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-child matches the first child that is an element
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstOfType: {
25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-of-type matches the first element of its type
25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastChild: {
25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-child matches the last child that is an element
2552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
2554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (parentElement->isFinishedParsingChildren()) {
25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Node* n = e->nextSibling();
25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
25598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = true;
25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastOfType: {
25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-of-type matches the last element of its type
2575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
25908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyChild: {
2598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
2607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (firstChild && parentElement->isFinishedParsingChildren()) {
26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (firstChild && childStyle)
26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (lastChild && childStyle)
26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyOfType: {
26318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: This selector is very slow.
2632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
26418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
26428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
26438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
26448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
26458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
26538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstChild) {
26548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n) {
26568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthChild: {
2668635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
26698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode()) {
26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            RenderStyle* s = n->renderStyle();
26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned index = s ? s->childIndex() : 0;
26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (index) {
26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                count += index;
26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            }
26818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
26828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (childStyle)
26908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setChildIndex(count);
26918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
26928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
26968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
26978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthOfType: {
2701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
27078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastChild: {
2725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode())
27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastOfType: {
2748635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2750635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2756635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoTarget:
27728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (e == e->document()->cssTarget())
27738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27752bde8e466a4451c7319e3a072d118917957d6554Steve Block            case CSSSelector::PseudoAny:
27762bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* selector = sel->selectorList()->first(); selector; selector = CSSSelectorList::next(selector)) {
27772bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (checkSelector(selector, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle) == SelectorMatches)
27782bde8e466a4451c7319e3a072d118917957d6554Steve Block                        return true;
27792bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
27802bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
27818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoAnyLink:
2782dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
27838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoAutofill: {
27868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
27878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
27882bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (InputElement* inputElement = e->toInputElement())
27898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return inputElement->isAutofilled();
27908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLink:
2793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2794dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return !m_matchVisitedPseudoClass;
27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoVisited:
2797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return m_matchVisitedPseudoClass;
27998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDrag: {
28018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (elementStyle)
28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    elementStyle->setAffectedByDragRules(true);
28038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (e->renderStyle())
28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    e->renderStyle()->setAffectedByDragRules(true);
28058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->renderer() && e->renderer()->isDragging())
28068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFocus:
2810dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                if (e && e->focused() && e->document()->frame() && e->document()->frame()->selection()->isFocusedAndActive())
28118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoHover: {
28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then hover should never match anchors with no
28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:hover should not match anything.  This is important for sites like wsj.com.
28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByHoverRules(true);
28198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByHoverRules(true);
28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->hovered())
28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoActive:
28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then :active should never match anchors with no
28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:active should not match anything.
28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByActiveRules(true);
28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByActiveRules(true);
28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->active())
28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEnabled:
2839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return e->isEnabledFormControl();
28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFullPageMedia:
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return e && e->document() && e->document()->isMediaDocument();
28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
2845231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSSelector::PseudoDefault:
2846231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return e && e->isDefaultButtonForForm();
28478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDisabled:
2848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return !e->isEnabledFormControl();
28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadOnly: {
28528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && e->isReadOnlyFormControl();
28558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadWrite: {
28578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && !e->isReadOnlyFormControl();
28608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoOptional:
28620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isOptionalFormControl();
28630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoRequired:
28640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isRequiredFormControl();
2865d0825bca7fe65beaee391d30da42e937db621564Steve Block            case CSSSelector::PseudoValid: {
2866d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2867d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2868d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
2869d0825bca7fe65beaee391d30da42e937db621564Steve Block                return e->willValidate() && e->isValidFormControlElement();
2870d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoInvalid: {
2871d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2872d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2873d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
28745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return (e->willValidate() && !e->isValidFormControlElement()) || e->hasUnacceptableValue();
2875d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoChecked: {
28768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Even though WinIE allows checked and indeterminate to co-exist, the CSS selector spec says that
28798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // you can't be both checked and indeterminate.  We will behave like WinIE behind the scenes and just
28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // obey the CSS spec here in the test for matching the pseudo.
28812bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isChecked() && !inputElement->isIndeterminate())
28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoIndeterminate: {
28878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28892bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isIndeterminate())
28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoRoot:
28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e == e->document()->documentElement())
28968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLang: {
28995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                AtomicString value = e->computeInheritedLanguage();
2900635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                const AtomicString& argument = sel->argument();
2901f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (value.isEmpty() || !value.startsWith(argument, false))
29028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2903635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (value.length() != argument.length() && value[argument.length()] != '-')
29048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
29068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
29075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
29085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreen:
29095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, and the document's current fullscreen
29105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // element is an element in the document, the 'full-screen' pseudoclass applies to
29115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // that element. Also, an <iframe>, <object> or <embed> element whose child browsing
29125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // context's Document is in the fullscreen state has the 'full-screen' pseudoclass applied.
2913cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (e != e->document()->webkitCurrentFullScreenElement())
29165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreenDocument:
29195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
2920cad810f21b803229eb11403f9209855525a25d57Steve Block                // to all elements of that Document.
2921cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
2925cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoInRange:
2926cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2927cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2928cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2929cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isInRange();
2930cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoOutOfRange:
2931cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2932cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2933cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2934cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isOutOfRange();
29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoUnknown:
29368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNotParsed:
29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
29408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoElement) {
2944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!elementStyle && !m_collectRulesOnly)
29458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
29468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PseudoId pseudoId = CSSSelector::pseudoId(sel->pseudoType());
2948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pseudoId == FIRST_LETTER) {
2949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (Document* document = e->document())
2950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                document->setUsesFirstLetterRules(true);
2951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
295265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (pseudoId != NOPSEUDO)
2953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            dynamicPseudo = pseudoId;
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ### add the rest of the checks...
29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
29578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass(CSSSelector* sel, PseudoId&) const
29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderScrollbar* scrollbar = RenderScrollbar::scrollbarForStyleResolve();
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarPart part = RenderScrollbar::partForStyleResolve();
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This is a temporary hack for resizers and scrollbar corners.  Eventually :window-inactive should become a real
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // pseudo class and just apply to everything.
29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !m_document->page()->focusController()->isActive();
29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!scrollbar)
29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(sel->m_match == CSSSelector::PseudoClass);
29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (sel->pseudoType()) {
29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnabled:
29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->enabled();
29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDisabled:
29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return !scrollbar->enabled();
29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHover: {
29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart hoveredPart = scrollbar->hoveredPart();
29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart != NoPart;
29828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart == BackTrackPart || hoveredPart == ForwardTrackPart || hoveredPart == ThumbPart;
29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == hoveredPart;
29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoActive: {
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart pressedPart = scrollbar->pressedPart();
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart != NoPart;
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart == BackTrackPart || pressedPart == ForwardTrackPart || pressedPart == ThumbPart;
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == pressedPart;
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHorizontal:
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == HorizontalScrollbar;
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoVertical:
29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == VerticalScrollbar;
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDecrement:
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == BackButtonEndPart || part == BackTrackPart;
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoIncrement:
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == ForwardButtonStartPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoStart:
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart;
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnd:
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDoubleButton: {
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart)
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleStart || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart)
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleEnd || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoSingleButton: {
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonEndPart || part == BackTrackPart || part == ForwardTrackPart)
30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsSingle;
30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoNoButton: {
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackTrackPart)
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleEnd;
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ForwardTrackPart)
30258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleStart;
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoCornerPresent:
30292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return scrollbar->scrollableArea()->isScrollCornerVisible();
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -----------------------------------------------------------------
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30372fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* selector)
30382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& selectorNamespace = selector->tag().namespaceURI();
30402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selectorNamespace != starAtom && selectorNamespace != xhtmlNamespaceURI)
30412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match == CSSSelector::None)
30432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
30442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
30452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return selector->tag() == starAtom;
30472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30492fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleData::RuleData(CSSStyleRule* rule, CSSSelector* selector, unsigned position)
30502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_rule(rule)
30512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_selector(selector)
305281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_specificity(selector->specificity())
30532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_position(position)
30542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasFastCheckableSelector(isFastCheckableSelector(selector))
30552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasMultipartSelector(selector->tagHistory())
30562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasTopSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector))
30572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectDescendantSelectorIdentifierHashes();
30592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectIdentifierHashes(const CSSSelector* selector, unsigned& identifierCount)
30622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ((selector->m_match == CSSSelector::Id || selector->m_match == CSSSelector::Class) && !selector->value().isEmpty())
30642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = selector->value().impl()->existingHash();
30652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (identifierCount == maximumIdentifierCount)
30662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
30672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
30682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom)
30692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = localName.impl()->existingHash();
30702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30722fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectDescendantSelectorIdentifierHashes()
30732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned identifierCount = 0;
30752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector::Relation relation = m_selector->relation();
30762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Skip the topmost selector. It is handled quickly by the rule hashes.
30782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool skipOverSubselectors = true;
30792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (const CSSSelector* selector = m_selector->tagHistory(); selector; selector = selector->tagHistory()) {
30802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Only collect identifiers that match ancestors.
30812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (relation) {
30822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::SubSelector:
30832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!skipOverSubselectors)
30842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                collectIdentifierHashes(selector, identifierCount);
30852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::DirectAdjacent:
30872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::IndirectAdjacent:
30882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::ShadowDescendant:
30892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = true;
30902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Descendant:
30922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Child:
30932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = false;
30942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            collectIdentifierHashes(selector, identifierCount);
30952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
30972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (identifierCount == maximumIdentifierCount)
30982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
30992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        relation = selector->relation();
31002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
31012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_descendantSelectorIdentifierHashes[identifierCount] = 0;
31022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
31032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
31042fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::RuleSet()
31055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    : m_ruleCount(0)
31062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_autoShrinkToFitEnabled(true)
31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::~RuleSet()
31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_idRules);
31138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_classRules);
31142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    deleteAllValues(m_pseudoRules);
31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_tagRules);
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31192fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              CSSStyleRule* rule, CSSSelector* sel)
31218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!key) return;
31232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData>* rules = map.get(key);
31248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules) {
31252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rules = new Vector<RuleData>;
31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        map.set(key, rules);
31272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
31282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    rules->append(RuleData(rule, sel, m_ruleCount++));
31298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31312fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRule(CSSStyleRule* rule, CSSSelector* sel)
31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Id) {
31342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_idRules, rule, sel);
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Class) {
31382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_classRules, rule, sel);
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
314265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (sel->isUnknownPseudoElement()) {
31432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_pseudoRules, rule, sel);
314465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
314565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
314665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = sel->tag().localName();
31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (localName != starAtom) {
31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addToRuleSet(localName.impl(), m_tagRules, rule, sel);
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
315265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.append(RuleData(rule, sel, m_ruleCount++));
31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31562fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addPageRule(CSSStyleRule* rule, CSSSelector* sel)
315721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
31582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.append(RuleData(rule, sel, m_pageRules.size()));
315921939df44de1705786c545cd1bf519d47250322dBen Murdoch}
316021939df44de1705786c545cd1bf519d47250322dBen Murdoch
31612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRulesFromSheet(CSSStyleSheet* sheet, const MediaQueryEvaluator& medium, CSSStyleSelector* styleSelector)
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sheet)
31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No media implies "all", but if a media list exists it must
31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // contain our current medium
31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sheet->media() && !medium.eval(sheet->media(), styleSelector))
31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return; // the style sheet doesn't apply
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = sheet->length();
31728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StyleBase* item = sheet->item(i);
31756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (item->isStyleRule())
31766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            addStyleRule(static_cast<CSSStyleRule*>(item));
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isImportRule()) {
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSImportRule* import = static_cast<CSSImportRule*>(item);
31798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!import->media() || medium.eval(import->media(), styleSelector))
31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addRulesFromSheet(import->styleSheet(), medium, styleSelector);
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isMediaRule()) {
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMediaRule* r = static_cast<CSSMediaRule*>(item);
31848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSRuleList* rules = r->cssRules();
31858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((!r->media() || medium.eval(r->media(), styleSelector)) && rules) {
31878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Traverse child elements of the @media rule.
31888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned j = 0; j < rules->length(); j++) {
31898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    CSSRule *childItem = rules->item(j);
31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (childItem->isStyleRule()) {
31918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // It is a StyleRule, so append it to our list
31926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        addStyleRule(static_cast<CSSStyleRule*>(childItem));
31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isFontFaceRule() && styleSelector) {
31948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this font face to our set.
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(childItem);
31968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isKeyframesRule() && styleSelector) {
31988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this keyframe rule to our set.
31998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(childItem));
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }   // for rules
32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }   // if rules
32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isFontFaceRule() && styleSelector) {
32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Add this font face to our set.
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(item);
32068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isKeyframesRule())
32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(item));
32098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_autoShrinkToFitEnabled)
32112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        shrinkToFit();
32128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32142fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addStyleRule(CSSStyleRule* rule)
3215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
32166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (rule->isPageRule()) {
32176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPageRule* pageRule = static_cast<CSSPageRule*>(rule);
3218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        addPageRule(pageRule, pageRule->selectorList().first());
3219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else {
3220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s))
3221545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addRule(rule, s);
3222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
3223545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
322481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
322581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline void collectFeaturesFromSelector(CSSStyleSelector::Features& features, const CSSSelector* selector)
322681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
322781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->m_match == CSSSelector::Id && !selector->value().isEmpty())
322881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.idsInRules.add(selector->value().impl());
322981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (selector->pseudoType()) {
323081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoFirstLine:
323181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesFirstLineRules = true;
323281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoBefore:
323481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoAfter:
323581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesBeforeAfterRules = true;
323681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoLink:
323881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoVisited:
323981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesLinkRules = true;
324081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
324181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    default:
324281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
324381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
324481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
3245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
324681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void collectFeaturesFromList(CSSStyleSelector::Features& features, const Vector<RuleData>& rules)
3247ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
32482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules.size();
32492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
32502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules[i];
3251ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        bool foundSiblingSelector = false;
32522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (CSSSelector* selector = ruleData.selector(); selector; selector = selector->tagHistory()) {
325381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            collectFeaturesFromSelector(features, selector);
32542bde8e466a4451c7319e3a072d118917957d6554Steve Block
32552bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (CSSSelectorList* selectorList = selector->selectorList()) {
32562bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* subSelector = selectorList->first(); subSelector; subSelector = CSSSelectorList::next(subSelector)) {
32572bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (selector->isSiblingSelector())
32582bde8e466a4451c7319e3a072d118917957d6554Steve Block                        foundSiblingSelector = true;
32592bde8e466a4451c7319e3a072d118917957d6554Steve Block                    collectFeaturesFromSelector(features, subSelector);
32602bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
32612bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else if (selector->isSiblingSelector())
3262ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                foundSiblingSelector = true;
3263ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3264ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (foundSiblingSelector) {
326581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!features.siblingRules)
326681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                features.siblingRules = adoptPtr(new RuleSet);
326781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            features.siblingRules->addRule(ruleData.rule(), ruleData.selector());
3268ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3269ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
3270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3271ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
327281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid RuleSet::collectFeatures(CSSStyleSelector::Features& features) const
3273ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
3274ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    AtomRuleMap::const_iterator end = m_idRules.end();
3275ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_idRules.begin(); it != end; ++it)
327681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3277ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_classRules.end();
3278ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_classRules.begin(); it != end; ++it)
327981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_tagRules.end();
3281ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_tagRules.begin(); it != end; ++it)
328281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3283ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_pseudoRules.end();
3284ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_pseudoRules.begin(); it != end; ++it)
328581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
328681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    collectFeaturesFromList(features, m_universalRules);
32872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void shrinkMapVectorsToFit(RuleSet::AtomRuleMap& map)
32902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet::AtomRuleMap::iterator end = map.end();
32922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (RuleSet::AtomRuleMap::iterator it = map.begin(); it != end; ++it)
32932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        it->second->shrinkToFit();
32942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32962fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::shrinkToFit()
32972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_idRules);
32992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_classRules);
33002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_tagRules);
33012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_pseudoRules);
33022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.shrinkToFit();
33032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.shrinkToFit();
3304ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3305ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------------------------------------------------------------------------------------
33078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// this is mostly boring stuff on how to apply a certain rule to the renderstyle...
33088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33092bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, bool toFloat, double multiplier = 1, bool *ok = 0)
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This function is tolerant of a null style value. The only place style is used is in
3312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // length measurements, like 'ems' and 'px'. And in those cases style is only used
3313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // when the units are EMS or EXS. So we will just fail in those cases.
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!primitiveValue) {
33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ok)
33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
33198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
3320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!style && (type == CSSPrimitiveValue::CSS_EMS || type == CSSPrimitiveValue::CSS_EXS || type == CSSPrimitiveValue::CSS_REMS)) {
3322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (ok)
3323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                *ok = false;
33242bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
33252bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (toFloat)
33262bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthDouble(style, rootStyle, multiplier), Fixed);
33272bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
33282bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthIntForLength(style, rootStyle, multiplier), Fixed);
33292bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ok)
33358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return l;
33388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33392bde8e466a4451c7319e3a072d118917957d6554Steve Block
33402bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToIntLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33412bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33422bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, false, multiplier, ok);
33432bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33442bde8e466a4451c7319e3a072d118917957d6554Steve Block
33452bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToFloatLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33462bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33472bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, true, multiplier, ok);
33482bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
335021939df44de1705786c545cd1bf519d47250322dBen Murdochtemplate <bool applyFirst>
335121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSStyleSelector::applyDeclarations(bool isImportant, int startIndex, int endIndex)
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (startIndex == -1)
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = startIndex; i <= endIndex; i++) {
33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSMutableStyleDeclaration* decl = m_matchedDecls[i];
3358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSMutableStyleDeclaration::const_iterator end = decl->end();
3359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (CSSMutableStyleDeclaration::const_iterator it = decl->begin(); it != end; ++it) {
33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSProperty& current = *it;
33618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isImportant == current.isImportant()) {
336221939df44de1705786c545cd1bf519d47250322dBen Murdoch                int property = current.id();
336321939df44de1705786c545cd1bf519d47250322dBen Murdoch
336421939df44de1705786c545cd1bf519d47250322dBen Murdoch                if (applyFirst) {
336521939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(firstCSSProperty == CSSPropertyColor, CSS_color_is_first_property);
33662bde8e466a4451c7319e3a072d118917957d6554Steve Block                    COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyColor + 14, CSS_zoom_is_end_of_first_prop_range);
336721939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyZoom + 1, CSS_line_height_is_after_zoom);
336821939df44de1705786c545cd1bf519d47250322dBen Murdoch
336921939df44de1705786c545cd1bf519d47250322dBen Murdoch                    // give special priority to font-xxx, color properties, etc
337021939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property <= CSSPropertyLineHeight) {
337121939df44de1705786c545cd1bf519d47250322dBen Murdoch                        // we apply line-height later
337221939df44de1705786c545cd1bf519d47250322dBen Murdoch                        if (property == CSSPropertyLineHeight)
337321939df44de1705786c545cd1bf519d47250322dBen Murdoch                            m_lineHeightValue = current.value();
337421939df44de1705786c545cd1bf519d47250322dBen Murdoch                        else
337521939df44de1705786c545cd1bf519d47250322dBen Murdoch                            applyProperty(current.id(), current.value());
337621939df44de1705786c545cd1bf519d47250322dBen Murdoch                    }
337721939df44de1705786c545cd1bf519d47250322dBen Murdoch                } else {
337821939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property > CSSPropertyLineHeight)
337921939df44de1705786c545cd1bf519d47250322dBen Murdoch                        applyProperty(current.id(), current.value());
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33862fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRules(RuleSet* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
338706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
338806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_matchedRules.clear();
338906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
339106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
339206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRulesForList(rules->getPageRules(), isLeftPage, isFirstPage, pageName);
339406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If we didn't match any rules, we're done.
339606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_matchedRules.isEmpty())
339706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
339806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Sort the set of matched rules.
340081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sortMatchedRules();
340106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
340206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now transfer the set of matched rules over to our list of decls.
340306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    for (unsigned i = 0; i < m_matchedRules.size(); i++)
340406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
340506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
340606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34072fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRulesForList(const Vector<RuleData>* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
340806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
340906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
341006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
341106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules->size();
34132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
34142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules->at(i);
34152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSStyleRule* rule = ruleData.rule();
34162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const AtomicString& selectorLocalName = ruleData.selector()->tag().localName();
341706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (selectorLocalName != starAtom && selectorLocalName != pageName)
341806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
34192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSSelector::PseudoType pseudoType = ruleData.selector()->pseudoType();
342006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ((pseudoType == CSSSelector::PseudoLeftPage && !isLeftPage)
342106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoRightPage && isLeftPage)
342206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoFirstPage && !isFirstPage))
342306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
342506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // If the rule has no properties to apply, then ignore it.
342606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSMutableStyleDeclaration* decl = rule->declaration();
342706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!decl || !decl->length())
342806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
343006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // Add this rule to our list of matched rules.
34312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addMatchedRule(&ruleData);
343206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
343306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
343406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
343506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isLeftPage(int pageIndex) const
343606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
343706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isFirstPageLeft = false;
3438a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_rootElementStyle->isLeftToRightDirection())
343906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        isFirstPageLeft = true;
344006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (pageIndex + (isFirstPageLeft ? 1 : 0)) % 2;
344206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
344306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isFirstPage(int pageIndex) const
344506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
344606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: In case of forced left/right page, page at index 1 (not 0) can be the first page.
344706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (!pageIndex);
344806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
344906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
345006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenString CSSStyleSelector::pageName(int /* pageIndex */) const
345106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
345206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Implement page index to page name mapping.
345306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return "";
345406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
345506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void applyCounterList(RenderStyle* style, CSSValueList* list, bool isReset)
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CounterDirectiveMap& map = style->accessCounterDirectives();
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef CounterDirectiveMap::iterator Iterator;
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Iterator end = map.end();
34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Iterator it = map.begin(); it != end; ++it)
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset)
34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_reset = false;
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
34668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_increment = false;
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = list ? list->length() : 0;
34698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < length; ++i) {
34706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
34716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isPrimitiveValue())
34726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        Pair* pair = static_cast<CSSPrimitiveValue*>(currValue)->getPairValue();
34756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
34766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        AtomicString identifier = static_cast<CSSPrimitiveValue*>(pair->first())->getStringValue();
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: What about overflow?
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = static_cast<CSSPrimitiveValue*>(pair->second())->getIntValue();
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CounterDirectives& directives = map.add(identifier.impl(), CounterDirectives()).first->second;
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset) {
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_reset = true;
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_resetValue = value;
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (directives.m_increment)
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue += value;
34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_increment = true;
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue = value;
34918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
34928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyPropertyToStyle(int id, CSSValue *value, RenderStyle* style)
34978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(0);
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(0, style);
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = style;
350128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (value)
350228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        applyProperty(id, value);
35038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline bool isValidVisitedLinkProperty(int id)
35066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
35076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    switch(static_cast<CSSPropertyID>(id)) {
35086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackgroundColor:
35096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeftColor:
35106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRightColor:
35116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTopColor:
35126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottomColor:
35136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyColor:
35146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutlineColor:
35156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRuleColor:
3516f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case CSSPropertyWebkitTextEmphasisColor:
35176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextFillColor:
35186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextStrokeColor:
35196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Also allow shorthands so that inherit/initial still work.
35206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackground:
35216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeft:
35226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRight:
35236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTop:
35246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottom:
35256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutline:
35266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRule:
35276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(SVG)
35286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyFill:
35296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyStroke:
35306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
35316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return true;
35326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        default:
35336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            break;
35346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return false;
35376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
35386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// SVG handles zooming in a different way compared to CSS. The whole document is scaled instead
35402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// of each individual length value in the render style / tree. CSSPrimitiveValue::computeLength*()
35412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// multiplies each resolved length with the zoom multiplier - so for SVG we need to disable that.
35422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// Though all CSS values that can be applied to outermost <svg> elements (width/height/border/padding...)
35432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// need to respect the scaling. RenderBox (the parent class of RenderSVGRoot) grabs values like
35442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// width/height/border/padding/... from the RenderStyle -> for SVG these values would never scale,
35452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// if we'd pass a 1.0 zoom factor everyhwere. So we only pass a zoom factor of 1.0 for specific
35462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// properties that are NOT allowed to scale within a zoomed SVG document (letter/word-spacing/font-size).
35472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool useSVGZoomRules(const Element* e)
35482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
35492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return e && e->isSVGElement();
35502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
35512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyProperty(int id, CSSValue *value)
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = 0;
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue())
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        primitiveValue = static_cast<CSSPrimitiveValue*>(value);
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool apply = false;
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned short valueType = value->cssValueType();
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInherit = m_parentNode && valueType == CSSValue::CSS_INHERIT;
35668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInitial = valueType == CSSValue::CSS_INITIAL || (!m_parentNode && valueType == CSSValue::CSS_INHERIT);
35678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3568a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    id = CSSProperty::resolveDirectionAwareProperty(id, m_style->direction(), m_style->writingMode());
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_checker.m_matchVisitedPseudoClass && !isValidVisitedLinkProperty(id)) {
35716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Limit the properties that can be applied to only the ones honored by :visited.
35726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
35736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35752bde8e466a4451c7319e3a072d118917957d6554Steve Block    CSSPropertyID property = static_cast<CSSPropertyID>(id);
35762bde8e466a4451c7319e3a072d118917957d6554Steve Block
35772bde8e466a4451c7319e3a072d118917957d6554Steve Block    // check lookup table for implementations and use when available
35782bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_applyProperty.implements(property)) {
35792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (isInherit)
35802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInheritValue(property, this);
35812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else if (isInitial)
35822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInitialValue(property, this);
35832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
35842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyValue(property, this, value);
35852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
35862bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
35872bde8e466a4451c7319e3a072d118917957d6554Steve Block
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // What follows is a list that maps the CSS properties into their corresponding front-end
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RenderStyle values.  Shorthands (e.g. border, background) occur in this list as well and
35908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // are only hit when mapping "inherit" or "initial" into front-end values.
35915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    switch (property) {
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ident only properties
35938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderCollapse:
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderCollapse, BorderCollapse)
35958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueCollapse:
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(true);
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueSeparate:
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(false);
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineStyle:
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(outlineStyle, OutlineStyle, BorderStyle)
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent() == CSSValueAuto)
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(DOTTED, true);
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(*primitiveValue);
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCaptionSide:
36185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(captionSide, CaptionSide)
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClear:
36215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(clear, Clear)
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDisplay:
36245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(display, Display)
3625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
3626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue) {
3627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (primitiveValue->getIdent() == CSSValueWapMarquee) {
3628d0825bca7fe65beaee391d30da42e937db621564Steve Block                // Initialize WAP Marquee style
3629231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowX(OMARQUEE);
3630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowY(OMARQUEE);
3631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setWhiteSpace(NOWRAP);
3632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
3633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeSpeed(85); // Normal speed
3634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeLoopCount(1);
3635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeBehavior(MSCROLL);
3636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                if (m_parentStyle)
3638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(m_parentStyle->display());
3639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                else
3640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(*primitiveValue);
3641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            } else
3642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setDisplay(*primitiveValue);
3643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3644231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyEmptyCells:
36475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(emptyCells, EmptyCells)
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFloat:
36505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(floating, Floating)
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStyle:
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(m_parentStyle->fontDescription().italic());
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(false);
36598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueOblique:
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: oblique is the same as italic for the moment...
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueItalic:
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(true);
36678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
36698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(false);
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
36778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontVariant:
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(m_parentStyle->fontDescription().smallCaps());
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(false);
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int id = primitiveValue->getIdent();
36918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueNormal)
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(false);
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (id == CSSValueSmallCaps)
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(true);
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
37008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontWeight:
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(m_parentStyle->fontDescription().weight());
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(FontWeightNormal);
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent()) {
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBolder:
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.bolderWeight());
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLighter:
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.lighterWeight());
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBold:
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue700:
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightBold);
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNormal:
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue400:
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightNormal);
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue900:
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight900);
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue800:
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight800);
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue600:
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight600);
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue500:
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight500);
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue300:
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight300);
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue200:
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight200);
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue100:
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight100);
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
37588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStylePosition:
37625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStylePosition, ListStylePosition)
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleType:
37655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStyleType, ListStyleType)
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakBefore:
37685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakBefore, PageBreakBefore, PageBreak)
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakAfter:
37715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakAfter, PageBreakAfter, PageBreak)
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakInside: {
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(pageBreakInside, PageBreakInside, PageBreak)
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
37768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pageBreak = *primitiveValue;
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pageBreak != PBALWAYS)
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPageBreakInside(pageBreak);
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPosition:
37845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(position, Position)
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTableLayout: {
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(tableLayout, TableLayout)
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ETableLayout l = *primitiveValue;
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (l == TAUTO)
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = RenderStyle::initialTableLayout();
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTableLayout(l);
37948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyUnicodeBidi:
37985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(unicodeBidi, UnicodeBidi)
37998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyTextTransform:
38015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textTransform, TextTransform)
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVisibility:
38045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(visibility, Visibility)
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWhiteSpace:
38075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(whiteSpace, WhiteSpace)
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderSpacing: {
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(m_parentStyle->horizontalBorderSpacing());
38128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(m_parentStyle->verticalBorderSpacing());
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
38158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(0);
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(0);
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderHorizontalSpacing: {
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(horizontalBorderSpacing, HorizontalBorderSpacing)
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHorizontalBorderSpacing(spacing);
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderVerticalSpacing: {
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalBorderSpacing, VerticalBorderSpacing)
38308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVerticalBorderSpacing(spacing);
38348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCursor:
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(m_parentStyle->cursor());
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursorList(m_parentStyle->cursors());
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->clearCursorList();
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(RenderStyle::initialCursor());
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->isValueList()) {
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList* list = static_cast<CSSValueList*>(value);
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(CURSOR_AUTO);
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++) {
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue* item = list->itemWithoutBoundsCheck(i);
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!item->isPrimitiveValue())
38548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
38568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int type = primitiveValue->primitiveType();
38578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (type == CSSPrimitiveValue::CSS_URI) {
38586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (primitiveValue->isCursorImageValue()) {
38596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        CSSCursorImageValue* image = static_cast<CSSCursorImageValue*>(primitiveValue);
38606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (image->updateIfSVGCursorIsUsed(m_element)) // Elements with SVG cursors are not allowed to share style.
38616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            m_style->setUnique();
38626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        m_style->addCursor(cachedOrPendingFromValue(CSSPropertyCursor, image), image->hotSpot());
38636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    }
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else if (type == CSSPrimitiveValue::CSS_IDENT)
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setCursor(*primitiveValue);
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
38688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
3869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_IDENT && m_style->cursor() != ECursor(*primitiveValue))
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setCursor(*primitiveValue);
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// uri || inherit
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleImage:
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(listStyleImage, ListStyleImage)
38785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_style->setListStyleImage(styleImage(CSSPropertyListStyleImage, value));
38798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length
38838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopWidth:
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightWidth:
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomWidth:
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftWidth:
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineWidth:
38888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleWidth:
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderTopWidth, borderTopWidth, BorderTopWidth)
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderRightWidth, borderRightWidth, BorderRightWidth)
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderBottomWidth, borderBottomWidth, BorderBottomWidth)
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderLeftWidth, borderLeftWidth, BorderLeftWidth)
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyOutlineWidth, outlineWidth, OutlineWidth)
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitColumnRuleWidth, columnRuleWidth, ColumnRuleWidth)
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopWidth, BorderTopWidth, BorderWidth)
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderRightWidth, BorderRightWidth, BorderWidth)
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomWidth, BorderBottomWidth, BorderWidth)
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderLeftWidth, BorderLeftWidth, BorderWidth)
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyOutlineWidth, OutlineWidth, BorderWidth)
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitColumnRuleWidth, ColumnRuleWidth, BorderWidth)
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short width = 3;
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThin:
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 1;
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMedium:
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 3;
39188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThick:
39208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 5;
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInvalid:
39230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            width = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0) return;
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderTopWidth:
39328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(width);
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderRightWidth:
39358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(width);
39368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderBottomWidth:
39388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(width);
39398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderLeftWidth:
39418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(width);
39428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyOutlineWidth:
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(width);
39458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitColumnRuleWidth:
39478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(width);
39488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
39538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitFontSmoothing: {
3956231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
3957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
3958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(m_parentStyle->fontDescription().fontSmoothing());
3959231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
3960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(AutoSmoothing);
3961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
3962231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
3963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
3964231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            int id = primitiveValue->getIdent();
3965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            FontSmoothingMode smoothing;
3966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (id) {
3967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAuto:
3968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueNone:
3971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = NoSmoothing;
3972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAntialiased:
3974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = Antialiased;
3975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueSubpixelAntialiased:
3977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = SubpixelAntialiased;
3978231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                default:
3980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    ASSERT_NOT_REACHED();
3981231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3982231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
3983231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(smoothing);
3984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
3986231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
3987231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
3988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
3989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
39908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLetterSpacing:
39918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordSpacing:
39928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
39938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
39948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLetterSpacing, letterSpacing, LetterSpacing)
39958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWordSpacing, wordSpacing, WordSpacing)
39968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLetterSpacing, LetterSpacing, LetterWordSpacing)
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWordSpacing, WordSpacing, LetterWordSpacing)
40018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int width = 0;
40050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNormal) {
40068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 0;
40078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
40088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
40098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
40102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            width = primitiveValue->computeLengthInt(style(), m_rootElementStyle, useSVGZoomRules(m_element) ? 1.0f : zoomFactor);
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
40138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyLetterSpacing:
40148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLetterSpacing(width);
40158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWordSpacing:
40178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setWordSpacing(width);
40188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ### needs the definitions in renderstyle
40208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: break;
40218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordBreak:
40265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordBreak, WordBreak)
40278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordWrap:
40295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordWrap, WordWrap)
40308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitNbspMode:
40325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(nbspMode, NBSPMode)
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineBreak:
40355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(khtmlLineBreak, KHTMLLineBreak)
40368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
40385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(matchNearestMailBlockquoteColor, MatchNearestMailBlockquoteColor)
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyResize:
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(resize, Resize)
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue->getIdent())
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EResize r = RESIZE_NONE;
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueAuto) {
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (Settings* settings = m_checker.m_document->settings())
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                r = settings->textAreasAreResizable() ? RESIZE_BOTH : RESIZE_NONE;
40528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            r = *primitiveValue;
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setResize(r);
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // length, percent
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxWidth:
40618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +none +inherit
406281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
406381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            l = Length(undefinedLength, Fixed);
40648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
406581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTop:
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLeft:
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyRight:
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBottom:
40708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidth:
40718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinWidth:
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginTop:
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginRight:
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginBottom:
40758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginLeft:
40768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit +auto
40778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWidth || id == CSSPropertyMinWidth || id == CSSPropertyMaxWidth) {
40788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
40798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(Intrinsic);
40808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
40838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(MinIntrinsic);
40848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSPropertyMaxWidth && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
40888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
40898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingTop:
40908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingRight:
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingBottom:
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingLeft:
40938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextIndent:
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
40978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxWidth, maxWidth, MaxWidth)
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBottom, bottom, Bottom)
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTop, top, Top)
41008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLeft, left, Left)
41018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyRight, right, Right)
41028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWidth, width, Width)
41038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinWidth, minWidth, MinWidth)
41048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingTop, paddingTop, PaddingTop)
41058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingRight, paddingRight, PaddingRight)
41068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingBottom, paddingBottom, PaddingBottom)
41078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingLeft, paddingLeft, PaddingLeft)
41088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginTop, marginTop, MarginTop)
41098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginRight, marginRight, MarginRight)
41108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginBottom, marginBottom, MarginBottom)
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginLeft, marginLeft, MarginLeft)
41128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTextIndent, textIndent, TextIndent)
41138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
41168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxWidth, MaxWidth, MaxSize)
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBottom, Bottom, Offset)
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyTop, Top, Offset)
41198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLeft, Left, Offset)
41208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyRight, Right, Offset)
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWidth, Width, Size)
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinWidth, MinWidth, MinSize)
41238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingTop, PaddingTop, Padding)
41248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingRight, PaddingRight, Padding)
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingBottom, PaddingBottom, Padding)
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingLeft, PaddingLeft, Padding)
41278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginTop, MarginTop, Margin)
41288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginRight, MarginRight, Margin)
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginBottom, MarginBottom, Margin)
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginLeft, MarginLeft, Margin)
41318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND(CSSPropertyTextIndent, TextIndent)
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
41368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
41378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
41388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle our quirky margin units if we have them.
41390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed,
41408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           primitiveValue->isQuirkValue());
41418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
41448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
414506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            apply = true;
41468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!apply) return;
41488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
41498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMaxWidth:
41508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMaxWidth(l);
41518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyBottom:
41538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBottom(l);
41548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTop:
41568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTop(l);
41578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyLeft:
41598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setLeft(l);
41608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyRight:
41628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setRight(l);
41638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyWidth:
41658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setWidth(l);
41668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMinWidth:
41688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMinWidth(l);
41698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingTop:
41718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingTop(l);
41728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingRight:
41748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingRight(l);
41758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingBottom:
41778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingBottom(l);
41788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingLeft:
41808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingLeft(l);
41818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginTop:
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginTop(l);
41848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginRight:
41868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginRight(l);
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginBottom:
41898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginBottom(l);
41908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginLeft:
41928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginLeft(l);
41938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTextIndent:
41958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextIndent(l);
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
41988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
42028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxHeight:
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
42058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(undefinedLength, Fixed);
42068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyHeight:
42098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinHeight:
42108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
42118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(Intrinsic);
42128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
42148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(MinIntrinsic);
42158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (id != CSSPropertyMaxHeight && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
42178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
42198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxHeight, maxHeight, MaxHeight)
42208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyHeight, height, Height)
42218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinHeight, minHeight, MinHeight)
42228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
42258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxHeight, MaxHeight, MaxSize)
42268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyHeight, Height, Size)
42278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinHeight, MinHeight, MinSize)
42288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
42328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned short type = primitiveValue->primitiveType();
42338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
42340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
42378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
42388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
42398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (apply)
42428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (id) {
42438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMaxHeight:
42448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMaxHeight(l);
42458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyHeight:
42478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setHeight(l);
42488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMinHeight:
42508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMinHeight(l);
42518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVerticalAlign:
42568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalAlign, VerticalAlign)
42578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
42588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
42608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          EVerticalAlign align;
42618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          switch (primitiveValue->getIdent()) {
42638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTop:
42648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TOP; break;
42658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBottom:
42668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BOTTOM; break;
42678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMiddle:
42688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = MIDDLE; break;
42698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBaseline:
42708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE; break;
42718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextBottom:
42728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_BOTTOM; break;
42738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextTop:
42748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_TOP; break;
42758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSub:
42768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUB; break;
42778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSuper:
42788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUPER; break;
42798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitBaselineMiddle:
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE_MIDDLE; break;
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
42828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
42838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(align);
42858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          return;
42868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
42878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          int type = primitiveValue->primitiveType();
42888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          Length l;
42898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian          if (CSSPrimitiveValue::isUnitTypeLength(type))
42900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
42938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(LENGTH);
42958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlignLength(l);
42968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontSize:
43008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
43028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setKeywordSize(0);
43038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float oldSize = 0;
43048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float size = 0;
43058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parentIsAbsoluteSize = false;
43078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_parentNode) {
43088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            oldSize = m_parentStyle->fontDescription().specifiedSize();
43098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parentIsAbsoluteSize = m_parentStyle->fontDescription().isAbsoluteSize();
43108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            size = oldSize;
43148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentNode)
43158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setKeywordSize(m_parentStyle->fontDescription().keywordSize());
43168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
4317d0825bca7fe65beaee391d30da42e937db621564Steve Block            size = fontSizeForKeyword(m_checker.m_document, CSSValueMedium, fontDescription.useFixedDefaultSize());
43188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
43198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent()) {
43208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Keywords are being used.
43218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
43228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxSmall:
43238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXSmall:
43248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
43258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMedium:
43268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
43278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXLarge:
43288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxLarge:
43298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitXxxLarge:
4330d0825bca7fe65beaee391d30da42e937db621564Steve Block                    size = fontSizeForKeyword(m_checker.m_document, primitiveValue->getIdent(), fontDescription.useFixedDefaultSize());
43318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setKeywordSize(primitiveValue->getIdent() - CSSValueXxSmall + 1);
43328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarger:
43345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = largerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmaller:
43375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = smallerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
43408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
43418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
43428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize &&
43448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (primitiveValue->getIdent() == CSSValueLarger ||
43458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               primitiveValue->getIdent() == CSSValueSmaller));
43468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
43478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
43488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize ||
43498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (type != CSSPrimitiveValue::CSS_PERCENTAGE &&
43508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               type != CSSPrimitiveValue::CSS_EMS &&
43510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_EXS &&
43520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_REMS));
43538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
43540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                size = primitiveValue->computeLengthFloat(m_parentStyle, m_rootElementStyle, true);
43558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
43568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size = (primitiveValue->getFloatValue() * oldSize) / 100.0f;
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (size < 0)
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setFontSize(fontDescription, size);
43658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
43668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
43678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZIndex: {
43718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoZIndex())
43738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoZIndex();
43748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZIndex(m_parentStyle->zIndex());
43768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
43788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoZIndex();
43798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Should clamp all sorts of other integer properties too.
43832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_style->setZIndex(clampToInteger(primitiveValue->getDoubleValue()));
43848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidows:
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(widows, Widows)
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setWidows(primitiveValue->getIntValue());
43928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOrphans:
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(orphans, Orphans)
43988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOrphans(primitiveValue->getIntValue());
44018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length, percent, number
44058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLineHeight:
44068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineHeight, LineHeight)
44088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length lineHeight;
44118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
44128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
44138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(-100.0, Percent);
44148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
4415692e5dbf12901edacf14812a6fae25462920af42Steve Block            double multiplier = zoomFactor;
44165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (m_style->textSizeAdjust()) {
441768513a70bcd92384395513322f1b801e7bf9c729Steve Block                if (Frame* frame = m_checker.m_document->frame())
441868513a70bcd92384395513322f1b801e7bf9c729Steve Block                    multiplier *= frame->textZoomFactor();
44195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            }
44200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            lineHeight = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle,  multiplier), Fixed);
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length((m_style->fontSize() * primitiveValue->getIntValue()) / 100, Fixed);
44238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
44248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
44258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
44268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setLineHeight(lineHeight);
44288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// string
44328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextAlign:
44338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textAlign, TextAlign)
44358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44372bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (primitiveValue->getIdent() == CSSValueWebkitMatchParent) {
44382bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (m_parentStyle->textAlign() == TASTART)
44392bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? LEFT : RIGHT);
44402bde8e466a4451c7319e3a072d118917957d6554Steve Block            else if (m_parentStyle->textAlign() == TAEND)
44412bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? RIGHT : LEFT);
44422bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
44432bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->textAlign());
44442bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
44452bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
44462bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_style->setTextAlign(*primitiveValue);
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect
44518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClip:
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length top;
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length right;
44558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length bottom;
44568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length left;
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasClip = true;
44588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
44598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasClip()) {
44608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = m_parentStyle->clipTop();
44618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                right = m_parentStyle->clipRight();
44628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bottom = m_parentStyle->clipBottom();
44638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                left = m_parentStyle->clipLeft();
44648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else {
44658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                hasClip = false;
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = right = bottom = left = Length();
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hasClip = false;
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            top = right = bottom = left = Length();
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (!primitiveValue) {
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RECT) {
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect* rect = primitiveValue->getRectValue();
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!rect)
44768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
44772bde8e466a4451c7319e3a072d118917957d6554Steve Block            top = convertToIntLength(rect->top(), style(), m_rootElementStyle, zoomFactor);
44782bde8e466a4451c7319e3a072d118917957d6554Steve Block            right = convertToIntLength(rect->right(), style(), m_rootElementStyle, zoomFactor);
44792bde8e466a4451c7319e3a072d118917957d6554Steve Block            bottom = convertToIntLength(rect->bottom(), style(), m_rootElementStyle, zoomFactor);
44802bde8e466a4451c7319e3a072d118917957d6554Steve Block            left = convertToIntLength(rect->left(), style(), m_rootElementStyle, zoomFactor);
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent() != CSSValueAuto) {
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setClip(top, right, bottom, left);
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHasClip(hasClip);
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // rect, ident
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// lists
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyContent:
44938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of string, uri, counter, attr, i
44948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: In CSS3, it will be possible to inherit content.  In CSS2 it is not.  This
44968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // note is a reminder that eventually "inherit" needs to be supported.
44978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList* list = static_cast<CSSValueList*>(value);
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
45088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool didSet = false;
45108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* item = list->itemWithoutBoundsCheck(i);
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->isImageGeneratorValue()) {
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setContent(static_cast<CSSImageGeneratorValue*>(item)->generatedImage(), didSet);
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                didSet = true;
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!item->isPrimitiveValue())
45188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
45198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
45216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            switch (contentValue->primitiveType()) {
452281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_STRING:
452381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(contentValue->getStringValue().impl(), didSet);
452481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
452581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
452681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_ATTR: {
452781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // FIXME: Can a namespace be specified for an attr(foo)?
452881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (m_style->styleType() == NOPSEUDO)
452981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setUnique();
453081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                else
453181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_parentStyle->setUnique();
453281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                QualifiedName attr(nullAtom, contentValue->getStringValue().impl(), nullAtom);
453381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(m_element->getAttribute(attr).impl(), didSet);
453481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
453581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // register the fact that the attribute value affects the style
453681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_selectorAttrs.add(attr.localName().impl());
453781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
453881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
453981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_URI: {
454081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (!contentValue->isImageValue())
454181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
454281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(cachedOrPendingFromValue(CSSPropertyContent, static_cast<CSSImageValue*>(contentValue)), didSet);
454381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
454481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
454581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
454681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_COUNTER: {
454781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                Counter* counterValue = contentValue->getCounterValue();
454881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                OwnPtr<CounterContent> counter = adoptPtr(new CounterContent(counterValue->identifier(),
454981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    (EListStyleType)counterValue->listStyleNumber(), counterValue->separator()));
455081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(counter.release(), didSet);
455181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
455281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
455381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
455481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_IDENT:
455581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                switch (contentValue->getIdent()) {
455681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueOpenQuote:
455781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(OPEN_QUOTE, didSet);
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueCloseQuote:
456181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(CLOSE_QUOTE, didSet);
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoOpenQuote:
456581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_OPEN_QUOTE, didSet);
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoCloseQuote:
456981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_CLOSE_QUOTE, didSet);
45708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
457181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
457281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                default:
457381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    // normal and none do not have any effect.
457481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    {}
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!didSet)
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
45808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
45818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
458281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyQuotes:
458381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInherit) {
458481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_parentStyle)
458581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(m_parentStyle->quotes());
458681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
458781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
458881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInitial) {
458981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(0);
459081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
459181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
459281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (value->isValueList()) {
459381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
459481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            size_t length = list->length();
459581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QuotesData* data = QuotesData::create(length);
459681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!data)
459781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return; // Out of memory
459881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            String* quotes = data->data();
459981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            for (size_t i = 0; i < length; i++) {
460081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                CSSValue* item = list->itemWithoutBoundsCheck(i);
460181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(item->isPrimitiveValue());
460281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
460381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING);
460481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                quotes[i] = primitiveValue->getStringValue();
460581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
460681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(adoptRef(data));
460781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        } else if (primitiveValue) {
460881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT);
460981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (primitiveValue->getIdent() == CSSValueNone)
461081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(adoptRef(QuotesData::create(0)));
461181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
461281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
46138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterIncrement:
46158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, false);
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterReset:
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, true);
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontFamily: {
46228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of strings and ids
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
46248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription parentFontDescription = m_parentStyle->fontDescription();
46258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(parentFontDescription.genericFamily());
46278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setFamily(parentFontDescription.firstFamily());
46280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            fontDescription.setIsSpecifiedFont(parentFontDescription.isSpecifiedFont());
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
4632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (isInitial) {
46338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription initialDesc = FontDescription();
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We need to adjust the size to account for the generic family change from monospace
46368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to non-monospace.
4637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize())
4638d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, false));
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(initialDesc.genericFamily());
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!initialDesc.firstFamily().familyIsEmpty())
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setFamily(initialDesc.firstFamily());
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!value->isValueList())
4648231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
46498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
4650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSValueList* list = static_cast<CSSValueList*>(value);
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
46528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontFamily& firstFamily = fontDescription.firstFamily();
4653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontFamily* currFamily = 0;
46548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Before mapping in a new font-family property, we should reset the generic family.
4656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool oldFamilyUsedFixedDefaultSize = fontDescription.useFixedDefaultSize();
46578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setGenericFamily(FontDescription::NoFamily);
46588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
4660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            CSSValue* item = list->itemWithoutBoundsCheck(i);
4661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!item->isPrimitiveValue())
4662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                continue;
46636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
46648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AtomicString face;
46658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
46666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
46676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (contentValue->isFontFamilyValue())
46686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    face = static_cast<FontFamilyValue*>(contentValue)->familyName();
46696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            } else if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && settings) {
46706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                switch (contentValue->getIdent()) {
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueWebkitBody:
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = settings->standardFontFamily();
46738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSerif:
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-serif";
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SerifFamily);
46778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSansSerif:
46798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-sans-serif";
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SansSerifFamily);
46818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueCursive:
46838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-cursive";
46848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::CursiveFamily);
46858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueFantasy:
46878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-fantasy";
46888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::FantasyFamily);
46898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueMonospace:
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-monospace";
46928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::MonospaceFamily);
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4696231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!face.isEmpty()) {
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!currFamily) {
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Filling in the first family.
47008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstFamily.setFamily(face);
4701231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    firstFamily.appendFamily(0); // Remove any inherited family-fallback list.
47028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = &firstFamily;
47030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    fontDescription.setIsSpecifiedFont(fontDescription.genericFamily() == FontDescription::NoFamily);
4704231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                } else {
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create();
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    newFamily->setFamily(face);
47078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily->appendFamily(newFamily);
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = newFamily.get();
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4712231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // We can't call useFixedDefaultSize() until all new font families have been added
4714231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If currFamily is non-zero then we set at least one family on this description.
4715231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (currFamily) {
4716231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize() != oldFamilyUsedFixedDefaultSize)
4717d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, !oldFamilyUsedFixedDefaultSize));
4718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4719231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (m_style->setFontDescription(fontDescription))
4720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_fontDirty = true;
4721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
4722231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextDecoration: {
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of ident
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textDecoration, TextDecoration)
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int t = RenderStyle::initialTextDecoration();
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // do nothing
47308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
47316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!value->isValueList())
47326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                return;
47338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList *list = static_cast<CSSValueList*>(value);
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++)
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
47378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue *item = list->itemWithoutBoundsCheck(i);
47386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!item->isPrimitiveValue())
47396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    continue;
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNone:
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t = TDNONE; break;
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueUnderline:
47458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= UNDERLINE; break;
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueOverline:
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= OVERLINE; break;
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLineThrough:
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= LINE_THROUGH; break;
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBlink:
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= BLINK; break;
47528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextDecoration(t);
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZoom:
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Reset the zoom in effect before we do anything.  This allows the setZoom method to accurately compute a new
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // zoom in effect.
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setEffectiveZoom(m_parentStyle ? m_parentStyle->effectiveZoom() : RenderStyle::initialZoom());
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we can handle inherit and initial.
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(zoom, Zoom)
47708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle normal/reset, numbers and percentages.
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
47738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
47748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
47758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->getIdent() == CSSValueReset) {
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setEffectiveZoom(RenderStyle::initialZoom());
47778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
4778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else if (primitiveValue->getIdent() == CSSValueDocument) {
4779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            float docZoom = m_checker.m_document->renderer()->style()->zoom();
4780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setEffectiveZoom(docZoom);
4781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setZoom(docZoom);
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE) {
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue() / 100.0f);
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_NUMBER) {
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue());
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// shorthand properties
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackground:
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearBackgroundLayers();
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(Color());
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit) {
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritBackgroundLayers(*m_parentStyle->backgroundLayers());
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(m_parentStyle->backgroundColor());
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMask:
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearMaskLayers();
48078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritMaskLayers(*m_parentStyle->maskLayers());
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorder:
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderStyle:
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderWidth:
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderColor:
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderColor)
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor(): m_parentStyle->color());
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(Color()); // Reset to invalid color so currentColor is used instead.
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(Color());
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(Color());
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(Color());
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderStyle)
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(RenderStyle::initialBorderStyle());
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(RenderStyle::initialBorderStyle());
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(RenderStyle::initialBorderStyle());
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(RenderStyle::initialBorderStyle());
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderWidth)
48468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(RenderStyle::initialBorderWidth());
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(RenderStyle::initialBorderWidth());
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(RenderStyle::initialBorderWidth());
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(RenderStyle::initialBorderWidth());
48588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTop:
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderTop();
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRight:
48718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor() : m_parentStyle->color());
48738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRight();
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottom:
48808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderBottom();
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeft:
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderLeft();
48968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMargin:
48988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginTop(m_parentStyle->marginTop());
49008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginBottom(m_parentStyle->marginBottom());
49018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginLeft(m_parentStyle->marginLeft());
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginRight(m_parentStyle->marginRight());
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetMargin();
49068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPadding:
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingTop(m_parentStyle->paddingTop());
49108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingBottom(m_parentStyle->paddingBottom());
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingLeft(m_parentStyle->paddingLeft());
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingRight(m_parentStyle->paddingRight());
49138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetPadding();
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFont:
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_parentStyle->fontDescription();
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(m_parentStyle->lineHeight());
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
49258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
49268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (!settings)
49288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(FontDescription::StandardFamily);
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setRenderingMode(settings->fontRenderingMode());
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const AtomicString& standardFontFamily = m_checker.m_document->settings()->standardFontFamily();
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!standardFontFamily.isEmpty()) {
49358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().setFamily(standardFontFamily);
49368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().appendFamily(0);
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
4939d0825bca7fe65beaee391d30da42e937db621564Steve Block            setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueMedium, false));
49408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
49458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RenderTheme::defaultTheme()->systemFont(primitiveValue->getIdent(), fontDescription);
49500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
49518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Double-check and see if the theme did anything.  If not, don't bother updating the font.
49528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (fontDescription.isAbsoluteSize()) {
49538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Make sure the rendering mode and printer font settings are updated.
49548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Settings* settings = m_checker.m_document->settings();
49558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!settings)
49578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return;
49588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setRenderingMode(settings->fontRenderingMode());
49598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle the zoom factor.
49622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), fontDescription.specifiedSize(), useSVGZoomRules(m_element)));
49638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_style->setFontDescription(fontDescription))
49648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_fontDirty = true;
49658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->isFontValue()) {
49678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontValue *font = static_cast<FontValue*>(value);
49688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!font->style || !font->variant || !font->weight ||
49698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 !font->size || !font->lineHeight || !font->family)
49708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
49718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontStyle, font->style.get());
49728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontVariant, font->variant.get());
49738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontWeight, font->weight.get());
4974bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // The previous properties can dirty our font but they don't try to read the font's
4975bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // properties back, which is safe. However if font-size is using the 'ex' unit, it will
4976bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // need query the dirtied font's x-height to get the computed size. To be safe in this
4977bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // case, let's just update the font now.
4978bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            updateFont();
49798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontSize, font->size.get());
49808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = font->lineHeight.get();
49828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontFamily, font->family.get());
49848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyle:
49888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(m_parentStyle->listStyleType());
49908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(m_parentStyle->listStyleImage());
49918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(m_parentStyle->listStylePosition());
49928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
49948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(RenderStyle::initialListStyleType());
49958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(RenderStyle::initialListStyleImage());
49968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(RenderStyle::initialListStylePosition());
49978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutline:
50008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(m_parentStyle->outlineWidth());
50028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineColor(m_parentStyle->outlineColor().isValid() ? m_parentStyle->outlineColor() : m_parentStyle->color());
50038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineStyle(m_parentStyle->outlineStyle());
50048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
50068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetOutline();
50078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // CSS3 Properties
50108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAppearance: {
50118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(appearance, Appearance)
50128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setAppearance(*primitiveValue);
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderImage:
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskBoxImage: {
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitBorderImage, borderImage, BorderImage)
50228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitMaskBoxImage, maskBoxImage, MaskBoxImage)
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
50258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitBorderImage, BorderImage, NinePieceImage)
50268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitMaskBoxImage, MaskBoxImage, NinePieceImage)
50278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage image;
50315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, value, image);
50328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWebkitBorderImage)
50348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderImage(image);
50358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
50368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMaskBoxImage(image);
50378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderRadius:
50418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderRadius:
50428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopLeftRadius(m_parentStyle->borderTopLeftRadius());
50448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopRightRadius(m_parentStyle->borderTopRightRadius());
50458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomLeftRadius(m_parentStyle->borderBottomLeftRadius());
50468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomRightRadius(m_parentStyle->borderBottomRightRadius());
50478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRadius();
50518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fall through
50540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopLeftRadius:
50550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopRightRadius:
50560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomLeftRadius:
50570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomRightRadius: {
50588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopLeftRadius, borderTopLeftRadius, BorderTopLeftRadius)
50600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopRightRadius, borderTopRightRadius, BorderTopRightRadius)
50610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomLeftRadius, borderBottomLeftRadius, BorderBottomLeftRadius)
50620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomRightRadius, borderBottomRightRadius, BorderBottomRightRadius)
50638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopLeftRadius, BorderTopLeftRadius, BorderRadius)
50680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopRightRadius, BorderTopRightRadius, BorderRadius)
50690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomLeftRadius, BorderBottomLeftRadius, BorderRadius)
50700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomRightRadius, BorderBottomRightRadius, BorderRadius)
50718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Pair* pair = primitiveValue->getPairValue();
50786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
50798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusWidth;
50825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusHeight;
50835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->first()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(pair->first()->getDoubleValue(), Percent);
50855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(max(intMinForLength, min(intMaxForLength, pair->first()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->second()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(pair->second()->getDoubleValue(), Percent);
50895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(max(intMinForLength, min(intMaxForLength, pair->second()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50912bde8e466a4451c7319e3a072d118917957d6554Steve Block        int width = radiusWidth.value();
50922bde8e466a4451c7319e3a072d118917957d6554Steve Block        int height = radiusHeight.value();
50938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0 || height < 0)
50948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width == 0)
50965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = radiusWidth; // Null out the other value.
50978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (height == 0)
50985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = radiusHeight; // Null out the other value.
50998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        LengthSize size(radiusWidth, radiusHeight);
51018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
51020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopLeftRadius:
51038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopLeftRadius(size);
51048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopRightRadius:
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopRightRadius(size);
51078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomLeftRadius:
51098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomLeftRadius(size);
51108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomRightRadius:
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomRightRadius(size);
51138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
51158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRadius(size);
51168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineOffset:
51228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(outlineOffset, OutlineOffset)
51230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setOutlineOffset(primitiveValue->computeLengthInt(style(), m_rootElementStyle, zoomFactor));
51248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyTextRendering: {
5126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
5127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
5128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(m_parentStyle->fontDescription().textRenderingMode());
5129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
5130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(AutoTextRendering);
5131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
5132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
5133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
5134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(*primitiveValue);
5135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
5137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
5138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
51408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextShadow:
5141cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSPropertyBoxShadow:
5142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitBoxShadow: {
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
51448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return m_style->setTextShadow(m_parentStyle->textShadow() ? new ShadowData(*m_parentStyle->textShadow()) : 0);
51468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_style->setBoxShadow(m_parentStyle->boxShadow() ? new ShadowData(*m_parentStyle->boxShadow()) : 0);
51478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial || primitiveValue) // initial | none
51498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return id == CSSPropertyTextShadow ? m_style->setTextShadow(0) : m_style->setBoxShadow(0);
51508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
51528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList *list = static_cast<CSSValueList*>(value);
51558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
51568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
51576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSValue* currValue = list->itemWithoutBoundsCheck(i);
51586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!currValue->isShadowValue())
51596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                continue;
51608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShadowValue* item = static_cast<ShadowValue*>(list->itemWithoutBoundsCheck(i));
51610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int x = item->x->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int y = item->y->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int blur = item->blur ? item->blur->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int spread = item->spread ? item->spread->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ShadowStyle shadowStyle = item->style && item->style->getIdent() == CSSValueInset ? Inset : Normal;
51668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Color color;
51678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->color)
51688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                color = getColorFromPrimitiveValue(item->color.get());
5169cad810f21b803229eb11403f9209855525a25d57Steve Block            ShadowData* shadowData = new ShadowData(x, y, blur, spread, shadowStyle, id == CSSPropertyWebkitBoxShadow, color.isValid() ? color : Color::transparent);
51708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextShadow(shadowData, i != 0);
51728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBoxShadow(shadowData, i != 0);
51748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxReflect: {
51788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxReflect, BoxReflect)
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
51808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxReflect(RenderStyle::initialBoxReflect());
51818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!value->isReflectValue())
51856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
51866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSReflectValue* reflectValue = static_cast<CSSReflectValue*>(value);
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<StyleReflection> reflection = StyleReflection::create();
51898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setDirection(reflectValue->direction());
51908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (reflectValue->offset()) {
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = reflectValue->offset()->primitiveType();
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                reflection->setOffset(Length(reflectValue->offset()->getDoubleValue(), Percent));
51948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                reflection->setOffset(Length(reflectValue->offset()->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed));
51968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage mask;
51985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, reflectValue->mask(), mask);
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setMask(mask);
52008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxReflect(reflection.release());
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOpacity:
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(opacity, Opacity)
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Clamp opacity to the range 0-1
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOpacity(min(1.0f, max(0.0f, primitiveValue->getFloatValue())));
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxAlign:
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxAlign, BoxAlign)
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxAlignment = *primitiveValue;
52178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxAlignment != BJUSTIFY)
52188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxAlign(boxAlignment);
52198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertySrc: // Only used in @font-face rules.
52228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyUnicodeRange: // Only used in @font-face rules.
52248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitBackfaceVisibility:
52268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(backfaceVisibility, BackfaceVisibility)
52278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
52288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setBackfaceVisibility((primitiveValue->getIdent() == CSSValueVisible) ? BackfaceVisibilityVisible : BackfaceVisibilityHidden);
52298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxDirection:
52315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxDirection, BoxDirection)
52328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxLines:
52345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxLines, BoxLines)
52358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrient:
52375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxOrient, BoxOrient)
52388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxPack:
52408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxPack, BoxPack)
52428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxPack = *primitiveValue;
52458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxPack != BSTRETCH && boxPack != BBASELINE)
52468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxPack(boxPack);
52478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlex:
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlex, BoxFlex)
52518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlex(primitiveValue->getFloatValue());
52548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlexGroup:
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlexGroup, BoxFlexGroup)
52578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlexGroup((unsigned int)(primitiveValue->getDoubleValue()));
52608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrdinalGroup:
52628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxOrdinalGroup, BoxOrdinalGroup)
52638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxOrdinalGroup((unsigned int)(primitiveValue->getDoubleValue()));
52668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
526728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case CSSPropertyBoxSizing:
52688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxSizing, BoxSizing)
52698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueContentBox)
52728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(CONTENT_BOX);
52738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
52748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(BORDER_BOX);
52758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnCount: {
52778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnCount())
52798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnCount();
52808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnCount(m_parentStyle->columnCount());
52828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
52848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnCount();
52858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
52878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setColumnCount(static_cast<unsigned short>(primitiveValue->getDoubleValue()));
52888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnGap: {
52918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasNormalColumnGap())
52938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasNormalColumnGap();
52948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnGap(m_parentStyle->columnGap());
52968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueNormal) {
52988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasNormalColumnGap();
52998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnGap(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
53028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5304e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitColumnSpan: {
5305e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        HANDLE_INHERIT_AND_INITIAL(columnSpan, ColumnSpan)
5306e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_style->setColumnSpan(primitiveValue->getIdent() == CSSValueAll);
5307e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
5308e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
53098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnWidth: {
53108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
53178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnWidth(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
53218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleStyle:
53245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnRuleStyle, ColumnRuleStyle, BorderStyle)
53258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakBefore:
53275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakBefore, ColumnBreakBefore, PageBreak)
53288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakAfter:
53305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakAfter, ColumnBreakAfter, PageBreak)
53318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakInside: {
53338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(columnBreakInside, ColumnBreakInside, PageBreak)
53348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pb = *primitiveValue;
53358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pb != PBALWAYS)
53368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnBreakInside(pb);
53378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     case CSSPropertyWebkitColumnRule:
53408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleColor(m_parentStyle->columnRuleColor().isValid() ? m_parentStyle->columnRuleColor() : m_parentStyle->color());
53428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleStyle(m_parentStyle->columnRuleStyle());
53438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(m_parentStyle->columnRuleWidth());
53448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
53468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetColumnRule();
53478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumns:
53498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(m_parentStyle->columnCount());
53558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
53568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(RenderStyle::initialColumnCount());
53588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarquee:
53618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (valueType != CSSValue::CSS_INHERIT || !m_parentNode) return;
53628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeDirection(m_parentStyle->marqueeDirection());
53638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeIncrement(m_parentStyle->marqueeIncrement());
53648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeSpeed(m_parentStyle->marqueeSpeed());
53658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeLoopCount(m_parentStyle->marqueeLoopCount());
53668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeBehavior(m_parentStyle->marqueeBehavior());
53678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5368231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeLoop:
5370231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeRepetition: {
53728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeLoopCount, MarqueeLoopCount)
53738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueInfinite)
53768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(-1); // -1 means repeat forever.
53778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER)
53788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(primitiveValue->getIntValue());
53798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeSpeed:
5383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeSpeed: {
53858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeSpeed, MarqueeSpeed)
53868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
53898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
53908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSlow:
53918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(500); // 500 msec.
53928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
53948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(85); // 85msec. The WinIE default.
53958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueFast:
53978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(10); // 10msec. Super fast.
53988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
54008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
54028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(1000 * primitiveValue->getIntValue());
54038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
54048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
54058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER) // For scrollamount support.
54068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
54078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeIncrement: {
54108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeIncrement, MarqueeIncrement)
54118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
54128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
54148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
54158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
54168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(1, Fixed)); // 1px.
54178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
54198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(6, Fixed)); // 6px. The WinIE default.
54208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
54228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(36, Fixed)); // 36px.
54238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
54258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
54278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            bool ok = true;
54282bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length marqueeLength = convertToIntLength(primitiveValue, style(), m_rootElementStyle, 1, &ok);
54298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (ok)
54302bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setMarqueeIncrement(marqueeLength);
54318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeStyle:
5436231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeStyle:
54385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeBehavior, MarqueeBehavior)
54398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5440231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5441231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeDir:
5442231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        HANDLE_INHERIT_AND_INITIAL(marqueeDirection, MarqueeDirection)
5443231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue && primitiveValue->getIdent()) {
5444231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (primitiveValue->getIdent()) {
5445231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueLtr:
5446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MRIGHT);
5447231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueRtl:
5449231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
5450231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            default:
5452231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(*primitiveValue);
5453231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5454231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
5455231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5456231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5457231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeDirection:
54595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeDirection, MarqueeDirection)
54608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserDrag:
54625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userDrag, UserDrag)
54638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserModify:
54655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userModify, UserModify)
54668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserSelect:
54685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userSelect, UserSelect)
54698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
54718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverflow: {
54728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This property is supported by WinIE, and so we leave off the "-webkit-" in order to
54738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // work with WinIE-specific pages that use the property.
54748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textOverflow, TextOverflow)
54758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
54768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextOverflow(primitiveValue->getIdent() == CSSValueEllipsis);
54788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginCollapse: {
54818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
5482bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(m_parentStyle->marginBeforeCollapse());
5483bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(m_parentStyle->marginAfterCollapse());
54848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
5486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(MCOLLAPSE);
5487bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(MCOLLAPSE);
54888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5492bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginBeforeCollapse:
54935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginTopCollapse:
5494bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginBeforeCollapse, MarginBeforeCollapse)
54958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginAfterCollapse:
54975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginBottomCollapse:
5498bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginAfterCollapse, MarginAfterCollapse)
54998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineClamp: {
55018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineClamp, LineClamp)
55028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
55038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int type = primitiveValue->primitiveType();
5505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (type == CSSPrimitiveValue::CSS_NUMBER)
5506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), LineClampLineCount));
5507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
5508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_PERCENTAGE), LineClampPercentage));
55098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitHighlight: {
55128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(highlight, Highlight);
55138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone)
55148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(nullAtom);
55158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(primitiveValue->getStringValue());
55178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
551906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphens: {
552006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        HANDLE_INHERIT_AND_INITIAL(hyphens, Hyphens);
552106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        m_style->setHyphens(*primitiveValue);
552206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
552306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
552406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphenateCharacter: {
5525dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationString, HyphenationString);
552606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (primitiveValue->getIdent() == CSSValueAuto)
5527dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(nullAtom);
552806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        else
5529dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(primitiveValue->getStringValue());
5530dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
5531dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
553281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitAfter: {
553381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitAfter, HyphenationLimitAfter);
553481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
553581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(-1);
553681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
553781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
553881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
553981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
554081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitBefore: {
554181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitBefore, HyphenationLimitBefore);
5542dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
554381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(-1);
5544dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        else
554581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
554681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
554781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
554881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitLocale: {
554981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(locale, Locale);
555081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
555181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(nullAtom);
555281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
555381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(primitiveValue->getStringValue());
555406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
555506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
55568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderFit: {
55578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderFit, BorderFit);
55588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueBorder)
55598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitBorder);
55608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitLines);
55628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSizeAdjust: {
55658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textSizeAdjust, TextSizeAdjust)
55668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent()) return;
55678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextSizeAdjust(primitiveValue->getIdent() == CSSValueAuto);
55688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
55698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitTextSecurity:
55725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textSecurity, TextSecurity)
55738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
55758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
55768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitDashboardRegion: {
55778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(dashboardRegions, DashboardRegions)
55788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
55798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone) {
55828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setDashboardRegions(RenderStyle::noneDashboardRegions());
55838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
55858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *region = primitiveValue->getDashboardRegionValue();
55878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!region)
55888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *first = region;
55918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (region) {
55922bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length top = convertToIntLength(region->top(), style(), m_rootElementStyle);
55932bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length right = convertToIntLength(region->right(), style(), m_rootElementStyle);
55942bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length bottom = convertToIntLength(region->bottom(), style(), m_rootElementStyle);
55952bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length left = convertToIntLength(region->left(), style(), m_rootElementStyle);
55968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (region->m_isCircle)
55978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Circle, region->m_label, top, right, bottom, left, region == first ? false : true);
55988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (region->m_isRectangle)
55998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Rectangle, region->m_label, top, right, bottom, left, region == first ? false : true);
56008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = region->m_next.get();
56018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_element->document()->setHasDashboardRegions(true);
56048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
56088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitRtlOrdering:
56098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(visuallyOrdered, VisuallyOrdered)
56108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
56118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVisuallyOrdered(primitiveValue->getIdent() == CSSValueVisual);
56138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeWidth: {
56158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textStrokeWidth, TextStrokeWidth)
56168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float width = 0;
56178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
56188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThin:
56198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueMedium:
56208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThick: {
56218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                double result = 1.0 / 48;
56228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (primitiveValue->getIdent() == CSSValueMedium)
56238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 3;
56248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (primitiveValue->getIdent() == CSSValueThick)
56258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 5;
56260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = CSSPrimitiveValue::create(result, CSSPrimitiveValue::CSS_EMS)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
56298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
56300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextStrokeWidth(width);
56348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransform: {
56378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transform, Transform);
56388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TransformOperations operations;
56390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        createTransformOperations(value, style(), m_rootElementStyle, operations);
56408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransform(operations);
56418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOrigin:
56448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginX: {
56498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginX(l);
56618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginY: {
56648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginY(l);
56768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginZ: {
56798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        float f;
56838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
56848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            f = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle));
56868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
56878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
56888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setTransformOriginZ(f);
56898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
56908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
56918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformStyle:
56928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformStyle3D, TransformStyle3D)
56938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
56948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setTransformStyle3D((primitiveValue->getIdent() == CSSValuePreserve3d) ? TransformStyle3DPreserve3D : TransformStyle3DFlat);
56958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
56968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspective: {
56978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspective, Perspective)
56988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
56998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(0);
57008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
57020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
57030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        float perspectiveValue;
57040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int type = primitiveValue->primitiveType();
57050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (CSSPrimitiveValue::isUnitTypeLength(type))
57060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor));
57070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_NUMBER) {
57080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // For backward compatibility, treat valueless numbers as px.
57090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = CSSPrimitiveValue::create(primitiveValue->getDoubleValue(), CSSPrimitiveValue::CSS_PX)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
57100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else
57118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
57138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (perspectiveValue >= 0.0f)
57148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(perspectiveValue);
57158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOrigin:
57188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginX: {
57228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginX(l);
57348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginY: {
57378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginY(l);
57498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimation:
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearAnimations();
57548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritAnimations(m_parentStyle->animations());
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDelay:
57588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(delay, Delay, value)
57598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDirection:
57618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(direction, Direction, value)
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDuration:
57648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(duration, Duration, value)
57658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSPropertyWebkitAnimationFillMode:
5767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        HANDLE_ANIMATION_VALUE(fillMode, FillMode, value)
5768dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
57698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationIterationCount:
57708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(iterationCount, IterationCount, value)
57718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationName:
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(name, Name, value)
57748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitAnimationPlayState:
57760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HANDLE_ANIMATION_VALUE(playState, PlayState, value)
57770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
57788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationTimingFunction:
57798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(timingFunction, TimingFunction, value)
57808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransition:
57828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearTransitions();
57848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritTransitions(m_parentStyle->transitions());
57868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDelay:
57888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(delay, Delay, value)
57898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDuration:
57918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(duration, Duration, value)
57928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionProperty:
57948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(property, Property, value)
57958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionTimingFunction:
57978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(timingFunction, TimingFunction, value)
57988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyPointerEvents:
5800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
5801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
5802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // <rdar://problem/6561077> Work around the Stocks widget's misuse of the
5803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // pointer-events property by not applying it in Dashboard.
5804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
5805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (settings && settings->usesDashboardBackwardCompatibilityMode())
5806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
5808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(pointerEvents, PointerEvents)
5809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!primitiveValue)
5810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_style->setPointerEvents(*primitiveValue);
5812635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
5813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
5814643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case CSSPropertyWebkitColorCorrection:
5815643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (isInherit)
5816643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(m_parentStyle->colorSpace());
5817643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (isInitial)
5818a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_style->setColorSpace(ColorSpaceDeviceRGB);
5819643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else {
5820643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!primitiveValue)
5821643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return;
5822643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(*primitiveValue);
5823643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
5824643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
582506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertySize:
582606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyPageSizeProperty(value);
582706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
5828a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
5829a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CSSPropertySpeak:
5830a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL(speak, Speak);
58316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
58326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
5833a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_style->setSpeak(*primitiveValue);
5834a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
5835a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
58368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyInvalid:
58378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5838967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
5839967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Directional properties are resolved by resolveDirectionAwareProperty() before the switch.
5840967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEnd:
5841967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
5842967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndStyle:
5843967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndWidth:
5844967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStart:
5845967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
5846967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartStyle:
5847967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartWidth:
584868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBefore:
584968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeColor:
585068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeStyle:
585168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeWidth:
585268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfter:
585368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterColor:
585468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterStyle:
585568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterWidth:
5856967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginEnd:
5857967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginStart:
585868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginBefore:
585968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginAfter:
5860967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingEnd:
5861967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingStart:
586268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingBefore:
586368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingAfter:
586468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalWidth:
586568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalHeight:
586668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalWidth:
586768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalHeight:
586868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalWidth:
586968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalHeight:
5870967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        ASSERT_NOT_REACHED();
5871967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
5872967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
58738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStretch:
58748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPage:
58758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThrough:
58768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughColor:
58778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughMode:
58788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughStyle:
58798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughWidth:
58808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverline:
58818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineColor:
58828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineMode:
58838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineStyle:
58848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineWidth:
58858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderline:
58868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineColor:
58878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineMode:
58888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineStyle:
58898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineWidth:
58908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitFontSizeDelta:
58918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextDecorationsInEffect:
58928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStroke:
5893f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasis:
58948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
589521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
589621939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputFormat:
589721939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->hasTagName(WebCore::inputTag)) {
589821939df44de1705786c545cd1bf519d47250322dBen Murdoch            String mask = primitiveValue->getStringValue();
589921939df44de1705786c545cd1bf519d47250322dBen Murdoch            static_cast<HTMLInputElement*>(m_element)->setWapInputFormat(mask);
590021939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
590121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
590221939df44de1705786c545cd1bf519d47250322dBen Murdoch
590321939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputRequired:
590421939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->isFormControlElement()) {
590521939df44de1705786c545cd1bf519d47250322dBen Murdoch            HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(m_element);
590621939df44de1705786c545cd1bf519d47250322dBen Murdoch            bool required = primitiveValue->getStringValue() == "true";
590721939df44de1705786c545cd1bf519d47250322dBen Murdoch            element->setRequired(required);
590821939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
590921939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
591021939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
591121939df44de1705786c545cd1bf519d47250322dBen Murdoch
59128de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    // CSS Text Layout Module Level 3: Vertical writing support
5913e14391e94c850b8bd03680c23b38978db68687a8John Reck    case CSSPropertyWebkitWritingMode: {
5914a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(writingMode, WritingMode)
5915e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (!isInherit && !isInitial && m_element && m_element == m_element->document()->documentElement())
5916e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_element->document()->setWritingModeSetOnDocumentElement(true);
5917e14391e94c850b8bd03680c23b38978db68687a8John Reck        FontDescription fontDescription = m_style->fontDescription();
5918e14391e94c850b8bd03680c23b38978db68687a8John Reck        fontDescription.setOrientation(m_style->isHorizontalWritingMode() ? Horizontal : Vertical);
5919e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (m_style->setFontDescription(fontDescription))
5920e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_fontDirty = true;
59218de7ac488df2f39f82e56811541f4847b3f2e952Steve Block        return;
59224326279fef480892cd059ad1c738f1320601d33fJohn Reck    }
59238de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
5924a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    case CSSPropertyWebkitTextCombine:
5925a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textCombine, TextCombine)
5926a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        return;
5927a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu
5928e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisPosition:
5929e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textEmphasisPosition, TextEmphasisPosition)
5930e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5931e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5932e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisStyle:
5933e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisFill, TextEmphasisFill)
5934e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisMark, TextEmphasisMark)
5935e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisCustomMark, TextEmphasisCustomMark)
5936e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (isInherit || isInitial)
5937e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5938e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5939e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (value->isValueList()) {
5940e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
5941e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            ASSERT(list->length() == 2);
5942e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            if (list->length() != 2)
5943e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                return;
5944e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            for (unsigned i = 0; i < 2; ++i) {
59452bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSValue* item = list->itemWithoutBoundsCheck(i);
59462bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!item->isPrimitiveValue())
59472bde8e466a4451c7319e3a072d118917957d6554Steve Block                    continue;
59482bde8e466a4451c7319e3a072d118917957d6554Steve Block
59492bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSPrimitiveValue* value = static_cast<CSSPrimitiveValue*>(item);
5950e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                if (value->getIdent() == CSSValueFilled || value->getIdent() == CSSValueOpen)
5951e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisFill(*value);
5952e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                else
5953e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisMark(*value);
5954e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            }
5955e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(nullAtom);
5956e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5957e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5958e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5959e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (!primitiveValue)
5960e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5961e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5962e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
5963e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5964e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkCustom);
5965e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(primitiveValue->getStringValue());
5966e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5967e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5968e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5969e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        m_style->setTextEmphasisCustomMark(nullAtom);
5970e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5971e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->getIdent() == CSSValueFilled || primitiveValue->getIdent() == CSSValueOpen) {
5972e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(*primitiveValue);
5973e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkAuto);
5974e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        } else {
5975e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5976e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(*primitiveValue);
5977e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5978e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5979e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5980e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
598174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextOrientation: {
598274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!isInherit && !isInitial && !primitiveValue)
598374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
598474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
598574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        TextOrientation result;
598674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (isInherit)
598774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = m_parentStyle->fontDescription().textOrientation();
598874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else if (isInitial)
598974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = RenderStyle::initialTextOrientation();
599074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else
599174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = *primitiveValue;
599274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
599374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        FontDescription fontDescription = m_style->fontDescription();
599474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (fontDescription.textOrientation() != result) {
599574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            fontDescription.setTextOrientation(result);
599674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            if (m_style->setFontDescription(fontDescription))
599774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block                m_fontDirty = true;
599874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
599974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
600074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
600174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitLineBoxContain: {
600374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        HANDLE_INHERIT_AND_INITIAL(lineBoxContain, LineBoxContain)
600474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
600574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            m_style->setLineBoxContain(LineBoxContainNone);
600674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
600774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
600874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!value->isCSSLineBoxContainValue())
601074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
601174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
601274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        CSSLineBoxContainValue* lineBoxContainValue = static_cast<CSSLineBoxContainValue*>(value);
601374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        m_style->setLineBoxContain(lineBoxContainValue->value());
601474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
601574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
601674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
601774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    // These properties are implemented in the CSSStyleApplyProperty lookup table.
601874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyColor:
60192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyDirection:
60202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundAttachment:
60212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundClip:
60222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundClip:
60232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundComposite:
60242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundOrigin:
60252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundOrigin:
60262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundImage:
60272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundSize:
60282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundSize:
60292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskAttachment:
60302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskClip:
60312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskComposite:
60322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskOrigin:
60332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskImage:
60342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskSize:
603574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBackgroundColor:
603674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderBottomColor:
603774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderLeftColor:
603874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderRightColor:
603974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderTopColor:
60402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderTopStyle:
60412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderRightStyle:
60422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderBottomStyle:
60432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderLeftStyle:
604474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyOutlineColor:
604574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitColumnRuleColor:
604674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextEmphasisColor:
604774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextFillColor:
604874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextStrokeColor:
60492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPosition:
60502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionX:
60512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionY:
60522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPosition:
60532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionX:
60542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionY:
60552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeat:
60562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatX:
60572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatY:
60582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeat:
60592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatX:
60602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatY:
60612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflow:
60622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowX:
60632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowY:
606474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        ASSERT_NOT_REACHED();
606574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
606674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
606757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
606857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    case CSSPropertyWebkitTapHighlightColor: {
606957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(tapHighlightColor, TapHighlightColor);
607057a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        if (!primitiveValue)
607157a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch            break;
607257a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
607357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        Color col = getColorFromPrimitiveValue(primitiveValue).blendWithWhite();
607457a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        m_style->setTapHighlightColor(col);
607557a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        return;
607657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    }
607757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif
607857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
60798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
60808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
60818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Try the SVG properties
60828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applySVGProperty(id, value);
60832bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
60848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
60858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid CSSStyleSelector::applyPageSizeProperty(CSSValue* value)
608906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
6090ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->resetPageSizeType();
609106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!value->isValueList())
609206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
609306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CSSValueList* valueList = static_cast<CSSValueList*>(value);
609406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length width;
609506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length height;
6096ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    PageSizeType pageSizeType = PAGE_SIZE_AUTO;
609706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    switch (valueList->length()) {
609806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 2: {
609906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length>{2} | <page-size> <orientation>
6100ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        pageSizeType = PAGE_SIZE_RESOLVED;
610106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue() || !valueList->item(1)->isPrimitiveValue())
610206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
610306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue0 = static_cast<CSSPrimitiveValue*>(valueList->item(0));
610406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue1 = static_cast<CSSPrimitiveValue*>(valueList->item(1));
610506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type0 = primitiveValue0->primitiveType();
610606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type1 = primitiveValue1->primitiveType();
610706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type0)) {
610806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>{2}
610906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!CSSPrimitiveValue::isUnitTypeLength(type1))
611006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
611106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = Length(primitiveValue0->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
611206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            height = Length(primitiveValue1->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
611306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
611406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <page-size> <orientation>
611506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // The value order is guaranteed. See CSSParser::parseSizeParameter.
611606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!pageSizeFromName(primitiveValue0, primitiveValue1, width, height))
611706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
611806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
611906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
612006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
612106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 1: {
612206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length> | auto | <page-size> | [ portrait | landscape]
612306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue())
612406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
612506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(valueList->item(0));
612606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type = primitiveValue->primitiveType();
612706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type)) {
612806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>
6129ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            pageSizeType = PAGE_SIZE_RESOLVED;
613006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = height = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
613106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
613206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (type != CSSPrimitiveValue::CSS_IDENT)
613306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
613406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            switch (primitiveValue->getIdent()) {
613506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueAuto:
6136ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO;
613706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
613806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValuePortrait:
6139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_PORTRAIT;
6140ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                break;
614106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueLandscape:
6142ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_LANDSCAPE;
614306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
614406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            default:
6145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                // <page-size>
6146ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_RESOLVED;
614706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if (!pageSizeFromName(primitiveValue, 0, width, height))
614806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    return;
614906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
615006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
615106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
615206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
615306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
615406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
615506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->setPageSizeType(pageSizeType);
615706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->setPageSize(LengthSize(width, height));
615806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return;
615906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
616006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
616106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::pageSizeFromName(CSSPrimitiveValue* pageSizeName, CSSPrimitiveValue* pageOrientation, Length& width, Length& height)
616206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
616306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a5Width = mmLength(148), a5Height = mmLength(210);
616406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a4Width = mmLength(210), a4Height = mmLength(297);
616506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a3Width = mmLength(297), a3Height = mmLength(420);
616606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b5Width = mmLength(176), b5Height = mmLength(250);
616706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b4Width = mmLength(250), b4Height = mmLength(353);
616806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length letterWidth = inchLength(8.5), letterHeight = inchLength(11);
616906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length legalWidth = inchLength(8.5), legalHeight = inchLength(14);
617006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length ledgerWidth = inchLength(11), ledgerHeight = inchLength(17);
617106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6172ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!pageSizeName || pageSizeName->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6173ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return false;
617406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6175ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    switch (pageSizeName->getIdent()) {
617606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA5:
617706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a5Width;
617806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a5Height;
617906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA4:
618106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a4Width;
618206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a4Height;
618306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA3:
618506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a3Width;
618606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a3Height;
618706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB5:
618906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b5Width;
619006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b5Height;
619106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB4:
619306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b4Width;
619406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b4Height;
619506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLetter:
619706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = letterWidth;
619806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = letterHeight;
619906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
620006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLegal:
620106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = legalWidth;
620206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = legalHeight;
620306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
620406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLedger:
620506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = ledgerWidth;
620606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = ledgerHeight;
620706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
620806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
620906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
621006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6212ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (pageOrientation) {
6213ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (pageOrientation->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6214ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6215ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        switch (pageOrientation->getIdent()) {
6216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValueLandscape:
6217ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            std::swap(width, height);
6218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6219ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValuePortrait:
6220ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Nothing to do.
6221ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6222ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        default:
6223ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6224ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
6225ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
622606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return true;
622706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
622806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6229cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::mmLength(double mm) const
623006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
623106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(mm, CSSPrimitiveValue::CSS_MM)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
623206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
623306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6234cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::inchLength(double inch) const
623506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
623606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(inch, CSSPrimitiveValue::CSS_IN)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
623706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
623806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
62395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillAttachment(CSSPropertyID, FillLayer* layer, CSSValue* value)
62408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setAttachment(FillLayer::initialFillAttachment(layer->type()));
62438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (primitiveValue->getIdent()) {
62518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueFixed:
62520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(FixedBackgroundAttachment);
62538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueScroll:
62550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(ScrollBackgroundAttachment);
62560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
62570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case CSSValueLocal:
62580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(LocalBackgroundAttachment);
62598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
62618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
62628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillClip(CSSPropertyID, FillLayer* layer, CSSValue* value)
62668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setClip(FillLayer::initialFillClip(layer->type()));
62698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setClip(*primitiveValue);
62778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillComposite(CSSPropertyID, FillLayer* layer, CSSValue* value)
62808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setComposite(FillLayer::initialFillComposite(layer->type()));
62838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setComposite(*primitiveValue);
62918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillOrigin(CSSPropertyID, FillLayer* layer, CSSValue* value)
62948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setOrigin(FillLayer::initialFillOrigin(layer->type()));
62978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
63048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setOrigin(*primitiveValue);
63058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value)
63088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageValue())
63105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return cachedOrPendingFromValue(property, static_cast<CSSImageValue*>(value));
63115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageGeneratorValue())
63138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<CSSImageGeneratorValue*>(value)->generatedImage();
63145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
63168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value)
63195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
63205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    StyleImage* image = value->cachedOrPendingImage();
63215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (image && image->isPendingImage())
63225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_pendingImageProperties.add(property);
63235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return image;
63245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
63255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillImage(CSSPropertyID property, FillLayer* layer, CSSValue* value)
63278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
63298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setImage(FillLayer::initialFillImage(layer->type()));
63308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    layer->setImage(styleImage(property, value));
63348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatX(CSSPropertyID, FillLayer* layer, CSSValue* value)
63378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatX(FillLayer::initialFillRepeatX(layer->type()));
63408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6347231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatX(*primitiveValue);
63488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatY(CSSPropertyID, FillLayer* layer, CSSValue* value)
63518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatY(FillLayer::initialFillRepeatY(layer->type()));
63548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatY(*primitiveValue);
6362231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
6363231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillSize(CSSPropertyID, FillLayer* layer, CSSValue* value)
6365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!value->isPrimitiveValue()) {
6367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeNone);
6368231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6370231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (primitiveValue->getIdent() == CSSValueContain)
6373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Contain);
6374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (primitiveValue->getIdent() == CSSValueCover)
6375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Cover);
6376231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
6377231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeLength);
6378231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6379231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    LengthSize b = FillLayer::initialFillSizeLength(layer->type());
6380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL || primitiveValue->getIdent() == CSSValueContain
6382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        || primitiveValue->getIdent() == CSSValueCover) {
6383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeLength(b);
6384231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Pair* pair = primitiveValue->getPairValue();
63886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!pair || !pair->first() || !pair->second())
63898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* first = static_cast<CSSPrimitiveValue*>(pair->first());
63928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* second = static_cast<CSSPrimitiveValue*>(pair->second());
63938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length firstLength, secondLength;
63958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstType = first->primitiveType();
63968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int secondType = second->primitiveType();
63978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
63998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (firstType == CSSPrimitiveValue::CSS_UNKNOWN)
64018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(Auto);
64028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(firstType))
64030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        firstLength = Length(first->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (firstType == CSSPrimitiveValue::CSS_PERCENTAGE)
64058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(first->getDoubleValue(), Percent);
64068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (secondType == CSSPrimitiveValue::CSS_UNKNOWN)
64108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(Auto);
64118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(secondType))
64120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        secondLength = Length(second->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (secondType == CSSPrimitiveValue::CSS_PERCENTAGE)
64148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(second->getDoubleValue(), Percent);
64158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setWidth(firstLength);
64198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setHeight(secondLength);
6420231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setSizeLength(b);
64218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillXPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setXPosition(FillLayer::initialFillXPosition(layer->type()));
64278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setXPosition(l);
64458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillYPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setYPosition(FillLayer::initialFillYPosition(layer->type()));
64518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setYPosition(l);
64698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDelay(Animation* animation, CSSValue* value)
64728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(Animation::initialAnimationDelay());
64758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6482635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
6483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue());
6484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue()/1000.0f);
64868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDirection(Animation* layer, CSSValue* value)
64898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6491635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setDirection(Animation::initialAnimationDirection());
64928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    layer->setDirection(primitiveValue->getIdent() == CSSValueAlternate ? Animation::AnimationDirectionAlternate : Animation::AnimationDirectionNormal);
65008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDuration(Animation* animation, CSSValue* value)
65038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDuration(Animation::initialAnimationDuration());
65068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
65148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue());
65158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
65168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue()/1000.0f);
65178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSStyleSelector::mapAnimationFillMode(Animation* layer, CSSValue* value)
6520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(Animation::initialAnimationFillMode());
6523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
6524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (primitiveValue->getIdent()) {
6531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueNone:
6532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeNone);
6533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueForwards:
6535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeForwards);
6536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBackwards:
6538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBackwards);
6539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBoth:
6541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBoth);
6542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationIterationCount(Animation* animation, CSSValue* value)
65478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setIterationCount(Animation::initialAnimationIterationCount());
65508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueInfinite)
65588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(-1);
65598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(int(primitiveValue->getFloatValue()));
65618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationName(Animation* layer, CSSValue* value)
65648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setName(Animation::initialAnimationName());
65678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueNone)
65758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setIsNoneAnimation(true);
65768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setName(primitiveValue->getStringValue());
65788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid CSSStyleSelector::mapAnimationPlayState(Animation* layer, CSSValue* value)
65810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
65820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
65830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        layer->setPlayState(Animation::initialAnimationPlayState());
65840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
65850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
65860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    EAnimPlayState playState = (primitiveValue->getIdent() == CSSValuePaused) ? AnimPlayStatePaused : AnimPlayStatePlaying;
65920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    layer->setPlayState(playState);
65930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
65940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationProperty(Animation* animation, CSSValue* value)
65968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(Animation::initialAnimationProperty());
65998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
66038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueAll)
6607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateAll);
6608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (primitiveValue->getIdent() == CSSValueNone)
6609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateNone);
6610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(static_cast<CSSPropertyID>(primitiveValue->getIdent()));
66128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationTimingFunction(Animation* animation, CSSValue* value)
66158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setTimingFunction(Animation::initialAnimationTimingFunction());
66188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue()) {
66228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
66238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
66248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueLinear:
66255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(LinearTimingFunction::create());
66268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEase:
66285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create());
66298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseIn:
66315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 1.0, 1.0));
66328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseOut:
66345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.0, 0.0, 0.58, 1.0));
66358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseInOut:
66375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 0.58, 1.0));
66385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepStart:
66405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, true));
66415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepEnd:
66435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, false));
66448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
66468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isTimingFunctionValue()) {
66508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSTimingFunctionValue* timingFunction = static_cast<CSSTimingFunctionValue*>(value);
66515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (timingFunction->isCubicBezierTimingFunctionValue()) {
66525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSCubicBezierTimingFunctionValue* cubicTimingFunction = static_cast<CSSCubicBezierTimingFunctionValue*>(value);
66535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(CubicBezierTimingFunction::create(cubicTimingFunction->x1(), cubicTimingFunction->y1(), cubicTimingFunction->x2(), cubicTimingFunction->y2()));
66545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else if (timingFunction->isStepsTimingFunctionValue()) {
66555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSStepsTimingFunctionValue* stepsTimingFunction = static_cast<CSSStepsTimingFunctionValue*>(value);
66565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(StepsTimingFunction::create(stepsTimingFunction->numberOfSteps(), stepsTimingFunction->stepAtStart()));
66575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else
66585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(LinearTimingFunction::create());
66598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapNinePieceImage(CSSPropertyID property, CSSValue* value, NinePieceImage& image)
66638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
66656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value || value->isPrimitiveValue() || !value->isBorderImageValue())
66668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Retrieve the border image value.
66698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSBorderImageValue* borderImage = static_cast<CSSBorderImageValue*>(value);
66708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the image (this kicks off the load).
66725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    image.setImage(styleImage(property, borderImage->imageValue()));
66738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set up a length box to represent our image slices.
6675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    LengthBox l;
66768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Rect* r = borderImage->m_imageSliceRect.get();
66778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->top()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getDoubleValue(), Percent);
66798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->bottom()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length(r->bottom()->getDoubleValue(), Percent);
66838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length((int)r->bottom()->getFloatValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->left()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getDoubleValue(), Percent);
66878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->right()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getDoubleValue(), Percent);
66918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
6693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setSlices(l);
6694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the appropriate rules for stretch/round/repeat of the slices
6696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule horizontalRule;
66978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_horizontalSizeRule) {
66988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = StretchImageRule;
67008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RoundImageRule;
67038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RepeatImageRule;
67068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setHorizontalRule(horizontalRule);
67098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule verticalRule;
67118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_verticalSizeRule) {
67128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = StretchImageRule;
67148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RoundImageRule;
67178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6719dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RepeatImageRule;
67208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6722dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setVerticalRule(verticalRule);
67238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForTextSizeAdjust()
67268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_style->textSizeAdjust())
67288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6729aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck
6730aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    /* TODO: Remove this when a fix for webkit bug 56543 is submitted and can
6731aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * be cherry picked.
6732aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * This is a quick fix for Android to prevent sites from using
6733aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * -webkit-text-size-adjust: none; which breaks font size accessibility
6734aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * options on all platforms. The purpose of the property is to prevent
6735aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the automatic font size changes done by platforms like iOS when the
6736aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * rotation changes. Since Android doesn't do this, we can safely ignore
6737aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the 'none' option.
6738aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     */
6739aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#if PLATFORM(ANDROID)
6740aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    return;
6741aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#endif
67428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(m_style->fontDescription());
67448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFontDescription.setComputedSize(newFontDescription.specifiedSize());
67458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->setFontDescription(newFontDescription);
67468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForZoomChange(RenderStyle* style, RenderStyle* parentStyle)
67498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->effectiveZoom() == parentStyle->effectiveZoom())
67518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, childFont.specifiedSize());
67568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForGenericFamilyChange(RenderStyle* style, RenderStyle* parentStyle)
67608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.isAbsoluteSize() || !parentStyle)
67648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& parentFont = parentStyle->fontDescription();
6767231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.useFixedDefaultSize() == parentFont.useFixedDefaultSize())
67688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For now, lump all families but monospace together.
67718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.genericFamily() != FontDescription::MonospaceFamily &&
67728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parentFont.genericFamily() != FontDescription::MonospaceFamily)
67738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We know the parent is monospace or the child is monospace, and that font
67768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // size was unspecified.  We want to scale our font size as appropriate.
67778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the font uses a keyword size, then we refetch from the table rather than
67788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // multiplying by our scale factor.
67798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float size;
6780231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.keywordSize())
6781d0825bca7fe65beaee391d30da42e937db621564Steve Block        size = fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + childFont.keywordSize() - 1, childFont.useFixedDefaultSize());
6782231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
67838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
67848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float fixedScaleFactor = settings
67858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ? static_cast<float>(settings->defaultFixedFontSize()) / settings->defaultFontSize()
67868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : 1;
6787231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        size = parentFont.useFixedDefaultSize() ?
6788231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() / fixedScaleFactor :
6789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() * fixedScaleFactor;
67908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, size);
67948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::setFontSize(FontDescription& fontDescription, float size)
67988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setSpecifiedSize(size);
6800692e5dbf12901edacf14812a6fae25462920af42Steve Block
6801692e5dbf12901edacf14812a6fae25462920af42Steve Block    bool useSVGZoomRules = m_element && m_element->isSVGElement();
6802692e5dbf12901edacf14812a6fae25462920af42Steve Block    fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), size, useSVGZoomRules));
68038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
68048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6805692e5dbf12901edacf14812a6fae25462920af42Steve Blockfloat CSSStyleSelector::getComputedSizeFromSpecifiedSize(Document* document, RenderStyle* style, bool isAbsoluteSize, float specifiedSize, bool useSVGZoomRules)
68068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Text with a 0px font size should not be visible and therefore needs to be
68082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // exempt from minimum font size rules. Acid3 relies on this for pixel-perfect
68092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // rendering. This is also compatible with other browsers that have minimum
68102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // font size settings (e.g. Firefox).
68112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (fabsf(specifiedSize) < std::numeric_limits<float>::epsilon())
68122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0.0f;
68132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6814692e5dbf12901edacf14812a6fae25462920af42Steve Block    float zoomFactor = 1.0f;
6815692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!useSVGZoomRules) {
6816692e5dbf12901edacf14812a6fae25462920af42Steve Block        zoomFactor = style->effectiveZoom();
681768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (Frame* frame = document->frame())
681868513a70bcd92384395513322f1b801e7bf9c729Steve Block            zoomFactor *= frame->textZoomFactor();
6819692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
6820692e5dbf12901edacf14812a6fae25462920af42Steve Block
68218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We support two types of minimum font size.  The first is a hard override that applies to
68228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // all fonts.  This is "minSize."  The second type of minimum font size is a "smart minimum"
68238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that is applied only when the Web page can't know what size it really asked for, e.g.,
68248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when it uses logical sizes like "small" or expresses the font-size as a percentage of
68258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the user's default font setting.
68268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With the smart minimum, we never want to get smaller than the minimum font size to keep fonts readable.
68288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // However we always allow the page to set an explicit pixel size that is smaller,
68298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // since sites will mis-render otherwise (e.g., http://www.gamespot.com with a 9px minimum).
68308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6831d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
68328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
68338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
68348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minSize = settings->minimumFontSize();
68368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minLogicalSize = settings->minimumLogicalFontSize();
68378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomedSize = specifiedSize * zoomFactor;
68388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apply the hard minimum first.  We only apply the hard minimum if after zooming we're still too small.
68408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minSize)
68418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minSize;
68428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now apply the "smart minimum."  This minimum is also only applied if we're still too small
68448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // after zooming.  The font size must either be relative to the user default or the original size
68458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // must have been acceptable.  In other words, we only apply the smart minimum whenever we're positive
68468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // doing so won't disrupt the layout.
68478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minLogicalSize && (specifiedSize >= minLogicalSize || !isAbsoluteSize))
68488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minLogicalSize;
68498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also clamp to a reasonable maximum to prevent insane font sizes from causing crashes on various
68518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // platforms (I'm looking at you, Windows.)
68526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return min(1000000.0f, zoomedSize);
68538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
68548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMax = 16;
68568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMin = 9;
68578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int totalKeywords = 8;
68588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WinIE/Nav4 table for font sizes.  Designed to match the legacy font mapping system of HTML.
68608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int quirksFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    28 },
68638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    31 },
68648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    11,    13,    17,    22,    34 },
68658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    37 },
68668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    13,    16,    20,    26,    40 }, // fixed font default (13)
68678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    11,    14,    17,    21,    28,    42 },
68688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    15,    17,    23,    30,    45 },
68698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Strict mode table matches MacIE and Mozilla's settings exactly.
68778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int strictFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    27 },
68808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    30 },
68818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    11,    13,    17,    22,    33 },
68828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    36 },
68838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    13,    16,    20,    26,    39 }, // fixed font default (13)
68848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    14,    17,    21,    28,    42 },
68858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    15,    18,    23,    30,    45 },
68868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For values outside the range of the table, we use Todd Fahrner's suggested scale
68948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// factors for each keyword value.
68958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float fontSizeFactors[totalKeywords] = { 0.60f, 0.75f, 0.89f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f };
68968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickfloat CSSStyleSelector::fontSizeForKeyword(Document* document, int keyword, bool shouldUseFixedDefaultSize)
68988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6899d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
69008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
69018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
69028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool quirksMode = document->inQuirksMode();
69045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
69058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
69068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Look up the entry in the table.
69078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int row = mediumSize - fontSizeTableMin;
69088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int col = (keyword - CSSValueXxSmall);
69098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return quirksMode ? quirksFontSizeTable[row][col] : strictFontSizeTable[row][col];
69108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Value is outside the range of the table. Apply the scale factor instead.
69138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float minLogicalSize = max(settings->minimumLogicalFontSize(), 1);
69148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return max(fontSizeFactors[keyword - CSSValueXxSmall]*mediumSize, minLogicalSize);
69158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate<typename T>
69185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic int findNearestLegacyFontSize(int pixelFontSize, const T* table, int multiplier)
69195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Ignore table[0] because xx-small does not correspond to any legacy font size.
69215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    for (int i = 1; i < totalKeywords - 1; i++) {
69225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (pixelFontSize * 2 < (table[i] + table[i + 1]) * multiplier)
69235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return i;
69245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return totalKeywords - 1;
69265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickint CSSStyleSelector::legacyFontSize(Document* document, int pixelFontSize, bool shouldUseFixedDefaultSize)
69295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    Settings* settings = document->settings();
69315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!settings)
69325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 1;
69335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool quirksMode = document->inQuirksMode();
69355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
69365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
69375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        int row = mediumSize - fontSizeTableMin;
69385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return findNearestLegacyFontSize<int>(pixelFontSize, quirksMode ? quirksFontSizeTable[row] : strictFontSizeTable[row], 1);
69395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return findNearestLegacyFontSize<float>(pixelFontSize, fontSizeFactors, mediumSize);
69425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
6944635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::largerFontSize(float size, bool) const
69458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale up to
69478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size * 1.2f;
69498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::smallerFontSize(float size, bool) const
69528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale down to
69548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size / 1.2f;
69568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Color colorForCSSValue(int cssValueId)
69598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct ColorValue {
69618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int cssValueId;
69628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RGBA32 color;
69638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static const ColorValue colorValues[] = {
69668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueAqua, 0xFF00FFFF },
69678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlack, 0xFF000000 },
69688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlue, 0xFF0000FF },
69698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueFuchsia, 0xFFFF00FF },
69708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGray, 0xFF808080 },
69718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGreen, 0xFF008000  },
69728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGrey, 0xFF808080 },
69738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueLime, 0xFF00FF00 },
69748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueMaroon, 0xFF800000 },
69758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueNavy, 0xFF000080 },
69768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOlive, 0xFF808000  },
69778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOrange, 0xFFFFA500 },
69788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValuePurple, 0xFF800080 },
69798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueRed, 0xFFFF0000 },
69808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueSilver, 0xFFC0C0C0 },
69818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTeal, 0xFF008080  },
69828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTransparent, 0x00000000 },
69838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueWhite, 0xFFFFFFFF },
69848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueYellow, 0xFFFFFF00 },
69858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { 0, 0 }
69868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (const ColorValue* col = colorValues; col->cssValueId; ++col) {
69898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (col->cssValueId == cssValueId)
69908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return col->color;
69918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return RenderTheme::defaultTheme()->systemColor(cssValueId);
69938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6995cad810f21b803229eb11403f9209855525a25d57Steve BlockColor CSSStyleSelector::getColorFromPrimitiveValue(CSSPrimitiveValue* primitiveValue) const
69968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color col;
69988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int ident = primitiveValue->getIdent();
69998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ident) {
70008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ident == CSSValueWebkitText)
70018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->textColor();
7002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitLink)
7003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            col = m_element->isLink() && m_checker.m_matchVisitedPseudoClass ? m_element->document()->visitedLinkColor() : m_element->document()->linkColor();
7004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitActivelink)
70058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->activeLinkColor();
70068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueWebkitFocusRingColor)
70070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            col = RenderTheme::focusRingColor();
70088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueCurrentcolor)
70098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_style->color();
70108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
70118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = colorForCSSValue(ident);
70128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RGBCOLOR)
70130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        col.setRGB(primitiveValue->getRGBA32Value());
70148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return col;
70158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7017cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSStyleSelector::hasSelectorForAttribute(const AtomicString &attrname) const
70188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_selectorAttrs.contains(attrname.impl());
70208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addViewportDependentMediaQueryResult(const MediaQueryExp* expr, bool result)
70238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewportDependentMediaQueryResults.append(new MediaQueryResult(*expr, result));
70258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSStyleSelector::affectedByViewportChange() const
70288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned s = m_viewportDependentMediaQueryResults.size();
70308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < s; i++) {
70318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expression) != m_viewportDependentMediaQueryResults[i]->m_result)
70328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
70338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
70358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::allVisitedStateChanged()
70388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_linksCheckedForVisitedState.isEmpty())
70408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->isLink())
70435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7047635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::visitedStateChanged(LinkHash visitedHash)
70488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_linksCheckedForVisitedState.contains(visitedHash))
70508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const AtomicString* attr = linkAttribute(node);
7053635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (attr && visitedLinkHash(m_document->baseURL(), *attr) == visitedHash)
70545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7058635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic TransformOperation::OperationType getTransformOperationType(WebKitCSSTransformValue::TransformOperationType type)
70598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (type) {
70618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleTransformOperation:          return TransformOperation::SCALE;
70628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleXTransformOperation:         return TransformOperation::SCALE_X;
70638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleYTransformOperation:         return TransformOperation::SCALE_Y;
70648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::ScaleZTransformOperation:         return TransformOperation::SCALE_Z;
70658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Scale3DTransformOperation:        return TransformOperation::SCALE_3D;
70668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateTransformOperation:      return TransformOperation::TRANSLATE;
70678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateXTransformOperation:     return TransformOperation::TRANSLATE_X;
70688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateYTransformOperation:     return TransformOperation::TRANSLATE_Y;
70698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::TranslateZTransformOperation:     return TransformOperation::TRANSLATE_Z;
70708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Translate3DTransformOperation:    return TransformOperation::TRANSLATE_3D;
70718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::RotateTransformOperation:         return TransformOperation::ROTATE;
70728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateXTransformOperation:        return TransformOperation::ROTATE_X;
70738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateYTransformOperation:        return TransformOperation::ROTATE_Y;
70748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateZTransformOperation:        return TransformOperation::ROTATE_Z;
70758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Rotate3DTransformOperation:       return TransformOperation::ROTATE_3D;
70768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewTransformOperation:           return TransformOperation::SKEW;
70778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewXTransformOperation:          return TransformOperation::SKEW_X;
70788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewYTransformOperation:          return TransformOperation::SKEW_Y;
70798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::MatrixTransformOperation:         return TransformOperation::MATRIX;
70808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Matrix3DTransformOperation:       return TransformOperation::MATRIX_3D;
70818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::PerspectiveTransformOperation:    return TransformOperation::PERSPECTIVE;
70828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::UnknownTransformOperation:        return TransformOperation::NONE;
70838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return TransformOperation::NONE;
70858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSStyleSelector::createTransformOperations(CSSValue* inValue, RenderStyle* style, RenderStyle* rootStyle, TransformOperations& outOperations)
70888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!inValue || !inValue->isValueList()) {
70906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        outOperations.clear();
70916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
70926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
70938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
70946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    float zoomFactor = style ? style->effectiveZoom() : 1;
70958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TransformOperations operations;
70966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    CSSValueList* list = static_cast<CSSValueList*>(inValue);
70976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned size = list->length();
70986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    for (unsigned i = 0; i < size; i++) {
70996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
71006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isWebKitCSSTransformValue())
71016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        WebKitCSSTransformValue* transformValue = static_cast<WebKitCSSTransformValue*>(list->itemWithoutBoundsCheck(i));
71046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!transformValue->length())
71056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        bool haveNonPrimitiveValue = false;
71086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        for (unsigned j = 0; j < transformValue->length(); ++j) {
71096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!transformValue->itemWithoutBoundsCheck(j)->isPrimitiveValue()) {
71106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                haveNonPrimitiveValue = true;
71116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        }
71146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (haveNonPrimitiveValue)
71156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPrimitiveValue* firstValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0));
71186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        switch (transformValue->operationType()) {
71206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleTransformOperation:
71216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleXTransformOperation:
71226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleYTransformOperation: {
71236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
71368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
71376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, 1.0, getTransformOperationType(transformValue->operationType())));
71386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleZTransformOperation:
71416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Scale3DTransformOperation: {
71426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sz = 1.0;
71456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleZTransformOperation)
71466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sz = firstValue->getDoubleValue();
71476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
71536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
71546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sz = thirdValue->getDoubleValue();
71558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
71636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, sz, getTransformOperationType(transformValue->operationType())));
71646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateTransformOperation:
71676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateXTransformOperation:
71686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateYTransformOperation: {
71696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71732bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71752bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
71776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71792bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
71808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
71838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
71856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
71868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, Length(0, Fixed), getTransformOperationType(transformValue->operationType())));
71886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateZTransformOperation:
71916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Translate3DTransformOperation: {
71926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tz = Length(0, Fixed);
71966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateZTransformOperation)
71972bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tz = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71992bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
72006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
72012bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
72026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
72036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
72046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
72052bde8e466a4451c7319e3a072d118917957d6554Steve Block                            tz = convertToFloatLength(thirdValue, style, rootStyle, zoomFactor, &ok);
72066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        }
72076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
72086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72092bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
72108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
72138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
72156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
72168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, tz, getTransformOperationType(transformValue->operationType())));
72186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateTransformOperation: {
72216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(0, 0, 1, angle, getTransformOperationType(transformValue->operationType())));
72306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateXTransformOperation:
72336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateYTransformOperation:
72346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateZTransformOperation: {
72356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = 0;
72366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = 0;
72376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = 0;
72386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::RotateXTransformOperation)
72456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    x = 1;
72466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::RotateYTransformOperation)
72476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    y = 1;
72486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else
72496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    z = 1;
72506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Rotate3DTransformOperation: {
72546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 4)
72558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
72566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
72586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* fourthValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3));
72596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = firstValue->getDoubleValue();
72606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = secondValue->getDoubleValue();
72616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = thirdValue->getDoubleValue();
72626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = fourthValue->getDoubleValue();
72636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewTransformOperation:
72716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewXTransformOperation:
72726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewYTransformOperation: {
72736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleX = 0;
72746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleY = 0;
72756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::SkewYTransformOperation)
72836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleY = angle;
72846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
72856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleX = angle;
72866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() == WebKitCSSTransformValue::SkewTransformOperation) {
72876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
72886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            angleY = secondValue->getDoubleValue();
72906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = rad2deg(angleY);
72926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = grad2deg(angleY);
72946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = turn2deg(angleY);
72968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
72996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(SkewTransformOperation::create(angleX, angleY, getTransformOperationType(transformValue->operationType())));
73006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::MatrixTransformOperation: {
73036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 6)
73048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
73056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double a = firstValue->getDoubleValue();
73066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double b = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue();
73076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double c = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue();
73086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double d = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue();
7309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double e = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue();
7310f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double f = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue();
73116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(MatrixTransformOperation::create(a, b, c, d, e, f));
73126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Matrix3DTransformOperation: {
73156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 16)
73168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
73176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                TransformationMatrix matrix(static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0))->getDoubleValue(),
73186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue(),
73196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue(),
73206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue(),
73216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue(),
73226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue(),
73236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(6))->getDoubleValue(),
73246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(7))->getDoubleValue(),
73256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(8))->getDoubleValue(),
73266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(9))->getDoubleValue(),
73276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(10))->getDoubleValue(),
73286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(11))->getDoubleValue(),
7329f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(12))->getDoubleValue(),
7330f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(13))->getDoubleValue(),
73316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(14))->getDoubleValue(),
73326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(15))->getDoubleValue());
73336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(Matrix3DTransformOperation::create(matrix));
73346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::PerspectiveTransformOperation: {
73372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                bool ok = true;
73382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                Length p = Length(0, Fixed);
73392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (CSSPrimitiveValue::isUnitTypeLength(firstValue->primitiveType()))
73402bde8e466a4451c7319e3a072d118917957d6554Steve Block                    p = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
73412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                else {
73422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    // This is a quirk that should go away when 3d transforms are finalized.
73432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    double val = firstValue->getDoubleValue();
73442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    ok = val >= 0;
73452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    val = clampToPositiveInteger(val);
73462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    p = Length(static_cast<int>(val), Fixed);
73472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                }
73482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (!ok)
73506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
73512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(PerspectiveTransformOperation::create(p));
73536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
73556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::UnknownTransformOperation:
73566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                ASSERT_NOT_REACHED();
73576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
73598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
73606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
73618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outOperations = operations;
73628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
73638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
73648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
73655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::loadPendingImages()
73665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
73675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_pendingImageProperties.isEmpty())
73685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
73695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HashSet<int>::const_iterator end = m_pendingImageProperties.end();
73715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (HashSet<int>::const_iterator it = m_pendingImageProperties.begin(); it != end; ++it) {
73725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSPropertyID currentProperty = static_cast<CSSPropertyID>(*it);
73735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        CachedResourceLoader* cachedResourceLoader = m_element->document()->cachedResourceLoader();
73755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        switch (currentProperty) {
73775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyBackgroundImage: {
73785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* backgroundLayer = m_style->accessBackgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next()) {
73795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) {
73805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(backgroundLayer->image())->cssImageValue();
73815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        backgroundLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
73825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyContent: {
73885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (ContentData* contentData = const_cast<ContentData*>(m_style->contentData()); contentData; contentData = contentData->next()) {
73895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (contentData->isImage() && contentData->image()->isPendingImage()) {
73905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(contentData->image())->cssImageValue();
7391a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        if (StyleCachedImage* cachedImage = imageValue->cachedImage(cachedResourceLoader))
7392a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                            contentData->setImage(cachedImage);
73935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyCursor: {
73995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (CursorList* cursorList = m_style->cursors()) {
74005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    for (size_t i = 0; i < cursorList->size(); ++i) {
7401e14391e94c850b8bd03680c23b38978db68687a8John Reck                        CursorData& currentCursor = cursorList->at(i);
7402e14391e94c850b8bd03680c23b38978db68687a8John Reck                        if (StyleImage* image = currentCursor.image()) {
7403e14391e94c850b8bd03680c23b38978db68687a8John Reck                            if (image->isPendingImage()) {
7404e14391e94c850b8bd03680c23b38978db68687a8John Reck                                CSSImageValue* imageValue = static_cast<StylePendingImage*>(image)->cssImageValue();
7405e14391e94c850b8bd03680c23b38978db68687a8John Reck                                currentCursor.setImage(imageValue->cachedImage(cachedResourceLoader));
7406e14391e94c850b8bd03680c23b38978db68687a8John Reck                            }
74075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        }
74085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyListStyleImage: {
74145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (m_style->listStyleImage() && m_style->listStyleImage()->isPendingImage()) {
74155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(m_style->listStyleImage())->cssImageValue();
74165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setListStyleImage(imageValue->cachedImage(cachedResourceLoader));
74175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBorderImage: {
74225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& borderImage = m_style->borderImage();
74235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (borderImage.image() && borderImage.image()->isPendingImage()) {
74245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(borderImage.image())->cssImageValue();
74255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setBorderImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), borderImage.slices(), borderImage.horizontalRule(), borderImage.verticalRule()));
74265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBoxReflect: {
7431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (StyleReflection* reflection = m_style->boxReflect()) {
7432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    const NinePieceImage& maskImage = reflection->mask();
7433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    if (maskImage.image() && maskImage.image()->isPendingImage()) {
7434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskImage.image())->cssImageValue();
7435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        reflection->setMask(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskImage.slices(), maskImage.horizontalRule(), maskImage.verticalRule()));
7436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    }
74375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskBoxImage: {
74425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& maskBoxImage = m_style->maskBoxImage();
74435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (maskBoxImage.image() && maskBoxImage.image()->isPendingImage()) {
74445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskBoxImage.image())->cssImageValue();
74455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setMaskBoxImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskBoxImage.slices(), maskBoxImage.horizontalRule(), maskBoxImage.verticalRule()));
74465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskImage: {
74515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* maskLayer = m_style->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) {
74525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (maskLayer->image() && maskLayer->image()->isPendingImage()) {
74535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskLayer->image())->cssImageValue();
74545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        maskLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
74555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            default:
74605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                ASSERT_NOT_REACHED();
74615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
74625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
74635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_pendingImageProperties.clear();
74655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
74665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
7468