Changeset 172599 in webkit
- Timestamp:
- Aug 14, 2014 12:38:37 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r172597 r172599 1 2014-08-14 Antti Koivisto <antti@apple.com> 2 3 Make inherited style and parent renderer references 4 https://bugs.webkit.org/show_bug.cgi?id=135857 5 6 Reviewed by Andreas Kling. 7 8 We don't recurse into non-rendered subtrees anymore so they can't be null. 9 Also stop using Element::renderStyle() as it differs from e->renderer().style() in 10 some rare cases (that should be fixed). 11 12 * style/StyleResolveTree.cpp: 13 (WebCore::Style::RenderTreePosition::parent): 14 (WebCore::Style::RenderTreePosition::RenderTreePosition): 15 (WebCore::Style::RenderTreePosition::canInsert): 16 (WebCore::Style::RenderTreePosition::insert): 17 (WebCore::Style::RenderTreePosition::computeNextSibling): 18 (WebCore::Style::shouldCreateRenderer): 19 (WebCore::Style::styleForElement): 20 (WebCore::Style::createRendererIfNeeded): 21 (WebCore::Style::textRendererIsNeeded): 22 (WebCore::Style::createTextRendererIfNeeded): 23 (WebCore::Style::updateTextRendererAfterContentChange): 24 (WebCore::Style::attachChildren): 25 (WebCore::Style::attachDistributedChildren): 26 (WebCore::Style::attachShadowRoot): 27 (WebCore::Style::resetStyleForNonRenderedDescendants): 28 (WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded): 29 (WebCore::Style::attachRenderTree): 30 (WebCore::Style::resolveLocal): 31 (WebCore::Style::resolveShadowTree): 32 (WebCore::Style::updateBeforeOrAfterPseudoElement): 33 (WebCore::Style::resolveTree): 34 1 35 2014-08-14 Antti Koivisto <antti@apple.com> 2 36 -
trunk/Source/WebCore/style/StyleResolveTree.cpp
r172517 r172599 66 66 public: 67 67 explicit RenderTreePosition(RenderView&); 68 explicit RenderTreePosition(RenderElement *parent);69 RenderTreePosition(RenderElement *parent, RenderObject* nextSibling);70 71 RenderElement *parent() { return m_parent; }72 const RenderElement *parent() const { return m_parent; }68 explicit RenderTreePosition(RenderElement& parent); 69 RenderTreePosition(RenderElement& parent, RenderObject* nextSibling); 70 71 RenderElement& parent() { return m_parent; } 72 const RenderElement& parent() const { return m_parent; } 73 73 74 74 void insert(RenderObject&); … … 80 80 81 81 private: 82 RenderElement *m_parent;82 RenderElement& m_parent; 83 83 RenderObject* m_nextSibling; 84 84 bool m_hasValidNextSibling; … … 88 88 }; 89 89 90 static void attachRenderTree(Element&, RenderStyle *inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>);90 static void attachRenderTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>); 91 91 static void attachTextRenderer(Text&, RenderTreePosition&); 92 92 static void detachRenderTree(Element&, DetachType); 93 93 static void resolveTextNode(Text&, RenderTreePosition&); 94 static void resolveTree(Element&, RenderStyle *inheritedStyle, RenderTreePosition&, Change);94 static void resolveTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change); 95 95 96 96 Change determineChange(const RenderStyle* s1, const RenderStyle* s2) … … 173 173 174 174 RenderTreePosition::RenderTreePosition(RenderView& root) 175 : m_parent( &root)175 : m_parent(root) 176 176 , m_nextSibling(nullptr) 177 177 , m_hasValidNextSibling(true) … … 182 182 } 183 183 184 RenderTreePosition::RenderTreePosition(RenderElement *parent)184 RenderTreePosition::RenderTreePosition(RenderElement& parent) 185 185 : m_parent(parent) 186 186 , m_nextSibling(nullptr) … … 192 192 } 193 193 194 RenderTreePosition::RenderTreePosition(RenderElement *parent, RenderObject* nextSibling)194 RenderTreePosition::RenderTreePosition(RenderElement& parent, RenderObject* nextSibling) 195 195 : m_parent(parent) 196 196 , m_nextSibling(nextSibling) … … 204 204 bool RenderTreePosition::canInsert(RenderElement& renderer) const 205 205 { 206 ASSERT(m_parent);207 206 ASSERT(!renderer.parent()); 208 return m_parent ->isChildAllowed(renderer, renderer.style());207 return m_parent.isChildAllowed(renderer, renderer.style()); 209 208 } 210 209 211 210 bool RenderTreePosition::canInsert(RenderText& renderer) const 212 211 { 213 ASSERT(m_parent);214 212 ASSERT(!renderer.parent()); 215 return m_parent ->isChildAllowed(renderer, m_parent->style());213 return m_parent.isChildAllowed(renderer, m_parent.style()); 216 214 } 217 215 218 216 void RenderTreePosition::insert(RenderObject& renderer) 219 217 { 220 ASSERT(m_parent);221 218 ASSERT(m_hasValidNextSibling); 222 m_parent ->addChild(&renderer, m_nextSibling);219 m_parent.addChild(&renderer, m_nextSibling); 223 220 } 224 221 225 222 void RenderTreePosition::computeNextSibling(const Node& node) 226 223 { 227 ASSERT(m_parent);228 224 ASSERT(!node.renderer()); 229 225 if (m_hasValidNextSibling) { 230 226 // Stop validating at some point so the assert doesn't make us O(N^2) on debug builds. 231 ASSERT(m_parent ->isRenderView() || ++m_assertionLimitCounter > 20 || nextSiblingRenderer(node, *m_parent) == m_nextSibling);232 return; 233 } 234 m_nextSibling = nextSiblingRenderer(node, *m_parent);227 ASSERT(m_parent.isRenderView() || ++m_assertionLimitCounter > 20 || nextSiblingRenderer(node, m_parent) == m_nextSibling); 228 return; 229 } 230 m_nextSibling = nextSiblingRenderer(node, m_parent); 235 231 m_hasValidNextSibling = true; 236 232 } … … 244 240 } 245 241 246 static bool shouldCreateRenderer(const Element& element, const RenderElement *parentRenderer)242 static bool shouldCreateRenderer(const Element& element, const RenderElement& parentRenderer) 247 243 { 248 244 if (!element.document().shouldCreateRenderers()) 249 245 return false; 250 if (!parentRenderer) 251 return false; 252 if (!parentRenderer->canHaveChildren() && !(element.isPseudoElement() && parentRenderer->canHaveGeneratedChildren())) 253 return false; 254 if (parentRenderer->element() && !parentRenderer->element()->childShouldCreateRenderer(element)) 246 if (!parentRenderer.canHaveChildren() && !(element.isPseudoElement() && parentRenderer.canHaveGeneratedChildren())) 247 return false; 248 if (parentRenderer.element() && !parentRenderer.element()->childShouldCreateRenderer(element)) 255 249 return false; 256 250 return true; 257 251 } 258 252 259 static PassRef<RenderStyle> styleForElement(Element& element, RenderStyle *inheritedStyle)260 { 261 if (element.hasCustomStyleResolveCallbacks() && inheritedStyle) {262 if (RefPtr<RenderStyle> style = element.customStyleForRenderer( *inheritedStyle))253 static PassRef<RenderStyle> styleForElement(Element& element, RenderStyle& inheritedStyle) 254 { 255 if (element.hasCustomStyleResolveCallbacks()) { 256 if (RefPtr<RenderStyle> style = element.customStyleForRenderer(inheritedStyle)) 263 257 return style.releaseNonNull(); 264 258 } 265 return element.document().ensureStyleResolver().styleForElement(&element, inheritedStyle);259 return element.document().ensureStyleResolver().styleForElement(&element, &inheritedStyle); 266 260 } 267 261 … … 279 273 #endif 280 274 281 static void createRendererIfNeeded(Element& element, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)275 static void createRendererIfNeeded(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle) 282 276 { 283 277 ASSERT(!element.renderer()); … … 302 296 303 297 RenderTreePosition insertionPosition = parentFlowRenderer 304 ? RenderTreePosition( parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element))298 ? RenderTreePosition(*parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element)) 305 299 : renderTreePosition; 306 300 … … 315 309 // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style 316 310 // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. 317 newRenderer->setFlowThreadState(insertionPosition.parent() ->flowThreadState());311 newRenderer->setFlowThreadState(insertionPosition.parent().flowThreadState()); 318 312 319 313 // Code below updateAnimations() can depend on Element::renderer() already being set. … … 329 323 Document& document = element.document(); 330 324 if (document.webkitIsFullScreen() && document.webkitCurrentFullScreenElement() == &element) { 331 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, insertionPosition.parent(), document);325 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), document); 332 326 if (!newRenderer) 333 327 return; … … 378 372 static bool textRendererIsNeeded(const Text& textNode, const RenderTreePosition& renderTreePosition) 379 373 { 380 if (!renderTreePosition.parent()) 381 return false; 382 const RenderElement& parentRenderer = *renderTreePosition.parent(); 374 const RenderElement& parentRenderer = renderTreePosition.parent(); 383 375 if (!parentRenderer.canHaveChildren()) 384 376 return false; … … 428 420 return; 429 421 430 auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent() ->style());422 auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent().style()); 431 423 ASSERT(newRenderer); 432 424 … … 438 430 // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style 439 431 // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. 440 newRenderer->setFlowThreadState(renderTreePosition.parent() ->flowThreadState());432 newRenderer->setFlowThreadState(renderTreePosition.parent().flowThreadState()); 441 433 442 434 textNode.setRenderer(newRenderer.get()); … … 467 459 bool hadRenderer = textNode.renderer(); 468 460 469 RenderTreePosition renderTreePosition( renderingParentNode->renderer());461 RenderTreePosition renderTreePosition(*renderingParentNode->renderer()); 470 462 resolveTextNode(textNode, renderTreePosition); 471 463 … … 474 466 } 475 467 476 static void attachChildren(ContainerNode& current, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition)468 static void attachChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition) 477 469 { 478 470 for (Node* child = current.firstChild(); child; child = child->nextSibling()) { … … 491 483 } 492 484 493 static void attachDistributedChildren(InsertionPoint& insertionPoint, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition)485 static void attachDistributedChildren(InsertionPoint& insertionPoint, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition) 494 486 { 495 487 if (ShadowRoot* shadowRoot = insertionPoint.containingShadowRoot()) … … 520 512 { 521 513 ASSERT(shadowRoot.hostElement()); 522 523 RenderTreePosition renderTreePosition(shadowRoot.hostElement()->renderer()); 524 attachChildren(shadowRoot, shadowRoot.hostElement()->renderStyle(), renderTreePosition); 514 ASSERT(shadowRoot.hostElement()->renderer()); 515 516 auto& renderer = *shadowRoot.hostElement()->renderer(); 517 RenderTreePosition renderTreePosition(renderer); 518 attachChildren(shadowRoot, renderer.style(), renderTreePosition); 525 519 526 520 shadowRoot.clearNeedsStyleRecalc(); … … 558 552 static void resetStyleForNonRenderedDescendants(Element& current) 559 553 { 560 ASSERT(!current.render Style());554 ASSERT(!current.renderer()); 561 555 for (auto& child : childrenOfType<Element>(current)) { 562 556 ASSERT(!child.renderer()); … … 591 585 RefPtr<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId); 592 586 setBeforeOrAfterPseudoElement(current, pseudoElement, pseudoId); 593 attachRenderTree(*pseudoElement, current.renderStyle(), renderTreePosition, nullptr);594 } 595 596 static void attachRenderTree(Element& current, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)587 attachRenderTree(*pseudoElement, *current.renderStyle(), renderTreePosition, nullptr); 588 } 589 590 static void attachRenderTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle) 597 591 { 598 592 PostResolutionCallbackDisabler callbackDisabler(current.document()); … … 611 605 createRendererIfNeeded(current, inheritedStyle, renderTreePosition, resolvedStyle); 612 606 613 if ( RenderStyle* style = current.renderStyle()) {607 if (auto* renderer = current.renderer()) { 614 608 StyleResolverParentPusher parentPusher(¤t); 615 609 616 RenderTreePosition childRenderTreePosition( current.renderer());610 RenderTreePosition childRenderTreePosition(*renderer); 617 611 attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition); 618 612 … … 623 617 parentPusher.push(); 624 618 625 attachChildren(current, style, childRenderTreePosition);619 attachChildren(current, renderer->style(), childRenderTreePosition); 626 620 627 621 if (AXObjectCache* cache = current.document().axObjectCache()) … … 735 729 } 736 730 737 static Change resolveLocal(Element& current, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)731 static Change resolveLocal(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange) 738 732 { 739 733 Change localChange = Detach; … … 803 797 { 804 798 ASSERT(shadowRoot.hostElement() == &host); 805 RenderTreePosition renderTreePosition(host.renderer()); 799 ASSERT(host.renderer()); 800 RenderTreePosition renderTreePosition(*host.renderer()); 806 801 for (Node* child = shadowRoot.firstChild(); child; child = child->nextSibling()) { 807 802 if (child->renderer()) … … 812 807 } 813 808 if (child->isElementNode()) 814 resolveTree(*toElement(child), host.render Style(), renderTreePosition, change);809 resolveTree(*toElement(child), host.renderer()->style(), renderTreePosition, change); 815 810 } 816 811 … … 821 816 static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition) 822 817 { 818 ASSERT(current.renderer()); 823 819 if (PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId)) { 824 820 if (existingPseudoElement->renderer()) … … 826 822 827 823 if (needsPseudoElement(current, pseudoId)) 828 resolveTree(*existingPseudoElement, current.render Style(), renderTreePosition, current.needsStyleRecalc() ? Force : change);824 resolveTree(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change); 829 825 else 830 826 clearBeforeOrAfterPseudoElement(current, pseudoId); … … 886 882 #endif // PLATFORM(IOS) 887 883 888 void resolveTree(Element& current, RenderStyle *inheritedStyle, RenderTreePosition& renderTreePosition, Change change)884 void resolveTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change) 889 885 { 890 886 ASSERT(change != Detach); … … 911 907 current.resetComputedStyle(); 912 908 913 if ( inheritedStyle && (change >= Inherit || current.needsStyleRecalc()))909 if (change >= Inherit || current.needsStyleRecalc()) 914 910 change = resolveLocal(current, inheritedStyle, renderTreePosition, change); 915 911 916 RenderStyle* style = current.renderStyle();917 918 if (change != Detach && style) {912 auto* renderer = current.renderer(); 913 914 if (change != Detach && renderer) { 919 915 StyleResolverParentPusher parentPusher(¤t); 920 916 … … 926 922 } 927 923 928 RenderTreePosition childRenderTreePosition( current.renderer());924 RenderTreePosition childRenderTreePosition(*renderer); 929 925 updateBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition); 930 926 … … 949 945 if (change >= Inherit || childElement->childNeedsStyleRecalc() || childElement->needsStyleRecalc()) { 950 946 parentPusher.push(); 951 resolveTree(*childElement, style, childRenderTreePosition, change);947 resolveTree(*childElement, renderer->style(), childRenderTreePosition, change); 952 948 } 953 949 forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules; … … 957 953 updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition); 958 954 } 959 if (change != Detach && ! style)955 if (change != Detach && !renderer) 960 956 resetStyleForNonRenderedDescendants(current); 961 957 … … 993 989 return; 994 990 RenderTreePosition renderTreePosition(*document.renderView()); 995 resolveTree(*documentElement, document.renderStyle(), renderTreePosition, change);991 resolveTree(*documentElement, *document.renderStyle(), renderTreePosition, change); 996 992 } 997 993
Note: See TracChangeset
for help on using the changeset viewer.