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