Chromium Code Reviews| 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, 2013 Apple Inc. All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights 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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 if (parent->hasScopedHTMLStyleChild()) | 263 if (parent->hasScopedHTMLStyleChild()) |
| 264 return false; | 264 return false; |
| 265 if (parent->inlineStyle()) | 265 if (parent->inlineStyle()) |
| 266 return false; | 266 return false; |
| 267 if (parent->isSVGElement() && toSVGElement(parent)->animatedSMILStylePro perties()) | 267 if (parent->isSVGElement() && toSVGElement(parent)->animatedSMILStylePro perties()) |
| 268 return false; | 268 return false; |
| 269 if (parent->hasID() && m_features.idsInRules.contains(parent->idForStyle Resolution().impl())) | 269 if (parent->hasID() && m_features.idsInRules.contains(parent->idForStyle Resolution().impl())) |
| 270 return false; | 270 return false; |
| 271 if (parentElementPreventsSharing(parent)) | 271 if (parentElementPreventsSharing(parent)) |
| 272 return false; | 272 return false; |
| 273 if (!candidateMatchesDescendantRules(context, element)) | |
|
esprehn
2013/10/21 19:19:08
The hotest part of style sharing is matching the r
| |
| 274 return false; | |
| 273 } | 275 } |
| 274 | 276 |
| 275 return true; | 277 return true; |
| 276 } | 278 } |
| 277 | 279 |
| 278 #ifdef STYLE_STATS | 280 #ifdef STYLE_STATS |
| 279 Element* SharedStyleFinder::searchDocumentForSharedStyle(const ElementResolveCon text& context) const | 281 Element* SharedStyleFinder::searchDocumentForSharedStyle(const ElementResolveCon text& context) const |
| 280 { | 282 { |
| 281 for (Element* element = context.element()->document().documentElement(); ele ment; element = ElementTraversal::next(element)) { | 283 for (Element* element = context.element()->document().documentElement(); ele ment; element = ElementTraversal::next(element)) { |
| 282 if (canShareStyleWithElement(context, element)) | 284 if (canShareStyleWithElement(context, element)) |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 305 } | 307 } |
| 306 | 308 |
| 307 bool SharedStyleFinder::matchesRuleSet(const ElementResolveContext& context, Rul eSet* ruleSet) | 309 bool SharedStyleFinder::matchesRuleSet(const ElementResolveContext& context, Rul eSet* ruleSet) |
| 308 { | 310 { |
| 309 if (!ruleSet) | 311 if (!ruleSet) |
| 310 return false; | 312 return false; |
| 311 ElementRuleCollector collector(context, m_styleResolver->selectorFilter()); | 313 ElementRuleCollector collector(context, m_styleResolver->selectorFilter()); |
| 312 return collector.hasAnyMatchingRules(ruleSet); | 314 return collector.hasAnyMatchingRules(ruleSet); |
| 313 } | 315 } |
| 314 | 316 |
| 317 bool SharedStyleFinder::candidateMatchesDescendantRules(const ElementResolveCont ext& context, Element* candidate) const | |
| 318 { | |
| 319 if (!m_descendantRuleSet) | |
| 320 return false; | |
| 321 | |
| 322 ElementResolveContext candidateContext(*candidate); | |
| 323 | |
| 324 ElementRuleCollector collector(context, m_styleResolver->selectorFilter()); | |
| 325 ElementRuleCollector candidateCollector(candidateContext, m_styleResolver->s electorFilter()); | |
| 326 int firstRuleIndex = -1, lastRuleIndex = -1; | |
| 327 RuleRange ruleRange(firstRuleIndex, lastRuleIndex); | |
| 328 collector.collectMatchingRules(MatchRequest(m_descendantRuleSet), ruleRange, SelectorChecker::StaysWithinTreeScope); | |
| 329 candidateCollector.collectMatchingRules(MatchRequest(m_descendantRuleSet), r uleRange, SelectorChecker::StaysWithinTreeScope); | |
| 330 return collector.matchedResult().ranges == candidateCollector.matchedResult( ).ranges; | |
|
esprehn
2013/10/21 19:19:08
Matching rules like this is really expensive.
| |
| 331 } | |
| 332 | |
| 315 RenderStyle* SharedStyleFinder::locateSharedStyle(const ElementResolveContext& c ontext) | 333 RenderStyle* SharedStyleFinder::locateSharedStyle(const ElementResolveContext& c ontext) |
| 316 { | 334 { |
| 317 STYLE_STATS_ADD_SEARCH(); | 335 STYLE_STATS_ADD_SEARCH(); |
| 318 | 336 |
| 319 if (!context.element()->supportsStyleSharing()) | 337 if (!context.element()->supportsStyleSharing()) |
| 320 return 0; | 338 return 0; |
| 321 | 339 |
| 322 STYLE_STATS_ADD_ELEMENT_ELIGIBLE_FOR_SHARING(); | 340 STYLE_STATS_ADD_ELEMENT_ELIGIBLE_FOR_SHARING(); |
| 323 | 341 |
| 324 // Cache whether context.element() is affected by any known class selectors. | 342 // Cache whether context.element() is affected by any known class selectors. |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 348 if (matchesRuleSet(context, m_siblingRuleSet) || matchesRuleSet(context, m_u ncommonAttributeRuleSet)) | 366 if (matchesRuleSet(context, m_siblingRuleSet) || matchesRuleSet(context, m_u ncommonAttributeRuleSet)) |
| 349 return 0; | 367 return 0; |
| 350 // Tracking child index requires unique style for each node. This may get se t by the sibling rule match above. | 368 // Tracking child index requires unique style for each node. This may get se t by the sibling rule match above. |
| 351 if (parentElementPreventsSharing(context.element()->parentElement())) | 369 if (parentElementPreventsSharing(context.element()->parentElement())) |
| 352 return 0; | 370 return 0; |
| 353 STYLE_STATS_ADD_STYLE_SHARED(); | 371 STYLE_STATS_ADD_STYLE_SHARED(); |
| 354 return shareElement->renderStyle(); | 372 return shareElement->renderStyle(); |
| 355 } | 373 } |
| 356 | 374 |
| 357 } | 375 } |
| OLD | NEW |