OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
993 m_pendingImageProperties.clear(); | 993 m_pendingImageProperties.clear(); |
994 | 994 |
995 m_ruleList = 0; | 995 m_ruleList = 0; |
996 | 996 |
997 m_fontDirty = false; | 997 m_fontDirty = false; |
998 } | 998 } |
999 | 999 |
1000 static const unsigned cStyleSearchThreshold = 10; | 1000 static const unsigned cStyleSearchThreshold = 10; |
1001 static const unsigned cStyleSearchLevelThreshold = 10; | 1001 static const unsigned cStyleSearchLevelThreshold = 10; |
1002 | 1002 |
| 1003 static inline bool parentElementPreventsSharing(const Element* parentElement) |
| 1004 { |
| 1005 if (!parentElement) |
| 1006 return false; |
| 1007 return parentElement->hasFlagsSetDuringStylingOfChildren(); |
| 1008 } |
| 1009 |
1003 Node* StyleResolver::locateCousinList(Element* parent, unsigned& visitedNodeCoun
t) const | 1010 Node* StyleResolver::locateCousinList(Element* parent, unsigned& visitedNodeCoun
t) const |
1004 { | 1011 { |
1005 if (visitedNodeCount >= cStyleSearchThreshold * cStyleSearchLevelThreshold) | 1012 if (visitedNodeCount >= cStyleSearchThreshold * cStyleSearchLevelThreshold) |
1006 return 0; | 1013 return 0; |
1007 if (!parent || !parent->isStyledElement()) | 1014 if (!parent || !parent->isStyledElement()) |
1008 return 0; | 1015 return 0; |
1009 if (parent->hasScopedHTMLStyleChild()) | 1016 if (parent->hasScopedHTMLStyleChild()) |
1010 return 0; | 1017 return 0; |
1011 StyledElement* p = static_cast<StyledElement*>(parent); | 1018 StyledElement* p = static_cast<StyledElement*>(parent); |
1012 if (p->inlineStyle()) | 1019 if (p->inlineStyle()) |
1013 return 0; | 1020 return 0; |
1014 #if ENABLE(SVG) | 1021 #if ENABLE(SVG) |
1015 if (p->isSVGElement() && static_cast<SVGElement*>(p)->animatedSMILStylePrope
rties()) | 1022 if (p->isSVGElement() && static_cast<SVGElement*>(p)->animatedSMILStylePrope
rties()) |
1016 return 0; | 1023 return 0; |
1017 #endif | 1024 #endif |
1018 if (p->hasID() && m_features.idsInRules.contains(p->idForStyleResolution().i
mpl())) | 1025 if (p->hasID() && m_features.idsInRules.contains(p->idForStyleResolution().i
mpl())) |
1019 return 0; | 1026 return 0; |
1020 | 1027 |
1021 RenderStyle* parentStyle = p->renderStyle(); | 1028 RenderStyle* parentStyle = p->renderStyle(); |
1022 unsigned subcount = 0; | 1029 unsigned subcount = 0; |
1023 Node* thisCousin = p; | 1030 Node* thisCousin = p; |
1024 Node* currentNode = p->previousSibling(); | 1031 Node* currentNode = p->previousSibling(); |
1025 | 1032 |
1026 // Reserve the tries for this level. This effectively makes sure that the al
gorithm | 1033 // Reserve the tries for this level. This effectively makes sure that the al
gorithm |
1027 // will never go deeper than cStyleSearchLevelThreshold levels into recursio
n. | 1034 // will never go deeper than cStyleSearchLevelThreshold levels into recursio
n. |
1028 visitedNodeCount += cStyleSearchThreshold; | 1035 visitedNodeCount += cStyleSearchThreshold; |
1029 while (thisCousin) { | 1036 while (thisCousin) { |
1030 while (currentNode) { | 1037 while (currentNode) { |
1031 ++subcount; | 1038 ++subcount; |
1032 if (currentNode->renderStyle() == parentStyle && currentNode->lastCh
ild()) { | 1039 if (currentNode->renderStyle() == parentStyle && currentNode->lastCh
ild() |
| 1040 && currentNode->isElementNode() && !parentElementPreventsSharing
(toElement(currentNode))) { |
1033 // Adjust for unused reserved tries. | 1041 // Adjust for unused reserved tries. |
1034 visitedNodeCount -= cStyleSearchThreshold - subcount; | 1042 visitedNodeCount -= cStyleSearchThreshold - subcount; |
1035 return currentNode->lastChild(); | 1043 return currentNode->lastChild(); |
1036 } | 1044 } |
1037 if (subcount >= cStyleSearchThreshold) | 1045 if (subcount >= cStyleSearchThreshold) |
1038 return 0; | 1046 return 0; |
1039 currentNode = currentNode->previousSibling(); | 1047 currentNode = currentNode->previousSibling(); |
1040 } | 1048 } |
1041 currentNode = locateCousinList(thisCousin->parentElement(), visitedNodeC
ount); | 1049 currentNode = locateCousinList(thisCousin->parentElement(), visitedNodeC
ount); |
1042 thisCousin = currentNode; | 1050 thisCousin = currentNode; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1241 if (!node->isStyledElement()) | 1249 if (!node->isStyledElement()) |
1242 continue; | 1250 continue; |
1243 if (canShareStyleWithElement(static_cast<StyledElement*>(node))) | 1251 if (canShareStyleWithElement(static_cast<StyledElement*>(node))) |
1244 break; | 1252 break; |
1245 if (count++ == cStyleSearchThreshold) | 1253 if (count++ == cStyleSearchThreshold) |
1246 return 0; | 1254 return 0; |
1247 } | 1255 } |
1248 return static_cast<StyledElement*>(node); | 1256 return static_cast<StyledElement*>(node); |
1249 } | 1257 } |
1250 | 1258 |
1251 static inline bool parentElementPreventsSharing(const Element* parentElement) | |
1252 { | |
1253 if (!parentElement) | |
1254 return false; | |
1255 return parentElement->childrenAffectedByPositionalRules() | |
1256 || parentElement->childrenAffectedByFirstChildRules() | |
1257 || parentElement->childrenAffectedByLastChildRules() | |
1258 || parentElement->childrenAffectedByDirectAdjacentRules(); | |
1259 } | |
1260 | |
1261 RenderStyle* StyleResolver::locateSharedStyle() | 1259 RenderStyle* StyleResolver::locateSharedStyle() |
1262 { | 1260 { |
1263 if (!m_styledElement || !m_parentStyle) | 1261 if (!m_styledElement || !m_parentStyle) |
1264 return 0; | 1262 return 0; |
1265 // If the element has inline style it is probably unique. | 1263 // If the element has inline style it is probably unique. |
1266 if (m_styledElement->inlineStyle()) | 1264 if (m_styledElement->inlineStyle()) |
1267 return 0; | 1265 return 0; |
1268 #if ENABLE(SVG) | 1266 #if ENABLE(SVG) |
1269 if (m_styledElement->isSVGElement() && static_cast<SVGElement*>(m_styledElem
ent)->animatedSMILStyleProperties()) | 1267 if (m_styledElement->isSVGElement() && static_cast<SVGElement*>(m_styledElem
ent)->animatedSMILStyleProperties()) |
1270 return 0; | 1268 return 0; |
(...skipping 4060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5331 info.addMember(m_scopeResolver); | 5329 info.addMember(m_scopeResolver); |
5332 | 5330 |
5333 // FIXME: move this to a place where it would be called only once? | 5331 // FIXME: move this to a place where it would be called only once? |
5334 info.addMember(defaultStyle); | 5332 info.addMember(defaultStyle); |
5335 info.addMember(defaultQuirksStyle); | 5333 info.addMember(defaultQuirksStyle); |
5336 info.addMember(defaultPrintStyle); | 5334 info.addMember(defaultPrintStyle); |
5337 info.addMember(defaultViewSourceStyle); | 5335 info.addMember(defaultViewSourceStyle); |
5338 } | 5336 } |
5339 | 5337 |
5340 } // namespace WebCore | 5338 } // namespace WebCore |
OLD | NEW |