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