Changeset 160138 in webkit
- Timestamp:
- Dec 4, 2013, 4:03:00 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
-
ChangeLog (modified) (1 diff)
-
dom/Element.cpp (modified) (1 diff)
-
dom/Element.h (modified) (2 diffs)
-
style/StyleResolveTree.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r160135 r160138 1 2013-12-04 Antti Koivisto <antti@apple.com> 2 3 Move pseudo element construction out from Element 4 https://bugs.webkit.org/show_bug.cgi?id=125257 5 6 Reviewed by Anders Carlsson. 7 8 This is logically part of the style resolve/render tree construction. This will make future 9 refactoring easier. 10 11 * dom/Element.cpp: 12 * dom/Element.h: 13 * style/StyleResolveTree.cpp: 14 (WebCore::Style::beforeOrAfterPseudoElement): 15 (WebCore::Style::setBeforeOrAfterPseudoElement): 16 (WebCore::Style::clearBeforeOrAfterPseudoElement): 17 (WebCore::Style::needsPseudeElement): 18 (WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded): 19 (WebCore::Style::attachRenderTree): 20 (WebCore::Style::updateBeforeOrAfterPseudoElement): 21 (WebCore::Style::resolveTree): 22 1 23 2013-12-04 Zoltan Horvath <zoltan@webkit.org> 2 24 -
trunk/Source/WebCore/dom/Element.cpp
r160032 r160138 2335 2335 } 2336 2336 2337 bool Element::updateExistingPseudoElement(PseudoElement* existingPseudoElement, Style::Change change)2338 {2339 // PseudoElement styles hang off their parent element's style so if we needed2340 // a style recalc we should Force one on the pseudo.2341 Style::resolveTree(*existingPseudoElement, needsStyleRecalc() ? Style::Force : change);2342 2343 // FIXME: This is silly.2344 // Wait until our parent is not displayed or pseudoElementRendererIsNeeded2345 // is false, otherwise we could continously create and destroy PseudoElements2346 // when RenderElement::isChildAllowed on our parent returns false for the2347 // PseudoElement's renderer for each style recalc.2348 return renderer() && pseudoElementRendererIsNeeded(existingPseudoElement->renderStyle());2349 }2350 2351 PassRefPtr<PseudoElement> Element::createPseudoElementIfNeeded(PseudoId pseudoId)2352 {2353 if (!document().styleSheetCollection().usesBeforeAfterRules())2354 return 0;2355 if (!renderer() || !renderer()->canHaveGeneratedChildren())2356 return 0;2357 if (isPseudoElement())2358 return 0;2359 if (!pseudoElementRendererIsNeeded(renderer()->getCachedPseudoStyle(pseudoId)))2360 return 0;2361 RefPtr<PseudoElement> pseudoElement = PseudoElement::create(*this, pseudoId);2362 Style::attachRenderTree(*pseudoElement);2363 return pseudoElement.release();2364 }2365 2366 void Element::updateBeforePseudoElement(Style::Change change)2367 {2368 if (PseudoElement* existingPseudoElement = beforePseudoElement()) {2369 if (!updateExistingPseudoElement(existingPseudoElement, change))2370 clearBeforePseudoElement();2371 return;2372 }2373 if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(BEFORE))2374 setBeforePseudoElement(pseudo.release());2375 }2376 2377 void Element::updateAfterPseudoElement(Style::Change change)2378 {2379 if (PseudoElement* existingPseudoElement = afterPseudoElement()) {2380 if (!updateExistingPseudoElement(existingPseudoElement, change))2381 clearAfterPseudoElement();2382 return;2383 }2384 if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(AFTER))2385 setAfterPseudoElement(pseudo.release());2386 }2387 2388 2337 PseudoElement* Element::beforePseudoElement() const 2389 2338 { -
trunk/Source/WebCore/dom/Element.h
r160032 r160138 552 552 virtual void didDetachRenderers(); 553 553 554 void updateBeforePseudoElement(Style::Change); 555 void updateAfterPseudoElement(Style::Change); 554 void setBeforePseudoElement(PassRefPtr<PseudoElement>); 555 void setAfterPseudoElement(PassRefPtr<PseudoElement>); 556 void clearBeforePseudoElement(); 557 void clearAfterPseudoElement(); 556 558 void resetComputedStyle(); 557 559 void clearStyleDerivedDataBeforeDetachingRenderer(); … … 591 593 bool isUserActionElementHovered() const; 592 594 593 PassRefPtr<PseudoElement> createPseudoElementIfNeeded(PseudoId);594 bool updateExistingPseudoElement(PseudoElement* existing, Style::Change);595 596 void setBeforePseudoElement(PassRefPtr<PseudoElement>);597 void setAfterPseudoElement(PassRefPtr<PseudoElement>);598 void clearBeforePseudoElement();599 void clearAfterPseudoElement();600 595 void resetNeedsNodeRenderingTraversalSlowPath(); 601 596 -
trunk/Source/WebCore/style/StyleResolveTree.cpp
r159036 r160138 468 468 } 469 469 470 static PseudoElement* beforeOrAfterPseudoElement(Element& current, PseudoId pseudoId) 471 { 472 ASSERT(pseudoId == BEFORE || pseudoId == AFTER); 473 if (pseudoId == BEFORE) 474 return current.beforePseudoElement(); 475 return current.afterPseudoElement(); 476 } 477 478 static void setBeforeOrAfterPseudoElement(Element& current, PassRefPtr<PseudoElement> pseudoElement, PseudoId pseudoId) 479 { 480 ASSERT(pseudoId == BEFORE || pseudoId == AFTER); 481 if (pseudoId == BEFORE) { 482 current.setBeforePseudoElement(pseudoElement); 483 return; 484 } 485 current.setAfterPseudoElement(pseudoElement); 486 } 487 488 static void clearBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId) 489 { 490 ASSERT(pseudoId == BEFORE || pseudoId == AFTER); 491 if (pseudoId == BEFORE) { 492 current.clearBeforePseudoElement(); 493 return; 494 } 495 current.clearAfterPseudoElement(); 496 } 497 498 static bool needsPseudeElement(Element& current, PseudoId pseudoId) 499 { 500 if (!current.document().styleSheetCollection().usesBeforeAfterRules()) 501 return false; 502 if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren()) 503 return false; 504 if (current.isPseudoElement()) 505 return false; 506 if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId))) 507 return false; 508 return true; 509 } 510 511 static void attachBeforeOrAfterPseudoElementIfNeeded(Element& current, PseudoId pseudoId) 512 { 513 if (!needsPseudeElement(current, pseudoId)) 514 return; 515 RefPtr<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId); 516 setBeforeOrAfterPseudoElement(current, pseudoElement, pseudoId); 517 attachRenderTree(*pseudoElement, nullptr); 518 } 519 470 520 static void attachRenderTree(Element& current, PassRefPtr<RenderStyle> resolvedStyle) 471 521 { … … 481 531 current.setIsInCanvasSubtree(true); 482 532 483 current.updateBeforePseudoElement(NoChange);533 attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE); 484 534 485 535 StyleResolverParentPusher parentPusher(¤t); … … 500 550 cache->updateCacheAfterNodeIsAttached(¤t); 501 551 502 current.updateAfterPseudoElement(NoChange);552 attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER); 503 553 504 554 current.updateFocusAppearanceAfterAttachIfNeeded(); … … 675 725 } 676 726 727 static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId) 728 { 729 if (PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId)) { 730 if (needsPseudeElement(current, pseudoId)) 731 resolveTree(*existingPseudoElement, current.needsStyleRecalc() ? Force : change); 732 else 733 clearBeforeOrAfterPseudoElement(current, pseudoId); 734 return; 735 } 736 attachBeforeOrAfterPseudoElementIfNeeded(current, pseudoId); 737 } 738 677 739 #if PLATFORM(IOS) 678 740 static EVisibility elementImplicitVisibility(const Element* element) … … 763 825 } 764 826 765 current.updateBeforePseudoElement(change);827 updateBeforeOrAfterPseudoElement(current, change, BEFORE); 766 828 767 829 // FIXME: This check is good enough for :hover + foo, but it is not good enough for :hover + foo + bar. … … 789 851 } 790 852 791 current.updateAfterPseudoElement(change);853 updateBeforeOrAfterPseudoElement(current, change, AFTER); 792 854 } 793 855
Note:
See TracChangeset
for help on using the changeset viewer.