18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSelector.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ContentData.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CounterContent.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "CursorList.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSBorderImageValue.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSCursorImageValue.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSFontFaceRule.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSImportRule.h"
382bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSLineBoxContainValue.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSMediaRule.h"
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "CSSPageRule.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSParser.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPrimitiveValueMappings.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSPropertyNames.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSReflectValue.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSRuleList.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSSelector.h"
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CSSSelectorList.h"
482bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "CSSStyleApplyProperty.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleRule.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSTimingFunctionValue.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueList.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Counter.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FocusController.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontFamilyValue.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontValue.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLDocument.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLElement.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLInputElement.h"
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLTextAreaElement.h"
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "KeyframeList.h"
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "LinkHash.h"
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "Matrix3DTransformOperation.h"
68e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "MatrixTransformOperation.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaList.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaQueryEvaluator.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeRenderStyle.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h"
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Pair.h"
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "PerspectiveTransformOperation.h"
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "QuotesData.h"
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Rect.h"
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderScrollbar.h"
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderScrollbarTheme.h"
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderStyleConstants.h"
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTheme.h"
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RotateTransformOperation.h"
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ScaleTransformOperation.h"
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SelectionController.h"
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ShadowData.h"
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ShadowValue.h"
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkewTransformOperation.h"
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleCachedImage.h"
905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "StylePendingImage.h"
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleGeneratedImage.h"
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "StyleSheetList.h"
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Text.h"
948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TransformationMatrix.h"
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TranslateTransformOperation.h"
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "UserAgentStyleSheets.h"
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframeRule.h"
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSKeyframesRule.h"
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WebKitCSSTransformValue.h"
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XMLNames.h"
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
104db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#if USE(PLATFORM_STRATEGIES)
105db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "PlatformStrategies.h"
106db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "VisitedLinkStrategy.h"
107db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
108db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DashboardRegion.h"
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XLinkNames.h"
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h"
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h"
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(QT)
1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <qwebhistoryinterface.h>
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT(prop, Prop) \
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(m_parentStyle->prop()); \
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_AND_INITIAL(prop, Prop) \
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_INHERIT(prop, Prop) \
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInitial) { \
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Prop()); \
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(prop, Prop, Value) \
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_INHERIT(prop, Prop) \
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInitial) { \
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Value());\
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return;\
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(prop, Prop) \
1535f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHANDLE_INHERIT_AND_INITIAL(prop, Prop) \
1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianif (primitiveValue) \
1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_style->set##Prop(*primitiveValue);
1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(prop, Prop, Value) \
1585f1ab04193ad0130ca8204aadaceae083aca9881Feng QianHANDLE_INHERIT_AND_INITIAL_WITH_VALUE(prop, Prop, Value) \
1595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianif (primitiveValue) \
1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_style->set##Prop(*primitiveValue);
1615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_ANIMATION_INHERIT_AND_INITIAL(prop, Prop) \
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessAnimations(); \
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AnimationList* parentList = m_parentStyle->animations(); \
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t i = 0, parentSize = parentList ? parentList->size() : 0; \
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < parentSize && parentList->animation(i)->is##Prop##Set(); ++i) { \
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list->size() <= i) \
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->set##Prop(parentList->animation(i)->prop()); \
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    \
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset any remaining animations to not have the property set. */ \
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < list->size(); ++i) \
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->clear##Prop(); \
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else if (isInitial) { \
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessAnimations(); \
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    list->animation(0)->set##Prop(Animation::initialAnimation##Prop()); \
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 1; i < list->size(); ++i) \
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(0)->clear##Prop(); \
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_ANIMATION_VALUE(prop, Prop, value) { \
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_ANIMATION_INHERIT_AND_INITIAL(prop, Prop) \
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit || isInitial) \
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationList* list = m_style->accessAnimations(); \
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsize_t childIndex = 0; \
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (value->isValueList()) { \
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Walk each value and put it into an animation, creating new animations as needed. */ \
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSValueList* valueList = static_cast<CSSValueList*>(value); \
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = 0; i < valueList->length(); i++) { \
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (childIndex <= list->size()) \
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mapAnimation##Prop(list->animation(childIndex), valueList->itemWithoutBoundsCheck(i)); \
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++childIndex; \
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else { \
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mapAnimation##Prop(list->animation(childIndex), value); \
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    childIndex = 1; \
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor ( ; childIndex < list->size(); ++childIndex) { \
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset all remaining animations to not have the property set. */ \
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list->animation(childIndex)->clear##Prop(); \
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_TRANSITION_INHERIT_AND_INITIAL(prop, Prop) \
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit) { \
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessTransitions(); \
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AnimationList* parentList = m_parentStyle->transitions(); \
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t i = 0, parentSize = parentList ? parentList->size() : 0; \
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < parentSize && parentList->animation(i)->is##Prop##Set(); ++i) { \
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (list->size() <= i) \
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->set##Prop(parentList->animation(i)->prop()); \
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    \
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset any remaining transitions to not have the property set. */ \
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( ; i < list->size(); ++i) \
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(i)->clear##Prop(); \
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else if (isInitial) { \
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AnimationList* list = m_style->accessTransitions(); \
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    list->animation(0)->set##Prop(Animation::initialAnimation##Prop()); \
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 1; i < list->size(); ++i) \
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->animation(0)->clear##Prop(); \
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_TRANSITION_VALUE(prop, Prop, value) { \
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE_TRANSITION_INHERIT_AND_INITIAL(prop, Prop) \
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (isInherit || isInitial) \
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectAnimationList* list = m_style->accessTransitions(); \
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectsize_t childIndex = 0; \
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (value->isValueList()) { \
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Walk each value and put it into a transition, creating new animations as needed. */ \
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSValueList* valueList = static_cast<CSSValueList*>(value); \
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned int i = 0; i < valueList->length(); i++) { \
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (childIndex <= list->size()) \
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            list->append(Animation::create()); \
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mapAnimation##Prop(list->animation(childIndex), valueList->itemWithoutBoundsCheck(i)); \
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++childIndex; \
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } \
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} else { \
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (list->isEmpty()) \
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        list->append(Animation::create()); \
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mapAnimation##Prop(list->animation(childIndex), value); \
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    childIndex = 1; \
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfor ( ; childIndex < list->size(); ++childIndex) { \
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /* Reset all remaining transitions to not have the property set. */ \
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list->animation(childIndex)->clear##Prop(); \
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} \
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_COND(propID, prop, Prop) \
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(m_parentStyle->prop()); \
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INHERIT_COND_WITH_BACKUP(propID, prop, propAlt, Prop) \
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_parentStyle->prop().isValid()) \
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->set##Prop(m_parentStyle->prop()); \
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else \
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->set##Prop(m_parentStyle->propAlt()); \
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INITIAL_COND(propID, Prop) \
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Prop()); \
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HANDLE_INITIAL_COND_WITH_VALUE(propID, Prop, Value) \
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectif (id == propID) { \
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->set##Prop(RenderStyle::initial##Value()); \
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return; \
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass RuleData {
290cad810f21b803229eb11403f9209855525a25d57Steve Blockpublic:
2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleData(CSSStyleRule*, CSSSelector*, unsigned position);
292cad810f21b803229eb11403f9209855525a25d57Steve Block
2932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned position() const { return m_position; }
2942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSStyleRule* rule() const { return m_rule; }
2952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector* selector() const { return m_selector; }
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasFastCheckableSelector() const { return m_hasFastCheckableSelector; }
2982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasMultipartSelector() const { return m_hasMultipartSelector; }
2992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasTopSelectorMatchingHTMLBasedOnRuleHash() const { return m_hasTopSelectorMatchingHTMLBasedOnRuleHash; }
30081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity() const { return m_specificity; }
3012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Try to balance between memory usage (there can be lots of RuleData objects) and good filtering performance.
3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static const unsigned maximumIdentifierCount = 4;
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const unsigned* descendantSelectorIdentifierHashes() const { return m_descendantSelectorIdentifierHashes; }
305cad810f21b803229eb11403f9209855525a25d57Steve Block
306cad810f21b803229eb11403f9209855525a25d57Steve Blockprivate:
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void collectDescendantSelectorIdentifierHashes();
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void collectIdentifierHashes(const CSSSelector*, unsigned& identifierCount);
3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
310cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSStyleRule* m_rule;
311cad810f21b803229eb11403f9209855525a25d57Steve Block    CSSSelector* m_selector;
31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned m_specificity;
3132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned m_position : 29;
3142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasFastCheckableSelector : 1;
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasMultipartSelector : 1;
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_hasTopSelectorMatchingHTMLBasedOnRuleHash : 1;
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Use plain array instead of a Vector to minimize memory overhead.
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned m_descendantSelectorIdentifierHashes[maximumIdentifierCount];
319cad810f21b803229eb11403f9209855525a25d57Steve Block};
320cad810f21b803229eb11403f9209855525a25d57Steve Block
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass RuleSet {
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WTF_MAKE_NONCOPYABLE(RuleSet);
323cad810f21b803229eb11403f9209855525a25d57Steve Blockpublic:
3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet();
3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ~RuleSet();
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    typedef HashMap<AtomicStringImpl*, Vector<RuleData>*> AtomRuleMap;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addRulesFromSheet(CSSStyleSheet*, const MediaQueryEvaluator&, CSSStyleSelector* = 0);
330545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
3316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void addStyleRule(CSSStyleRule* item);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addRule(CSSStyleRule* rule, CSSSelector* sel);
33321939df44de1705786c545cd1bf519d47250322dBen Murdoch    void addPageRule(CSSStyleRule* rule, CSSSelector* sel);
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                      CSSStyleRule* rule, CSSSelector* sel);
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void shrinkToFit();
3372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void disableAutoShrinkToFit() { m_autoShrinkToFitEnabled = false; }
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void collectFeatures(CSSStyleSelector::Features&) const;
340ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getIDRules(AtomicStringImpl* key) const { return m_idRules.get(key); }
3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getClassRules(AtomicStringImpl* key) const { return m_classRules.get(key); }
3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getTagRules(AtomicStringImpl* key) const { return m_tagRules.get(key); }
3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getPseudoRules(AtomicStringImpl* key) const { return m_pseudoRules.get(key); }
3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getUniversalRules() const { return &m_universalRules; }
3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const Vector<RuleData>* getPageRules() const { return &m_pageRules; }
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_idRules;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_classRules;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomRuleMap m_tagRules;
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AtomRuleMap m_pseudoRules;
3532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData> m_universalRules;
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData> m_pageRules;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_ruleCount;
3562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_autoShrinkToFitEnabled;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3592fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultStyle;
3602fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultQuirksStyle;
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultPrintStyle;
3622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* defaultViewSourceStyle;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CSSStyleSheet* simpleDefaultStyleSheet;
364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3652fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic RuleSet* siblingRulesInDefaultStyle;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderStyle* CSSStyleSelector::s_styleNotYetAvailable;
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadFullDefaultStyle();
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadSimpleDefaultStyle();
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: It would be nice to use some mechanism that guarantees this is in sync with the real UA stylesheet.
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const char* simpleUserAgentStyleSheet = "html,body,div{display:block}head{display:none}body{margin:8px}div:focus,span:focus{outline:auto 5px -webkit-focus-ring-color}a:-webkit-any-link{color:-webkit-link;text-decoration:underline}a:-webkit-any-link:active{color:-webkit-activelink}";
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
374ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline bool elementCanUseSimpleDefaultStyle(Element* e)
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return e->hasTagName(htmlTag) || e->hasTagName(headTag) || e->hasTagName(bodyTag) || e->hasTagName(divTag) || e->hasTagName(spanTag) || e->hasTagName(brTag) || e->hasTagName(aTag);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
379ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline void collectSiblingRulesInDefaultStyle()
380ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    CSSStyleSelector::Features features;
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    defaultStyle->collectFeatures(features);
38381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(features.idsInRules.isEmpty());
384ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    delete siblingRulesInDefaultStyle;
38581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    siblingRulesInDefaultStyle = features.siblingRules.leakPtr();
386ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
387ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
388ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic inline void assertNoSiblingRulesInDefaultStyle()
389ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
390ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#ifndef NDEBUG
391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (siblingRulesInDefaultStyle)
392ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
393ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    collectSiblingRulesInDefaultStyle();
394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ASSERT(!siblingRulesInDefaultStyle);
395ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
396ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
397ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const MediaQueryEvaluator& screenEval()
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticScreenEval, ("screen"));
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return staticScreenEval;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const MediaQueryEvaluator& printEval()
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticPrintEval, ("print"));
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return staticPrintEval;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic CSSMutableStyleDeclaration* leftToRightDeclaration()
41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_STATIC_LOCAL(RefPtr<CSSMutableStyleDeclaration>, leftToRightDecl, (CSSMutableStyleDeclaration::create()));
41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!leftToRightDecl->length()) {
41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        leftToRightDecl->setProperty(CSSPropertyDirection, "ltr", false, false);
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        leftToRightDecl->setStrictParsing(false);
41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return leftToRightDecl.get();
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
41981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
42081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic CSSMutableStyleDeclaration* rightToLeftDeclaration()
42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_STATIC_LOCAL(RefPtr<CSSMutableStyleDeclaration>, rightToLeftDecl, (CSSMutableStyleDeclaration::create()));
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!rightToLeftDecl->length()) {
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rightToLeftDecl->setProperty(CSSPropertyDirection, "rtl", false, false);
42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rightToLeftDecl->setStrictParsing(false);
42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return rightToLeftDecl.get();
42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
42981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenCSSStyleSelector::CSSStyleSelector(Document* document, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet,
431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                   CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets,
432231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                   bool strictParsing, bool matchAuthorAndUserStyles)
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_backgroundData(BackgroundFillLayer)
4345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_checker(document, strictParsing)
4356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_element(0)
4366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_styledElement(0)
4376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_elementLinkState(NotInsideLink)
4385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    , m_fontSelector(CSSFontSelector::create(document))
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_applyProperty(CSSStyleApplyProperty::sharedCSSStyleApplyProperty())
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchAuthorAndUserStyles = matchAuthorAndUserStyles;
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Element* root = document->documentElement();
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!defaultStyle) {
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!root || elementCanUseSimpleDefaultStyle(root))
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadSimpleDefaultStyle();
4484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        else {
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadFullDefaultStyle();
4504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // construct document root element default style. this is needed
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to evaluate media queries that contain relative constraints, like "screen and (max-width: 10em)"
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is here instead of constructor, because when constructor is run,
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // document doesn't have documentElement
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NOTE: this assumes that element that gets passed to styleForElement -call
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // is always from the document that owns the style selector
4595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    FrameView* view = document->view();
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (view)
4615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType()));
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
4635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator("all"));
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (root)
466d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_rootDefaultStyle = styleForElement(root, 0, false, true); // don't ref, because the RenderStyle is allocated from global heap
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_rootDefaultStyle && view)
4695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_medium = adoptPtr(new MediaQueryEvaluator(view->mediaType(), view->frame(), m_rootDefaultStyle.get()));
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle = adoptPtr(new RuleSet);
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Adding rules from multiple sheets, shrink at the end.
4732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle->disableAutoShrinkToFit();
474f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This sucks! The user sheet is reparsed every time!
4762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    OwnPtr<RuleSet> tempUserStyle = adoptPtr(new RuleSet);
477f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pageUserSheet)
478f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        tempUserStyle->addRulesFromSheet(pageUserSheet, *m_medium, this);
479f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (pageGroupUserSheets) {
480f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        unsigned length = pageGroupUserSheets->size();
481f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        for (unsigned i = 0; i < length; i++) {
482f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            if (pageGroupUserSheets->at(i)->isUserStyleSheet())
483f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                tempUserStyle->addRulesFromSheet(pageGroupUserSheets->at(i).get(), *m_medium, this);
484f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            else
485f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                m_authorStyle->addRulesFromSheet(pageGroupUserSheets->at(i).get(), *m_medium, this);
486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (tempUserStyle->m_ruleCount > 0 || tempUserStyle->m_pageRules.size() > 0)
4905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_userStyle = tempUserStyle.release();
491f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
492d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Add rules from elements like SVG's <font-face>
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mappedElementSheet)
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_authorStyle->addRulesFromSheet(mappedElementSheet, *m_medium, this);
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
496f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // add stylesheets from document
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned length = styleSheets->length();
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < length; i++) {
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StyleSheet* sheet = styleSheets->item(i);
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sheet->isCSSStyleSheet() && !sheet->disabled())
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_authorStyle->addRulesFromSheet(static_cast<CSSStyleSheet*>(sheet), *m_medium, this);
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
503ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Collect all ids and rules using sibling selectors (:first-child and similar)
504ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // in the current set of stylesheets. Style sharing code uses this information to reject
505ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // sharing candidates.
506ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Usually there are no sibling rules in the default style but the MathML sheet has some.
507ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (siblingRulesInDefaultStyle)
50881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        siblingRulesInDefaultStyle->collectFeatures(m_features);
50981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_authorStyle->collectFeatures(m_features);
510ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_userStyle)
51181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_userStyle->collectFeatures(m_features);
512f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_authorStyle->shrinkToFit();
51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_features.siblingRules)
51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_features.siblingRules->shrinkToFit();
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (document->renderer() && document->renderer()->style())
5185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        document->renderer()->style()->font().update(fontSelector());
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This is a simplified style setting function for keyframe styles
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addKeyframeStyle(PassRefPtr<WebKitCSSKeyframesRule> rule)
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString s(rule->name());
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_keyframesRuleMap.add(s.impl(), rule);
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleSelector::~CSSStyleSelector()
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontSelector->clearDocument();
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_viewportDependentMediaQueryResults);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
53481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochCSSStyleSelector::Features::Features()
53581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : usesFirstLineRules(false)
53681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , usesBeforeAfterRules(false)
53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , usesLinkRules(false)
53881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
53981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
54181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochCSSStyleSelector::Features::~Features()
54281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
54381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
545635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CSSStyleSheet* parseUASheet(const String& str)
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSStyleSheet* sheet = CSSStyleSheet::create().releaseRef(); // leak the sheet on purpose
548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sheet->parseString(str);
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return sheet;
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CSSStyleSheet* parseUASheet(const char* characters, unsigned size)
553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return parseUASheet(String(characters, size));
555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadFullDefaultStyle()
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (simpleDefaultStyleSheet) {
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(defaultStyle);
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete defaultStyle;
56206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        simpleDefaultStyleSheet->deref();
5632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultStyle = new RuleSet;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        simpleDefaultStyleSheet = 0;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!defaultStyle);
5672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultStyle = new RuleSet;
5682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultPrintStyle = new RuleSet;
5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        defaultQuirksStyle = new RuleSet;
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Strict-mode rules.
5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String defaultRules = String(htmlUserAgentStyleSheet, sizeof(htmlUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraDefaultStyleSheet();
574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CSSStyleSheet* defaultSheet = parseUASheet(defaultRules);
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultStyle->addRulesFromSheet(defaultSheet, screenEval());
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultPrintStyle->addRulesFromSheet(defaultSheet, printEval());
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Quirks-mode rules.
5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraQuirksStyleSheet();
580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CSSStyleSheet* quirksSheet = parseUASheet(quirksRules);
581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    defaultQuirksStyle->addRulesFromSheet(quirksSheet, screenEval());
5824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
5834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadSimpleDefaultStyle()
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!defaultStyle);
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!simpleDefaultStyleSheet);
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultStyle = new RuleSet;
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultPrintStyle = new RuleSet;
5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultQuirksStyle = new RuleSet;
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultStyle->addRulesFromSheet(simpleDefaultStyleSheet, screenEval());
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void loadViewSourceStyle()
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!defaultViewSourceStyle);
6022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    defaultViewSourceStyle = new RuleSet;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultViewSourceStyle->addRulesFromSheet(parseUASheet(sourceUserAgentStyleSheet, sizeof(sourceUserAgentStyleSheet)), screenEval());
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6062fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void collectElementIdentifierHashes(const Element* element, Vector<unsigned, 4>& identifierHashes)
6072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    identifierHashes.append(element->localName().impl()->existingHash());
6092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (element->hasID())
6102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        identifierHashes.append(element->idForStyleResolution().impl()->existingHash());
6112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const StyledElement* styledElement = element->isStyledElement() ? static_cast<const StyledElement*>(element) : 0;
6122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (styledElement && styledElement->hasClass()) {
6132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const SpaceSplitString& classNames = styledElement->classNames();
6142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        size_t count = classNames.size();
6152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (size_t i = 0; i < count; ++i)
6162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            identifierHashes.append(classNames[i].impl()->existingHash());
6172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6202fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::pushParentStackFrame(Element* parent)
6212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
6232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_parentStack.isEmpty() || m_parentStack.last().element == parent->parentElement());
6242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_parentStack.isEmpty() || !parent->parentElement());
6252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_parentStack.append(ParentStackFrame(parent));
6262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ParentStackFrame& parentFrame = m_parentStack.last();
6272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Mix tags, class names and ids into some sort of weird bouillabaisse.
6282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The filter is used for fast rejection of child and descendant selectors.
6292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectElementIdentifierHashes(parent, parentFrame.identifierHashes);
6302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    size_t count = parentFrame.identifierHashes.size();
6312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (size_t i = 0; i < count; ++i)
6322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->add(parentFrame.identifierHashes[i]);
6332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::popParentStackFrame()
6362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_parentStack.isEmpty());
6382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
6392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const ParentStackFrame& parentFrame = m_parentStack.last();
6402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    size_t count = parentFrame.identifierHashes.size();
6412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (size_t i = 0; i < count; ++i)
6422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->remove(parentFrame.identifierHashes[i]);
6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_parentStack.removeLast();
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty()) {
6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter->likelyEmpty());
6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter.clear();
6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::pushParent(Element* parent)
6512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty()) {
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(!m_ancestorIdentifierFilter);
6542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter = adoptPtr(new BloomFilter<bloomFilterKeyBits>);
6552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // If the element is not the root itself, build the stack starting from the root.
6562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (parent->parentElement()) {
6572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            Vector<Element*, 30> ancestors;
6582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (Element* ancestor = parent; ancestor; ancestor = ancestor->parentElement())
6592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                ancestors.append(ancestor);
6602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            int count = ancestors.size();
6612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            for (int n = count - 1; n >= 0; --n)
6622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                pushParentStackFrame(ancestors[n]);
6632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
6642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
6652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else if (!parent->parentElement()) {
6662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We are not always invoked consistently. For example, script execution can cause us to enter
6672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // style recalc in the middle of tree building. Reset the stack if we see a new root element.
6682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter);
6692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_ancestorIdentifierFilter->clear();
6702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_parentStack.resize(0);
6712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else {
6722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(m_ancestorIdentifierFilter);
6732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We may get invoked for some random elements in some wacky cases during style resolve.
6742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Pause maintaining the stack in this case.
6752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_parentStack.last().element != parent->parentElement())
6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
6772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
6782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    pushParentStackFrame(parent);
6792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
6812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::popParent(Element* parent)
6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
6832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_parentStack.isEmpty() || m_parentStack.last().element != parent)
6842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
6852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    popParentStackFrame();
6862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addMatchedDeclaration(CSSMutableStyleDeclaration* decl)
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_matchedDecls.append(decl);
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6932fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchRules(RuleSet* rules, int& firstRuleIndex, int& lastRuleIndex, bool includeEmptyRules)
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchedRules.clear();
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules || !m_element)
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We need to collect the rules for id, class, tag, and everything else into a buffer and
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // then sort the buffer.
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_element->hasID())
70368513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRulesForList(rules->getIDRules(m_element->idForStyleResolution().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_element->hasClass()) {
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(m_styledElement);
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const SpaceSplitString& classNames = m_styledElement->classNames();
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size_t size = classNames.size();
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < size; ++i)
70968513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRulesForList(rules->getClassRules(classNames[i].impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_element->shadowPseudoId().isEmpty()) {
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(m_styledElement);
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        matchRulesForList(rules->getPseudoRules(m_element->shadowPseudoId().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
71568513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRulesForList(rules->getTagRules(m_element->localName().impl()), firstRuleIndex, lastRuleIndex, includeEmptyRules);
71668513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRulesForList(rules->getUniversalRules(), firstRuleIndex, lastRuleIndex, includeEmptyRules);
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we didn't match any rules, we're done.
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchedRules.isEmpty())
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Sort the set of matched rules.
72381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sortMatchedRules();
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now transfer the set of matched rules over to our list of decls.
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_checker.m_collectRulesOnly) {
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < m_matchedRules.size(); i++)
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; i < m_matchedRules.size(); i++) {
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_ruleList)
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_ruleList = CSSRuleList::create();
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_ruleList->append(m_matchedRules[i]->rule());
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7382fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSStyleSelector::fastRejectSelector(const RuleData& ruleData) const
7392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
7402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_ancestorIdentifierFilter);
7412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const unsigned* descendantSelectorIdentifierHashes = ruleData.descendantSelectorIdentifierHashes();
7422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned n = 0; n < RuleData::maximumIdentifierCount && descendantSelectorIdentifierHashes[n]; ++n) {
7432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!m_ancestorIdentifierFilter->mayContain(descendantSelectorIdentifierHashes[n]))
7442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return true;
7452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
7462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return false;
7472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
7482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
7492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchRulesForList(const Vector<RuleData>* rules, int& firstRuleIndex, int& lastRuleIndex, bool includeEmptyRules)
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules)
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // In some cases we may end up looking up style for random elements in the middle of a recursive tree resolve.
7542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Ancestor identifier filter won't be up-to-date in that case and we can't use the fast path.
7552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool canUseFastReject = !m_parentStack.isEmpty() && m_parentStack.last().element == m_parentNode;
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules->size();
7582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
7592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules->at(i);
7602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (canUseFastReject && fastRejectSelector(ruleData))
7612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            continue;
7622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (checkSelector(ruleData)) {
76368513a70bcd92384395513322f1b801e7bf9c729Steve Block            // If the rule has no properties to apply, then ignore it in the non-debug mode.
7642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            CSSStyleRule* rule = ruleData.rule();
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMutableStyleDeclaration* decl = rule->declaration();
76668513a70bcd92384395513322f1b801e7bf9c729Steve Block            if (!decl || (!decl->length() && !includeEmptyRules))
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
7682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (m_checker.m_sameOriginOnly && !m_checker.m_document->securityOrigin()->canRequest(rule->baseURL()))
7692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                continue;
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // If we're matching normal rules, set a pseudo bit if
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // we really just matched a pseudo-element.
7728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (m_dynamicPseudo != NOPSEUDO && m_checker.m_pseudoStyle == NOPSEUDO) {
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_checker.m_collectRulesOnly)
774dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    continue;
7758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (m_dynamicPseudo < FIRST_INTERNAL_PSEUDOID)
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setHasPseudoStyle(m_dynamicPseudo);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Update our first/last rule indices in the matched rules array.
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                lastRuleIndex = m_matchedDecls.size() + m_matchedRules.size();
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (firstRuleIndex == -1)
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstRuleIndex = lastRuleIndex;
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Add this rule to our list of matched rules.
7842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                addMatchedRule(&ruleData);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline bool compareRules(const RuleData* r1, const RuleData* r2)
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
79281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity1 = r1->specificity();
79381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned specificity2 = r2->specificity();
79481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return (specificity1 == specificity2) ? r1->position() < r2->position() : specificity1 < specificity2;
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
79781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid CSSStyleSelector::sortMatchedRules()
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
79981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    std::sort(m_matchedRules.begin(), m_matchedRules.end(), compareRules);
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline EInsideLink CSSStyleSelector::SelectorChecker::determineLinkState(Element* element) const
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!element || !element->isLink())
8056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return NotInsideLink;
8066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return determineLinkStateSlowCase(element);
8076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
8086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline void CSSStyleSelector::initElement(Element* e)
8106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
8116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_element != e) {
8126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_element = e;
8136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_styledElement = m_element && m_element->isStyledElement() ? static_cast<StyledElement*>(m_element) : 0;
8146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_elementLinkState = m_checker.determineLinkState(m_element);
815e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (e && e == e->document()->documentElement()) {
816e14391e94c850b8bd03680c23b38978db68687a8John Reck            e->document()->setDirectionSetOnDocumentElement(false);
817e14391e94c850b8bd03680c23b38978db68687a8John Reck            e->document()->setWritingModeSetOnDocumentElement(false);
818e14391e94c850b8bd03680c23b38978db68687a8John Reck        }
8196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
82221939df44de1705786c545cd1bf519d47250322dBen Murdochinline void CSSStyleSelector::initForStyleResolve(Element* e, RenderStyle* parentStyle, PseudoId pseudoID)
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_pseudoStyle = pseudoID;
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_parentNode = e ? e->parentNodeForRenderingAndStyle() : 0;
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (parentStyle)
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = parentStyle;
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = m_parentNode ? m_parentNode->renderStyle() : 0;
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Node* docElement = e ? e->document()->documentElement() : 0;
8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RenderStyle* docStyle = m_checker.m_document->renderStyle();
8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_rootElementStyle = docElement && e != docElement ? docElement->renderStyle() : docStyle;
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = 0;
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_matchedDecls.clear();
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_pendingImageProperties.clear();
8425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ruleList = 0;
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontDirty = false;
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline const AtomicString* linkAttribute(Node* node)
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!node->isLink())
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(node->isElementNode());
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* element = static_cast<Element*>(node);
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (element->isHTMLElement())
8566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(hrefAttr);
857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
859635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (element->isWMLElement()) {
860635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // <anchor> elements don't have href attributes, but we still want to
861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // appear as link, so linkAttribute() has to return a non-null value!
862635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (element->hasTagName(WMLNames::anchorTag))
863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return &emptyAtom;
864635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(hrefAttr);
866635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
867635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (element->isSVGElement())
8716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return &element->fastGetAttribute(XLinkNames::hrefAttr);
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
873635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCSSStyleSelector::SelectorChecker::SelectorChecker(Document* document, bool strictParsing)
8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_document(document)
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_strictParsing(strictParsing)
8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_collectRulesOnly(false)
881e14391e94c850b8bd03680c23b38978db68687a8John Reck    , m_sameOriginOnly(false)
8828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    , m_pseudoStyle(NOPSEUDO)
8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_documentIsHTML(document->isHTMLDocument())
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_matchVisitedPseudoClass(false)
8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88821939df44de1705786c545cd1bf519d47250322dBen MurdochEInsideLink CSSStyleSelector::SelectorChecker::determineLinkStateSlowCase(Element* element) const
88921939df44de1705786c545cd1bf519d47250322dBen Murdoch{
89021939df44de1705786c545cd1bf519d47250322dBen Murdoch    ASSERT(element->isLink());
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const AtomicString* attr = linkAttribute(element);
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!attr || attr->isNull())
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return NotInsideLink;
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if PLATFORM(QT)
8975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Vector<UChar, 512> url;
8985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    visitedURL(m_document->baseURL(), *attr, url);
8995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (url.isEmpty())
900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // If the Qt4.4 interface for the history is used, we will have to fallback
9035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // to the old global history.
9045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    QWebHistoryInterface* iface = QWebHistoryInterface::defaultInterface();
9055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (iface)
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return iface->historyContains(QString(reinterpret_cast<QChar*>(url.data()), url.size())) ? InsideVisitedLink : InsideUnvisitedLink;
9075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    LinkHash hash = visitedLinkHash(url.data(), url.size());
9095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!hash)
910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    LinkHash hash = visitedLinkHash(m_document->baseURL(), *attr);
9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!hash)
914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = m_document->frame();
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = frame->page();
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!page)
923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return InsideUnvisitedLink;
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_linksCheckedForVisitedState.add(hash);
926db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
927db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#if USE(PLATFORM_STRATEGIES)
928db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return platformStrategies()->visitedLinkStrategy()->isLinkVisited(page, hash) ? InsideVisitedLink : InsideUnvisitedLink;
929db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#else
930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return page->group().isLinkVisited(hash) ? InsideVisitedLink : InsideUnvisitedLink;
931db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#endif
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* element) const
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    PseudoId dynamicPseudo = NOPSEUDO;
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return checkSelector(sel, element, 0, dynamicPseudo, false, false) == SelectorMatches;
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const unsigned cStyleSearchThreshold = 10;
94181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic const unsigned cStyleSearchLevelThreshold = 10;
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
94381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochNode* CSSStyleSelector::locateCousinList(Element* parent, unsigned& visitedNodeCount) const
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
94581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (visitedNodeCount >= cStyleSearchThreshold * cStyleSearchLevelThreshold)
94681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return 0;
947ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!parent || !parent->isStyledElement())
948ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
949ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    StyledElement* p = static_cast<StyledElement*>(parent);
950ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (p->inlineStyleDecl())
951ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
95281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (p->hasID() && m_features.idsInRules.contains(p->idForStyleResolution().impl()))
953ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
95481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
95581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RenderStyle* parentStyle = p->renderStyle();
956ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unsigned subcount = 0;
95781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* thisCousin = p;
95881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* currentNode = p->previousSibling();
95981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
96081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Reserve the tries for this level. This effectively makes sure that the algorithm
96181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // will never go deeper than cStyleSearchLevelThreshold levels into recursion.
96281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    visitedNodeCount += cStyleSearchThreshold;
96381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (thisCousin) {
96481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (currentNode) {
96581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ++subcount;
96681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (currentNode->renderStyle() == parentStyle && currentNode->lastChild()) {
96781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // Adjust for unused reserved tries.
96881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                visitedNodeCount -= cStyleSearchThreshold - subcount;
96981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return currentNode->lastChild();
97081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
97181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (subcount >= cStyleSearchThreshold)
97281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return 0;
97381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            currentNode = currentNode->previousSibling();
97481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
97581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        currentNode = locateCousinList(thisCousin->parentElement(), visitedNodeCount);
97681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        thisCousin = currentNode;
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
97881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
982ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool CSSStyleSelector::matchesSiblingRules()
983ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
984ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    int firstSiblingRule = -1, lastSiblingRule = -1;
98581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    matchRules(m_features.siblingRules.get(), firstSiblingRule, lastSiblingRule, false);
986ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_matchedDecls.isEmpty())
987ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return false;
988ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    m_matchedDecls.clear();
989ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return true;
990ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
991ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
99281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool CSSStyleSelector::canShareStyleWithElement(Node* node) const
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
99481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!node->isStyledElement())
99581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
9968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
99781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    StyledElement* element = static_cast<StyledElement*>(node);
99881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RenderStyle* style = element->renderStyle();
999231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
100081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!style)
100181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->unique())
100381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->tagQName() != m_element->tagQName())
100581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasClass() != m_element->hasClass())
100781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
100881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->inlineStyleDecl())
100981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasMappedAttributes() != m_styledElement->hasMappedAttributes())
101181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->isLink() != m_element->isLink())
101381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->affectedByAttributeSelectors())
101581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hovered() != m_element->hovered())
101781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
101881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->active() != m_element->active())
101981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->focused() != m_element->focused())
102181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->shadowPseudoId() != m_element->shadowPseudoId())
102381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element == element->document()->cssTarget())
102581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_element == m_element->document()->cssTarget())
102781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
102881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(typeAttr) != m_element->fastGetAttribute(typeAttr))
102981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(XMLNames::langAttr) != m_element->fastGetAttribute(XMLNames::langAttr))
103181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(langAttr) != m_element->fastGetAttribute(langAttr))
103381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(readonlyAttr) != m_element->fastGetAttribute(readonlyAttr))
103581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
103681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->fastGetAttribute(cellpaddingAttr) != m_element->fastGetAttribute(cellpaddingAttr))
103781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
1038cad810f21b803229eb11403f9209855525a25d57Steve Block
103981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasID() && m_features.idsInRules.contains(element->idForStyleResolution().impl()))
104081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
1041cad810f21b803229eb11403f9209855525a25d57Steve Block
104281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool isControl = element->isFormControlElement();
10438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
104481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (isControl != m_element->isFormControlElement())
104581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
104681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
104781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (isControl) {
10482bde8e466a4451c7319e3a072d118917957d6554Steve Block        InputElement* thisInputElement = element->toInputElement();
10492bde8e466a4451c7319e3a072d118917957d6554Steve Block        InputElement* otherInputElement = m_element->toInputElement();
105081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
105181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!thisInputElement || !otherInputElement)
105281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
105481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isAutofilled() != otherInputElement->isAutofilled())
105581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isChecked() != otherInputElement->isChecked())
105781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
105881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (thisInputElement->isIndeterminate() != otherInputElement->isIndeterminate())
105981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isEnabledFormControl() != m_element->isEnabledFormControl())
106281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isDefaultButtonForForm() != m_element->isDefaultButtonForForm())
106581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
106781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!m_element->document()->containsValidityStyleRules())
106881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
106981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        bool willValidate = element->willValidate();
107181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (willValidate != m_element->willValidate())
107381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
107481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (willValidate && (element->isValidFormControlElement() != m_element->isValidFormControlElement()))
107681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
107781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
107881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isInRange() != m_element->isInRange())
107981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
108081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
108181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (element->isOutOfRange() != m_element->isOutOfRange())
108281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return false;
108381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
108481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
108581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (style->transitions() || style->animations())
108681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
108828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if USE(ACCELERATED_COMPOSITING)
108981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Turn off style sharing for elements that can gain layers for reasons outside of the style system.
109081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // See comments in RenderObject::setStyle().
10912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (element->hasTagName(iframeTag) || element->hasTagName(frameTag) || element->hasTagName(embedTag) || element->hasTagName(objectTag) || element->hasTagName(appletTag))
109281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
109328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif
109428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
109581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (equalIgnoringCase(element->fastGetAttribute(dirAttr), "auto") || equalIgnoringCase(m_element->fastGetAttribute(dirAttr), "auto"))
109681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
109781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
109881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasClass() && m_element->fastGetAttribute(classAttr) != element->fastGetAttribute(classAttr))
109981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->hasMappedAttributes() && !element->attributeMap()->mappedMapsEquivalent(m_styledElement->attributeMap()))
110281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element->isLink() && m_elementLinkState != style->insideLink())
110581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
110681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
110781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return true;
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1110ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochinline Node* CSSStyleSelector::findSiblingForStyleSharing(Node* node, unsigned& count) const
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1112ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (; node; node = node->previousSibling()) {
1113ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (!node->isElementNode())
1114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            continue;
1115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (canShareStyleWithElement(node))
1116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            break;
1117ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (count++ == cStyleSearchThreshold)
1118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return 0;
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1120ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return node;
1121ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1122ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
11232fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool parentStylePreventsSharing(const RenderStyle* parentStyle)
11242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
11252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return parentStyle->childrenAffectedByPositionalRules()
11262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByFirstChildRules()
11272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByLastChildRules()
11282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        || parentStyle->childrenAffectedByDirectAdjacentRules();
11292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
11302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1131ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochALWAYS_INLINE RenderStyle* CSSStyleSelector::locateSharedStyle()
1132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
1133ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!m_styledElement || !m_parentStyle)
1134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // If the element has inline style it is probably unique.
1136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (m_styledElement->inlineStyleDecl())
1137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Ids stop style sharing if they show up in the stylesheets.
113981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_styledElement->hasID() && m_features.idsInRules.contains(m_styledElement->idForStyleResolution().impl()))
1140ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
11412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (parentStylePreventsSharing(m_parentStyle))
11422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return 0;
114381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
114481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Check previous siblings and their cousins.
1145ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    unsigned count = 0;
114681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    unsigned visitedNodeCount = 0;
114781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* shareNode = 0;
114881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Node* cousinList = m_styledElement->previousSibling();
114981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (cousinList) {
115081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        shareNode = findSiblingForStyleSharing(cousinList, count);
115181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (shareNode)
115281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            break;
115381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cousinList = locateCousinList(cousinList->parentElement(), visitedNodeCount);
1154ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
115581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
115681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // If we have exhausted all our budget or our cousins.
115781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!shareNode)
115881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return 0;
115981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
1160ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Can't share if sibling rules apply. This is checked at the end as it should rarely fail.
1161ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (matchesSiblingRules())
1162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1163ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Tracking child index requires unique style for each node. This may get set by the sibling rule match above.
11642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (parentStylePreventsSharing(m_parentStyle))
1165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return 0;
1166ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return shareNode->renderStyle();
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::matchUARules(int& firstUARule, int& lastUARule)
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // First we match rules from the user agent sheet.
11722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet* userAgentStyleSheet = m_medium->mediaTypeMatchSpecific("print")
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ? defaultPrintStyle : defaultStyle;
117468513a70bcd92384395513322f1b801e7bf9c729Steve Block    matchRules(userAgentStyleSheet, firstUARule, lastUARule, false);
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In quirks mode, we match rules from the quirks user agent sheet.
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_checker.m_strictParsing)
117868513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(defaultQuirksStyle, firstUARule, lastUARule, false);
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // If document uses view source styles (in view source mode or in xml viewer mode), then we match rules from the view source style sheet.
118181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_checker.m_document->usesViewSourceStyles()) {
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!defaultViewSourceStyle)
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            loadViewSourceStyle();
118468513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(defaultViewSourceStyle, firstUARule, lastUARule, false);
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188d0825bca7fe65beaee391d30da42e937db621564Steve BlockPassRefPtr<RenderStyle> CSSStyleSelector::styleForDocument(Document* document)
1189d0825bca7fe65beaee391d30da42e937db621564Steve Block{
119068513a70bcd92384395513322f1b801e7bf9c729Steve Block    Frame* frame = document->frame();
11915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1192d0825bca7fe65beaee391d30da42e937db621564Steve Block    RefPtr<RenderStyle> documentStyle = RenderStyle::create();
1193d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setDisplay(BLOCK);
1194d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setVisuallyOrdered(document->visuallyOrdered());
119568513a70bcd92384395513322f1b801e7bf9c729Steve Block    documentStyle->setZoom(frame ? frame->pageZoomFactor() : 1);
1196e14391e94c850b8bd03680c23b38978db68687a8John Reck    documentStyle->setPageScaleTransform(frame ? frame->pageScaleFactor() : 1);
11976fc495ad78b1663298d1395115dc316eeb537036Steve Block    documentStyle->setUserModify(document->inDesignMode() ? READ_WRITE : READ_ONLY);
11986fc495ad78b1663298d1395115dc316eeb537036Steve Block
1199bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Element* docElement = document->documentElement();
1200e14391e94c850b8bd03680c23b38978db68687a8John Reck    RenderObject* docElementRenderer = docElement ? docElement->renderer() : 0;
1201e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (docElementRenderer) {
1202e14391e94c850b8bd03680c23b38978db68687a8John Reck        // Use the direction and writing-mode of the body to set the
1203e14391e94c850b8bd03680c23b38978db68687a8John Reck        // viewport's direction and writing-mode unless the property is set on the document element.
1204e14391e94c850b8bd03680c23b38978db68687a8John Reck        // If there is no body, then use the document element.
1205e14391e94c850b8bd03680c23b38978db68687a8John Reck        RenderObject* bodyRenderer = document->body() ? document->body()->renderer() : 0;
1206e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (bodyRenderer && !document->writingModeSetOnDocumentElement())
1207e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setWritingMode(bodyRenderer->style()->writingMode());
1208e14391e94c850b8bd03680c23b38978db68687a8John Reck        else
1209e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setWritingMode(docElementRenderer->style()->writingMode());
1210e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (bodyRenderer && !document->directionSetOnDocumentElement())
1211e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setDirection(bodyRenderer->style()->direction());
1212e14391e94c850b8bd03680c23b38978db68687a8John Reck        else
1213e14391e94c850b8bd03680c23b38978db68687a8John Reck            documentStyle->setDirection(docElementRenderer->style()->direction());
1214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
1215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1216d0825bca7fe65beaee391d30da42e937db621564Steve Block    FontDescription fontDescription;
1217d0825bca7fe65beaee391d30da42e937db621564Steve Block    fontDescription.setUsePrinterFont(document->printing());
1218d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (Settings* settings = document->settings()) {
1219d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setRenderingMode(settings->fontRenderingMode());
1220d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (document->printing() && !settings->shouldPrintBackgrounds())
1221d0825bca7fe65beaee391d30da42e937db621564Steve Block            documentStyle->setForceBackgroundsToWhite(true);
1222d0825bca7fe65beaee391d30da42e937db621564Steve Block        const AtomicString& stdfont = settings->standardFontFamily();
1223d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!stdfont.isEmpty()) {
1224d0825bca7fe65beaee391d30da42e937db621564Steve Block            fontDescription.firstFamily().setFamily(stdfont);
1225d0825bca7fe65beaee391d30da42e937db621564Steve Block            fontDescription.firstFamily().appendFamily(0);
1226d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
1227d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
1228d0825bca7fe65beaee391d30da42e937db621564Steve Block        int size = CSSStyleSelector::fontSizeForKeyword(document, CSSValueMedium, false);
1229d0825bca7fe65beaee391d30da42e937db621564Steve Block        fontDescription.setSpecifiedSize(size);
1230692e5dbf12901edacf14812a6fae25462920af42Steve Block        bool useSVGZoomRules = document->isSVGDocument();
1231692e5dbf12901edacf14812a6fae25462920af42Steve Block        fontDescription.setComputedSize(CSSStyleSelector::getComputedSizeFromSpecifiedSize(document, documentStyle.get(), fontDescription.isAbsoluteSize(), size, useSVGZoomRules));
1232d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1233d0825bca7fe65beaee391d30da42e937db621564Steve Block
1234d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->setFontDescription(fontDescription);
1235d0825bca7fe65beaee391d30da42e937db621564Steve Block    documentStyle->font().update(0);
1236d0825bca7fe65beaee391d30da42e937db621564Steve Block
1237d0825bca7fe65beaee391d30da42e937db621564Steve Block    return documentStyle.release();
1238d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1239d0825bca7fe65beaee391d30da42e937db621564Steve Block
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// If resolveForRootDefault is true, style based on user agent style sheet only. This is used in media queries, where
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// relative units are interpreted according to document root element style, styled only with UA stylesheet
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForElement(Element* e, RenderStyle* defaultParent, bool allowSharing, bool resolveForRootDefault, bool matchVisitedPseudoClass)
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Once an element has a renderer, we don't try to destroy it, since otherwise the renderer
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // will vanish if a style recalc happens during loading.
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing && !e->document()->haveStylesheetsLoaded() && !e->renderer()) {
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!s_styleNotYetAvailable) {
124921939df44de1705786c545cd1bf519d47250322dBen Murdoch            s_styleNotYetAvailable = RenderStyle::create().releaseRef();
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->ref();
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->setDisplay(NONE);
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            s_styleNotYetAvailable->font().update(m_fontSelector);
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s_styleNotYetAvailable->ref();
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        e->document()->setHasNodesWithPlaceholderStyle();
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return s_styleNotYetAvailable;
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
1260ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    initForStyleResolve(e, defaultParent);
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allowSharing) {
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderStyle* sharedStyle = locateSharedStyle();
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sharedStyle)
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return sharedStyle;
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Compute our style allowing :visited to match first.
1268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
12696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && m_parentStyle && (m_parentStyle->insideLink() || e->isLink()) && e->document()->usesLinkRules()) {
1270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style.
1271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentStyle = m_parentStyle;
1272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!e->isLink()) {
1273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Use the parent's visited style if one exists.
1274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RenderStyle* parentVisitedStyle = m_parentStyle->getCachedPseudoStyle(VISITED_LINK);
1275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (parentVisitedStyle)
1276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                parentStyle = parentVisitedStyle;
1277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = styleForElement(e, parentStyle, false, false, true);
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initForStyleResolve(e, defaultParent);
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = RenderStyle::create();
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_parentStyle)
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->inheritFrom(m_parentStyle);
12883818681c85a025afd8aa203937b66d7c01ac1a8bSteve Block    else {
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_parentStyle = style();
12903818681c85a025afd8aa203937b66d7c01ac1a8bSteve Block        // Make sure our fonts are initialized if we don't inherit them from our parent style.
12913818681c85a025afd8aa203937b66d7c01ac1a8bSteve Block        m_style->font().update(0);
12923818681c85a025afd8aa203937b66d7c01ac1a8bSteve Block    }
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (e->isLink()) {
1295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->setIsLink(true);
12966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_style->setInsideLink(m_elementLinkState);
1297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (visitedStyle) {
13002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Copy any pseudo bits that the visited style has to the primary style so that
13012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // pseudo element styles will continue to work for pseudo elements inside :visited
13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // links.
13032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (unsigned pseudo = FIRST_PUBLIC_PSEUDOID; pseudo < FIRST_INTERNAL_PSEUDOID; ++pseudo) {
13042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (visitedStyle->hasPseudoStyle(static_cast<PseudoId>(pseudo)))
13052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                m_style->setHasPseudoStyle(static_cast<PseudoId>(pseudo));
13062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
13072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_elementLinkState == InsideUnvisitedLink)
13082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben 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.
13092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
13102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
13112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (simpleDefaultStyleSheet && !elementCanUseSimpleDefaultStyle(e)) {
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadFullDefaultStyle();
1315ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool loadedSVGUserAgentSheet;
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e->isSVGElement() && !loadedSVGUserAgentSheet) {
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // SVG rules.
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loadedSVGUserAgentSheet = true;
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSStyleSheet* svgSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultStyle->addRulesFromSheet(svgSheet, screenEval());
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(svgSheet, printEval());
1326ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(MATHML)
1331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    static bool loadedMathMLUserAgentSheet;
1332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (e->isMathMLElement() && !loadedMathMLUserAgentSheet) {
1333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // MathML rules.
1334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        loadedMathMLUserAgentSheet = true;
1335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSStyleSheet* mathMLSheet = parseUASheet(mathmlUserAgentStyleSheet, sizeof(mathmlUserAgentStyleSheet));
1336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultStyle->addRulesFromSheet(mathMLSheet, screenEval());
1337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        defaultPrintStyle->addRulesFromSheet(mathMLSheet, printEval());
1338ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        // There are some sibling rules here.
1339ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        collectSiblingRulesInDefaultStyle();
1340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1341231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
1342231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedWMLUserAgentSheet;
1345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (e->isWMLElement() && !loadedWMLUserAgentSheet) {
1346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // WML rules.
1347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedWMLUserAgentSheet = true;
1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* wmlSheet = parseUASheet(wmlUserAgentStyleSheet, sizeof(wmlUserAgentStyleSheet));
1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(wmlSheet, screenEval());
1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(wmlSheet, printEval());
1351ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(VIDEO)
1356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool loadedMediaStyleSheet;
1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!loadedMediaStyleSheet && (e->hasTagName(videoTag) || e->hasTagName(audioTag))) {
1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadedMediaStyleSheet = true;
1359cad810f21b803229eb11403f9209855525a25d57Steve Block        String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::themeForPage(e->document()->page())->extraMediaControlsStyleSheet();
1360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSStyleSheet* mediaControlsSheet = parseUASheet(mediaRules);
1361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultStyle->addRulesFromSheet(mediaControlsSheet, screenEval());
1362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        defaultPrintStyle->addRulesFromSheet(mediaControlsSheet, printEval());
1363ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        assertNoSiblingRulesInDefaultStyle();
1364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
1365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
13672bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API)
13682bde8e466a4451c7319e3a072d118917957d6554Steve Block    static bool loadedFullScreenStyleSheet;
13692bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!loadedFullScreenStyleSheet && e->document()->webkitIsFullScreen()) {
13702bde8e466a4451c7319e3a072d118917957d6554Steve Block        loadedFullScreenStyleSheet = true;
13712bde8e466a4451c7319e3a072d118917957d6554Steve Block        String fullscreenRules = String(fullscreenUserAgentStyleSheet, sizeof(fullscreenUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraFullScreenStyleSheet();
13722bde8e466a4451c7319e3a072d118917957d6554Steve Block        CSSStyleSheet* fullscreenSheet = parseUASheet(fullscreenRules);
13732bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13742bde8e466a4451c7319e3a072d118917957d6554Steve Block        defaultQuirksStyle->addRulesFromSheet(fullscreenSheet, screenEval());
13752bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
13762bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
13772bde8e466a4451c7319e3a072d118917957d6554Steve Block
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1;
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUserRule = -1, lastUserRule = -1;
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstAuthorRule = -1, lastAuthorRule = -1;
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 4. Now we check user sheet rules.
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
138668513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 5. Now check author rules, beginning first with presentational attributes
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // mapped from HTML.
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_styledElement) {
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ask if the HTML element has mapped attributes.
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->hasMappedAttributes()) {
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Walk our attribute list and add in each decl.
1394e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                const NamedNodeMap* map = m_styledElement->attributeMap();
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned i = 0; i < map->length(); i++) {
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Attribute* attr = map->attributeItem(i);
1397e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    if (attr->isMappedAttribute() && attr->decl()) {
1398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        lastAuthorRule = m_matchedDecls.size();
1399e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        if (firstAuthorRule == -1)
1400e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                            firstAuthorRule = lastAuthorRule;
1401e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        addMatchedDeclaration(attr->decl());
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Now we check additional mapped declarations.
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Tables and table cells share an additional mapped rule that must be applied
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // after all attributes, since their mapped style depends on the values of multiple attributes.
14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_styledElement->canHaveAdditionalAttributeStyleDecls()) {
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_additionalAttributeStyleDecls.clear();
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_styledElement->additionalAttributeStyleDecls(m_additionalAttributeStyleDecls);
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_additionalAttributeStyleDecls.isEmpty()) {
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    unsigned additionalDeclsSize = m_additionalAttributeStyleDecls.size();
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstAuthorRule == -1)
14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstAuthorRule = m_matchedDecls.size();
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    lastAuthorRule = m_matchedDecls.size() + additionalDeclsSize - 1;
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    for (unsigned i = 0; i < additionalDeclsSize; i++)
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        addMatchedDeclaration(m_additionalAttributeStyleDecls[i]);
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
142181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_styledElement->isHTMLElement()) {
142281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                bool isAuto;
142381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                TextDirection textDirection = toHTMLElement(m_styledElement)->directionalityIfhasDirAutoAttribute(isAuto);
142481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (isAuto)
142581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    addMatchedDeclaration(textDirection == LTR ? leftToRightDeclaration() : rightToLeftDeclaration());
142681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 6. Check the rules in author sheets next.
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles)
143168513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // 7. Now check our inline style attribute.
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles && m_styledElement) {
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMutableStyleDeclaration* inlineDecl = m_styledElement->inlineStyleDecl();
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (inlineDecl) {
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                lastAuthorRule = m_matchedDecls.size();
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (firstAuthorRule == -1)
14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstAuthorRule = lastAuthorRule;
14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addMatchedDeclaration(inlineDecl);
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
14466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now we have all of the matched rules in the appropriate order.  Walk the rules and apply
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // high-priority properties first, i.e., those properties that other properties depend on.
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and (4) normal important.
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
145321939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
145521939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
145621939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<true>(true, firstUserRule, lastUserRule);
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
145821939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority UA properties.
146921939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the author and user normal priority properties and all the !important properties.
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resolveForRootDefault) {
147621939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
147721939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
147821939df44de1705786c545cd1bf519d47250322dBen Murdoch        applyDeclarations<false>(true, firstUserRule, lastUserRule);
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
148021939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
14815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
14825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    ASSERT(!m_fontDirty);
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1489bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), m_parentStyle, e);
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
14925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
14935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we have first-letter pseudo style, do not share this style
14958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_style->hasPseudoStyle(FIRST_LETTER))
14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setUnique();
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle) {
1499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Add the visited style off the main style.
1500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
15036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass)
15046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        initElement(0); // Clear out for the next resolve.
15056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForKeyframe(const RenderStyle* elementStyle, const WebKitCSSKeyframeRule* keyframeRule, KeyframeValue& keyframe)
1511ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
1512ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1513ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        addMatchedDeclaration(keyframeRule->style());
1514ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1515ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(!m_style);
1516ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1517ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Create the style
1518ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style = RenderStyle::clone(elementStyle);
1519ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1520ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_lineHeightValue = 0;
1521ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1522ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // We don't need to bother with !important. Since there is only ever one
1523ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // decl, there's nothing to override. So just add the first properties.
1524ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1525ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
1526ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1527ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied, go ahead and update it now.
1528ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1529ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1530ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1531ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Line-height is set when we are sure we decided on the font-size
1532ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_lineHeightValue)
1533ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
1534ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1535ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Now do rest of the properties.
1536ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style())
1537ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
1538ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1539ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If our font got dirtied by one of the non-essential font props,
1540ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // go ahead and update it a second time.
1541ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_fontDirty)
1542ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        updateFont();
1543ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
15455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
15465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Add all the animating properties to the keyframe.
1548ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (keyframeRule->style()) {
1549ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        CSSMutableStyleDeclaration::const_iterator end = keyframeRule->style()->end();
1550ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        for (CSSMutableStyleDeclaration::const_iterator it = keyframeRule->style()->begin(); it != end; ++it) {
1551ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            int property = (*it).id();
1552ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Timing-function within keyframes is special, because it is not animated; it just
1553ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // describes the timing function between this keyframe and the next.
1554ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            if (property != CSSPropertyWebkitAnimationTimingFunction)
15555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                keyframe.addProperty(property);
1556ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
1557ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1558ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1559ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return m_style.release();
1560ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
1561ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::keyframeStylesForAnimation(Element* e, const RenderStyle* elementStyle, KeyframeList& list)
15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    list.clear();
15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the keyframesRule for this name
15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || list.animationName().isEmpty())
15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1569d0825bca7fe65beaee391d30da42e937db621564Steve Block
1570d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_keyframesRuleMap.checkConsistency();
1571d0825bca7fe65beaee391d30da42e937db621564Steve Block
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_keyframesRuleMap.contains(list.animationName().impl()))
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const WebKitCSSKeyframesRule* rule = m_keyframesRuleMap.find(list.animationName().impl()).get()->second.get();
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Construct and populate the style for each keyframe
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < rule->length(); ++i) {
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Apply the declaration to the style. This is a simplified version of the logic in styleForElement
1580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        initElement(e);
15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        initForStyleResolve(e);
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1583ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        const WebKitCSSKeyframeRule* keyframeRule = rule->item(i);
15845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
15855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
15865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule, keyframe));
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Add this keyframe style to all the indicated key times
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<float> keys;
1590ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        keyframeRule->getKeys(keys);
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t keyIndex = 0; keyIndex < keys.size(); ++keyIndex) {
15925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            keyframe.setKey(keys[keyIndex]);
15935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            list.insert(keyframe);
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1597ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 0% keyframe is missing, create it (but only if there is at least one other keyframe)
1598ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int initialListSize = list.size();
15995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && list[0].key() != 0) {
16005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
16015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("0%");
16025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(0, 0);
16035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1605ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
1606ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1607ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // If the 100% keyframe is missing, create it (but only if there is at least one other keyframe)
16085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (initialListSize > 0 && (list[list.size() - 1].key() != 1)) {
16095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        RefPtr<WebKitCSSKeyframeRule> keyframeRule = WebKitCSSKeyframeRule::create();
16105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframeRule->setKeyText("100%");
16115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        KeyframeValue keyframe(1, 0);
16125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        keyframe.setStyle(styleForKeyframe(elementStyle, keyframeRule.get(), keyframe));
16135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        list.insert(keyframe);
1614ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForElement(PseudoId pseudo, Element* e, RenderStyle* parentStyle, bool matchVisitedPseudoClass)
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    initElement(e);
16236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve 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
1625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // off of.
1626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<RenderStyle> visitedStyle;
16276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!matchVisitedPseudoClass && parentStyle && parentStyle->insideLink()) {
1628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Fetch our parent style with :visited in effect.
1629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentVisitedStyle = parentStyle->getCachedPseudoStyle(VISITED_LINK);
1630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        visitedStyle = pseudoStyleForElement(pseudo, e, parentVisitedStyle ? parentVisitedStyle : parentStyle, true);
16312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (visitedStyle)
16322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            visitedStyle->setStyleType(VISITED_LINK);
1633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(e, parentStyle, pseudo);
163668513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_style = RenderStyle::create();
163768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (parentStyle)
163868513a70bcd92384395513322f1b801e7bf9c729Steve Block        m_style->inheritFrom(parentStyle);
163968513a70bcd92384395513322f1b801e7bf9c729Steve Block
16406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // those rules.
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check UA, user and author rules.
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstUARule = -1, lastUARule = -1, firstUserRule = -1, lastUserRule = -1, firstAuthorRule = -1, lastAuthorRule = -1;
16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matchUARules(firstUARule, lastUARule);
16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
165068513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_userStyle.get(), firstUserRule, lastUserRule, false);
165168513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, false);
16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchedDecls.isEmpty() && !visitedStyle)
16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_style->setStyleType(pseudo);
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_lineHeightValue = 0;
1660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Reset the value back before applying properties, so that -webkit-link knows what color to use.
16626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_checker.m_matchVisitedPseudoClass = matchVisitedPseudoClass;
1663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // High-priority properties.
166521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
166621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstAuthorRule, lastAuthorRule);
166721939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUserRule, lastUserRule);
166821939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<true>(true, firstUARule, lastUARule);
16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied, go ahead and update it now.
16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Line-height is set when we are sure we decided on the font-size
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_lineHeightValue)
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now do the normal priority properties.
167921939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, firstUARule, lastUARule);
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our border and background so that we can examine them later.
16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheBorderAndBackground();
16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
168421939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(false, lastUARule + 1, m_matchedDecls.size() - 1);
168521939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstAuthorRule, lastAuthorRule);
168621939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUserRule, lastUserRule);
168721939df44de1705786c545cd1bf519d47250322dBen Murdoch    applyDeclarations<false>(true, firstUARule, lastUARule);
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If our font got dirtied by one of the non-essential font props,
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // go ahead and update it a second time.
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontDirty)
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        updateFont();
1693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Clean up our style object's display and text decorations (among other fixups).
1695bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    adjustRenderStyle(style(), parentStyle, 0);
16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
16985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
16995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Hang our visited style off m_style.
1701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (visitedStyle)
1702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_style->addCachedPseudoStyle(visitedStyle.release());
1703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now return the style.
17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_style.release();
17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
170806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenPassRefPtr<RenderStyle> CSSStyleSelector::styleForPage(int pageIndex)
170906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
17106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    initForStyleResolve(m_checker.m_document->documentElement()); // m_rootElementStyle will be set to the document style.
171106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
171206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style = RenderStyle::create();
171306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->inheritFrom(m_rootElementStyle);
171406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
171506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isLeft = isLeftPage(pageIndex);
171606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const bool isFirst = isFirstPage(pageIndex);
171706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    const String page = pageName(pageIndex);
171806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRules(defaultPrintStyle, isLeft, isFirst, page);
17195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_userStyle.get(), isLeft, isFirst, page);
17205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    matchPageRules(m_authorStyle.get(), isLeft, isFirst, page);
172106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_lineHeightValue = 0;
172206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<true>(false, 0, m_matchedDecls.size() - 1);
172306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If our font got dirtied, go ahead and update it now.
172506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_fontDirty)
172606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        updateFont();
172706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
172806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Line-height is set when we are sure we decided on the font-size
172906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_lineHeightValue)
173006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyProperty(CSSPropertyLineHeight, m_lineHeightValue);
173106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
173206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    applyDeclarations<false>(false, 0, m_matchedDecls.size() - 1);
173306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Start loading images referenced by this style.
17355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    loadPendingImages();
17365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
173706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now return the style.
173806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return m_style.release();
173906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
174006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
17410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(DATAGRID)
17420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumn(DataGridColumn*, RenderStyle*)
17440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderStyle> CSSStyleSelector::pseudoStyleForDataGridColumnHeader(DataGridColumn*, RenderStyle*)
17500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
17510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Implement
17520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
17530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
17540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
17560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addIntrinsicMargins(RenderStyle* style)
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Intrinsic margin value.
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int intrinsicMargin = 2 * style->effectiveZoom();
17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using width/height alone and not also dealing with min-width/max-width is flawed.
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Using "quirk" to decide the margin wasn't set is kind of lame.
17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->width().isIntrinsicOrAuto()) {
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginLeft().quirk())
17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginLeft(Length(intrinsicMargin, Fixed));
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginRight().quirk())
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginRight(Length(intrinsicMargin, Fixed));
17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->height().isAuto()) {
17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginTop().quirk())
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginTop(Length(intrinsicMargin, Fixed));
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->marginBottom().quirk())
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setMarginBottom(Length(intrinsicMargin, Fixed));
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
177995217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhustatic inline bool isAtShadowBoundary(Element* element)
178095217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu{
178195217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu    if (!element)
178295217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu        return false;
178395217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu
178495217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu    ContainerNode* parentNode = element->parentNode();
178595217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu    return parentNode && parentNode->isShadowBoundary();
178695217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu}
178795217a662a9bdf75bcd22acb92bccce312ea974bTeng-Hui Zhu
1788bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid CSSStyleSelector::adjustRenderStyle(RenderStyle* style, RenderStyle* parentStyle, Element *e)
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache our original display.
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setOriginalDisplay(style->display());
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() != NONE) {
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // If we have a <td> that specifies a float property, in quirks mode we just drop the float
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // property.
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Sites also commonly use display:inline/block on <td>s and <table>s.  In quirks mode we force
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // these tags to retain their display types.
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_checker.m_strictParsing && e) {
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (e->hasTagName(tdTag)) {
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE_CELL);
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setFloating(FNONE);
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (e->hasTagName(tableTag))
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(style->isDisplayInlineType() ? INLINE_TABLE : TABLE);
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(tdTag) || e->hasTagName(thTag))) {
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->whiteSpace() == KHTML_NOWRAP) {
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Figure out if we are really nowrapping or if we should just
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // use normal instead.  If the width of the cell is fixed, then
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // we don't actually use NOWRAP.
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (style->width().isFixed())
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NORMAL);
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setWhiteSpace(NOWRAP);
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Tables never support the -webkit-* values for text-align and will reset back to the default.
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(tableTag) && (style->textAlign() == WEBKIT_LEFT || style->textAlign() == WEBKIT_CENTER || style->textAlign() == WEBKIT_RIGHT))
18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(TAAUTO);
18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Frames and framesets never honor position:relative or position:absolute.  This is necessary to
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fix a crash where a site tries to position these objects.  They also never honor display.
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && (e->hasTagName(frameTag) || e->hasTagName(framesetTag))) {
18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setDisplay(BLOCK);
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Table headers with a text-align of auto will change the text-align to center.
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (e && e->hasTagName(thTag) && style->textAlign() == TAAUTO)
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setTextAlign(CENTER);
18338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (e && e->hasTagName(legendTag))
18358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            style->setDisplay(BLOCK);
18368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Mutate the display to BLOCK or TABLE for certain cases, e.g., if someone attempts to
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // position or float an inline, compact, or run-in.  Cache the original display, since it
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // may be needed for positioned elements that have to compute their static normal flow
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // positions.  We also force inline-level roots to be block-level.
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->display() != BLOCK && style->display() != TABLE && style->display() != BOX &&
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            (style->position() == AbsolutePosition || style->position() == FixedPosition || style->floating() != FNONE ||
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (e && e->document()->documentElement() == e))) {
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (style->display() == INLINE_TABLE)
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(TABLE);
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == INLINE_BOX)
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BOX);
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (style->display() == LIST_ITEM) {
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // It is a WinIE bug that floated list items lose their bullets, so we'll emulate the quirk,
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // but only in quirks mode.
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_checker.m_strictParsing && style->floating() != FNONE)
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    style->setDisplay(BLOCK);
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                style->setDisplay(BLOCK);
18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // FIXME: Don't support this mutation for pseudo styles like first-letter or first-line, since it's not completely
1859bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // clear how that should work.
1860a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (style->display() == INLINE && style->styleType() == NOPSEUDO && parentStyle && style->writingMode() != parentStyle->writingMode())
1861bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            style->setDisplay(INLINE_BLOCK);
1862bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // After performing the display mutation, check table rows.  We do not honor position:relative on
18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // table rows or cells.  This has been established in CSS2.1 (and caused a crash in containingBlock()
18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // on some sites).
18662bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW_GROUP
18672bde8e466a4451c7319e3a072d118917957d6554Steve Block             || style->display() == TABLE_FOOTER_GROUP || style->display() == TABLE_ROW) &&
18688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             style->position() == RelativePosition)
18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(StaticPosition);
187028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
187128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // writing-mode does not apply to table row groups, table column groups, table rows, and table columns.
187228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Table cells should be allowed to be perpendicular or flipped with respect to the table, though.
187328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->display() == TABLE_COLUMN || style->display() == TABLE_COLUMN_GROUP || style->display() == TABLE_FOOTER_GROUP
187428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_ROW || style->display() == TABLE_ROW_GROUP
187528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            || style->display() == TABLE_CELL)
187628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            style->setWritingMode(parentStyle->writingMode());
187728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
187828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        // FIXME: Since we don't support block-flow on flexible boxes yet, disallow setting
1879a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // of block-flow to anything other than TopToBottomWritingMode.
1880bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // https://bugs.webkit.org/show_bug.cgi?id=46418 - Flexible box support.
188128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (style->writingMode() != TopToBottomWritingMode && (style->display() == BOX || style->display() == INLINE_BOX))
1882a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            style->setWritingMode(TopToBottomWritingMode);
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Make sure our z-index value is only applied if the object is positioned.
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->position() == StaticPosition)
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setHasAutoZIndex();
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Auto z-index becomes 0 for the root element and transparent objects.  This prevents
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // cases where objects that should be blended as a single unit end up with a non-transparent
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // object wedged in between them.  Auto z-index also becomes 0 for objects that specify transforms/masks/reflections.
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAutoZIndex() && ((e && e->document()->documentElement() == e) || style->opacity() < 1.0f ||
18938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        style->hasTransformRelatedProperty() || style->hasMask() || style->boxReflect()))
18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setZIndex(0);
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML)
1897f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && (e->hasTagName(WMLNames::insertedLegendTag)
1898f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick              || e->hasTagName(WMLNames::inputTag))
1899f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            && style->width().isAuto())
1900f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setWidth(Length(Intrinsic));
1901635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
1902f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
1903f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // Textarea considers overflow visible as auto.
1904f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (e && e->hasTagName(textareaTag)) {
1905f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowX(style->overflowX() == OVISIBLE ? OAUTO : style->overflowX());
1906f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        style->setOverflowY(style->overflowY() == OVISIBLE ? OAUTO : style->overflowY());
19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Finally update our text decorations in effect, but don't allow text-decoration to percolate through
19102bde8e466a4451c7319e3a072d118917957d6554Steve Block    // tables, inline blocks, inline tables, run-ins, or shadow DOM.
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE || style->display() == RUN_IN
19122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        || style->display() == INLINE_BLOCK || style->display() == INLINE_BOX || isAtShadowBoundary(e))
19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setTextDecorationsInEffect(style->textDecoration());
19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->addToTextDecorationsInEffect(style->textDecoration());
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If either overflow value is not visible, change to auto.
19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->overflowX() == OMARQUEE && style->overflowY() != OMARQUEE)
19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OMARQUEE);
19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OMARQUEE && style->overflowX() != OMARQUEE)
19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OMARQUEE);
19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowX() == OVISIBLE && style->overflowY() != OVISIBLE)
19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OAUTO);
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (style->overflowY() == OVISIBLE && style->overflowX() != OVISIBLE)
19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OAUTO);
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Table rows, sections and the table itself will support overflow:hidden and will ignore scroll/auto.
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Eventually table sections will support auto and scroll.
19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->display() == TABLE || style->display() == INLINE_TABLE ||
19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->display() == TABLE_ROW_GROUP || style->display() == TABLE_ROW) {
19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() != OVISIBLE && style->overflowX() != OHIDDEN)
19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() != OVISIBLE && style->overflowY() != OHIDDEN)
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Menulists should have visible overflow
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->appearance() == MenulistPart) {
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowX(OVISIBLE);
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setOverflowY(OVISIBLE);
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cull out any useless layers and also repeat patterns into additional layers.
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustBackgroundLayers();
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustMaskLayers();
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Do the same for animations and transitions.
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustAnimations();
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->adjustTransitions();
19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Important: Intrinsic margins get added to controls before the theme has adjusted the style, since the theme will
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // alter fonts and heights/widths.
19538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (e && e->isFormControlElement() && style->fontSize() >= 11) {
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Don't apply intrinsic margins to image buttons.  The designer knows how big the images are,
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // so we have to treat all image buttons as though they were explicitly sized.
195668513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!e->hasTagName(inputTag) || !static_cast<HTMLInputElement*>(e)->isImageButton())
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addIntrinsicMargins(style);
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Let the theme also have a crack at adjusting the style.
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->hasAppearance())
19620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RenderTheme::defaultTheme()->adjustStyle(this, style, e, m_hasUAAppearance, m_borderData, m_backgroundData, m_backgroundColor);
19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (e && e->isSVGElement()) {
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Spec: http://www.w3.org/TR/SVG/masking.html#OverflowProperty
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowY() == OSCROLL)
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OHIDDEN);
19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowY() == OAUTO)
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowY(OVISIBLE);
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (style->overflowX() == OSCROLL)
19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OHIDDEN);
19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (style->overflowX() == OAUTO)
19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setOverflowX(OVISIBLE);
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Only the root <svg> element in an SVG document fragment tree honors css position
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!(e->hasTagName(SVGNames::svgTag) && e->parentNode() && !e->parentNode()->isSVGElement()))
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            style->setPosition(RenderStyle::initialPosition());
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::updateFont()
19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForTextSizeAdjust();
19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForGenericFamilyChange(style(), m_parentStyle);
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkForZoomChange(style(), m_parentStyle);
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->font().update(m_fontSelector);
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_fontDirty = false;
19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::cacheBorderAndBackground()
19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_hasUAAppearance = m_style->hasAppearance();
19968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_hasUAAppearance) {
19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_borderData = m_style->border();
19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundData = *m_style->backgroundLayers();
19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_backgroundColor = m_style->backgroundColor();
20008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2003e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::styleRulesForElement(Element* e, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2005e14391e94c850b8bd03680c23b38978db68687a8John Reck    return pseudoStyleRulesForElement(e, NOPSEUDO, authorOnly, includeEmptyRules, filter);
2006dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2007dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2008e14391e94c850b8bd03680c23b38978db68687a8John ReckPassRefPtr<CSSRuleList> CSSStyleSelector::pseudoStyleRulesForElement(Element* e, PseudoId pseudoId, bool authorOnly, bool includeEmptyRules, CSSRuleFilter filter)
2009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e || !e->document()->haveStylesheetsLoaded())
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = true;
20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2015dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(e);
2016dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initForStyleResolve(e, 0, pseudoId);
20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!authorOnly) {
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstUARule = -1, lastUARule = -1;
20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // First we match rules from the user agent sheet.
20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        matchUARules(firstUARule, lastUARule);
20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we check user sheet rules.
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_matchAuthorAndUserStyles) {
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int firstUserRule = -1, lastUserRule = -1;
202668513a70bcd92384395513322f1b801e7bf9c729Steve Block            matchRules(m_userStyle.get(), firstUserRule, lastUserRule, includeEmptyRules);
20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_matchAuthorAndUserStyles) {
2031e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = (filter == SameOriginCSSRulesOnly);
2032e14391e94c850b8bd03680c23b38978db68687a8John Reck
20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check the rules in author sheets.
20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int firstAuthorRule = -1, lastAuthorRule = -1;
203568513a70bcd92384395513322f1b801e7bf9c729Steve Block        matchRules(m_authorStyle.get(), firstAuthorRule, lastAuthorRule, includeEmptyRules);
2036e14391e94c850b8bd03680c23b38978db68687a8John Reck
2037e14391e94c850b8bd03680c23b38978db68687a8John Reck        m_checker.m_sameOriginOnly = false;
20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_checker.m_collectRulesOnly = false;
2041e14391e94c850b8bd03680c23b38978db68687a8John Reck
20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_ruleList.release();
20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool CSSStyleSelector::checkSelector(const RuleData& ruleData)
20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    m_dynamicPseudo = NOPSEUDO;
20488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
204981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Let the slow path handle SVG as it has some additional rules regarding shadow trees.
205081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (ruleData.hasFastCheckableSelector() && !m_element->isSVGElement()) {
20512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know this selector does not include any pseudo selectors.
20522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (m_checker.m_pseudoStyle != NOPSEUDO)
20532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // We know a sufficiently simple single part selector matches simply because we found it from the rule hash.
20552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // This is limited to HTML only so we don't need to check the namespace.
20562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (ruleData.hasTopSelectorMatchingHTMLBasedOnRuleHash() && !ruleData.hasMultipartSelector() && m_element->isHTMLElement())
20572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return true;
20582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return SelectorChecker::fastCheckSelector(ruleData.selector(), m_element);
20592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Slow path.
20622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    SelectorMatch match = m_checker.checkSelector(ruleData.selector(), m_element, &m_selectorAttrs, m_dynamicPseudo, false, false, style(), m_parentNode ? m_parentNode->renderStyle() : 0);
20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (match != SelectorMatches)
20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (m_checker.m_pseudoStyle != NOPSEUDO && m_checker.m_pseudoStyle != m_dynamicPseudo)
20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
20672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
20682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20702fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool selectorTagMatches(const Element* element, const CSSSelector* selector)
20712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selector->hasTag())
20732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
20742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
20752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom && localName != element->localName())
20762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
20772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& namespaceURI = selector->tag().namespaceURI();
20782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return namespaceURI == starAtom || namespaceURI == element->namespaceURI();
20792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isFastCheckableSelector(const CSSSelector* selector)
20822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (; selector; selector = selector->tagHistory()) {
208481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (selector->relation() != CSSSelector::Descendant && selector->relation() != CSSSelector::Child && selector->relation() != CSSSelector::SubSelector)
20852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (selector->m_match != CSSSelector::None && selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
20872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return false;
20882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
20898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
209181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
209281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate <class ValueChecker>
209381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool fastCheckSingleSelector(const CSSSelector*& selector, const Element*& element, const CSSSelector*& topChildOrSubselector, const Element*& topChildOrSubselectorMatchElement)
209481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
209581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    AtomicStringImpl* value = selector->value().impl();
209681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (; element; element = element->parentElement()) {
209781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (ValueChecker::checkValue(element, value) && selectorTagMatches(element, selector)) {
209881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() == CSSSelector::Descendant)
209981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = 0;
210081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            else if (!topChildOrSubselector) {
210181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector);
210281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselector = selector;
210381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                topChildOrSubselectorMatchElement = element;
210481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
210581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (selector->relation() != CSSSelector::SubSelector)
210681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                element = element->parentElement();
210781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = selector->tagHistory();
210881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
210981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
211081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (topChildOrSubselector) {
211181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Child or subselector check failed.
211281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // If the match element is null, topChildOrSubselector was also the very topmost selector and had to match
211381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // the original element we were checking.
211481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!topChildOrSubselectorMatchElement)
211581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
211681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // There may be other matches down the ancestor chain.
211781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Rewind to the topmost child or subselector and the element it matched, continue checking ancestors.
211881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            selector = topChildOrSubselector;
211981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            element = topChildOrSubselectorMatchElement->parentElement();
212081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            topChildOrSubselector = 0;
212181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return true;
212281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
212381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
212481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return false;
212581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
212681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
212781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct ClassCheck {
212881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
212981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasClass() && static_cast<const StyledElement*>(element)->classNames().contains(value);
213181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
213281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
213381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct IdCheck {
213481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element* element, AtomicStringImpl* value)
213581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
213681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return element->hasID() && element->idForStyleResolution().impl() == value;
213781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
213881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
213981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstruct TagCheck {
214081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static bool checkValue(const Element*, AtomicStringImpl*)
214181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
214281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return true;
214381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
214481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch};
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool CSSStyleSelector::SelectorChecker::fastCheckSelector(const CSSSelector* selector, const Element* element)
21472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
21482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(isFastCheckableSelector(selector));
21492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // The top selector requires tag check only as rule hashes have already handled id and class matches.
21512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(element, selector))
21522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
21532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
215481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const CSSSelector* topChildOrSubselector = 0;
215581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const Element* topChildOrSubselectorMatchElement = 0;
215681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() == CSSSelector::Child || selector->relation() == CSSSelector::SubSelector)
215781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        topChildOrSubselector = selector;
215881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
215981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->relation() != CSSSelector::SubSelector)
216081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        element = element->parentElement();
216181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
21622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    selector = selector->tagHistory();
216381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
216481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // We know this compound selector has descendant, child and subselector combinators only and all components are simple.
216581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    while (selector) {
21662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (selector->m_match) {
21672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Class:
216881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<ClassCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
216981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Id:
217281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<IdCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::None:
217681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!fastCheckSingleSelector<TagCheck>(selector, element, topChildOrSubselector, topChildOrSubselectorMatchElement))
217781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return false;
21782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
21792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        default:
21802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            ASSERT_NOT_REACHED();
21812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
21822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
21832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
21842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
21852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Recursive check of selectors and combinators
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// It can return 3 different values:
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorMatches         - the selector matches the element e
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsLocally    - the selector fails for the element e
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// * SelectorFailsCompletely - the selector fails for e and any sibling or ancestor of e
2191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCSSStyleSelector::SelectorMatch CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Spec: CSS2 selectors cannot be applied to the (conceptually) cloned DOM tree
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // because its contents are not part of the formal document structure.
2196f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isSVGElement() && e->isShadowRoot())
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsCompletely;
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // first selector has to match
22012bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!checkOneSelector(sel, e, selectorAttrs, dynamicPseudo, isSubSelector, encounteredLink, elementStyle, elementParentStyle))
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorFailsLocally;
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The rest of the selectors has to match
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSSelector::Relation relation = sel->relation();
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Prepare next sel
2208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    sel = sel->tagHistory();
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sel)
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return SelectorMatches;
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (relation != CSSSelector::SubSelector)
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Bail-out if this selector is irrelevant for the pseudoStyle
22148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (m_pseudoStyle != NOPSEUDO && m_pseudoStyle != dynamicPseudo)
22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return SelectorFailsCompletely;
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Check for nested links.
2218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_matchVisitedPseudoClass && !isSubSelector) {
2219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* currentStyle = elementStyle ? elementStyle : e->renderStyle();
2220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (currentStyle && currentStyle->insideLink() && e->isLink()) {
2221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (encounteredLink)
2222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false; // This link is not relevant to the style being resolved, so disable matching.
2223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            else
2224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                encounteredLink = true;
2225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (relation) {
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Descendant:
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
2231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ContainerNode* n = e->parentNode();
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n || !n->isElementNode())
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsCompletely;
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Child:
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
2242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ContainerNode* n = e->parentNode();
22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n || !n->isElementNode())
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::DirectAdjacent:
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByDirectAdjacentRules();
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Node* n = e->previousSibling();
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (n && !n->isElementNode())
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n = n->previousSibling();
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!n)
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsLocally;
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            e = static_cast<Element*>(n);
2261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            m_matchVisitedPseudoClass = false;
2262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::IndirectAdjacent:
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!m_collectRulesOnly && e->parentNode() && e->parentNode()->isElementNode()) {
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (parentStyle)
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    parentStyle->setChildrenAffectedByForwardPositionalRules();
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Node* n = e->previousSibling();
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                while (n && !n->isElementNode())
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    n = n->previousSibling();
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!n)
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return SelectorFailsLocally;
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                e = static_cast<Element*>(n);
2277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                m_matchVisitedPseudoClass = false;
2278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                SelectorMatch match = checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (match != SelectorFailsLocally)
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return match;
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            };
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::SubSelector:
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // a selector is invalid if something follows a pseudo-element
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We make an exception for scrollbar pseudo elements and allow a set of pseudo classes (but nothing else)
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to follow the pseudo elements.
2287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if ((elementStyle || m_collectRulesOnly) && dynamicPseudo != NOPSEUDO && dynamicPseudo != SELECTION &&
22888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                !((RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER) && sel->m_match == CSSSelector::PseudoClass))
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return SelectorFailsCompletely;
2290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle);
229165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case CSSSelector::ShadowDescendant:
229265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
229365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Node* shadowHostNode = e->shadowAncestorNode();
229465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (shadowHostNode == e || !shadowHostNode->isElementNode())
229565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                return SelectorFailsCompletely;
229665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            e = static_cast<Element*>(shadowHostNode);
229765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return checkSelector(sel, e, selectorAttrs, dynamicPseudo, false, encounteredLink);
229865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return SelectorFailsCompletely;
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void addLocalNameToSet(HashSet<AtomicStringImpl*>* set, const QualifiedName& qName)
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    set->add(qName.localName().impl());
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashSet<AtomicStringImpl*>* createHtmlCaseInsensitiveAttributesSet()
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is the list of attributes in HTML 4.01 with values marked as "[CI]" or case-insensitive
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Mozilla treats all other values as case-sensitive, thus so do we.
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<AtomicStringImpl*>* attrSet = new HashSet<AtomicStringImpl*>;
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, accept_charsetAttr);
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, acceptAttr);
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alignAttr);
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, alinkAttr);
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, axisAttr);
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, bgcolorAttr);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, charsetAttr);
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, checkedAttr);
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, clearAttr);
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, codetypeAttr);
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, colorAttr);
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, compactAttr);
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, declareAttr);
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, deferAttr);
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, dirAttr);
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, disabledAttr);
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, enctypeAttr);
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, faceAttr);
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, frameAttr);
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, hreflangAttr);
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, http_equivAttr);
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, langAttr);
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, languageAttr);
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, linkAttr);
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, mediaAttr);
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, methodAttr);
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, multipleAttr);
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nohrefAttr);
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noresizeAttr);
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, noshadeAttr);
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, nowrapAttr);
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, readonlyAttr);
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, relAttr);
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, revAttr);
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, rulesAttr);
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scopeAttr);
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, scrollingAttr);
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, selectedAttr);
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, shapeAttr);
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, targetAttr);
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, textAttr);
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, typeAttr);
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valignAttr);
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, valuetypeAttr);
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addLocalNameToSet(attrSet, vlinkAttr);
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attrSet;
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool htmlAttributeHasCaseInsensitiveValue(const QualifiedName& attr)
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashSet<AtomicStringImpl*>* htmlCaseInsensitiveAttributesSet = createHtmlCaseInsensitiveAttributesSet();
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isPossibleHTMLAttr = !attr.hasPrefix() && (attr.namespaceURI() == nullAtom);
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return isPossibleHTMLAttr && htmlCaseInsensitiveAttributesSet->contains(attr.localName().impl());
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23712bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Element* e, HashSet<AtomicStringImpl*>* selectorAttrs, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2373cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(e);
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!e)
23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!selectorTagMatches(e, sel))
23782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->hasAttribute()) {
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Class)
23822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasClass() && static_cast<StyledElement*>(e)->classNames().contains(sel->value());
23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->m_match == CSSSelector::Id)
23852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return e->hasID() && e->idForStyleResolution() == sel->value();
2386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const QualifiedName& attr = sel->attribute();
23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Handle the case were elementStyle is 0.
2390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (elementStyle && (!e->isStyledElement() || (!static_cast<StyledElement*>(e)->isMappedAttribute(attr) && attr != typeAttr && attr != readonlyAttr))) {
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            elementStyle->setAffectedByAttributeSelectors(); // Special-case the "type" and "readonly" attributes so input form controls can share style.
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (selectorAttrs)
2393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                selectorAttrs->add(attr.localName().impl());
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const AtomicString& value = e->getAttribute(attr);
23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value.isNull())
23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false; // attribute is not set
23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool caseSensitive = !m_documentIsHTML || !htmlAttributeHasCaseInsensitiveValue(attr);
24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->m_match) {
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Exact:
24042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (caseSensitive ? sel->value() != value : !equalIgnoringCase(sel->value(), value))
24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::List:
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Ignore empty selectors or selectors containing spaces
24102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (sel->value().contains(' ') || sel->value().isEmpty())
24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2413f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            unsigned startSearchAt = 0;
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            while (true) {
24152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                size_t foundPos = value.find(sel->value(), startSearchAt, caseSensitive);
2416f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == notFound)
24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return false;
2418f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (foundPos == 0 || value[foundPos - 1] == ' ') {
24192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    unsigned endStr = foundPos + sel->value().length();
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (endStr == value.length() || value[endStr] == ' ')
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break; // We found a match.
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2424f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                // No match. Keep looking.
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                startSearchAt = foundPos + 1;
24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Contain:
24302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.contains(sel->value(), caseSensitive) || sel->value().isEmpty())
24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Begin:
24342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(sel->value(), caseSensitive) || sel->value().isEmpty())
24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::End:
24382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.endsWith(sel->value(), caseSensitive) || sel->value().isEmpty())
24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::Hyphen:
24422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() < sel->value().length())
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!value.startsWith(sel->value(), caseSensitive))
24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // It they start the same, check for exact match or following '-':
24472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (value.length() != sel->value().length() && value[sel->value().length()] != '-')
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoClass:
24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoElement:
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoClass) {
24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle :not up front.
24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (sel->pseudoType() == CSSSelector::PseudoNot) {
24602bde8e466a4451c7319e3a072d118917957d6554Steve Block            ASSERT(sel->selectorList());
24612bde8e466a4451c7319e3a072d118917957d6554Steve Block            for (CSSSelector* subSel = sel->selectorList()->first(); subSel; subSel = subSel->tagHistory()) {
24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // :not cannot nest. I don't really know why this is a
24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // restriction in CSS3, but it is, so let's honor it.
24648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                // the parser enforces that this never occurs
24652bde8e466a4451c7319e3a072d118917957d6554Steve Block                ASSERT(subSel->pseudoType() != CSSSelector::PseudoNot);
24668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
24672bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!checkOneSelector(subSel, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle))
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
24708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo != NOPSEUDO && (RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER)) {
24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // CSS scrollbars match a specific subset of pseudo classes, and they have specialized rules for each
24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // (since there are no elements involved).
24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return checkScrollbarPseudoClass(sel, dynamicPseudo);
24748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        } else if (dynamicPseudo == SELECTION) {
24758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
24768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return !m_document->page()->focusController()->isActive();
24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Normal element pseudo class checking.
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (sel->pseudoType()) {
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Pseudo classes:
24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNot:
24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break; // Already handled up above.
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEmpty: {
24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bool result = true;
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (Node* n = e->firstChild(); n; n = n->nextSibling()) {
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (n->isElementNode()) {
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = false;
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (n->isTextNode()) {
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Text* textNode = static_cast<Text*>(n);
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!textNode->data().isEmpty()) {
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = false;
24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!m_collectRulesOnly) {
24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setEmptyState(result);
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle() && (e->document()->usesSiblingRules() || e->renderStyle()->unique()))
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setEmptyState(result);
25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return result;
25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstChild: {
25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-child matches the first child that is an element
25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFirstOfType: {
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // first-of-type matches the first element of its type
25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->parentNode() && e->parentNode()->isElementNode()) {
25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : e->parentNode()->renderStyle();
25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastChild: {
25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-child matches the last child that is an element
2551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
2553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (parentElement->isFinishedParsingChildren()) {
25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        Node* n = e->nextSibling();
25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            result = true;
25598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (result && childStyle)
25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLastOfType: {
25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // last-of-type matches the last element of its type
2574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2576635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool result = false;
25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
25878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
25888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
25898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
25908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
25918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        result = true;
25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return result;
25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyChild: {
2597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
25988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
25998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n && !n->isElementNode())
26038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
2606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (firstChild && parentElement->isFinishedParsingChildren()) {
26078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n && !n->isElementNode())
26098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByFirstChildRules();
26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByLastChildRules();
26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (firstChild && childStyle)
26218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setFirstChildState();
26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (lastChild && childStyle)
26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setLastChildState();
26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoOnlyOfType: {
26308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: This selector is very slow.
2631635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2633635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle) {
26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
26408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
26418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool firstChild = false;
26428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    bool lastChild = false;
26438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
26448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            break;
26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!n)
26518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        firstChild = true;
26528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (firstChild) {
26538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = e->nextSibling();
26548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        while (n) {
26558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
26568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            n = n->nextSibling();
26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (!n)
26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            lastChild = true;
26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return firstChild && lastChild;
26638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthChild: {
2667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
26688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2669635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
26708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
26738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode()) {
26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            RenderStyle* s = n->renderStyle();
26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            unsigned index = s ? s->childIndex() : 0;
26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            if (index) {
26778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                count += index;
26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                break;
26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            }
26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
26818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
26828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
26838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
26868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        RenderStyle* childStyle = elementStyle ? elementStyle : e->renderStyle();
2687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
26888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (childStyle)
26898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            childStyle->setChildIndex(count);
26908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
26918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
26928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
26958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
26968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
26978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
26988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
26998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthOfType: {
2700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->previousSibling();
27068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->previousSibling();
27108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByForwardPositionalRules();
27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastChild: {
2724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode())
27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNthLastOfType: {
2747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (!sel->parseNth())
27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (Element* parentElement = e->parentElement()) {
27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (!m_collectRulesOnly) {
2751635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        RenderStyle* parentStyle = elementStyle ? elementParentStyle : parentElement->renderStyle();
27528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (parentStyle)
27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            parentStyle->setChildrenAffectedByBackwardPositionalRules();
27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2755635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (!parentElement->isFinishedParsingChildren())
27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return false;
27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int count = 1;
27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    const QualifiedName& type = e->tagQName();
27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    Node* n = e->nextSibling();
27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    while (n) {
27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        if (n->isElementNode() && static_cast<Element*>(n)->hasTagName(type))
27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            count++;
27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        n = n->nextSibling();
27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (sel->matchNth(count))
27668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoTarget:
27718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (e == e->document()->cssTarget())
27728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27742bde8e466a4451c7319e3a072d118917957d6554Steve Block            case CSSSelector::PseudoAny:
27752bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* selector = sel->selectorList()->first(); selector; selector = CSSSelectorList::next(selector)) {
27762bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (checkSelector(selector, e, selectorAttrs, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle) == SelectorMatches)
27772bde8e466a4451c7319e3a072d118917957d6554Steve Block                        return true;
27782bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
27792bde8e466a4451c7319e3a072d118917957d6554Steve Block                break;
27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoAnyLink:
2781dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
27828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
27838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoAutofill: {
27858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
27868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
27872bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (InputElement* inputElement = e->toInputElement())
27888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return inputElement->isAutofilled();
27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLink:
2792dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2793dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return !m_matchVisitedPseudoClass;
27948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoVisited:
2796dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isLink())
2797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    return m_matchVisitedPseudoClass;
27988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
27998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDrag: {
28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (elementStyle)
28018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    elementStyle->setAffectedByDragRules(true);
28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (e->renderStyle())
28038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    e->renderStyle()->setAffectedByDragRules(true);
28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e->renderer() && e->renderer()->isDragging())
28058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFocus:
2809dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                if (e && e->focused() && e->document()->frame() && e->document()->frame()->selection()->isFocusedAndActive())
28108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoHover: {
28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then hover should never match anchors with no
28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:hover should not match anything.  This is important for sites like wsj.com.
28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByHoverRules(true);
28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByHoverRules(true);
28208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->hovered())
28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoActive:
28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If we're in quirks mode, then :active should never match anchors with no
28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // href and *:active should not match anything.
28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_strictParsing || isSubSelector || (sel->hasTag() && !e->hasTagName(aTag)) || e->isLink()) {
28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (elementStyle)
28308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        elementStyle->setAffectedByActiveRules(true);
28318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    else if (e->renderStyle())
28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        e->renderStyle()->setAffectedByActiveRules(true);
28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (e->active())
28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return true;
28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoEnabled:
2838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return e->isEnabledFormControl();
28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoFullPageMedia:
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return e && e->document() && e->document()->isMediaDocument();
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
2844231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSSelector::PseudoDefault:
2845231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return e && e->isDefaultButtonForForm();
28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoDisabled:
2847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (e && e->isFormControlElement())
28485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    return !e->isEnabledFormControl();
28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadOnly: {
28518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && e->isReadOnlyFormControl();
28548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoReadWrite: {
28568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return false;
28585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                return e->isTextFormControl() && !e->isReadOnlyFormControl();
28598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoOptional:
28610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isOptionalFormControl();
28620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSSelector::PseudoRequired:
28630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return e && e->isRequiredFormControl();
2864d0825bca7fe65beaee391d30da42e937db621564Steve Block            case CSSSelector::PseudoValid: {
2865d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2866d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2867d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
2868d0825bca7fe65beaee391d30da42e937db621564Steve Block                return e->willValidate() && e->isValidFormControlElement();
2869d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoInvalid: {
2870d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (!e)
2871d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return false;
2872d0825bca7fe65beaee391d30da42e937db621564Steve Block                e->document()->setContainsValidityStyleRules();
28735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return (e->willValidate() && !e->isValidFormControlElement()) || e->hasUnacceptableValue();
2874d0825bca7fe65beaee391d30da42e937db621564Steve Block            } case CSSSelector::PseudoChecked: {
28758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Even though WinIE allows checked and indeterminate to co-exist, the CSS selector spec says that
28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // you can't be both checked and indeterminate.  We will behave like WinIE behind the scenes and just
28798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // obey the CSS spec here in the test for matching the pseudo.
28802bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isChecked() && !inputElement->isIndeterminate())
28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            case CSSSelector::PseudoIndeterminate: {
28868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!e || !e->isFormControlElement())
28878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
28882bde8e466a4451c7319e3a072d118917957d6554Steve Block                InputElement* inputElement = e->toInputElement();
28898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (inputElement && inputElement->isIndeterminate())
28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            }
28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoRoot:
28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (e == e->document()->documentElement())
28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return true;
28968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoLang: {
28985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                AtomicString value = e->computeInheritedLanguage();
2899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                const AtomicString& argument = sel->argument();
2900f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                if (value.isEmpty() || !value.startsWith(argument, false))
29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
2902635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (value.length() != argument.length() && value[argument.length()] != '-')
29038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
29048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return true;
29058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
29065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
29075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreen:
29085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, and the document's current fullscreen
29095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // element is an element in the document, the 'full-screen' pseudoclass applies to
29105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // that element. Also, an <iframe>, <object> or <embed> element whose child browsing
29115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // context's Document is in the fullscreen state has the 'full-screen' pseudoclass applied.
2912cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (e != e->document()->webkitCurrentFullScreenElement())
29155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSSelector::PseudoFullScreenDocument:
29185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                // While a Document is in the fullscreen state, the 'full-screen-document' pseudoclass applies
2919cad810f21b803229eb11403f9209855525a25d57Steve Block                // to all elements of that Document.
2920cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e->document()->webkitIsFullScreen())
29215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    return false;
29225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                return true;
29235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
2924cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoInRange:
2925cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2926cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2927cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2928cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isInRange();
2929cad810f21b803229eb11403f9209855525a25d57Steve Block            case CSSSelector::PseudoOutOfRange:
2930cad810f21b803229eb11403f9209855525a25d57Steve Block                if (!e)
2931cad810f21b803229eb11403f9209855525a25d57Steve Block                    return false;
2932cad810f21b803229eb11403f9209855525a25d57Steve Block                e->document()->setContainsValidityStyleRules();
2933cad810f21b803229eb11403f9209855525a25d57Steve Block                return e->isOutOfRange();
29348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoUnknown:
29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSSelector::PseudoNotParsed:
29368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::PseudoElement) {
2943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!elementStyle && !m_collectRulesOnly)
29448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
29458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PseudoId pseudoId = CSSSelector::pseudoId(sel->pseudoType());
2947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (pseudoId == FIRST_LETTER) {
2948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (Document* document = e->document())
2949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                document->setUsesFirstLetterRules(true);
2950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
295165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (pseudoId != NOPSEUDO)
2952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            dynamicPseudo = pseudoId;
29538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ### add the rest of the checks...
29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool CSSStyleSelector::SelectorChecker::checkScrollbarPseudoClass(CSSSelector* sel, PseudoId&) const
29598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderScrollbar* scrollbar = RenderScrollbar::scrollbarForStyleResolve();
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScrollbarPart part = RenderScrollbar::partForStyleResolve();
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This is a temporary hack for resizers and scrollbar corners.  Eventually :window-inactive should become a real
29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // pseudo class and just apply to everything.
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->pseudoType() == CSSSelector::PseudoWindowInactive)
29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return !m_document->page()->focusController()->isActive();
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!scrollbar)
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(sel->m_match == CSSSelector::PseudoClass);
29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (sel->pseudoType()) {
29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnabled:
29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->enabled();
29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDisabled:
29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return !scrollbar->enabled();
29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHover: {
29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart hoveredPart = scrollbar->hoveredPart();
29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart != NoPart;
29818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return hoveredPart == BackTrackPart || hoveredPart == ForwardTrackPart || hoveredPart == ThumbPart;
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == hoveredPart;
29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoActive: {
29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarPart pressedPart = scrollbar->pressedPart();
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ScrollbarBGPart)
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart != NoPart;
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == TrackBGPart)
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return pressedPart == BackTrackPart || pressedPart == ForwardTrackPart || pressedPart == ThumbPart;
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == pressedPart;
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoHorizontal:
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == HorizontalScrollbar;
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoVertical:
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return scrollbar->orientation() == VerticalScrollbar;
29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDecrement:
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == BackButtonEndPart || part == BackTrackPart;
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoIncrement:
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == ForwardButtonStartPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoStart:
30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart;
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoEnd:
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart;
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoDoubleButton: {
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonStartPart || part == BackTrackPart)
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleStart || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonEndPart || part == ForwardButtonEndPart || part == ForwardTrackPart)
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsDoubleEnd || buttonsPlacement == ScrollbarButtonsDoubleBoth;
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoSingleButton: {
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackButtonStartPart || part == ForwardButtonEndPart || part == BackTrackPart || part == ForwardTrackPart)
30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsSingle;
30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoNoButton: {
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScrollbarButtonsPlacement buttonsPlacement = scrollbar->theme()->buttonsPlacement();
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == BackTrackPart)
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleEnd;
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (part == ForwardTrackPart)
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return buttonsPlacement == ScrollbarButtonsNone || buttonsPlacement == ScrollbarButtonsDoubleStart;
30258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSSelector::PseudoCornerPresent:
30282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return scrollbar->scrollableArea()->isScrollCornerVisible();
30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -----------------------------------------------------------------
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30362fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* selector)
30372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& selectorNamespace = selector->tag().namespaceURI();
30392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selectorNamespace != starAtom && selectorNamespace != xhtmlNamespaceURI)
30402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match == CSSSelector::None)
30422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
30432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (selector->m_match != CSSSelector::Id && selector->m_match != CSSSelector::Class)
30442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
30452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return selector->tag() == starAtom;
30462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30482fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleData::RuleData(CSSStyleRule* rule, CSSSelector* selector, unsigned position)
30492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    : m_rule(rule)
30502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_selector(selector)
305181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_specificity(selector->specificity())
30522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_position(position)
30532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasFastCheckableSelector(isFastCheckableSelector(selector))
30542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasMultipartSelector(selector->tagHistory())
30552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_hasTopSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector))
30562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    collectDescendantSelectorIdentifierHashes();
30582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30602fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectIdentifierHashes(const CSSSelector* selector, unsigned& identifierCount)
30612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ((selector->m_match == CSSSelector::Id || selector->m_match == CSSSelector::Class) && !selector->value().isEmpty())
30632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = selector->value().impl()->existingHash();
30642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (identifierCount == maximumIdentifierCount)
30652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
30662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = selector->tag().localName();
30672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (localName != starAtom)
30682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_descendantSelectorIdentifierHashes[identifierCount++] = localName.impl()->existingHash();
30692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
30702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30712fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline void RuleData::collectDescendantSelectorIdentifierHashes()
30722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
30732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned identifierCount = 0;
30742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CSSSelector::Relation relation = m_selector->relation();
30752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
30762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Skip the topmost selector. It is handled quickly by the rule hashes.
30772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool skipOverSubselectors = true;
30782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (const CSSSelector* selector = m_selector->tagHistory(); selector; selector = selector->tagHistory()) {
30792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Only collect identifiers that match ancestors.
30802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        switch (relation) {
30812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::SubSelector:
30822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!skipOverSubselectors)
30832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                collectIdentifierHashes(selector, identifierCount);
30842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::DirectAdjacent:
30862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::IndirectAdjacent:
30872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::ShadowDescendant:
30882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = true;
30892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Descendant:
30912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        case CSSSelector::Child:
30922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            skipOverSubselectors = false;
30932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            collectIdentifierHashes(selector, identifierCount);
30942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            break;
30952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
30962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (identifierCount == maximumIdentifierCount)
30972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return;
30982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        relation = selector->relation();
30992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
31002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_descendantSelectorIdentifierHashes[identifierCount] = 0;
31012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
31022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
31032fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::RuleSet()
31045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    : m_ruleCount(0)
31052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    , m_autoShrinkToFitEnabled(true)
31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31092fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockRuleSet::~RuleSet()
31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_idRules);
31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_classRules);
31132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    deleteAllValues(m_pseudoRules);
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    deleteAllValues(m_tagRules);
31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31182fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,
31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                              CSSStyleRule* rule, CSSSelector* sel)
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!key) return;
31222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Vector<RuleData>* rules = map.get(key);
31238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!rules) {
31242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        rules = new Vector<RuleData>;
31258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        map.set(key, rules);
31262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
31272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    rules->append(RuleData(rule, sel, m_ruleCount++));
31288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31302fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRule(CSSStyleRule* rule, CSSSelector* sel)
31318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Id) {
31332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_idRules, rule, sel);
31348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sel->m_match == CSSSelector::Class) {
31372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_classRules, rule, sel);
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
314165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (sel->isUnknownPseudoElement()) {
31422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addToRuleSet(sel->value().impl(), m_pseudoRules, rule, sel);
314365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
314465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
314565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const AtomicString& localName = sel->tag().localName();
31478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (localName != starAtom) {
31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addToRuleSet(localName.impl(), m_tagRules, rule, sel);
31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
315165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
31522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.append(RuleData(rule, sel, m_ruleCount++));
31538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31552fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addPageRule(CSSStyleRule* rule, CSSSelector* sel)
315621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
31572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.append(RuleData(rule, sel, m_pageRules.size()));
315821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
315921939df44de1705786c545cd1bf519d47250322dBen Murdoch
31602fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addRulesFromSheet(CSSStyleSheet* sheet, const MediaQueryEvaluator& medium, CSSStyleSelector* styleSelector)
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sheet)
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // No media implies "all", but if a media list exists it must
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // contain our current medium
31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (sheet->media() && !medium.eval(sheet->media(), styleSelector))
31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return; // the style sheet doesn't apply
31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int len = sheet->length();
31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < len; i++) {
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StyleBase* item = sheet->item(i);
31746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (item->isStyleRule())
31756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            addStyleRule(static_cast<CSSStyleRule*>(item));
31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isImportRule()) {
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSImportRule* import = static_cast<CSSImportRule*>(item);
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!import->media() || medium.eval(import->media(), styleSelector))
31798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                addRulesFromSheet(import->styleSheet(), medium, styleSelector);
31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (item->isMediaRule()) {
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSMediaRule* r = static_cast<CSSMediaRule*>(item);
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSRuleList* rules = r->cssRules();
31848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((!r->media() || medium.eval(r->media(), styleSelector)) && rules) {
31868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Traverse child elements of the @media rule.
31878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned j = 0; j < rules->length(); j++) {
31888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    CSSRule *childItem = rules->item(j);
31898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (childItem->isStyleRule()) {
31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // It is a StyleRule, so append it to our list
31916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        addStyleRule(static_cast<CSSStyleRule*>(childItem));
31928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isFontFaceRule() && styleSelector) {
31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this font face to our set.
31948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(childItem);
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
31968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    } else if (childItem->isKeyframesRule() && styleSelector) {
31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        // Add this keyframe rule to our set.
31988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(childItem));
31998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }   // for rules
32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }   // if rules
32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isFontFaceRule() && styleSelector) {
32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Add this font face to our set.
32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSFontFaceRule* fontFaceRule = static_cast<CSSFontFaceRule*>(item);
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->fontSelector()->addFontFaceRule(fontFaceRule);
32068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (item->isKeyframesRule())
32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            styleSelector->addKeyframeStyle(static_cast<WebKitCSSKeyframesRule*>(item));
32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_autoShrinkToFitEnabled)
32102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        shrinkToFit();
32118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32132fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::addStyleRule(CSSStyleRule* rule)
3214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
32156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (rule->isPageRule()) {
32166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPageRule* pageRule = static_cast<CSSPageRule*>(rule);
3217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        addPageRule(pageRule, pageRule->selectorList().first());
3218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else {
3219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s))
3220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            addRule(rule, s);
3221545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
3222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
322381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
322481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic inline void collectFeaturesFromSelector(CSSStyleSelector::Features& features, const CSSSelector* selector)
322581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
322681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (selector->m_match == CSSSelector::Id && !selector->value().isEmpty())
322781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.idsInRules.add(selector->value().impl());
322881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    switch (selector->pseudoType()) {
322981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoFirstLine:
323081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesFirstLineRules = true;
323181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoBefore:
323381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoAfter:
323481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesBeforeAfterRules = true;
323581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
323681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoLink:
323781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSSelector::PseudoVisited:
323881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        features.usesLinkRules = true;
323981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
324081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    default:
324181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        break;
324281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
324381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
3244545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
324581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void collectFeaturesFromList(CSSStyleSelector::Features& features, const Vector<RuleData>& rules)
3246ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
32472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules.size();
32482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
32492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules[i];
3250ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        bool foundSiblingSelector = false;
32512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        for (CSSSelector* selector = ruleData.selector(); selector; selector = selector->tagHistory()) {
325281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            collectFeaturesFromSelector(features, selector);
32532bde8e466a4451c7319e3a072d118917957d6554Steve Block
32542bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (CSSSelectorList* selectorList = selector->selectorList()) {
32552bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (CSSSelector* subSelector = selectorList->first(); subSelector; subSelector = CSSSelectorList::next(subSelector)) {
32562bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (selector->isSiblingSelector())
32572bde8e466a4451c7319e3a072d118917957d6554Steve Block                        foundSiblingSelector = true;
32582bde8e466a4451c7319e3a072d118917957d6554Steve Block                    collectFeaturesFromSelector(features, subSelector);
32592bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
32602bde8e466a4451c7319e3a072d118917957d6554Steve Block            } else if (selector->isSiblingSelector())
3261ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                foundSiblingSelector = true;
3262ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3263ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (foundSiblingSelector) {
326481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!features.siblingRules)
326581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                features.siblingRules = adoptPtr(new RuleSet);
326681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            features.siblingRules->addRule(ruleData.rule(), ruleData.selector());
3267ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3268ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
3269ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
327181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid RuleSet::collectFeatures(CSSStyleSelector::Features& features) const
3272ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
3273ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    AtomRuleMap::const_iterator end = m_idRules.end();
3274ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_idRules.begin(); it != end; ++it)
327581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3276ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_classRules.end();
3277ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_classRules.begin(); it != end; ++it)
327881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3279ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_tagRules.end();
3280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_tagRules.begin(); it != end; ++it)
328181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
3282ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    end = m_pseudoRules.end();
3283ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    for (AtomRuleMap::const_iterator it = m_pseudoRules.begin(); it != end; ++it)
328481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        collectFeaturesFromList(features, *it->second);
328581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    collectFeaturesFromList(features, m_universalRules);
32862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32882fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic inline void shrinkMapVectorsToFit(RuleSet::AtomRuleMap& map)
32892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RuleSet::AtomRuleMap::iterator end = map.end();
32912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (RuleSet::AtomRuleMap::iterator it = map.begin(); it != end; ++it)
32922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        it->second->shrinkToFit();
32932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
32942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32952fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid RuleSet::shrinkToFit()
32962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
32972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_idRules);
32982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_classRules);
32992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_tagRules);
33002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    shrinkMapVectorsToFit(m_pseudoRules);
33012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_universalRules.shrinkToFit();
33022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_pageRules.shrinkToFit();
3303ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3304ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
33058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------------------------------------------------------------------------------------
33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// this is mostly boring stuff on how to apply a certain rule to the renderstyle...
33078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33082bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, bool toFloat, double multiplier = 1, bool *ok = 0)
33098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This function is tolerant of a null style value. The only place style is used is in
3311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // length measurements, like 'ems' and 'px'. And in those cases style is only used
3312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // when the units are EMS or EXS. So we will just fail in those cases.
33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!primitiveValue) {
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ok)
33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
3319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!style && (type == CSSPrimitiveValue::CSS_EMS || type == CSSPrimitiveValue::CSS_EXS || type == CSSPrimitiveValue::CSS_REMS)) {
3321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (ok)
3322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                *ok = false;
33232bde8e466a4451c7319e3a072d118917957d6554Steve Block        } else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
33242bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (toFloat)
33252bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthDouble(style, rootStyle, multiplier), Fixed);
33262bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
33272bde8e466a4451c7319e3a072d118917957d6554Steve Block                l = Length(primitiveValue->computeLengthIntForLength(style, rootStyle, multiplier), Fixed);
33282bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ok)
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *ok = false;
33358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return l;
33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33382bde8e466a4451c7319e3a072d118917957d6554Steve Block
33392bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToIntLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33402bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33412bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, false, multiplier, ok);
33422bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33432bde8e466a4451c7319e3a072d118917957d6554Steve Block
33442bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic Length convertToFloatLength(CSSPrimitiveValue* primitiveValue, RenderStyle* style, RenderStyle* rootStyle, double multiplier = 1, bool *ok = 0)
33452bde8e466a4451c7319e3a072d118917957d6554Steve Block{
33462bde8e466a4451c7319e3a072d118917957d6554Steve Block    return convertToLength(primitiveValue, style, rootStyle, true, multiplier, ok);
33472bde8e466a4451c7319e3a072d118917957d6554Steve Block}
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
334921939df44de1705786c545cd1bf519d47250322dBen Murdochtemplate <bool applyFirst>
335021939df44de1705786c545cd1bf519d47250322dBen Murdochvoid CSSStyleSelector::applyDeclarations(bool isImportant, int startIndex, int endIndex)
33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (startIndex == -1)
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = startIndex; i <= endIndex; i++) {
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSMutableStyleDeclaration* decl = m_matchedDecls[i];
3357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CSSMutableStyleDeclaration::const_iterator end = decl->end();
3358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (CSSMutableStyleDeclaration::const_iterator it = decl->begin(); it != end; ++it) {
33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const CSSProperty& current = *it;
33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isImportant == current.isImportant()) {
336121939df44de1705786c545cd1bf519d47250322dBen Murdoch                int property = current.id();
336221939df44de1705786c545cd1bf519d47250322dBen Murdoch
336321939df44de1705786c545cd1bf519d47250322dBen Murdoch                if (applyFirst) {
336421939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(firstCSSProperty == CSSPropertyColor, CSS_color_is_first_property);
33652bde8e466a4451c7319e3a072d118917957d6554Steve Block                    COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyColor + 14, CSS_zoom_is_end_of_first_prop_range);
336621939df44de1705786c545cd1bf519d47250322dBen Murdoch                    COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyZoom + 1, CSS_line_height_is_after_zoom);
336721939df44de1705786c545cd1bf519d47250322dBen Murdoch
336821939df44de1705786c545cd1bf519d47250322dBen Murdoch                    // give special priority to font-xxx, color properties, etc
336921939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property <= CSSPropertyLineHeight) {
337021939df44de1705786c545cd1bf519d47250322dBen Murdoch                        // we apply line-height later
337121939df44de1705786c545cd1bf519d47250322dBen Murdoch                        if (property == CSSPropertyLineHeight)
337221939df44de1705786c545cd1bf519d47250322dBen Murdoch                            m_lineHeightValue = current.value();
337321939df44de1705786c545cd1bf519d47250322dBen Murdoch                        else
337421939df44de1705786c545cd1bf519d47250322dBen Murdoch                            applyProperty(current.id(), current.value());
337521939df44de1705786c545cd1bf519d47250322dBen Murdoch                    }
337621939df44de1705786c545cd1bf519d47250322dBen Murdoch                } else {
337721939df44de1705786c545cd1bf519d47250322dBen Murdoch                    if (property > CSSPropertyLineHeight)
337821939df44de1705786c545cd1bf519d47250322dBen Murdoch                        applyProperty(current.id(), current.value());
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
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
33852fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRules(RuleSet* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
338606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
338706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_matchedRules.clear();
338806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
338906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
339006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
339106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    matchPageRulesForList(rules->getPageRules(), isLeftPage, isFirstPage, pageName);
339306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // If we didn't match any rules, we're done.
339506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (m_matchedRules.isEmpty())
339606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
339706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
339806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Sort the set of matched rules.
339981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    sortMatchedRules();
340006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
340106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Now transfer the set of matched rules over to our list of decls.
340206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    for (unsigned i = 0; i < m_matchedRules.size(); i++)
340306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
340406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
340506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34062fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CSSStyleSelector::matchPageRulesForList(const Vector<RuleData>* rules, bool isLeftPage, bool isFirstPage, const String& pageName)
340706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
340806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!rules)
340906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
341006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    unsigned size = rules->size();
34122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    for (unsigned i = 0; i < size; ++i) {
34132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const RuleData& ruleData = rules->at(i);
34142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSStyleRule* rule = ruleData.rule();
34152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        const AtomicString& selectorLocalName = ruleData.selector()->tag().localName();
341606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (selectorLocalName != starAtom && selectorLocalName != pageName)
341706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
34182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CSSSelector::PseudoType pseudoType = ruleData.selector()->pseudoType();
341906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ((pseudoType == CSSSelector::PseudoLeftPage && !isLeftPage)
342006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoRightPage && isLeftPage)
342106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            || (pseudoType == CSSSelector::PseudoFirstPage && !isFirstPage))
342206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
342406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // If the rule has no properties to apply, then ignore it.
342506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSMutableStyleDeclaration* decl = rule->declaration();
342606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!decl || !decl->length())
342706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            continue;
342806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
342906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // Add this rule to our list of matched rules.
34302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        addMatchedRule(&ruleData);
343106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
343206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
343306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
343406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isLeftPage(int pageIndex) const
343506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
343606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool isFirstPageLeft = false;
3437a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_rootElementStyle->isLeftToRightDirection())
343806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        isFirstPageLeft = true;
343906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (pageIndex + (isFirstPageLeft ? 1 : 0)) % 2;
344106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
344206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::isFirstPage(int pageIndex) const
344406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
344506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: In case of forced left/right page, page at index 1 (not 0) can be the first page.
344606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return (!pageIndex);
344706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
344806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
344906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenString CSSStyleSelector::pageName(int /* pageIndex */) const
345006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
345106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: Implement page index to page name mapping.
345206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return "";
345306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
345406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
34558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void applyCounterList(RenderStyle* style, CSSValueList* list, bool isReset)
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CounterDirectiveMap& map = style->accessCounterDirectives();
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef CounterDirectiveMap::iterator Iterator;
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Iterator end = map.end();
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Iterator it = map.begin(); it != end; ++it)
34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset)
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_reset = false;
34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second.m_increment = false;
34668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int length = list ? list->length() : 0;
34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < length; ++i) {
34696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
34706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isPrimitiveValue())
34716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        Pair* pair = static_cast<CSSPrimitiveValue*>(currValue)->getPairValue();
34746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
34756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
34766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        AtomicString identifier = static_cast<CSSPrimitiveValue*>(pair->first())->getStringValue();
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: What about overflow?
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = static_cast<CSSPrimitiveValue*>(pair->second())->getIntValue();
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CounterDirectives& directives = map.add(identifier.impl(), CounterDirectives()).first->second;
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isReset) {
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_reset = true;
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directives.m_resetValue = value;
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (directives.m_increment)
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue += value;
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else {
34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_increment = true;
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                directives.m_incrementValue = value;
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
34918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyPropertyToStyle(int id, CSSValue *value, RenderStyle* style)
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initElement(0);
34988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initForStyleResolve(0, style);
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style = style;
350028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (value)
350128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        applyProperty(id, value);
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monseninline bool isValidVisitedLinkProperty(int id)
35056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
35066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    switch(static_cast<CSSPropertyID>(id)) {
35076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackgroundColor:
35086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeftColor:
35096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRightColor:
35106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTopColor:
35116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottomColor:
35126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyColor:
35136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutlineColor:
35146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRuleColor:
3515f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        case CSSPropertyWebkitTextEmphasisColor:
35166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextFillColor:
35176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitTextStrokeColor:
35186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Also allow shorthands so that inherit/initial still work.
35196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBackground:
35206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderLeft:
35216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderRight:
35226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderTop:
35236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyBorderBottom:
35246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyOutline:
35256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyWebkitColumnRule:
35266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(SVG)
35276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyFill:
35286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        case CSSPropertyStroke:
35296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
35306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return true;
35316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        default:
35326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            break;
35336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return false;
35366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
35376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// SVG handles zooming in a different way compared to CSS. The whole document is scaled instead
35392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// of each individual length value in the render style / tree. CSSPrimitiveValue::computeLength*()
35402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// multiplies each resolved length with the zoom multiplier - so for SVG we need to disable that.
35412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// Though all CSS values that can be applied to outermost <svg> elements (width/height/border/padding...)
35422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// need to respect the scaling. RenderBox (the parent class of RenderSVGRoot) grabs values like
35432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// width/height/border/padding/... from the RenderStyle -> for SVG these values would never scale,
35442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// if we'd pass a 1.0 zoom factor everyhwere. So we only pass a zoom factor of 1.0 for specific
35452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// properties that are NOT allowed to scale within a zoomed SVG document (letter/word-spacing/font-size).
35462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic inline bool useSVGZoomRules(const Element* e)
35472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
35482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return e && e->isSVGElement();
35492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
35502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::applyProperty(int id, CSSValue *value)
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = 0;
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue())
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        primitiveValue = static_cast<CSSPrimitiveValue*>(value);
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool apply = false;
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned short valueType = value->cssValueType();
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInherit = m_parentNode && valueType == CSSValue::CSS_INHERIT;
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isInitial = valueType == CSSValue::CSS_INITIAL || (!m_parentNode && valueType == CSSValue::CSS_INHERIT);
35668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3567a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    id = CSSProperty::resolveDirectionAwareProperty(id, m_style->direction(), m_style->writingMode());
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (m_checker.m_matchVisitedPseudoClass && !isValidVisitedLinkProperty(id)) {
35706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Limit the properties that can be applied to only the ones honored by :visited.
35716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
35726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
35736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
35742bde8e466a4451c7319e3a072d118917957d6554Steve Block    CSSPropertyID property = static_cast<CSSPropertyID>(id);
35752bde8e466a4451c7319e3a072d118917957d6554Steve Block
35762bde8e466a4451c7319e3a072d118917957d6554Steve Block    // check lookup table for implementations and use when available
35772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_applyProperty.implements(property)) {
35782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (isInherit)
35792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInheritValue(property, this);
35802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else if (isInitial)
35812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyInitialValue(property, this);
35822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
35832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            m_applyProperty.applyValue(property, this, value);
35842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
35852bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
35862bde8e466a4451c7319e3a072d118917957d6554Steve Block
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // What follows is a list that maps the CSS properties into their corresponding front-end
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // RenderStyle values.  Shorthands (e.g. border, background) occur in this list as well and
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // are only hit when mapping "inherit" or "initial" into front-end values.
35905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    switch (property) {
35918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ident only properties
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderCollapse:
35938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderCollapse, BorderCollapse)
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
35958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueCollapse:
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(true);
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueSeparate:
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderCollapse(false);
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
36048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineStyle:
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(outlineStyle, OutlineStyle, BorderStyle)
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent() == CSSValueAuto)
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(DOTTED, true);
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setOutlineStyle(*primitiveValue);
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCaptionSide:
36175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(captionSide, CaptionSide)
36188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClear:
36205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(clear, Clear)
36218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyDisplay:
36235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(display, Display)
3624231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
3625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue) {
3626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (primitiveValue->getIdent() == CSSValueWapMarquee) {
3627d0825bca7fe65beaee391d30da42e937db621564Steve Block                // Initialize WAP Marquee style
3628231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowX(OMARQUEE);
3629231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setOverflowY(OMARQUEE);
3630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setWhiteSpace(NOWRAP);
3631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
3632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeSpeed(85); // Normal speed
3633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeLoopCount(1);
3634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeBehavior(MSCROLL);
3635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                if (m_parentStyle)
3637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(m_parentStyle->display());
3638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                else
3639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    m_style->setDisplay(*primitiveValue);
3640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            } else
3641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setDisplay(*primitiveValue);
3642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
36448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyEmptyCells:
36465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(emptyCells, EmptyCells)
36478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFloat:
36495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(floating, Floating)
36508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStyle:
36528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(m_parentStyle->fontDescription().italic());
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setItalic(false);
36588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueOblique:
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // FIXME: oblique is the same as italic for the moment...
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueItalic:
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(true);
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setItalic(false);
36698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
36718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
36768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
36778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontVariant:
36808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(m_parentStyle->fontDescription().smallCaps());
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setSmallCaps(false);
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int id = primitiveValue->getIdent();
36908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSValueNormal)
36918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(false);
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (id == CSSValueSmallCaps)
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setSmallCaps(true);
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
36968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
36998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
37008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontWeight:
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit)
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(m_parentStyle->fontDescription().weight());
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setWeight(FontWeightNormal);
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getIdent()) {
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBolder:
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.bolderWeight());
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLighter:
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(fontDescription.lighterWeight());
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBold:
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue700:
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightBold);
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNormal:
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue400:
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeightNormal);
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue900:
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight900);
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue800:
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight800);
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue600:
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight600);
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue500:
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight500);
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue300:
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight300);
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue200:
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight200);
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValue100:
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setWeight(FontWeight100);
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT_NOT_REACHED();
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStylePosition:
37615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStylePosition, ListStylePosition)
37628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleType:
37645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(listStyleType, ListStyleType)
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakBefore:
37675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakBefore, PageBreakBefore, PageBreak)
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakAfter:
37705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(pageBreakAfter, PageBreakAfter, PageBreak)
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPageBreakInside: {
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(pageBreakInside, PageBreakInside, PageBreak)
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
37768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pageBreak = *primitiveValue;
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pageBreak != PBALWAYS)
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPageBreakInside(pageBreak);
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPosition:
37835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(position, Position)
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTableLayout: {
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(tableLayout, TableLayout)
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ETableLayout l = *primitiveValue;
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (l == TAUTO)
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = RenderStyle::initialTableLayout();
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTableLayout(l);
37938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyUnicodeBidi:
37975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(unicodeBidi, UnicodeBidi)
37988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyTextTransform:
38005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textTransform, TextTransform)
38018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVisibility:
38035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(visibility, Visibility)
38048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWhiteSpace:
38065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(whiteSpace, WhiteSpace)
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderSpacing: {
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(m_parentStyle->horizontalBorderSpacing());
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(m_parentStyle->verticalBorderSpacing());
38128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHorizontalBorderSpacing(0);
38158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setVerticalBorderSpacing(0);
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderHorizontalSpacing: {
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(horizontalBorderSpacing, HorizontalBorderSpacing)
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHorizontalBorderSpacing(spacing);
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderVerticalSpacing: {
38288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalBorderSpacing, VerticalBorderSpacing)
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
38308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        short spacing = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
38328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVerticalBorderSpacing(spacing);
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCursor:
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(m_parentStyle->cursor());
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursorList(m_parentStyle->cursors());
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->clearCursorList();
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(RenderStyle::initialCursor());
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value->isValueList()) {
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList* list = static_cast<CSSValueList*>(value);
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setCursor(CURSOR_AUTO);
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++) {
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue* item = list->itemWithoutBoundsCheck(i);
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!item->isPrimitiveValue())
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
38548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int type = primitiveValue->primitiveType();
38568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (type == CSSPrimitiveValue::CSS_URI) {
38576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (primitiveValue->isCursorImageValue()) {
38586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        CSSCursorImageValue* image = static_cast<CSSCursorImageValue*>(primitiveValue);
38596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (image->updateIfSVGCursorIsUsed(m_element)) // Elements with SVG cursors are not allowed to share style.
38606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            m_style->setUnique();
38616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        m_style->addCursor(cachedOrPendingFromValue(CSSPropertyCursor, image), image->hotSpot());
38626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    }
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else if (type == CSSPrimitiveValue::CSS_IDENT)
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setCursor(*primitiveValue);
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
3868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_IDENT && m_style->cursor() != ECursor(*primitiveValue))
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setCursor(*primitiveValue);
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// uri || inherit
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyleImage:
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(listStyleImage, ListStyleImage)
38775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_style->setListStyleImage(styleImage(CSSPropertyListStyleImage, value));
38788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTopWidth:
38838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRightWidth:
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottomWidth:
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeftWidth:
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineWidth:
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleWidth:
38888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderTopWidth, borderTopWidth, BorderTopWidth)
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderRightWidth, borderRightWidth, BorderRightWidth)
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderBottomWidth, borderBottomWidth, BorderBottomWidth)
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBorderLeftWidth, borderLeftWidth, BorderLeftWidth)
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyOutlineWidth, outlineWidth, OutlineWidth)
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitColumnRuleWidth, columnRuleWidth, ColumnRuleWidth)
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopWidth, BorderTopWidth, BorderWidth)
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderRightWidth, BorderRightWidth, BorderWidth)
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomWidth, BorderBottomWidth, BorderWidth)
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderLeftWidth, BorderLeftWidth, BorderWidth)
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyOutlineWidth, OutlineWidth, BorderWidth)
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitColumnRuleWidth, ColumnRuleWidth, BorderWidth)
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short width = 3;
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThin:
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 1;
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMedium:
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 3;
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThick:
39198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 5;
39208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInvalid:
39220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            width = primitiveValue->computeLengthShort(style(), m_rootElementStyle, zoomFactor);
39238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0) return;
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderTopWidth:
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(width);
39328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderRightWidth:
39348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(width);
39358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderBottomWidth:
39378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(width);
39388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyBorderLeftWidth:
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(width);
39418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyOutlineWidth:
39438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(width);
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWebkitColumnRuleWidth:
39468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(width);
39478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
39488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
39498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
39528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3954231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitFontSmoothing: {
3955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
3956231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
3957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(m_parentStyle->fontDescription().fontSmoothing());
3958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
3959231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(AutoSmoothing);
3960231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
3961231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
3962231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
3963231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            int id = primitiveValue->getIdent();
3964231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            FontSmoothingMode smoothing;
3965231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (id) {
3966231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAuto:
3967231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3968231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3969231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueNone:
3970231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = NoSmoothing;
3971231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3972231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueAntialiased:
3973231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = Antialiased;
3974231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3975231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                case CSSValueSubpixelAntialiased:
3976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = SubpixelAntialiased;
3977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    break;
3978231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                default:
3979231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    ASSERT_NOT_REACHED();
3980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    smoothing = AutoSmoothing;
3981231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
3982231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setFontSmoothing(smoothing);
3983231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3984231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
3985231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
3986231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
3987231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
3988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
39898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLetterSpacing:
39908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWordSpacing:
39918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
39928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
39938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLetterSpacing, letterSpacing, LetterSpacing)
39948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWordSpacing, wordSpacing, WordSpacing)
39958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
39968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
39988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLetterSpacing, LetterSpacing, LetterWordSpacing)
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWordSpacing, WordSpacing, LetterWordSpacing)
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
40018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int width = 0;
40040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNormal) {
40058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            width = 0;
40068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
40078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!primitiveValue)
40088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
40092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            width = primitiveValue->computeLengthInt(style(), m_rootElementStyle, useSVGZoomRules(m_element) ? 1.0f : zoomFactor);
40108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
40128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyLetterSpacing:
40138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLetterSpacing(width);
40148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSPropertyWordSpacing:
40168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setWordSpacing(width);
40178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
40188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // ### needs the definitions in renderstyle
40198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: break;
40208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordBreak:
40255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordBreak, WordBreak)
40268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWordWrap:
40285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(wordWrap, WordWrap)
40298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitNbspMode:
40315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(nbspMode, NBSPMode)
40328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineBreak:
40345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(khtmlLineBreak, KHTMLLineBreak)
40358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMatchNearestMailBlockquoteColor:
40375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(matchNearestMailBlockquoteColor, MatchNearestMailBlockquoteColor)
40388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyResize:
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(resize, Resize)
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue->getIdent())
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EResize r = RESIZE_NONE;
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueAuto) {
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (Settings* settings = m_checker.m_document->settings())
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                r = settings->textAreasAreResizable() ? RESIZE_BOTH : RESIZE_NONE;
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
40528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            r = *primitiveValue;
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setResize(r);
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // length, percent
40598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxWidth:
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +none +inherit
406181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
406281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            l = Length(undefinedLength, Fixed);
40638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
406481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
40658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTop:
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLeft:
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyRight:
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBottom:
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidth:
40708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinWidth:
40718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginTop:
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginRight:
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginBottom:
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMarginLeft:
40758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit +auto
40768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWidth || id == CSSPropertyMinWidth || id == CSSPropertyMaxWidth) {
40778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
40788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(Intrinsic);
40798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
40828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(MinIntrinsic);
40838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                apply = true;
40848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
40858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
40868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id != CSSPropertyMaxWidth && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
40888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingTop:
40898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingRight:
40908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingBottom:
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPaddingLeft:
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextIndent:
40938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // +inherit
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxWidth, maxWidth, MaxWidth)
40978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyBottom, bottom, Bottom)
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTop, top, Top)
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyLeft, left, Left)
41008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyRight, right, Right)
41018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWidth, width, Width)
41028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinWidth, minWidth, MinWidth)
41038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingTop, paddingTop, PaddingTop)
41048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingRight, paddingRight, PaddingRight)
41058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingBottom, paddingBottom, PaddingBottom)
41068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyPaddingLeft, paddingLeft, PaddingLeft)
41078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginTop, marginTop, MarginTop)
41088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginRight, marginRight, MarginRight)
41098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginBottom, marginBottom, MarginBottom)
41108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMarginLeft, marginLeft, MarginLeft)
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyTextIndent, textIndent, TextIndent)
41128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxWidth, MaxWidth, MaxSize)
41168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBottom, Bottom, Offset)
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyTop, Top, Offset)
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyLeft, Left, Offset)
41198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyRight, Right, Offset)
41208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWidth, Width, Size)
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinWidth, MinWidth, MinSize)
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingTop, PaddingTop, Padding)
41238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingRight, PaddingRight, Padding)
41248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingBottom, PaddingBottom, Padding)
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyPaddingLeft, PaddingLeft, Padding)
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginTop, MarginTop, Margin)
41278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginRight, MarginRight, Margin)
41288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginBottom, MarginBottom, Margin)
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMarginLeft, MarginLeft, Margin)
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND(CSSPropertyTextIndent, TextIndent)
41318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
41358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
41368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
41378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle our quirky margin units if we have them.
41380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed,
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           primitiveValue->isQuirkValue());
41408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
41418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
414406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            apply = true;
41458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
41468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!apply) return;
41478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
41488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMaxWidth:
41498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMaxWidth(l);
41508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyBottom:
41528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBottom(l);
41538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTop:
41558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTop(l);
41568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyLeft:
41588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setLeft(l);
41598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyRight:
41618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setRight(l);
41628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyWidth:
41648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setWidth(l);
41658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMinWidth:
41678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMinWidth(l);
41688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingTop:
41708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingTop(l);
41718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingRight:
41738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingRight(l);
41748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingBottom:
41768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingBottom(l);
41778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyPaddingLeft:
41798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setPaddingLeft(l);
41808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginTop:
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginTop(l);
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginRight:
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginRight(l);
41868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginBottom:
41888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginBottom(l);
41898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyMarginLeft:
41918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setMarginLeft(l);
41928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSPropertyTextIndent:
41948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextIndent(l);
41958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
41978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
41988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
41998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
42018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMaxHeight:
42038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(undefinedLength, Fixed);
42058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyHeight:
42088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMinHeight:
42098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueIntrinsic) {
42108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(Intrinsic);
42118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue && primitiveValue->getIdent() == CSSValueMinIntrinsic) {
42138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(MinIntrinsic);
42148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (id != CSSPropertyMaxHeight && primitiveValue && primitiveValue->getIdent() == CSSValueAuto)
42168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
42188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMaxHeight, maxHeight, MaxHeight)
42198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyHeight, height, Height)
42208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyMinHeight, minHeight, MinHeight)
42218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
42248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMaxHeight, MaxHeight, MaxSize)
42258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyHeight, Height, Size)
42268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyMinHeight, MinHeight, MinSize)
42278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && !apply) {
42318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned short type = primitiveValue->primitiveType();
42328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
42330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l = Length(primitiveValue->getDoubleValue(), Percent);
42368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
42378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
42388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            apply = true;
42398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (apply)
42418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (id) {
42428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMaxHeight:
42438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMaxHeight(l);
42448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyHeight:
42468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setHeight(l);
42478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSPropertyMinHeight:
42498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMinHeight(l);
42508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
42518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyVerticalAlign:
42558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(verticalAlign, VerticalAlign)
42568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
42578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
42588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
42598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          EVerticalAlign align;
42608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          switch (primitiveValue->getIdent()) {
42628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTop:
42638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TOP; break;
42648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBottom:
42658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BOTTOM; break;
42668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMiddle:
42678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = MIDDLE; break;
42688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueBaseline:
42698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE; break;
42708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextBottom:
42718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_BOTTOM; break;
42728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueTextTop:
42738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = TEXT_TOP; break;
42748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSub:
42758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUB; break;
42768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSuper:
42778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = SUPER; break;
42788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitBaselineMiddle:
42798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    align = BASELINE_MIDDLE; break;
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
42828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
42838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(align);
42848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          return;
42858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
42868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          int type = primitiveValue->primitiveType();
42878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          Length l;
42888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian          if (CSSPrimitiveValue::isUnitTypeLength(type))
42890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
42908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
42918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
42928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlign(LENGTH);
42948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          m_style->setVerticalAlignLength(l);
42958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
42968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
42978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontSize:
42998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
43018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setKeywordSize(0);
43028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float oldSize = 0;
43038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float size = 0;
43048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool parentIsAbsoluteSize = false;
43068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_parentNode) {
43078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            oldSize = m_parentStyle->fontDescription().specifiedSize();
43088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            parentIsAbsoluteSize = m_parentStyle->fontDescription().isAbsoluteSize();
43098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            size = oldSize;
43138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentNode)
43148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setKeywordSize(m_parentStyle->fontDescription().keywordSize());
43158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
4316d0825bca7fe65beaee391d30da42e937db621564Steve Block            size = fontSizeForKeyword(m_checker.m_document, CSSValueMedium, fontDescription.useFixedDefaultSize());
43178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
43188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent()) {
43198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Keywords are being used.
43208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
43218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxSmall:
43228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXSmall:
43238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
43248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueMedium:
43258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
43268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXLarge:
43278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueXxLarge:
43288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueWebkitXxxLarge:
4329d0825bca7fe65beaee391d30da42e937db621564Steve Block                    size = fontSizeForKeyword(m_checker.m_document, primitiveValue->getIdent(), fontDescription.useFixedDefaultSize());
43308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    fontDescription.setKeywordSize(primitiveValue->getIdent() - CSSValueXxSmall + 1);
43318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarger:
43335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = largerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmaller:
43365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    size = smallerFontSize(oldSize, m_checker.m_document->inQuirksMode());
43378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
43388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                default:
43398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return;
43408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
43418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize &&
43438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (primitiveValue->getIdent() == CSSValueLarger ||
43448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               primitiveValue->getIdent() == CSSValueSmaller));
43458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
43468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = primitiveValue->primitiveType();
43478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setIsAbsoluteSize(parentIsAbsoluteSize ||
43488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                              (type != CSSPrimitiveValue::CSS_PERCENTAGE &&
43498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               type != CSSPrimitiveValue::CSS_EMS &&
43500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_EXS &&
43510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               type != CSSPrimitiveValue::CSS_REMS));
43528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (CSSPrimitiveValue::isUnitTypeLength(type))
43530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                size = primitiveValue->computeLengthFloat(m_parentStyle, m_rootElementStyle, true);
43548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
43558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size = (primitiveValue->getFloatValue() * oldSize) / 100.0f;
43568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (size < 0)
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        setFontSize(fontDescription, size);
43648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_style->setFontDescription(fontDescription))
43658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_fontDirty = true;
43668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZIndex: {
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
43718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoZIndex())
43728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoZIndex();
43738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
43748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZIndex(m_parentStyle->zIndex());
43758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
43778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoZIndex();
43788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: Should clamp all sorts of other integer properties too.
43822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_style->setZIndex(clampToInteger(primitiveValue->getDoubleValue()));
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWidows:
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(widows, Widows)
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setWidows(primitiveValue->getIntValue());
43918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
43928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOrphans:
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(orphans, Orphans)
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
43988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOrphans(primitiveValue->getIntValue());
44008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// length, percent, number
44048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyLineHeight:
44058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineHeight, LineHeight)
44078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length lineHeight;
44108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
44118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
44128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(-100.0, Percent);
44138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (CSSPrimitiveValue::isUnitTypeLength(type)) {
4414692e5dbf12901edacf14812a6fae25462920af42Steve Block            double multiplier = zoomFactor;
44155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (m_style->textSizeAdjust()) {
441668513a70bcd92384395513322f1b801e7bf9c729Steve Block                if (Frame* frame = m_checker.m_document->frame())
441768513a70bcd92384395513322f1b801e7bf9c729Steve Block                    multiplier *= frame->textZoomFactor();
44185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            }
44190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            lineHeight = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle,  multiplier), Fixed);
44208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length((m_style->fontSize() * primitiveValue->getIntValue()) / 100, Fixed);
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_NUMBER)
44238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            lineHeight = Length(primitiveValue->getDoubleValue() * 100.0, Percent);
44248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
44258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setLineHeight(lineHeight);
44278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// string
44318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextAlign:
44328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textAlign, TextAlign)
44348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
44358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44362bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (primitiveValue->getIdent() == CSSValueWebkitMatchParent) {
44372bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (m_parentStyle->textAlign() == TASTART)
44382bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? LEFT : RIGHT);
44392bde8e466a4451c7319e3a072d118917957d6554Steve Block            else if (m_parentStyle->textAlign() == TAEND)
44402bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->isLeftToRightDirection() ? RIGHT : LEFT);
44412bde8e466a4451c7319e3a072d118917957d6554Steve Block            else
44422bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setTextAlign(m_parentStyle->textAlign());
44432bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
44442bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
44452bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_style->setTextAlign(*primitiveValue);
44468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// rect
44508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyClip:
44518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length top;
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length right;
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length bottom;
44558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length left;
44568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasClip = true;
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
44588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasClip()) {
44598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = m_parentStyle->clipTop();
44608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                right = m_parentStyle->clipRight();
44618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                bottom = m_parentStyle->clipBottom();
44628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                left = m_parentStyle->clipLeft();
44638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else {
44648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                hasClip = false;
44658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                top = right = bottom = left = Length();
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            hasClip = false;
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            top = right = bottom = left = Length();
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (!primitiveValue) {
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RECT) {
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Rect* rect = primitiveValue->getRectValue();
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!rect)
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
44762bde8e466a4451c7319e3a072d118917957d6554Steve Block            top = convertToIntLength(rect->top(), style(), m_rootElementStyle, zoomFactor);
44772bde8e466a4451c7319e3a072d118917957d6554Steve Block            right = convertToIntLength(rect->right(), style(), m_rootElementStyle, zoomFactor);
44782bde8e466a4451c7319e3a072d118917957d6554Steve Block            bottom = convertToIntLength(rect->bottom(), style(), m_rootElementStyle, zoomFactor);
44792bde8e466a4451c7319e3a072d118917957d6554Steve Block            left = convertToIntLength(rect->left(), style(), m_rootElementStyle, zoomFactor);
44808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue->getIdent() != CSSValueAuto) {
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setClip(top, right, bottom, left);
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setHasClip(hasClip);
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // rect, ident
44878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// lists
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyContent:
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of string, uri, counter, attr, i
44938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
44948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: In CSS3, it will be possible to inherit content.  In CSS2 it is not.  This
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // note is a reminder that eventually "inherit" needs to be supported.
44968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
44988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList* list = static_cast<CSSValueList*>(value);
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool didSet = false;
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
45108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValue* item = list->itemWithoutBoundsCheck(i);
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->isImageGeneratorValue()) {
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setContent(static_cast<CSSImageGeneratorValue*>(item)->generatedImage(), didSet);
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                didSet = true;
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!item->isPrimitiveValue())
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
45188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
45206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            switch (contentValue->primitiveType()) {
452181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_STRING:
452281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(contentValue->getStringValue().impl(), didSet);
452381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
452481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
452581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_ATTR: {
452681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // FIXME: Can a namespace be specified for an attr(foo)?
452781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (m_style->styleType() == NOPSEUDO)
452881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setUnique();
452981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                else
453081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_parentStyle->setUnique();
453181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                QualifiedName attr(nullAtom, contentValue->getStringValue().impl(), nullAtom);
453281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(m_element->getAttribute(attr).impl(), didSet);
453381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
453481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                // register the fact that the attribute value affects the style
453581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_selectorAttrs.add(attr.localName().impl());
453681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
453781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
453881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_URI: {
453981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                if (!contentValue->isImageValue())
454081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
454181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(cachedOrPendingFromValue(CSSPropertyContent, static_cast<CSSImageValue*>(contentValue)), didSet);
454281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
454381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
454481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
454581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_COUNTER: {
454681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                Counter* counterValue = contentValue->getCounterValue();
454781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                OwnPtr<CounterContent> counter = adoptPtr(new CounterContent(counterValue->identifier(),
454881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    (EListStyleType)counterValue->listStyleNumber(), counterValue->separator()));
454981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setContent(counter.release(), didSet);
455081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                didSet = true;
455181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                break;
455281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
455381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            case CSSPrimitiveValue::CSS_IDENT:
455481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                switch (contentValue->getIdent()) {
455581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueOpenQuote:
455681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(OPEN_QUOTE, didSet);
45578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
455981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueCloseQuote:
456081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(CLOSE_QUOTE, didSet);
45618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoOpenQuote:
456481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_OPEN_QUOTE, didSet);
45658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
456781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                case CSSValueNoCloseQuote:
456881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    m_style->setContent(NO_CLOSE_QUOTE, didSet);
45698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    didSet = true;
457081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    break;
457181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                default:
457281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    // normal and none do not have any effect.
457381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                    {}
45748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!didSet)
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearContent();
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
45808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
458181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyQuotes:
458281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInherit) {
458381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (m_parentStyle)
458481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(m_parentStyle->quotes());
458581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
458681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
458781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (isInitial) {
458881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(0);
458981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return;
459081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
459181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (value->isValueList()) {
459281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
459381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            size_t length = list->length();
459481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            QuotesData* data = QuotesData::create(length);
459581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (!data)
459681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                return; // Out of memory
459781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            String* quotes = data->data();
459881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            for (size_t i = 0; i < length; i++) {
459981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                CSSValue* item = list->itemWithoutBoundsCheck(i);
460081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(item->isPrimitiveValue());
460181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
460281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING);
460381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                quotes[i] = primitiveValue->getStringValue();
460481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            }
460581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setQuotes(adoptRef(data));
460681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        } else if (primitiveValue) {
460781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            ASSERT(primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT);
460881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (primitiveValue->getIdent() == CSSValueNone)
460981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                m_style->setQuotes(adoptRef(QuotesData::create(0)));
461081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
461181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterIncrement:
46148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, false);
46158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyCounterReset:
46178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applyCounterList(style(), value->isValueList() ? static_cast<CSSValueList*>(value) : 0, true);
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontFamily: {
46218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of strings and ids
46228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription parentFontDescription = m_parentStyle->fontDescription();
46248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(parentFontDescription.genericFamily());
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setFamily(parentFontDescription.firstFamily());
46270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            fontDescription.setIsSpecifiedFont(parentFontDescription.isSpecifiedFont());
46288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
4631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        } else if (isInitial) {
46328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription initialDesc = FontDescription();
46338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_style->fontDescription();
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // We need to adjust the size to account for the generic family change from monospace
46358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // to non-monospace.
4636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize())
4637d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, false));
46388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(initialDesc.genericFamily());
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!initialDesc.firstFamily().familyIsEmpty())
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setFamily(initialDesc.firstFamily());
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
46438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
46448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!value->isValueList())
4647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontDescription fontDescription = m_style->fontDescription();
4649231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        CSSValueList* list = static_cast<CSSValueList*>(value);
46508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FontFamily& firstFamily = fontDescription.firstFamily();
4652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontFamily* currFamily = 0;
46538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Before mapping in a new font-family property, we should reset the generic family.
4655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool oldFamilyUsedFixedDefaultSize = fontDescription.useFixedDefaultSize();
46568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fontDescription.setGenericFamily(FontDescription::NoFamily);
46578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
4659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            CSSValue* item = list->itemWithoutBoundsCheck(i);
4660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!item->isPrimitiveValue())
4661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                continue;
46626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSPrimitiveValue* contentValue = static_cast<CSSPrimitiveValue*>(item);
46638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AtomicString face;
46648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
46656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
46666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (contentValue->isFontFamilyValue())
46676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    face = static_cast<FontFamilyValue*>(contentValue)->familyName();
46686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            } else if (contentValue->primitiveType() == CSSPrimitiveValue::CSS_IDENT && settings) {
46696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                switch (contentValue->getIdent()) {
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueWebkitBody:
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = settings->standardFontFamily();
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSerif:
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-serif";
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SerifFamily);
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueSansSerif:
46788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-sans-serif";
46798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::SansSerifFamily);
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueCursive:
46828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-cursive";
46838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::CursiveFamily);
46848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueFantasy:
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-fantasy";
46878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::FantasyFamily);
46888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueMonospace:
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        face = "-webkit-monospace";
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fontDescription.setGenericFamily(FontDescription::MonospaceFamily);
46928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4695231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!face.isEmpty()) {
46978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (!currFamily) {
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    // Filling in the first family.
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    firstFamily.setFamily(face);
4700231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                    firstFamily.appendFamily(0); // Remove any inherited family-fallback list.
47018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = &firstFamily;
47020617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    fontDescription.setIsSpecifiedFont(fontDescription.genericFamily() == FontDescription::NoFamily);
4703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                } else {
47048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create();
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    newFamily->setFamily(face);
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily->appendFamily(newFamily);
47078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    currFamily = newFamily.get();
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4711231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4712231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // We can't call useFixedDefaultSize() until all new font families have been added
4713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // If currFamily is non-zero then we set at least one family on this description.
4714231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (currFamily) {
4715231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (fontDescription.keywordSize() && fontDescription.useFixedDefaultSize() != oldFamilyUsedFixedDefaultSize)
4716d0825bca7fe65beaee391d30da42e937db621564Steve Block                setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + fontDescription.keywordSize() - 1, !oldFamilyUsedFixedDefaultSize));
4717231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (m_style->setFontDescription(fontDescription))
4719231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_fontDirty = true;
4720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
4721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextDecoration: {
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // list of ident
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textDecoration, TextDecoration)
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int t = RenderStyle::initialTextDecoration();
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // do nothing
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
47306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!value->isValueList())
47316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                return;
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CSSValueList *list = static_cast<CSSValueList*>(value);
47338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int len = list->length();
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (int i = 0; i < len; i++)
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CSSValue *item = list->itemWithoutBoundsCheck(i);
47376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!item->isPrimitiveValue())
47386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    continue;
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                primitiveValue = static_cast<CSSPrimitiveValue*>(item);
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                switch (primitiveValue->getIdent()) {
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueNone:
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t = TDNONE; break;
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueUnderline:
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= UNDERLINE; break;
47458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueOverline:
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= OVERLINE; break;
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueLineThrough:
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= LINE_THROUGH; break;
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    case CSSValueBlink:
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        t |= BLINK; break;
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    default:
47528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        return;
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextDecoration(t);
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyZoom:
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Reset the zoom in effect before we do anything.  This allows the setZoom method to accurately compute a new
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // zoom in effect.
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setEffectiveZoom(m_parentStyle ? m_parentStyle->effectiveZoom() : RenderStyle::initialZoom());
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Now we can handle inherit and initial.
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(zoom, Zoom)
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Handle normal/reset, numbers and percentages.
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNormal)
47738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
47748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->getIdent() == CSSValueReset) {
47758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setEffectiveZoom(RenderStyle::initialZoom());
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setZoom(RenderStyle::initialZoom());
4777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else if (primitiveValue->getIdent() == CSSValueDocument) {
4778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            float docZoom = m_checker.m_document->renderer()->style()->zoom();
4779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setEffectiveZoom(docZoom);
4780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_style->setZoom(docZoom);
47818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_PERCENTAGE) {
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue() / 100.0f);
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (type == CSSPrimitiveValue::CSS_NUMBER) {
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (primitiveValue->getFloatValue())
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setZoom(primitiveValue->getFloatValue());
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// shorthand properties
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBackground:
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearBackgroundLayers();
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(Color());
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit) {
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritBackgroundLayers(*m_parentStyle->backgroundLayers());
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBackgroundColor(m_parentStyle->backgroundColor());
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMask:
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearMaskLayers();
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
48078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritMaskLayers(*m_parentStyle->maskLayers());
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorder:
48118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderStyle:
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderWidth:
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderColor:
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderColor)
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor(): m_parentStyle->color());
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopColor(Color()); // Reset to invalid color so currentColor is used instead.
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomColor(Color());
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftColor(Color());
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightColor(Color());
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderStyle)
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopStyle(RenderStyle::initialBorderStyle());
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomStyle(RenderStyle::initialBorderStyle());
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftStyle(RenderStyle::initialBorderStyle());
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightStyle(RenderStyle::initialBorderStyle());
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyBorder || id == CSSPropertyBorderWidth)
48458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
48468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isInherit) {
48478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isInitial) {
48538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopWidth(RenderStyle::initialBorderWidth());
48548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomWidth(RenderStyle::initialBorderWidth());
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderLeftWidth(RenderStyle::initialBorderWidth());
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRightWidth(RenderStyle::initialBorderWidth());
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
48588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderTop:
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopColor(m_parentStyle->borderTopColor().isValid() ? m_parentStyle->borderTopColor() : m_parentStyle->color());
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopStyle(m_parentStyle->borderTopStyle());
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopWidth(m_parentStyle->borderTopWidth());
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderTop();
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderRight:
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightColor(m_parentStyle->borderRightColor().isValid() ? m_parentStyle->borderRightColor() : m_parentStyle->color());
48728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightStyle(m_parentStyle->borderRightStyle());
48738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderRightWidth(m_parentStyle->borderRightWidth());
48748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRight();
48778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderBottom:
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomColor(m_parentStyle->borderBottomColor().isValid() ? m_parentStyle->borderBottomColor() : m_parentStyle->color());
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomStyle(m_parentStyle->borderBottomStyle());
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomWidth(m_parentStyle->borderBottomWidth());
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderBottom();
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyBorderLeft:
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftColor(m_parentStyle->borderLeftColor().isValid() ? m_parentStyle->borderLeftColor() : m_parentStyle->color());
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftStyle(m_parentStyle->borderLeftStyle());
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderLeftWidth(m_parentStyle->borderLeftWidth());
48928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
48938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderLeft();
48958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyMargin:
48978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
48988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginTop(m_parentStyle->marginTop());
48998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginBottom(m_parentStyle->marginBottom());
49008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginLeft(m_parentStyle->marginLeft());
49018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarginRight(m_parentStyle->marginRight());
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetMargin();
49058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPadding:
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingTop(m_parentStyle->paddingTop());
49098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingBottom(m_parentStyle->paddingBottom());
49108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingLeft(m_parentStyle->paddingLeft());
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setPaddingRight(m_parentStyle->paddingRight());
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
49148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetPadding();
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFont:
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription = m_parentStyle->fontDescription();
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(m_parentStyle->lineHeight());
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
49248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Settings* settings = m_checker.m_document->settings();
49258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (!settings)
49278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                return;
49288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setGenericFamily(FontDescription::StandardFamily);
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setRenderingMode(settings->fontRenderingMode());
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const AtomicString& standardFontFamily = m_checker.m_document->settings()->standardFontFamily();
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!standardFontFamily.isEmpty()) {
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().setFamily(standardFontFamily);
49358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.firstFamily().appendFamily(0);
49368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
4938d0825bca7fe65beaee391d30da42e937db621564Steve Block            setFontSize(fontDescription, fontSizeForKeyword(m_checker.m_document, CSSValueMedium, false));
49398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_style->setFontDescription(fontDescription))
49428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_fontDirty = true;
49438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (primitiveValue) {
49448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setLineHeight(RenderStyle::initialLineHeight());
49458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = 0;
49468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontDescription fontDescription;
49480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            RenderTheme::defaultTheme()->systemFont(primitiveValue->getIdent(), fontDescription);
49490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
49508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Double-check and see if the theme did anything.  If not, don't bother updating the font.
49518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (fontDescription.isAbsoluteSize()) {
49528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Make sure the rendering mode and printer font settings are updated.
49538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                Settings* settings = m_checker.m_document->settings();
49548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings
49558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                if (!settings)
49568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    return;
49578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setRenderingMode(settings->fontRenderingMode());
49588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fontDescription.setUsePrinterFont(m_checker.m_document->printing());
49598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Handle the zoom factor.
49612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), fontDescription.specifiedSize(), useSVGZoomRules(m_element)));
49628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (m_style->setFontDescription(fontDescription))
49638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_fontDirty = true;
49648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
49658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (value->isFontValue()) {
49668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            FontValue *font = static_cast<FontValue*>(value);
49678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!font->style || !font->variant || !font->weight ||
49688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                 !font->size || !font->lineHeight || !font->family)
49698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return;
49708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontStyle, font->style.get());
49718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontVariant, font->variant.get());
49728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontWeight, font->weight.get());
4973bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // The previous properties can dirty our font but they don't try to read the font's
4974bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // properties back, which is safe. However if font-size is using the 'ex' unit, it will
4975bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // need query the dirtied font's x-height to get the computed size. To be safe in this
4976bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            // case, let's just update the font now.
4977bb0dba49203d72577b8eac34537c9c671ba9bec7Steve Block            updateFont();
49788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontSize, font->size.get());
49798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_lineHeightValue = font->lineHeight.get();
49818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            applyProperty(CSSPropertyFontFamily, font->family.get());
49838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyListStyle:
49878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
49888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(m_parentStyle->listStyleType());
49898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(m_parentStyle->listStyleImage());
49908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(m_parentStyle->listStylePosition());
49918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
49938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleType(RenderStyle::initialListStyleType());
49948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStyleImage(RenderStyle::initialListStyleImage());
49958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setListStylePosition(RenderStyle::initialListStylePosition());
49968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
49978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutline:
49998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineWidth(m_parentStyle->outlineWidth());
50018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineColor(m_parentStyle->outlineColor().isValid() ? m_parentStyle->outlineColor() : m_parentStyle->color());
50028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setOutlineStyle(m_parentStyle->outlineStyle());
50038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
50058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetOutline();
50068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // CSS3 Properties
50098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAppearance: {
50108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(appearance, Appearance)
50118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setAppearance(*primitiveValue);
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderImage:
50188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMaskBoxImage: {
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitBorderImage, borderImage, BorderImage)
50218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INHERIT_COND(CSSPropertyWebkitMaskBoxImage, maskBoxImage, MaskBoxImage)
50228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
50248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitBorderImage, BorderImage, NinePieceImage)
50258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyWebkitMaskBoxImage, MaskBoxImage, NinePieceImage)
50268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage image;
50305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, value, image);
50318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (id == CSSPropertyWebkitBorderImage)
50338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderImage(image);
50348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
50358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMaskBoxImage(image);
50368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderRadius:
50408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderRadius:
50418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopLeftRadius(m_parentStyle->borderTopLeftRadius());
50438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderTopRightRadius(m_parentStyle->borderTopRightRadius());
50448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomLeftRadius(m_parentStyle->borderBottomLeftRadius());
50458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderBottomRightRadius(m_parentStyle->borderBottomRightRadius());
50468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetBorderRadius();
50508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Fall through
50530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopLeftRadius:
50540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderTopRightRadius:
50550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomLeftRadius:
50560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyBorderBottomRightRadius: {
50578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
50580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopLeftRadius, borderTopLeftRadius, BorderTopLeftRadius)
50590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderTopRightRadius, borderTopRightRadius, BorderTopRightRadius)
50600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomLeftRadius, borderBottomLeftRadius, BorderBottomLeftRadius)
50610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INHERIT_COND(CSSPropertyBorderBottomRightRadius, borderBottomRightRadius, BorderBottomRightRadius)
50628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial) {
50660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopLeftRadius, BorderTopLeftRadius, BorderRadius)
50670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderTopRightRadius, BorderTopRightRadius, BorderRadius)
50680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomLeftRadius, BorderBottomLeftRadius, BorderRadius)
50690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            HANDLE_INITIAL_COND_WITH_VALUE(CSSPropertyBorderBottomRightRadius, BorderBottomRightRadius, BorderRadius)
50708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
50748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Pair* pair = primitiveValue->getPairValue();
50776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!pair || !pair->first() || !pair->second())
50788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusWidth;
50815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Length radiusHeight;
50825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->first()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(pair->first()->getDoubleValue(), Percent);
50845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = Length(max(intMinForLength, min(intMaxForLength, pair->first()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (pair->second()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
50875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(pair->second()->getDoubleValue(), Percent);
50885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
50895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = Length(max(intMinForLength, min(intMaxForLength, pair->second()->computeLengthInt(style(), m_rootElementStyle, zoomFactor))), Fixed);
50902bde8e466a4451c7319e3a072d118917957d6554Steve Block        int width = radiusWidth.value();
50912bde8e466a4451c7319e3a072d118917957d6554Steve Block        int height = radiusHeight.value();
50928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width < 0 || height < 0)
50938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (width == 0)
50955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusHeight = radiusWidth; // Null out the other value.
50968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (height == 0)
50975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            radiusWidth = radiusHeight; // Null out the other value.
50988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        LengthSize size(radiusWidth, radiusHeight);
51008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (id) {
51010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopLeftRadius:
51028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopLeftRadius(size);
51038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderTopRightRadius:
51058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderTopRightRadius(size);
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomLeftRadius:
51088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomLeftRadius(size);
51098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            case CSSPropertyBorderBottomRightRadius:
51118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderBottomRightRadius(size);
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
51148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBorderRadius(size);
51158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
51168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOutlineOffset:
51218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(outlineOffset, OutlineOffset)
51220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setOutlineOffset(primitiveValue->computeLengthInt(style(), m_rootElementStyle, zoomFactor));
51238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyTextRendering: {
5125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        FontDescription fontDescription = m_style->fontDescription();
5126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isInherit)
5127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(m_parentStyle->fontDescription().textRenderingMode());
5128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else if (isInitial)
5129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(AutoTextRendering);
5130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else {
5131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!primitiveValue)
5132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
5133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            fontDescription.setTextRenderingMode(*primitiveValue);
5134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (m_style->setFontDescription(fontDescription))
5136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            m_fontDirty = true;
5137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
51398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextShadow:
5140cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSPropertyBoxShadow:
5141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWebkitBoxShadow: {
51428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return m_style->setTextShadow(m_parentStyle->textShadow() ? new ShadowData(*m_parentStyle->textShadow()) : 0);
51458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return m_style->setBoxShadow(m_parentStyle->boxShadow() ? new ShadowData(*m_parentStyle->boxShadow()) : 0);
51468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial || primitiveValue) // initial | none
51488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return id == CSSPropertyTextShadow ? m_style->setTextShadow(0) : m_style->setBoxShadow(0);
51498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!value->isValueList())
51518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSValueList *list = static_cast<CSSValueList*>(value);
51548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int len = list->length();
51558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < len; i++) {
51566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            CSSValue* currValue = list->itemWithoutBoundsCheck(i);
51576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!currValue->isShadowValue())
51586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                continue;
51598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ShadowValue* item = static_cast<ShadowValue*>(list->itemWithoutBoundsCheck(i));
51600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int x = item->x->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int y = item->y->computeLengthInt(style(), m_rootElementStyle, zoomFactor);
51620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int blur = item->blur ? item->blur->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            int spread = item->spread ? item->spread->computeLengthInt(style(), m_rootElementStyle, zoomFactor) : 0;
51640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ShadowStyle shadowStyle = item->style && item->style->getIdent() == CSSValueInset ? Inset : Normal;
51658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Color color;
51668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (item->color)
51678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                color = getColorFromPrimitiveValue(item->color.get());
5168cad810f21b803229eb11403f9209855525a25d57Steve Block            ShadowData* shadowData = new ShadowData(x, y, blur, spread, shadowStyle, id == CSSPropertyWebkitBoxShadow, color.isValid() ? color : Color::transparent);
51698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (id == CSSPropertyTextShadow)
51708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setTextShadow(shadowData, i != 0);
51718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setBoxShadow(shadowData, i != 0);
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxReflect: {
51778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxReflect, BoxReflect)
51788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue) {
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxReflect(RenderStyle::initialBoxReflect());
51808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
51818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!value->isReflectValue())
51846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
51856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
51868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSReflectValue* reflectValue = static_cast<CSSReflectValue*>(value);
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<StyleReflection> reflection = StyleReflection::create();
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setDirection(reflectValue->direction());
51898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (reflectValue->offset()) {
51908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int type = reflectValue->offset()->primitiveType();
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                reflection->setOffset(Length(reflectValue->offset()->getDoubleValue(), Percent));
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
51940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                reflection->setOffset(Length(reflectValue->offset()->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed));
51958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
51968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NinePieceImage mask;
51975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        mapNinePieceImage(property, reflectValue->mask(), mask);
51988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        reflection->setMask(mask);
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxReflect(reflection.release());
52018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyOpacity:
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(opacity, Opacity)
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Clamp opacity to the range 0-1
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setOpacity(min(1.0f, max(0.0f, primitiveValue->getFloatValue())));
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxAlign:
52118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxAlign, BoxAlign)
52138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxAlignment = *primitiveValue;
52168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxAlignment != BJUSTIFY)
52178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxAlign(boxAlignment);
52188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertySrc: // Only used in @font-face rules.
52218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyUnicodeRange: // Only used in @font-face rules.
52238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitBackfaceVisibility:
52258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(backfaceVisibility, BackfaceVisibility)
52268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
52278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setBackfaceVisibility((primitiveValue->getIdent() == CSSValueVisible) ? BackfaceVisibilityVisible : BackfaceVisibilityHidden);
52288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxDirection:
52305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxDirection, BoxDirection)
52318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxLines:
52335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxLines, BoxLines)
52348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrient:
52365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(boxOrient, BoxOrient)
52378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxPack:
52398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
52408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxPack, BoxPack)
52418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EBoxAlignment boxPack = *primitiveValue;
52448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (boxPack != BSTRETCH && boxPack != BBASELINE)
52458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxPack(boxPack);
52468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlex:
52498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlex, BoxFlex)
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlex(primitiveValue->getFloatValue());
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxFlexGroup:
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxFlexGroup, BoxFlexGroup)
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxFlexGroup((unsigned int)(primitiveValue->getDoubleValue()));
52598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
52608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBoxOrdinalGroup:
52618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxOrdinalGroup, BoxOrdinalGroup)
52628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || primitiveValue->primitiveType() != CSSPrimitiveValue::CSS_NUMBER)
52638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return; // Error case.
52648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setBoxOrdinalGroup((unsigned int)(primitiveValue->getDoubleValue()));
52658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
526628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    case CSSPropertyBoxSizing:
52678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(boxSizing, BoxSizing)
52688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
52698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueContentBox)
52718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(CONTENT_BOX);
52728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
52738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBoxSizing(BORDER_BOX);
52748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnCount: {
52768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnCount())
52788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnCount();
52798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnCount(m_parentStyle->columnCount());
52818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
52838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnCount();
52848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
52868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setColumnCount(static_cast<unsigned short>(primitiveValue->getDoubleValue()));
52878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
52898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnGap: {
52908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
52918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasNormalColumnGap())
52928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasNormalColumnGap();
52938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
52948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnGap(m_parentStyle->columnGap());
52958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueNormal) {
52978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasNormalColumnGap();
52988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
52998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnGap(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
53018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5303e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    case CSSPropertyWebkitColumnSpan: {
5304e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        HANDLE_INHERIT_AND_INITIAL(columnSpan, ColumnSpan)
5305e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        m_style->setColumnSpan(primitiveValue->getIdent() == CSSValueAll);
5306e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return;
5307e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
53088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnWidth: {
53098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial || primitiveValue->getIdent() == CSSValueAuto) {
53168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        m_style->setColumnWidth(primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor));
53208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnRuleStyle:
53235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnRuleStyle, ColumnRuleStyle, BorderStyle)
53248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakBefore:
53265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakBefore, ColumnBreakBefore, PageBreak)
53278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitColumnBreakAfter:
53295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE_WITH_VALUE(columnBreakAfter, ColumnBreakAfter, PageBreak)
53308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumnBreakInside: {
53328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL_WITH_VALUE(columnBreakInside, ColumnBreakInside, PageBreak)
53338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EPageBreak pb = *primitiveValue;
53348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pb != PBALWAYS)
53358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnBreakInside(pb);
53368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
53388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     case CSSPropertyWebkitColumnRule:
53398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleColor(m_parentStyle->columnRuleColor().isValid() ? m_parentStyle->columnRuleColor() : m_parentStyle->color());
53418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleStyle(m_parentStyle->columnRuleStyle());
53428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnRuleWidth(m_parentStyle->columnRuleWidth());
53438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial)
53458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->resetColumnRule();
53468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitColumns:
53488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
53498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (m_parentStyle->hasAutoColumnWidth())
53508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setHasAutoColumnWidth();
53518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
53528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setColumnWidth(m_parentStyle->columnWidth());
53538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(m_parentStyle->columnCount());
53548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (isInitial) {
53558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHasAutoColumnWidth();
53568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setColumnCount(RenderStyle::initialColumnCount());
53578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
53588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarquee:
53608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (valueType != CSSValue::CSS_INHERIT || !m_parentNode) return;
53618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeDirection(m_parentStyle->marqueeDirection());
53628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeIncrement(m_parentStyle->marqueeIncrement());
53638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeSpeed(m_parentStyle->marqueeSpeed());
53648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeLoopCount(m_parentStyle->marqueeLoopCount());
53658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setMarqueeBehavior(m_parentStyle->marqueeBehavior());
53668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5368231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeLoop:
5369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeRepetition: {
53718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeLoopCount, MarqueeLoopCount)
53728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueInfinite)
53758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(-1); // -1 means repeat forever.
53768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER)
53778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeLoopCount(primitiveValue->getIntValue());
53788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
53798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeSpeed:
5382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
53838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeSpeed: {
53848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeSpeed, MarqueeSpeed)
53858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
53868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
53878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
53888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
53898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSlow:
53908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(500); // 500 msec.
53918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
53938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(85); // 85msec. The WinIE default.
53948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueFast:
53968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeSpeed(10); // 10msec. Super fast.
53978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
53988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
53998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
54018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(1000 * primitiveValue->getIntValue());
54028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
54038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
54048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_NUMBER) // For scrollamount support.
54058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setMarqueeSpeed(primitiveValue->getIntValue());
54068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarqueeIncrement: {
54098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(marqueeIncrement, MarqueeIncrement)
54108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
54118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent()) {
54138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            switch (primitiveValue->getIdent()) {
54148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueSmall:
54158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(1, Fixed)); // 1px.
54168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueNormal:
54188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(6, Fixed)); // 6px. The WinIE default.
54198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                case CSSValueLarge:
54218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    m_style->setMarqueeIncrement(Length(36, Fixed)); // 36px.
54228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
54238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
54248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
54268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            bool ok = true;
54272bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length marqueeLength = convertToIntLength(primitiveValue, style(), m_rootElementStyle, 1, &ok);
54288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (ok)
54292bde8e466a4451c7319e3a072d118917957d6554Steve Block                m_style->setMarqueeIncrement(marqueeLength);
54308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeStyle:
5435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeStyle:
54375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeBehavior, MarqueeBehavior)
54388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5439231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WCSS)
5440231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case CSSPropertyWapMarqueeDir:
5441231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        HANDLE_INHERIT_AND_INITIAL(marqueeDirection, MarqueeDirection)
5442231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (primitiveValue && primitiveValue->getIdent()) {
5443231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            switch (primitiveValue->getIdent()) {
5444231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueLtr:
5445231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MRIGHT);
5446231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5447231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            case CSSValueRtl:
5448231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(MLEFT);
5449231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5450231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            default:
5451231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_style->setMarqueeDirection(*primitiveValue);
5452231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                break;
5453231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
5454231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5455231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
5456231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
54575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarqueeDirection:
54585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marqueeDirection, MarqueeDirection)
54598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserDrag:
54615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userDrag, UserDrag)
54628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserModify:
54645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userModify, UserModify)
54658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitUserSelect:
54675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(userSelect, UserSelect)
54688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
54708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverflow: {
54718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This property is supported by WinIE, and so we leave off the "-webkit-" in order to
54728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // work with WinIE-specific pages that use the property.
54738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textOverflow, TextOverflow)
54748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
54758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
54768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextOverflow(primitiveValue->getIdent() == CSSValueEllipsis);
54778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitMarginCollapse: {
54808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInherit) {
5481bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(m_parentStyle->marginBeforeCollapse());
5482bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(m_parentStyle->marginAfterCollapse());
54838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInitial) {
5485bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginBeforeCollapse(MCOLLAPSE);
5486bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            m_style->setMarginAfterCollapse(MCOLLAPSE);
54878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
54888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5491bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginBeforeCollapse:
54925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginTopCollapse:
5493bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginBeforeCollapse, MarginBeforeCollapse)
54948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    case CSSPropertyWebkitMarginAfterCollapse:
54965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitMarginBottomCollapse:
5497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(marginAfterCollapse, MarginAfterCollapse)
54988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitLineClamp: {
55008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(lineClamp, LineClamp)
55018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
55028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int type = primitiveValue->primitiveType();
5504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (type == CSSPrimitiveValue::CSS_NUMBER)
5505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), LineClampLineCount));
5506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
5507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setLineClamp(LineClampValue(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_PERCENTAGE), LineClampPercentage));
55088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitHighlight: {
55118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(highlight, Highlight);
55128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone)
55138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(nullAtom);
55148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setHighlight(primitiveValue->getStringValue());
55168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
551806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphens: {
551906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        HANDLE_INHERIT_AND_INITIAL(hyphens, Hyphens);
552006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        m_style->setHyphens(*primitiveValue);
552106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
552206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
552306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertyWebkitHyphenateCharacter: {
5524dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationString, HyphenationString);
552506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (primitiveValue->getIdent() == CSSValueAuto)
5526dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(nullAtom);
552706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        else
5528dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            m_style->setHyphenationString(primitiveValue->getStringValue());
5529dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        return;
5530dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    }
553181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitAfter: {
553281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitAfter, HyphenationLimitAfter);
553381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
553481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(-1);
553581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
553681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitAfter(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
553781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
553881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
553981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitHyphenateLimitBefore: {
554081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(hyphenationLimitBefore, HyphenationLimitBefore);
5541dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
554281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(-1);
5543dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        else
554481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setHyphenationLimitBefore(min(primitiveValue->getIntValue(CSSPrimitiveValue::CSS_NUMBER), static_cast<int>(numeric_limits<short>::max())));
554581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
554681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
554781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    case CSSPropertyWebkitLocale: {
554881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(locale, Locale);
554981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (primitiveValue->getIdent() == CSSValueAuto)
555081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(nullAtom);
555181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else
555281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            m_style->setLocale(primitiveValue->getStringValue());
555306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
555406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
55558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitBorderFit: {
55568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(borderFit, BorderFit);
55578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueBorder)
55588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitBorder);
55598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setBorderFit(BorderFitLines);
55618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextSizeAdjust: {
55648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textSizeAdjust, TextSizeAdjust)
55658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent()) return;
55668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextSizeAdjust(primitiveValue->getIdent() == CSSValueAuto);
55678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontDirty = true;
55688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case CSSPropertyWebkitTextSecurity:
55715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textSecurity, TextSecurity)
55728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
55748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
55758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitDashboardRegion: {
55768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(dashboardRegions, DashboardRegions)
55778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue)
55788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (primitiveValue->getIdent() == CSSValueNone) {
55818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->setDashboardRegions(RenderStyle::noneDashboardRegions());
55828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
55848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *region = primitiveValue->getDashboardRegionValue();
55868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!region)
55878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
55888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion *first = region;
55908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (region) {
55912bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length top = convertToIntLength(region->top(), style(), m_rootElementStyle);
55922bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length right = convertToIntLength(region->right(), style(), m_rootElementStyle);
55932bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length bottom = convertToIntLength(region->bottom(), style(), m_rootElementStyle);
55942bde8e466a4451c7319e3a072d118917957d6554Steve Block            Length left = convertToIntLength(region->left(), style(), m_rootElementStyle);
55958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (region->m_isCircle)
55968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Circle, region->m_label, top, right, bottom, left, region == first ? false : true);
55978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (region->m_isRectangle)
55988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_style->setDashboardRegion(StyleDashboardRegion::Rectangle, region->m_label, top, right, bottom, left, region == first ? false : true);
55998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            region = region->m_next.get();
56008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_element->document()->setHasDashboardRegions(true);
56038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
56078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitRtlOrdering:
56088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(visuallyOrdered, VisuallyOrdered)
56098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!primitiveValue || !primitiveValue->getIdent())
56108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setVisuallyOrdered(primitiveValue->getIdent() == CSSValueVisual);
56128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStrokeWidth: {
56148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(textStrokeWidth, TextStrokeWidth)
56158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float width = 0;
56168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
56178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThin:
56188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueMedium:
56198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueThick: {
56208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                double result = 1.0 / 48;
56218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (primitiveValue->getIdent() == CSSValueMedium)
56228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 3;
56238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else if (primitiveValue->getIdent() == CSSValueThick)
56248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result *= 5;
56250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = CSSPrimitiveValue::create(result, CSSPrimitiveValue::CSS_EMS)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
56288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            default:
56290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                width = primitiveValue->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
56308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
56318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
56328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTextStrokeWidth(width);
56338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransform: {
56368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transform, Transform);
56378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TransformOperations operations;
56380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        createTransformOperations(value, style(), m_rootElementStyle, operations);
56398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransform(operations);
56408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOrigin:
56438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
56478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginX: {
56488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginX, TransformOriginX)
56496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginX(l);
56608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransformOriginY: {
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(transformOriginY, TransformOriginY)
56646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Length l;
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int type = primitiveValue->primitiveType();
56688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
56700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
56718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            l = Length(primitiveValue->getDoubleValue(), Percent);
56728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
56748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_style->setTransformOriginY(l);
56758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformOriginZ: {
56788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformOriginZ, TransformOriginZ)
56796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
56806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
56818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        float f;
56828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
56838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
56840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            f = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle));
56858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
56868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
56878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setTransformOriginZ(f);
56888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        break;
56898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
56908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitTransformStyle:
56918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(transformStyle3D, TransformStyle3D)
56928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue)
56938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setTransformStyle3D((primitiveValue->getIdent() == CSSValuePreserve3d) ? TransformStyle3DPreserve3D : TransformStyle3DFlat);
56948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
56958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspective: {
56968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspective, Perspective)
56978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
56988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(0);
56998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        }
57010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
57020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        float perspectiveValue;
57030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int type = primitiveValue->primitiveType();
57040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (CSSPrimitiveValue::isUnitTypeLength(type))
57050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = static_cast<float>(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor));
57060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_NUMBER) {
57070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // For backward compatibility, treat valueless numbers as px.
57080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            perspectiveValue = CSSPrimitiveValue::create(primitiveValue->getDoubleValue(), CSSPrimitiveValue::CSS_PX)->computeLengthFloat(style(), m_rootElementStyle, zoomFactor);
57090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else
57108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
57128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (perspectiveValue >= 0.0f)
57138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            m_style->setPerspective(perspectiveValue);
57148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOrigin:
57178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginX: {
57218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginX, PerspectiveOriginX)
57226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginX(l);
57338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    case CSSPropertyWebkitPerspectiveOriginY: {
57368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        HANDLE_INHERIT_AND_INITIAL(perspectiveOriginY, PerspectiveOriginY)
57376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
57386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
57398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        Length l;
57408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        int type = primitiveValue->primitiveType();
57418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (CSSPrimitiveValue::isUnitTypeLength(type))
57420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
57430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
57448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            l = Length(primitiveValue->getDoubleValue(), Percent);
57458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        else
57468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            return;
57478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_style->setPerspectiveOriginY(l);
57488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        return;
57498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
57508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimation:
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearAnimations();
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritAnimations(m_parentStyle->animations());
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDelay:
57578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(delay, Delay, value)
57588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDirection:
57608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(direction, Direction, value)
57618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationDuration:
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(duration, Duration, value)
57648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSPropertyWebkitAnimationFillMode:
5766dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        HANDLE_ANIMATION_VALUE(fillMode, FillMode, value)
5767dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
57688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationIterationCount:
57698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(iterationCount, IterationCount, value)
57708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationName:
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(name, Name, value)
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CSSPropertyWebkitAnimationPlayState:
57750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HANDLE_ANIMATION_VALUE(playState, PlayState, value)
57760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
57778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitAnimationTimingFunction:
57788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_ANIMATION_VALUE(timingFunction, TimingFunction, value)
57798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransition:
57818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isInitial)
57828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->clearTransitions();
57838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (isInherit)
57848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_style->inheritTransitions(m_parentStyle->transitions());
57858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDelay:
57878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(delay, Delay, value)
57888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionDuration:
57908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(duration, Duration, value)
57918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionProperty:
57938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(property, Property, value)
57948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
57958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTransitionTimingFunction:
57968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HANDLE_TRANSITION_VALUE(timingFunction, TimingFunction, value)
57978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    case CSSPropertyPointerEvents:
5799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
5800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
5801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // <rdar://problem/6561077> Work around the Stocks widget's misuse of the
5802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // pointer-events property by not applying it in Dashboard.
5803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
5804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (settings && settings->usesDashboardBackwardCompatibilityMode())
5805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
5807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HANDLE_INHERIT_AND_INITIAL(pointerEvents, PointerEvents)
5808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!primitiveValue)
5809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
5810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_style->setPointerEvents(*primitiveValue);
5811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
5812635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
5813643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case CSSPropertyWebkitColorCorrection:
5814643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (isInherit)
5815643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(m_parentStyle->colorSpace());
5816643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else if (isInitial)
5817a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            m_style->setColorSpace(ColorSpaceDeviceRGB);
5818643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else {
5819643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!primitiveValue)
5820643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return;
5821643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_style->setColorSpace(*primitiveValue);
5822643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
5823643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
582406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSPropertySize:
582506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        applyPageSizeProperty(value);
582606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
5827a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
5828a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    case CSSPropertySpeak:
5829a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL(speak, Speak);
58306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!primitiveValue)
58316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            return;
5832a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_style->setSpeak(*primitiveValue);
5833a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return;
5834a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
58358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyInvalid:
58368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5837967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
5838967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Directional properties are resolved by resolveDirectionAwareProperty() before the switch.
5839967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEnd:
5840967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndColor:
5841967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndStyle:
5842967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderEndWidth:
5843967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStart:
5844967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartColor:
5845967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartStyle:
5846967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitBorderStartWidth:
584768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBefore:
584868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeColor:
584968513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeStyle:
585068513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderBeforeWidth:
585168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfter:
585268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterColor:
585368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterStyle:
585468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitBorderAfterWidth:
5855967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginEnd:
5856967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitMarginStart:
585768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginBefore:
585868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMarginAfter:
5859967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingEnd:
5860967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    case CSSPropertyWebkitPaddingStart:
586168513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingBefore:
586268513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitPaddingAfter:
586368513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalWidth:
586468513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitLogicalHeight:
586568513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalWidth:
586668513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMinLogicalHeight:
586768513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalWidth:
586868513a70bcd92384395513322f1b801e7bf9c729Steve Block    case CSSPropertyWebkitMaxLogicalHeight:
5869967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        ASSERT_NOT_REACHED();
5870967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        break;
5871967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
58728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyFontStretch:
58738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyPage:
58748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThrough:
58758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughColor:
58768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughMode:
58778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughStyle:
58788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextLineThroughWidth:
58798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverline:
58808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineColor:
58818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineMode:
58828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineStyle:
58838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextOverlineWidth:
58848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderline:
58858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineColor:
58868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineMode:
58878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineStyle:
58888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyTextUnderlineWidth:
58898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitFontSizeDelta:
58908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextDecorationsInEffect:
58918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CSSPropertyWebkitTextStroke:
5892f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case CSSPropertyWebkitTextEmphasis:
58938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
589421939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(WCSS)
589521939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputFormat:
589621939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->hasTagName(WebCore::inputTag)) {
589721939df44de1705786c545cd1bf519d47250322dBen Murdoch            String mask = primitiveValue->getStringValue();
589821939df44de1705786c545cd1bf519d47250322dBen Murdoch            static_cast<HTMLInputElement*>(m_element)->setWapInputFormat(mask);
589921939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
590021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
590121939df44de1705786c545cd1bf519d47250322dBen Murdoch
590221939df44de1705786c545cd1bf519d47250322dBen Murdoch    case CSSPropertyWapInputRequired:
590321939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (primitiveValue && m_element->isFormControlElement()) {
590421939df44de1705786c545cd1bf519d47250322dBen Murdoch            HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(m_element);
590521939df44de1705786c545cd1bf519d47250322dBen Murdoch            bool required = primitiveValue->getStringValue() == "true";
590621939df44de1705786c545cd1bf519d47250322dBen Murdoch            element->setRequired(required);
590721939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
590821939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
590921939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
591021939df44de1705786c545cd1bf519d47250322dBen Murdoch
59118de7ac488df2f39f82e56811541f4847b3f2e952Steve Block    // CSS Text Layout Module Level 3: Vertical writing support
5912e14391e94c850b8bd03680c23b38978db68687a8John Reck    case CSSPropertyWebkitWritingMode: {
5913a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(writingMode, WritingMode)
5914e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (!isInherit && !isInitial && m_element && m_element == m_element->document()->documentElement())
5915e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_element->document()->setWritingModeSetOnDocumentElement(true);
5916e14391e94c850b8bd03680c23b38978db68687a8John Reck        FontDescription fontDescription = m_style->fontDescription();
5917e14391e94c850b8bd03680c23b38978db68687a8John Reck        fontDescription.setOrientation(m_style->isHorizontalWritingMode() ? Horizontal : Vertical);
5918e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (m_style->setFontDescription(fontDescription))
5919e14391e94c850b8bd03680c23b38978db68687a8John Reck            m_fontDirty = true;
59208de7ac488df2f39f82e56811541f4847b3f2e952Steve Block        return;
59214326279fef480892cd059ad1c738f1320601d33fJohn Reck    }
59228de7ac488df2f39f82e56811541f4847b3f2e952Steve Block
5923a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu    case CSSPropertyWebkitTextCombine:
5924a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textCombine, TextCombine)
5925a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu        return;
5926a884348a07235d658b6337f68cf977cecba570f6Teng-Hui Zhu
5927e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisPosition:
5928e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL_AND_PRIMITIVE(textEmphasisPosition, TextEmphasisPosition)
5929e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5930e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5931e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch    case CSSPropertyWebkitTextEmphasisStyle:
5932e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisFill, TextEmphasisFill)
5933e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisMark, TextEmphasisMark)
5934e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        HANDLE_INHERIT_AND_INITIAL(textEmphasisCustomMark, TextEmphasisCustomMark)
5935e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (isInherit || isInitial)
5936e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5937e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5938e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (value->isValueList()) {
5939e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            CSSValueList* list = static_cast<CSSValueList*>(value);
5940e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            ASSERT(list->length() == 2);
5941e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            if (list->length() != 2)
5942e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                return;
5943e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            for (unsigned i = 0; i < 2; ++i) {
59442bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSValue* item = list->itemWithoutBoundsCheck(i);
59452bde8e466a4451c7319e3a072d118917957d6554Steve Block                if (!item->isPrimitiveValue())
59462bde8e466a4451c7319e3a072d118917957d6554Steve Block                    continue;
59472bde8e466a4451c7319e3a072d118917957d6554Steve Block
59482bde8e466a4451c7319e3a072d118917957d6554Steve Block                CSSPrimitiveValue* value = static_cast<CSSPrimitiveValue*>(item);
5949e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                if (value->getIdent() == CSSValueFilled || value->getIdent() == CSSValueOpen)
5950e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisFill(*value);
5951e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                else
5952e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch                    m_style->setTextEmphasisMark(*value);
5953e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            }
5954e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(nullAtom);
5955e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5956e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5957e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5958e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (!primitiveValue)
5959e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5960e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5961e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_STRING) {
5962e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5963e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkCustom);
5964e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisCustomMark(primitiveValue->getStringValue());
5965e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            return;
5966e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5967e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5968e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        m_style->setTextEmphasisCustomMark(nullAtom);
5969e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5970e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        if (primitiveValue->getIdent() == CSSValueFilled || primitiveValue->getIdent() == CSSValueOpen) {
5971e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(*primitiveValue);
5972e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(TextEmphasisMarkAuto);
5973e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        } else {
5974e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisFill(TextEmphasisFillFilled);
5975e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch            m_style->setTextEmphasisMark(*primitiveValue);
5976e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        }
5977e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
5978e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch        return;
5979e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch
598074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextOrientation: {
598174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!isInherit && !isInitial && !primitiveValue)
598274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
598374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
598474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        TextOrientation result;
598574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (isInherit)
598674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = m_parentStyle->fontDescription().textOrientation();
598774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else if (isInitial)
598874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = RenderStyle::initialTextOrientation();
598974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        else
599074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            result = *primitiveValue;
599174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
599274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        FontDescription fontDescription = m_style->fontDescription();
599374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (fontDescription.textOrientation() != result) {
599474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            fontDescription.setTextOrientation(result);
599574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            if (m_style->setFontDescription(fontDescription))
599674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block                m_fontDirty = true;
599774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
599874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
599974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
600074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitLineBoxContain: {
600274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        HANDLE_INHERIT_AND_INITIAL(lineBoxContain, LineBoxContain)
600374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) {
600474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            m_style->setLineBoxContain(LineBoxContainNone);
600574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
600674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        }
600774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
600874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        if (!value->isCSSLineBoxContainValue())
600974ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block            return;
601074ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
601174ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        CSSLineBoxContainValue* lineBoxContainValue = static_cast<CSSLineBoxContainValue*>(value);
601274ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        m_style->setLineBoxContain(lineBoxContainValue->value());
601374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
601474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    }
601574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
601674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    // These properties are implemented in the CSSStyleApplyProperty lookup table.
601774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyColor:
60182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyDirection:
60192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundAttachment:
60202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundClip:
60212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundClip:
60222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundComposite:
60232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundOrigin:
60242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundOrigin:
60252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundImage:
60262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundSize:
60272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitBackgroundSize:
60282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskAttachment:
60292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskClip:
60302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskComposite:
60312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskOrigin:
60322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskImage:
60332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskSize:
603474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBackgroundColor:
603574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderBottomColor:
603674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderLeftColor:
603774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderRightColor:
603874ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyBorderTopColor:
60392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderTopStyle:
60402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderRightStyle:
60412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderBottomStyle:
60422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBorderLeftStyle:
604374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyOutlineColor:
604474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitColumnRuleColor:
604574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextEmphasisColor:
604674ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextFillColor:
604774ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block    case CSSPropertyWebkitTextStrokeColor:
60482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPosition:
60492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionX:
60502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundPositionY:
60512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPosition:
60522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionX:
60532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskPositionY:
60542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeat:
60552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatX:
60562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyBackgroundRepeatY:
60572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeat:
60582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatX:
60592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyWebkitMaskRepeatY:
60602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflow:
60612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowX:
60622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case CSSPropertyOverflowY:
606374ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        ASSERT_NOT_REACHED();
606474ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block        return;
606574ee772b3c1ea8b557e5a596e9cbc655d1c0e161Steve Block
606657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#ifdef ANDROID_CSS_TAP_HIGHLIGHT_COLOR
606757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    case CSSPropertyWebkitTapHighlightColor: {
606857a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        HANDLE_INHERIT_AND_INITIAL(tapHighlightColor, TapHighlightColor);
606957a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        if (!primitiveValue)
607057a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch            break;
607157a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
607257a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        Color col = getColorFromPrimitiveValue(primitiveValue).blendWithWhite();
607357a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        m_style->setTapHighlightColor(col);
607457a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch        return;
607557a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch    }
607657a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch#endif
607757a47dd4f75b9c15804c3c61479540cfdc11bd6eBen Murdoch
60788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
60798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
60808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Try the SVG properties
60818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        applySVGProperty(id, value);
60822bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
60838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
60848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid CSSStyleSelector::applyPageSizeProperty(CSSValue* value)
608806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
6089ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->resetPageSizeType();
609006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (!value->isValueList())
609106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
609206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CSSValueList* valueList = static_cast<CSSValueList*>(value);
609306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length width;
609406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Length height;
6095ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    PageSizeType pageSizeType = PAGE_SIZE_AUTO;
609606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    switch (valueList->length()) {
609706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 2: {
609806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length>{2} | <page-size> <orientation>
6099ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        pageSizeType = PAGE_SIZE_RESOLVED;
610006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue() || !valueList->item(1)->isPrimitiveValue())
610106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
610206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue0 = static_cast<CSSPrimitiveValue*>(valueList->item(0));
610306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue1 = static_cast<CSSPrimitiveValue*>(valueList->item(1));
610406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type0 = primitiveValue0->primitiveType();
610506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type1 = primitiveValue1->primitiveType();
610606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type0)) {
610706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>{2}
610806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!CSSPrimitiveValue::isUnitTypeLength(type1))
610906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
611006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = Length(primitiveValue0->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
611106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            height = Length(primitiveValue1->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
611206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
611306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <page-size> <orientation>
611406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // The value order is guaranteed. See CSSParser::parseSizeParameter.
611506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!pageSizeFromName(primitiveValue0, primitiveValue1, width, height))
611606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
611706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
611806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
611906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
612006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case 1: {
612106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // <length> | auto | <page-size> | [ portrait | landscape]
612206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!valueList->item(0)->isPrimitiveValue())
612306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return;
612406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(valueList->item(0));
612506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        int type = primitiveValue->primitiveType();
612606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (CSSPrimitiveValue::isUnitTypeLength(type)) {
612706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            // <length>
6128ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            pageSizeType = PAGE_SIZE_RESOLVED;
612906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            width = height = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
613006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        } else {
613106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (type != CSSPrimitiveValue::CSS_IDENT)
613206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                return;
613306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            switch (primitiveValue->getIdent()) {
613406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueAuto:
6135ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO;
613606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
613706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValuePortrait:
6138ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_PORTRAIT;
6139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                break;
614006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            case CSSValueLandscape:
6141ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_AUTO_LANDSCAPE;
614206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                break;
614306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            default:
6144ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                // <page-size>
6145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                pageSizeType = PAGE_SIZE_RESOLVED;
614606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                if (!pageSizeFromName(primitiveValue, 0, width, height))
614706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                    return;
614806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
614906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
615006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
615106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
615206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
615306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return;
615406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6155ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_style->setPageSizeType(pageSizeType);
615606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_style->setPageSize(LengthSize(width, height));
615706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return;
615806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
615906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
616006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool CSSStyleSelector::pageSizeFromName(CSSPrimitiveValue* pageSizeName, CSSPrimitiveValue* pageOrientation, Length& width, Length& height)
616106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
616206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a5Width = mmLength(148), a5Height = mmLength(210);
616306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a4Width = mmLength(210), a4Height = mmLength(297);
616406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length a3Width = mmLength(297), a3Height = mmLength(420);
616506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b5Width = mmLength(176), b5Height = mmLength(250);
616606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length b4Width = mmLength(250), b4Height = mmLength(353);
616706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length letterWidth = inchLength(8.5), letterHeight = inchLength(11);
616806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length legalWidth = inchLength(8.5), legalHeight = inchLength(14);
616906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static const Length ledgerWidth = inchLength(11), ledgerHeight = inchLength(17);
617006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6171ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!pageSizeName || pageSizeName->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6172ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return false;
617306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6174ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    switch (pageSizeName->getIdent()) {
617506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA5:
617606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a5Width;
617706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a5Height;
617806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
617906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA4:
618006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a4Width;
618106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a4Height;
618206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueA3:
618406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = a3Width;
618506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = a3Height;
618606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
618706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB5:
618806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b5Width;
618906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b5Height;
619006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueB4:
619206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = b4Width;
619306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = b4Height;
619406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLetter:
619606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = letterWidth;
619706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = letterHeight;
619806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
619906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLegal:
620006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = legalWidth;
620106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = legalHeight;
620206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
620306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    case CSSValueLedger:
620406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        width = ledgerWidth;
620506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        height = ledgerHeight;
620606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        break;
620706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    default:
620806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
620906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
6210ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (pageOrientation) {
6212ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        if (pageOrientation->primitiveType() != CSSPrimitiveValue::CSS_IDENT)
6213ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6214ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        switch (pageOrientation->getIdent()) {
6215ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValueLandscape:
6216ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            std::swap(width, height);
6217ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        case CSSValuePortrait:
6219ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            // Nothing to do.
6220ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            break;
6221ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        default:
6222ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            return false;
6223ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        }
6224ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
622506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return true;
622606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
622706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6228cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::mmLength(double mm) const
622906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
623006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(mm, CSSPrimitiveValue::CSS_MM)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
623106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
623206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
6233cad810f21b803229eb11403f9209855525a25d57Steve BlockLength CSSStyleSelector::inchLength(double inch) const
623406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
623506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return Length(CSSPrimitiveValue::create(inch, CSSPrimitiveValue::CSS_IN)->computeLengthIntForLength(style(), m_rootElementStyle), Fixed);
623606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
623706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
62385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillAttachment(CSSPropertyID, FillLayer* layer, CSSValue* value)
62398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setAttachment(FillLayer::initialFillAttachment(layer->type()));
62428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (primitiveValue->getIdent()) {
62508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueFixed:
62510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(FixedBackgroundAttachment);
62528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueScroll:
62540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(ScrollBackgroundAttachment);
62550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
62560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case CSSValueLocal:
62570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            layer->setAttachment(LocalBackgroundAttachment);
62588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
62598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
62608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
62618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillClip(CSSPropertyID, FillLayer* layer, CSSValue* value)
62658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setClip(FillLayer::initialFillClip(layer->type()));
62688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setClip(*primitiveValue);
62768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillComposite(CSSPropertyID, FillLayer* layer, CSSValue* value)
62798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setComposite(FillLayer::initialFillComposite(layer->type()));
62828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
62868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
62898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setComposite(*primitiveValue);
62908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
62918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillOrigin(CSSPropertyID, FillLayer* layer, CSSValue* value)
62938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
62948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
62958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setOrigin(FillLayer::initialFillOrigin(layer->type()));
62968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
62978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
62988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
63038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setOrigin(*primitiveValue);
63048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::styleImage(CSSPropertyID property, CSSValue* value)
63078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageValue())
63095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return cachedOrPendingFromValue(property, static_cast<CSSImageValue*>(value));
63105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isImageGeneratorValue())
63128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<CSSImageGeneratorValue*>(value)->generatedImage();
63135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
63158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenStyleImage* CSSStyleSelector::cachedOrPendingFromValue(CSSPropertyID property, CSSImageValue* value)
63185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
63195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    StyleImage* image = value->cachedOrPendingImage();
63205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (image && image->isPendingImage())
63215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        m_pendingImageProperties.add(property);
63225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return image;
63235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
63245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
63255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillImage(CSSPropertyID property, FillLayer* layer, CSSValue* value)
63268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
63288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setImage(FillLayer::initialFillImage(layer->type()));
63298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    layer->setImage(styleImage(property, value));
63338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatX(CSSPropertyID, FillLayer* layer, CSSValue* value)
63368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatX(FillLayer::initialFillRepeatX(layer->type()));
63398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6346231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatX(*primitiveValue);
63478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
63488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillRepeatY(CSSPropertyID, FillLayer* layer, CSSValue* value)
63508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
63518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6352231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setRepeatY(FillLayer::initialFillRepeatY(layer->type()));
63538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
63558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
63578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6358231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setRepeatY(*primitiveValue);
6361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
6362231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillSize(CSSPropertyID, FillLayer* layer, CSSValue* value)
6364231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!value->isPrimitiveValue()) {
6366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeNone);
6367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6368231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6369231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6371231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (primitiveValue->getIdent() == CSSValueContain)
6372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Contain);
6373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else if (primitiveValue->getIdent() == CSSValueCover)
6374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(Cover);
6375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
6376231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeType(SizeLength);
6377231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6378231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    LengthSize b = FillLayer::initialFillSizeLength(layer->type());
6379231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL || primitiveValue->getIdent() == CSSValueContain
6381231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        || primitiveValue->getIdent() == CSSValueCover) {
6382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        layer->setSizeLength(b);
6383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
6384231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Pair* pair = primitiveValue->getPairValue();
63876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!pair || !pair->first() || !pair->second())
63888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
63898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* first = static_cast<CSSPrimitiveValue*>(pair->first());
63918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* second = static_cast<CSSPrimitiveValue*>(pair->second());
63928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length firstLength, secondLength;
63948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int firstType = first->primitiveType();
63958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int secondType = second->primitiveType();
63968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
63988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
63998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (firstType == CSSPrimitiveValue::CSS_UNKNOWN)
64008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(Auto);
64018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(firstType))
64020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        firstLength = Length(first->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (firstType == CSSPrimitiveValue::CSS_PERCENTAGE)
64048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstLength = Length(first->getDoubleValue(), Percent);
64058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (secondType == CSSPrimitiveValue::CSS_UNKNOWN)
64098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(Auto);
64108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    else if (CSSPrimitiveValue::isUnitTypeLength(secondType))
64110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        secondLength = Length(second->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (secondType == CSSPrimitiveValue::CSS_PERCENTAGE)
64138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        secondLength = Length(second->getDoubleValue(), Percent);
64148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setWidth(firstLength);
64188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    b.setHeight(secondLength);
6419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    layer->setSizeLength(b);
64208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillXPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setXPosition(FillLayer::initialFillXPosition(layer->type()));
64268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setXPosition(l);
64448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapFillYPosition(CSSPropertyID, FillLayer* layer, CSSValue* value)
64478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
64498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setYPosition(FillLayer::initialFillYPosition(layer->type()));
64508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
64548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomFactor = m_style->effectiveZoom();
64578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Length l;
64608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int type = primitiveValue->primitiveType();
64618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (CSSPrimitiveValue::isUnitTypeLength(type))
64620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        l = Length(primitiveValue->computeLengthIntForLength(style(), m_rootElementStyle, zoomFactor), Fixed);
64638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (type == CSSPrimitiveValue::CSS_PERCENTAGE)
64648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l = Length(primitiveValue->getDoubleValue(), Percent);
64658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
64668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    layer->setYPosition(l);
64688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDelay(Animation* animation, CSSValue* value)
64718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(Animation::initialAnimationDelay());
64748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
6482635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue());
6483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDelay(primitiveValue->getFloatValue()/1000.0f);
64858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
64868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDirection(Animation* layer, CSSValue* value)
64888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setDirection(Animation::initialAnimationDirection());
64918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
64928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
64938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
64946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
64956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
64966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
64978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
64988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    layer->setDirection(primitiveValue->getIdent() == CSSValueAlternate ? Animation::AnimationDirectionAlternate : Animation::AnimationDirectionNormal);
64998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationDuration(Animation* animation, CSSValue* value)
65028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6504635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setDuration(Animation::initialAnimationDuration());
65058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_S)
65138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue());
65148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_MS)
65158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setDuration(primitiveValue->getFloatValue()/1000.0f);
65168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid CSSStyleSelector::mapAnimationFillMode(Animation* layer, CSSValue* value)
6519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(Animation::initialAnimationFillMode());
6522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
6523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (primitiveValue->getIdent()) {
6530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueNone:
6531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeNone);
6532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueForwards:
6534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeForwards);
6535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBackwards:
6537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBackwards);
6538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CSSValueBoth:
6540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        layer->setFillMode(AnimationFillModeBoth);
6541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
6542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
6543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationIterationCount(Animation* animation, CSSValue* value)
65468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setIterationCount(Animation::initialAnimationIterationCount());
65498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
65538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueInfinite)
65578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(-1);
65588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        animation->setIterationCount(int(primitiveValue->getFloatValue()));
65608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationName(Animation* layer, CSSValue* value)
65638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        layer->setName(Animation::initialAnimationName());
65668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
65688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueNone)
65748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setIsNoneAnimation(true);
65758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
65768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        layer->setName(primitiveValue->getStringValue());
65778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
65788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
65790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid CSSStyleSelector::mapAnimationPlayState(Animation* layer, CSSValue* value)
65800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
65810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
65820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        layer->setPlayState(Animation::initialAnimationPlayState());
65830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
65840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
65850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value->isPrimitiveValue())
65876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
65886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
65890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
65900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    EAnimPlayState playState = (primitiveValue->getIdent() == CSSValuePaused) ? AnimPlayStatePaused : AnimPlayStatePlaying;
65910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    layer->setPlayState(playState);
65920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
65930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
65948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationProperty(Animation* animation, CSSValue* value)
65958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
65968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(Animation::initialAnimationProperty());
65988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
65998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!value->isPrimitiveValue())
66028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
6605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (primitiveValue->getIdent() == CSSValueAll)
6606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateAll);
6607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (primitiveValue->getIdent() == CSSValueNone)
6608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(cAnimateNone);
6609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
6610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setProperty(static_cast<CSSPropertyID>(primitiveValue->getIdent()));
66118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::mapAnimationTimingFunction(Animation* animation, CSSValue* value)
66148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->cssValueType() == CSSValue::CSS_INITIAL) {
6616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        animation->setTimingFunction(Animation::initialAnimationTimingFunction());
66178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isPrimitiveValue()) {
66218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
66228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        switch (primitiveValue->getIdent()) {
66238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueLinear:
66245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(LinearTimingFunction::create());
66258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEase:
66275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create());
66288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseIn:
66305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 1.0, 1.0));
66318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseOut:
66335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.0, 0.0, 0.58, 1.0));
66348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            case CSSValueEaseInOut:
66365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(CubicBezierTimingFunction::create(0.42, 0.0, 0.58, 1.0));
66375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepStart:
66395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, true));
66405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
66415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            case CSSValueStepEnd:
66425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                animation->setTimingFunction(StepsTimingFunction::create(1, false));
66438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
66448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
66458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (value->isTimingFunctionValue()) {
66498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSSTimingFunctionValue* timingFunction = static_cast<CSSTimingFunctionValue*>(value);
66505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (timingFunction->isCubicBezierTimingFunctionValue()) {
66515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSCubicBezierTimingFunctionValue* cubicTimingFunction = static_cast<CSSCubicBezierTimingFunctionValue*>(value);
66525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(CubicBezierTimingFunction::create(cubicTimingFunction->x1(), cubicTimingFunction->y1(), cubicTimingFunction->x2(), cubicTimingFunction->y2()));
66535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else if (timingFunction->isStepsTimingFunctionValue()) {
66545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            CSSStepsTimingFunctionValue* stepsTimingFunction = static_cast<CSSStepsTimingFunctionValue*>(value);
66555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(StepsTimingFunction::create(stepsTimingFunction->numberOfSteps(), stepsTimingFunction->stepAtStart()));
66565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        } else
66575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            animation->setTimingFunction(LinearTimingFunction::create());
66588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
66598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
66608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::mapNinePieceImage(CSSPropertyID property, CSSValue* value, NinePieceImage& image)
66628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
66646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!value || value->isPrimitiveValue() || !value->isBorderImageValue())
66658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
66668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Retrieve the border image value.
66688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSBorderImageValue* borderImage = static_cast<CSSBorderImageValue*>(value);
66698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the image (this kicks off the load).
66715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    image.setImage(styleImage(property, borderImage->imageValue()));
66728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set up a length box to represent our image slices.
6674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    LengthBox l;
66758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Rect* r = borderImage->m_imageSliceRect.get();
66768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->top()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getDoubleValue(), Percent);
66788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_top = Length(r->top()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->bottom()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length(r->bottom()->getDoubleValue(), Percent);
66828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_bottom = Length((int)r->bottom()->getFloatValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->left()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getDoubleValue(), Percent);
66868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_left = Length(r->left()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
66888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (r->right()->primitiveType() == CSSPrimitiveValue::CSS_PERCENTAGE)
66898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getDoubleValue(), Percent);
66908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
66918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        l.m_right = Length(r->right()->getIntValue(CSSPrimitiveValue::CSS_NUMBER), Fixed);
6692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setSlices(l);
6693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set the appropriate rules for stretch/round/repeat of the slices
6695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule horizontalRule;
66968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_horizontalSizeRule) {
66978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = StretchImageRule;
66998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RoundImageRule;
67028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            horizontalRule = RepeatImageRule;
67058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setHorizontalRule(horizontalRule);
67088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ENinePieceImageRule verticalRule;
67108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (borderImage->m_verticalSizeRule) {
67118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStretch:
6712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = StretchImageRule;
67138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueRound:
6715dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RoundImageRule;
67168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: // CSSValueRepeat
6718dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            verticalRule = RepeatImageRule;
67198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
67208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    image.setVerticalRule(verticalRule);
67228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForTextSizeAdjust()
67258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_style->textSizeAdjust())
67278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6728aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck
6729aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    /* TODO: Remove this when a fix for webkit bug 56543 is submitted and can
6730aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * be cherry picked.
6731aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * This is a quick fix for Android to prevent sites from using
6732aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * -webkit-text-size-adjust: none; which breaks font size accessibility
6733aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * options on all platforms. The purpose of the property is to prevent
6734aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the automatic font size changes done by platforms like iOS when the
6735aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * rotation changes. Since Android doesn't do this, we can safely ignore
6736aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     * the 'none' option.
6737aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck     */
6738aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#if PLATFORM(ANDROID)
6739aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck    return;
6740aaf00b3dd10c64d47611a17592267b3aad69eee8John Reck#endif
67418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(m_style->fontDescription());
67438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newFontDescription.setComputedSize(newFontDescription.specifiedSize());
67448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_style->setFontDescription(newFontDescription);
67458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForZoomChange(RenderStyle* style, RenderStyle* parentStyle)
67488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->effectiveZoom() == parentStyle->effectiveZoom())
67508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, childFont.specifiedSize());
67558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::checkForGenericFamilyChange(RenderStyle* style, RenderStyle* parentStyle)
67598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& childFont = style->fontDescription();
67618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.isAbsoluteSize() || !parentStyle)
67638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const FontDescription& parentFont = parentStyle->fontDescription();
6766231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.useFixedDefaultSize() == parentFont.useFixedDefaultSize())
67678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For now, lump all families but monospace together.
67708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (childFont.genericFamily() != FontDescription::MonospaceFamily &&
67718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        parentFont.genericFamily() != FontDescription::MonospaceFamily)
67728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
67738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We know the parent is monospace or the child is monospace, and that font
67758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // size was unspecified.  We want to scale our font size as appropriate.
67768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the font uses a keyword size, then we refetch from the table rather than
67778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // multiplying by our scale factor.
67788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float size;
6779231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (childFont.keywordSize())
6780d0825bca7fe65beaee391d30da42e937db621564Steve Block        size = fontSizeForKeyword(m_checker.m_document, CSSValueXxSmall + childFont.keywordSize() - 1, childFont.useFixedDefaultSize());
6781231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else {
67828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Settings* settings = m_checker.m_document->settings();
67838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float fixedScaleFactor = settings
67848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ? static_cast<float>(settings->defaultFixedFontSize()) / settings->defaultFontSize()
67858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            : 1;
6786231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        size = parentFont.useFixedDefaultSize() ?
6787231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() / fixedScaleFactor :
6788231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                childFont.specifiedSize() * fixedScaleFactor;
67898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
67908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription newFontDescription(childFont);
67928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setFontSize(newFontDescription, size);
67938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(newFontDescription);
67948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
67958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::setFontSize(FontDescription& fontDescription, float size)
67978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setSpecifiedSize(size);
6799692e5dbf12901edacf14812a6fae25462920af42Steve Block
6800692e5dbf12901edacf14812a6fae25462920af42Steve Block    bool useSVGZoomRules = m_element && m_element->isSVGElement();
6801692e5dbf12901edacf14812a6fae25462920af42Steve Block    fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(m_checker.m_document, m_style.get(), fontDescription.isAbsoluteSize(), size, useSVGZoomRules));
68028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
68038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6804692e5dbf12901edacf14812a6fae25462920af42Steve Blockfloat CSSStyleSelector::getComputedSizeFromSpecifiedSize(Document* document, RenderStyle* style, bool isAbsoluteSize, float specifiedSize, bool useSVGZoomRules)
68058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Text with a 0px font size should not be visible and therefore needs to be
68072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // exempt from minimum font size rules. Acid3 relies on this for pixel-perfect
68082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // rendering. This is also compatible with other browsers that have minimum
68092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // font size settings (e.g. Firefox).
68102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (fabsf(specifiedSize) < std::numeric_limits<float>::epsilon())
68112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return 0.0f;
68122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6813692e5dbf12901edacf14812a6fae25462920af42Steve Block    float zoomFactor = 1.0f;
6814692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!useSVGZoomRules) {
6815692e5dbf12901edacf14812a6fae25462920af42Steve Block        zoomFactor = style->effectiveZoom();
681668513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (Frame* frame = document->frame())
681768513a70bcd92384395513322f1b801e7bf9c729Steve Block            zoomFactor *= frame->textZoomFactor();
6818692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
6819692e5dbf12901edacf14812a6fae25462920af42Steve Block
68208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We support two types of minimum font size.  The first is a hard override that applies to
68218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // all fonts.  This is "minSize."  The second type of minimum font size is a "smart minimum"
68228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that is applied only when the Web page can't know what size it really asked for, e.g.,
68238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when it uses logical sizes like "small" or expresses the font-size as a percentage of
68248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the user's default font setting.
68258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // With the smart minimum, we never want to get smaller than the minimum font size to keep fonts readable.
68278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // However we always allow the page to set an explicit pixel size that is smaller,
68288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // since sites will mis-render otherwise (e.g., http://www.gamespot.com with a 9px minimum).
68298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6830d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
68318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
68328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
68338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minSize = settings->minimumFontSize();
68358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minLogicalSize = settings->minimumLogicalFontSize();
68368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float zoomedSize = specifiedSize * zoomFactor;
68378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Apply the hard minimum first.  We only apply the hard minimum if after zooming we're still too small.
68398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minSize)
68408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minSize;
68418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now apply the "smart minimum."  This minimum is also only applied if we're still too small
68438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // after zooming.  The font size must either be relative to the user default or the original size
68448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // must have been acceptable.  In other words, we only apply the smart minimum whenever we're positive
68458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // doing so won't disrupt the layout.
68468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (zoomedSize < minLogicalSize && (specifiedSize >= minLogicalSize || !isAbsoluteSize))
68478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        zoomedSize = minLogicalSize;
68488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Also clamp to a reasonable maximum to prevent insane font sizes from causing crashes on various
68508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // platforms (I'm looking at you, Windows.)
68516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return min(1000000.0f, zoomedSize);
68528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
68538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMax = 16;
68558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int fontSizeTableMin = 9;
68568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int totalKeywords = 8;
68578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WinIE/Nav4 table for font sizes.  Designed to match the legacy font mapping system of HTML.
68598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int quirksFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    28 },
68628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    31 },
68638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    11,    13,    17,    22,    34 },
68648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    37 },
68658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    13,    16,    20,    26,    40 }, // fixed font default (13)
68668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    11,    14,    17,    21,    28,    42 },
68678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    15,    17,    23,    30,    45 },
68688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Strict mode table matches MacIE and Mozilla's settings exactly.
68768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const int strictFontSizeTable[fontSizeTableMax - fontSizeTableMin + 1][totalKeywords] =
68778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,     9,    11,    14,    18,    27 },
68798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,     9,    10,    12,    15,    20,    30 },
68808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    11,    13,    17,    22,    33 },
68818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,    9,    10,    12,    14,    18,    24,    36 },
68828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    13,    16,    20,    26,    39 }, // fixed font default (13)
68838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    12,    14,    17,    21,    28,    42 },
68848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    15,    18,    23,    30,    45 },
68858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project      { 9,   10,    13,    16,    18,    24,    32,    48 }  // proportional font default (16)
68868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
68878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// HTML       1      2      3      4      5      6      7
68888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// CSS  xxs   xs     s      m      l     xl     xxl
68898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                          |
68908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//                      user pref
68918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For values outside the range of the table, we use Todd Fahrner's suggested scale
68938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// factors for each keyword value.
68948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const float fontSizeFactors[totalKeywords] = { 0.60f, 0.75f, 0.89f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f };
68958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickfloat CSSStyleSelector::fontSizeForKeyword(Document* document, int keyword, bool shouldUseFixedDefaultSize)
68978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6898d0825bca7fe65beaee391d30da42e937db621564Steve Block    Settings* settings = document->settings();
68998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!settings)
69008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
69018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    bool quirksMode = document->inQuirksMode();
69035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
69048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
69058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Look up the entry in the table.
69068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int row = mediumSize - fontSizeTableMin;
69078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int col = (keyword - CSSValueXxSmall);
69088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return quirksMode ? quirksFontSizeTable[row][col] : strictFontSizeTable[row][col];
69098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Value is outside the range of the table. Apply the scale factor instead.
69128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float minLogicalSize = max(settings->minimumLogicalFontSize(), 1);
69138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return max(fontSizeFactors[keyword - CSSValueXxSmall]*mediumSize, minLogicalSize);
69148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate<typename T>
69175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickstatic int findNearestLegacyFontSize(int pixelFontSize, const T* table, int multiplier)
69185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Ignore table[0] because xx-small does not correspond to any legacy font size.
69205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    for (int i = 1; i < totalKeywords - 1; i++) {
69215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (pixelFontSize * 2 < (table[i] + table[i + 1]) * multiplier)
69225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return i;
69235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return totalKeywords - 1;
69255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickint CSSStyleSelector::legacyFontSize(Document* document, int pixelFontSize, bool shouldUseFixedDefaultSize)
69285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
69295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    Settings* settings = document->settings();
69305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!settings)
69315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 1;
69325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool quirksMode = document->inQuirksMode();
69345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    int mediumSize = shouldUseFixedDefaultSize ? settings->defaultFixedFontSize() : settings->defaultFontSize();
69355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (mediumSize >= fontSizeTableMin && mediumSize <= fontSizeTableMax) {
69365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        int row = mediumSize - fontSizeTableMin;
69375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return findNearestLegacyFontSize<int>(pixelFontSize, quirksMode ? quirksFontSizeTable[row] : strictFontSizeTable[row], 1);
69385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
69395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
69405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return findNearestLegacyFontSize<float>(pixelFontSize, fontSizeFactors, mediumSize);
69415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
69425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
6943635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::largerFontSize(float size, bool) const
69448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale up to
69468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size * 1.2f;
69488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6950635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectfloat CSSStyleSelector::smallerFontSize(float size, bool) const
69518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Figure out where we fall in the size ranges (xx-small to xxx-large) and scale down to
69538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the next size level.
69548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return size / 1.2f;
69558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Color colorForCSSValue(int cssValueId)
69588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    struct ColorValue {
69608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int cssValueId;
69618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RGBA32 color;
69628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static const ColorValue colorValues[] = {
69658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueAqua, 0xFF00FFFF },
69668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlack, 0xFF000000 },
69678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueBlue, 0xFF0000FF },
69688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueFuchsia, 0xFFFF00FF },
69698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGray, 0xFF808080 },
69708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGreen, 0xFF008000  },
69718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueGrey, 0xFF808080 },
69728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueLime, 0xFF00FF00 },
69738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueMaroon, 0xFF800000 },
69748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueNavy, 0xFF000080 },
69758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOlive, 0xFF808000  },
69768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueOrange, 0xFFFFA500 },
69778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValuePurple, 0xFF800080 },
69788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueRed, 0xFFFF0000 },
69798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueSilver, 0xFFC0C0C0 },
69808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTeal, 0xFF008080  },
69818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueTransparent, 0x00000000 },
69828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueWhite, 0xFFFFFFFF },
69838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { CSSValueYellow, 0xFFFFFF00 },
69848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        { 0, 0 }
69858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
69868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (const ColorValue* col = colorValues; col->cssValueId; ++col) {
69888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (col->cssValueId == cssValueId)
69898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return col->color;
69908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
69910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return RenderTheme::defaultTheme()->systemColor(cssValueId);
69928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
69938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6994cad810f21b803229eb11403f9209855525a25d57Steve BlockColor CSSStyleSelector::getColorFromPrimitiveValue(CSSPrimitiveValue* primitiveValue) const
69958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Color col;
69978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int ident = primitiveValue->getIdent();
69988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ident) {
69998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (ident == CSSValueWebkitText)
70008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->textColor();
7001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitLink)
7002dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            col = m_element->isLink() && m_checker.m_matchVisitedPseudoClass ? m_element->document()->visitedLinkColor() : m_element->document()->linkColor();
7003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else if (ident == CSSValueWebkitActivelink)
70048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_element->document()->activeLinkColor();
70058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueWebkitFocusRingColor)
70060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            col = RenderTheme::focusRingColor();
70078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (ident == CSSValueCurrentcolor)
70088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = m_style->color();
70098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
70108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            col = colorForCSSValue(ident);
70118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (primitiveValue->primitiveType() == CSSPrimitiveValue::CSS_RGBCOLOR)
70120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        col.setRGB(primitiveValue->getRGBA32Value());
70138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return col;
70148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7016cad810f21b803229eb11403f9209855525a25d57Steve Blockbool CSSStyleSelector::hasSelectorForAttribute(const AtomicString &attrname) const
70178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_selectorAttrs.contains(attrname.impl());
70198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::addViewportDependentMediaQueryResult(const MediaQueryExp* expr, bool result)
70228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_viewportDependentMediaQueryResults.append(new MediaQueryResult(*expr, result));
70248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CSSStyleSelector::affectedByViewportChange() const
70278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned s = m_viewportDependentMediaQueryResults.size();
70298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < s; i++) {
70308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expression) != m_viewportDependentMediaQueryResults[i]->m_result)
70318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
70328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
70348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::allVisitedStateChanged()
70378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_linksCheckedForVisitedState.isEmpty())
70398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->isLink())
70425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7046635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CSSStyleSelector::SelectorChecker::visitedStateChanged(LinkHash visitedHash)
70478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_linksCheckedForVisitedState.contains(visitedHash))
70498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
70508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Node* node = m_document; node; node = node->traverseNextNode()) {
70518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const AtomicString* attr = linkAttribute(node);
7052635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (attr && visitedLinkHash(m_document->baseURL(), *attr) == visitedHash)
70535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            node->setNeedsStyleRecalc();
70548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7057635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic TransformOperation::OperationType getTransformOperationType(WebKitCSSTransformValue::TransformOperationType type)
70588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (type) {
70608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleTransformOperation:          return TransformOperation::SCALE;
70618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleXTransformOperation:         return TransformOperation::SCALE_X;
70628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::ScaleYTransformOperation:         return TransformOperation::SCALE_Y;
70638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::ScaleZTransformOperation:         return TransformOperation::SCALE_Z;
70648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Scale3DTransformOperation:        return TransformOperation::SCALE_3D;
70658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateTransformOperation:      return TransformOperation::TRANSLATE;
70668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateXTransformOperation:     return TransformOperation::TRANSLATE_X;
70678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::TranslateYTransformOperation:     return TransformOperation::TRANSLATE_Y;
70688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::TranslateZTransformOperation:     return TransformOperation::TRANSLATE_Z;
70698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Translate3DTransformOperation:    return TransformOperation::TRANSLATE_3D;
70708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::RotateTransformOperation:         return TransformOperation::ROTATE;
70718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateXTransformOperation:        return TransformOperation::ROTATE_X;
70728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateYTransformOperation:        return TransformOperation::ROTATE_Y;
70738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::RotateZTransformOperation:        return TransformOperation::ROTATE_Z;
70748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Rotate3DTransformOperation:       return TransformOperation::ROTATE_3D;
70758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewTransformOperation:           return TransformOperation::SKEW;
70768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewXTransformOperation:          return TransformOperation::SKEW_X;
70778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::SkewYTransformOperation:          return TransformOperation::SKEW_Y;
70788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::MatrixTransformOperation:         return TransformOperation::MATRIX;
70798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::Matrix3DTransformOperation:       return TransformOperation::MATRIX_3D;
70808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        case WebKitCSSTransformValue::PerspectiveTransformOperation:    return TransformOperation::PERSPECTIVE;
70818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebKitCSSTransformValue::UnknownTransformOperation:        return TransformOperation::NONE;
70828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
70838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return TransformOperation::NONE;
70848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
70858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
70860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool CSSStyleSelector::createTransformOperations(CSSValue* inValue, RenderStyle* style, RenderStyle* rootStyle, TransformOperations& outOperations)
70878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
70886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!inValue || !inValue->isValueList()) {
70896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        outOperations.clear();
70906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
70916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
70928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
70936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    float zoomFactor = style ? style->effectiveZoom() : 1;
70948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TransformOperations operations;
70956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    CSSValueList* list = static_cast<CSSValueList*>(inValue);
70966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned size = list->length();
70976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    for (unsigned i = 0; i < size; i++) {
70986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSValue* currValue = list->itemWithoutBoundsCheck(i);
70996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!currValue->isWebKitCSSTransformValue())
71006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        WebKitCSSTransformValue* transformValue = static_cast<WebKitCSSTransformValue*>(list->itemWithoutBoundsCheck(i));
71036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (!transformValue->length())
71046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        bool haveNonPrimitiveValue = false;
71076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        for (unsigned j = 0; j < transformValue->length(); ++j) {
71086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (!transformValue->itemWithoutBoundsCheck(j)->isPrimitiveValue()) {
71096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                haveNonPrimitiveValue = true;
71106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        }
71136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (haveNonPrimitiveValue)
71146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            continue;
71156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSSPrimitiveValue* firstValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0));
71176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
71186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        switch (transformValue->operationType()) {
71196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleTransformOperation:
71206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleXTransformOperation:
71216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleYTransformOperation: {
71226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
71358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                }
71366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, 1.0, getTransformOperationType(transformValue->operationType())));
71376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::ScaleZTransformOperation:
71406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Scale3DTransformOperation: {
71416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sx = 1.0;
71426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sy = 1.0;
71436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double sz = 1.0;
71446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::ScaleZTransformOperation)
71456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sz = firstValue->getDoubleValue();
71466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::ScaleYTransformOperation)
71476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sy = firstValue->getDoubleValue();
71486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    sx = firstValue->getDoubleValue();
71506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::ScaleXTransformOperation) {
71516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
71526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
71536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sz = thirdValue->getDoubleValue();
71548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = secondValue->getDoubleValue();
71586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        } else
71596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            sy = sx;
71608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
71626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(ScaleTransformOperation::create(sx, sy, sz, getTransformOperationType(transformValue->operationType())));
71636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateTransformOperation:
71666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateXTransformOperation:
71676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateYTransformOperation: {
71686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71722bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
71742bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
71766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
71776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
71782bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
71798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                        }
71808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    }
71816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
71828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
71846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
71858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
71866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, Length(0, Fixed), getTransformOperationType(transformValue->operationType())));
71876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
71886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
71896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::TranslateZTransformOperation:
71906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Translate3DTransformOperation: {
71916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                bool ok = true;
71926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tx = Length(0, Fixed);
71936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length ty = Length(0, Fixed);
71946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                Length tz = Length(0, Fixed);
71956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::TranslateZTransformOperation)
71962bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tz = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::TranslateYTransformOperation)
71982bde8e466a4451c7319e3a072d118917957d6554Steve Block                    ty = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
71996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
72002bde8e466a4451c7319e3a072d118917957d6554Steve Block                    tx = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
72016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() != WebKitCSSTransformValue::TranslateXTransformOperation) {
72026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 2) {
72036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
72042bde8e466a4451c7319e3a072d118917957d6554Steve Block                            tz = convertToFloatLength(thirdValue, style, rootStyle, zoomFactor, &ok);
72056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        }
72066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
72076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72082bde8e466a4451c7319e3a072d118917957d6554Steve Block                            ty = convertToFloatLength(secondValue, style, rootStyle, zoomFactor, &ok);
72098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                }
72128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (!ok)
72146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
72158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(TranslateTransformOperation::create(tx, ty, tz, getTransformOperationType(transformValue->operationType())));
72176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateTransformOperation: {
72206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(0, 0, 1, angle, getTransformOperationType(transformValue->operationType())));
72296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateXTransformOperation:
72326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateYTransformOperation:
72336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::RotateZTransformOperation: {
72346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = 0;
72356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = 0;
72366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = 0;
72376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
72436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::RotateXTransformOperation)
72446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    x = 1;
72456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (transformValue->operationType() == WebKitCSSTransformValue::RotateYTransformOperation)
72466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    y = 1;
72476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else
72486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    z = 1;
72496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Rotate3DTransformOperation: {
72536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 4)
72548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
72556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* thirdValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2));
72576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                CSSPrimitiveValue* fourthValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3));
72586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double x = firstValue->getDoubleValue();
72596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double y = secondValue->getDoubleValue();
72606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double z = thirdValue->getDoubleValue();
72616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = fourthValue->getDoubleValue();
72626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (fourthValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(RotateTransformOperation::create(x, y, z, angle, getTransformOperationType(transformValue->operationType())));
72676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
72686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
72696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewTransformOperation:
72706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewXTransformOperation:
72716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::SkewYTransformOperation: {
72726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleX = 0;
72736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angleY = 0;
72746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double angle = firstValue->getDoubleValue();
72756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = rad2deg(angle);
72776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = grad2deg(angle);
72796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else if (firstValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angle = turn2deg(angle);
72816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->operationType() == WebKitCSSTransformValue::SkewYTransformOperation)
72826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleY = angle;
72836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                else {
72846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    angleX = angle;
72856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    if (transformValue->operationType() == WebKitCSSTransformValue::SkewTransformOperation) {
72866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                        if (transformValue->length() > 1) {
72876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            CSSPrimitiveValue* secondValue = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1));
72886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            angleY = secondValue->getDoubleValue();
72896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_RAD)
72906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = rad2deg(angleY);
72916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_GRAD)
72926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = grad2deg(angleY);
72936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                            else if (secondValue->primitiveType() == CSSPrimitiveValue::CSS_TURN)
72946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                angleY = turn2deg(angleY);
72958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        }
72968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
72978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
72986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(SkewTransformOperation::create(angleX, angleY, getTransformOperationType(transformValue->operationType())));
72996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::MatrixTransformOperation: {
73026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 6)
73038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian                    break;
73046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double a = firstValue->getDoubleValue();
73056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double b = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue();
73066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double c = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue();
73076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                double d = static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue();
7308f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double e = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue();
7309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                double f = zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue();
73106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(MatrixTransformOperation::create(a, b, c, d, e, f));
73116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::Matrix3DTransformOperation: {
73146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                if (transformValue->length() < 16)
73158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    break;
73166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                TransformationMatrix matrix(static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(0))->getDoubleValue(),
73176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(1))->getDoubleValue(),
73186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(2))->getDoubleValue(),
73196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(3))->getDoubleValue(),
73206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(4))->getDoubleValue(),
73216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(5))->getDoubleValue(),
73226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(6))->getDoubleValue(),
73236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(7))->getDoubleValue(),
73246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(8))->getDoubleValue(),
73256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(9))->getDoubleValue(),
73266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(10))->getDoubleValue(),
73276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(11))->getDoubleValue(),
7328f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(12))->getDoubleValue(),
7329f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                   zoomFactor * static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(13))->getDoubleValue(),
73306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(14))->getDoubleValue(),
73316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                                   static_cast<CSSPrimitiveValue*>(transformValue->itemWithoutBoundsCheck(15))->getDoubleValue());
73326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(Matrix3DTransformOperation::create(matrix));
73336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
73356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::PerspectiveTransformOperation: {
73362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                bool ok = true;
73372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                Length p = Length(0, Fixed);
73382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (CSSPrimitiveValue::isUnitTypeLength(firstValue->primitiveType()))
73392bde8e466a4451c7319e3a072d118917957d6554Steve Block                    p = convertToFloatLength(firstValue, style, rootStyle, zoomFactor, &ok);
73402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                else {
73412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    // This is a quirk that should go away when 3d transforms are finalized.
73422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    double val = firstValue->getDoubleValue();
73432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    ok = val >= 0;
73442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    val = clampToPositiveInteger(val);
73452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    p = Length(static_cast<int>(val), Fixed);
73462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                }
73472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                if (!ok)
73496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                    return false;
73502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
73516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                operations.operations().append(PerspectiveTransformOperation::create(p));
73526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
73546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            case WebKitCSSTransformValue::UnknownTransformOperation:
73556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                ASSERT_NOT_REACHED();
73566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
73578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
73588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
73596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
73608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    outOperations = operations;
73618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
73628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
73638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
73645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenvoid CSSStyleSelector::loadPendingImages()
73655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
73665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (m_pendingImageProperties.isEmpty())
73675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
73685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HashSet<int>::const_iterator end = m_pendingImageProperties.end();
73705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (HashSet<int>::const_iterator it = m_pendingImageProperties.begin(); it != end; ++it) {
73715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        CSSPropertyID currentProperty = static_cast<CSSPropertyID>(*it);
73725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        CachedResourceLoader* cachedResourceLoader = m_element->document()->cachedResourceLoader();
73745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        switch (currentProperty) {
73765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyBackgroundImage: {
73775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* backgroundLayer = m_style->accessBackgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next()) {
73785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (backgroundLayer->image() && backgroundLayer->image()->isPendingImage()) {
73795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(backgroundLayer->image())->cssImageValue();
73805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        backgroundLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
73815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyContent: {
73875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (ContentData* contentData = const_cast<ContentData*>(m_style->contentData()); contentData; contentData = contentData->next()) {
73885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (contentData->isImage() && contentData->image()->isPendingImage()) {
73895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(contentData->image())->cssImageValue();
7390a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                        if (StyleCachedImage* cachedImage = imageValue->cachedImage(cachedResourceLoader))
7391a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                            contentData->setImage(cachedImage);
73925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
73935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
73945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
73955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
73965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
73975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyCursor: {
73985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (CursorList* cursorList = m_style->cursors()) {
73995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    for (size_t i = 0; i < cursorList->size(); ++i) {
7400e14391e94c850b8bd03680c23b38978db68687a8John Reck                        CursorData& currentCursor = cursorList->at(i);
7401e14391e94c850b8bd03680c23b38978db68687a8John Reck                        if (StyleImage* image = currentCursor.image()) {
7402e14391e94c850b8bd03680c23b38978db68687a8John Reck                            if (image->isPendingImage()) {
7403e14391e94c850b8bd03680c23b38978db68687a8John Reck                                CSSImageValue* imageValue = static_cast<StylePendingImage*>(image)->cssImageValue();
7404e14391e94c850b8bd03680c23b38978db68687a8John Reck                                currentCursor.setImage(imageValue->cachedImage(cachedResourceLoader));
7405e14391e94c850b8bd03680c23b38978db68687a8John Reck                            }
74065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        }
74075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyListStyleImage: {
74135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (m_style->listStyleImage() && m_style->listStyleImage()->isPendingImage()) {
74145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(m_style->listStyleImage())->cssImageValue();
74155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setListStyleImage(imageValue->cachedImage(cachedResourceLoader));
74165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBorderImage: {
74215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& borderImage = m_style->borderImage();
74225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (borderImage.image() && borderImage.image()->isPendingImage()) {
74235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(borderImage.image())->cssImageValue();
74245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setBorderImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), borderImage.slices(), borderImage.horizontalRule(), borderImage.verticalRule()));
74255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitBoxReflect: {
7430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (StyleReflection* reflection = m_style->boxReflect()) {
7431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    const NinePieceImage& maskImage = reflection->mask();
7432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    if (maskImage.image() && maskImage.image()->isPendingImage()) {
7433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskImage.image())->cssImageValue();
7434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        reflection->setMask(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskImage.slices(), maskImage.horizontalRule(), maskImage.verticalRule()));
7435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    }
74365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskBoxImage: {
74415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                const NinePieceImage& maskBoxImage = m_style->maskBoxImage();
74425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                if (maskBoxImage.image() && maskBoxImage.image()->isPendingImage()) {
74435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskBoxImage.image())->cssImageValue();
74445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    m_style->setMaskBoxImage(NinePieceImage(imageValue->cachedImage(cachedResourceLoader), maskBoxImage.slices(), maskBoxImage.horizontalRule(), maskBoxImage.verticalRule()));
74455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            case CSSPropertyWebkitMaskImage: {
74505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                for (FillLayer* maskLayer = m_style->accessMaskLayers(); maskLayer; maskLayer = maskLayer->next()) {
74515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    if (maskLayer->image() && maskLayer->image()->isPendingImage()) {
74525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                        CSSImageValue* imageValue = static_cast<StylePendingImage*>(maskLayer->image())->cssImageValue();
74535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        maskLayer->setImage(imageValue->cachedImage(cachedResourceLoader));
74545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                    }
74555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                }
74565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                break;
74575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
74585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            default:
74595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                ASSERT_NOT_REACHED();
74605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
74615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
74625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    m_pendingImageProperties.clear();
74645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
74655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
74668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
7467