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