Changeset 220956 in webkit
- Timestamp:
- Aug 20, 2017 2:42:09 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r220949 r220956 2790 2790 style/RenderTreeUpdater.cpp 2791 2791 style/RenderTreeUpdaterFirstLetter.cpp 2792 style/RenderTreeUpdaterGeneratedContent.cpp 2792 2793 style/RenderTreeUpdaterListItem.cpp 2793 2794 style/StyleChange.cpp -
trunk/Source/WebCore/ChangeLog
r220955 r220956 1 2017-08-20 Antti Koivisto <antti@apple.com> 2 3 Factor :before/:after render tree mutations into a RenderTreeUpdater helper class 4 https://bugs.webkit.org/show_bug.cgi?id=175752 5 6 Reviewed by Andreas Kling. 7 8 Move code that constructs generated content renderers out from PseudoElement. 9 Also refactor the related code from RenderTreeUpdater main class into 10 RenderTreeUpdater::GeneratedContent helper class. 11 12 * WebCore.xcodeproj/project.pbxproj: 13 * dom/PseudoElement.cpp: 14 (WebCore::PseudoElement::resolveCustomStyle): Deleted. 15 16 Not needed anymore. 17 18 (WebCore::PseudoElement::didAttachRenderers): Deleted. 19 20 Moves to createContentRenderers in GeneratedContent. 21 22 (WebCore::PseudoElement::didRecalcStyle): Deleted. 23 24 Moves to updateStyleForContentRenderers in GeneratedContent. 25 26 * dom/PseudoElement.h: 27 * style/RenderTreeUpdater.cpp: 28 (WebCore::RenderTreeUpdater::RenderTreeUpdater): 29 (WebCore::RenderTreeUpdater::~RenderTreeUpdater): 30 (WebCore::RenderTreeUpdater::commit): 31 (WebCore::RenderTreeUpdater::updateBeforeDescendants): 32 (WebCore::RenderTreeUpdater::updateAfterDescendants): 33 (WebCore::needsPseudoElement): Deleted. 34 (WebCore::RenderTreeUpdater::updateBeforeOrAfterPseudoElement): Deleted. 35 (WebCore::RenderTreeUpdater::updateQuotesUpTo): Deleted. 36 37 Quotes and other :before/:after support moves to GeneratedContent helpwe. 38 39 * style/RenderTreeUpdater.h: 40 (WebCore::RenderTreeUpdater::generatedContent): 41 * style/RenderTreeUpdaterGeneratedContent.cpp: Added. 42 (WebCore::RenderTreeUpdater::GeneratedContent::GeneratedContent): 43 (WebCore::RenderTreeUpdater::GeneratedContent::updateBeforePseudoElement): 44 (WebCore::RenderTreeUpdater::GeneratedContent::updateAfterPseudoElement): 45 (WebCore::RenderTreeUpdater::GeneratedContent::updateRemainingQuotes): 46 (WebCore::RenderTreeUpdater::GeneratedContent::updateQuotesUpTo): 47 (WebCore::createContentRenderers): 48 (WebCore::updateStyleForContentRenderers): 49 (WebCore::RenderTreeUpdater::GeneratedContent::updatePseudoElement): 50 (WebCore::RenderTreeUpdater::GeneratedContent::needsPseudoElement): 51 * style/RenderTreeUpdaterGeneratedContent.h: Added. 52 1 53 2017-08-19 Andy Estes <aestes@apple.com> 2 54 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r220955 r220956 6825 6825 E48E332D1F47038000BAB0EF /* RenderTreeUpdaterListItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */; }; 6826 6826 E48E332E1F47038000BAB0EF /* RenderTreeUpdaterListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */; }; 6827 E48E33311F47437000BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */; }; 6828 E48E33321F47437300BAB0EF /* RenderTreeUpdaterGeneratedContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */; }; 6827 6829 E4916FF7195DF6A0005AB349 /* LayerFlushThrottleState.h in Headers */ = {isa = PBXBuildFile; fileRef = E4916FF6195DF6A0005AB349 /* LayerFlushThrottleState.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6828 6830 E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4946EAC156E64DD00D3297F /* StyleRuleImport.cpp */; }; … … 15484 15486 E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterListItem.h; sourceTree = "<group>"; }; 15485 15487 E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterListItem.cpp; sourceTree = "<group>"; }; 15488 E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterGeneratedContent.cpp; sourceTree = "<group>"; }; 15489 E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterGeneratedContent.h; sourceTree = "<group>"; }; 15486 15490 E4916FF6195DF6A0005AB349 /* LayerFlushThrottleState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayerFlushThrottleState.h; sourceTree = "<group>"; }; 15487 15491 E4946EAC156E64DD00D3297F /* StyleRuleImport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleRuleImport.cpp; sourceTree = "<group>"; }; … … 25064 25068 E48284061F44594B00863AC3 /* RenderTreeUpdaterFirstLetter.cpp */, 25065 25069 E48284091F44595600863AC3 /* RenderTreeUpdaterFirstLetter.h */, 25070 E48E332F1F47436500BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp */, 25071 E48E33301F47436700BAB0EF /* RenderTreeUpdaterGeneratedContent.h */, 25066 25072 E48E332A1F46C98000BAB0EF /* RenderTreeUpdaterListItem.cpp */, 25067 25073 E48E33281F46C97F00BAB0EF /* RenderTreeUpdaterListItem.h */, … … 29621 29627 FD45A95B175D41EE00C21EC8 /* ShapeInterval.h in Headers */, 29622 29628 FD45A952175D3F3E00C21EC8 /* ShapeOutsideInfo.h in Headers */, 29629 E48E33321F47437300BAB0EF /* RenderTreeUpdaterGeneratedContent.h in Headers */, 29623 29630 FD1AF1501656F15100C6D4F7 /* ShapeValue.h in Headers */, 29624 29631 1A4A954E0B4EDCCB002D8C3C /* SharedBuffer.h in Headers */, … … 31269 31276 62CD32591157E57C0063B0A7 /* CustomEvent.cpp in Sources */, 31270 31277 97BC6A201505F081001B74AC /* Database.cpp in Sources */, 31278 E48E33311F47437000BAB0EF /* RenderTreeUpdaterGeneratedContent.cpp in Sources */, 31271 31279 97BC6A231505F081001B74AC /* DatabaseAuthorizer.cpp in Sources */, 31272 31280 97BC6A271505F081001B74AC /* DatabaseContext.cpp in Sources */, -
trunk/Source/WebCore/dom/PseudoElement.cpp
r219237 r220956 79 79 } 80 80 81 std::optional<ElementStyle> PseudoElement::resolveCustomStyle(const RenderStyle& parentStyle, const RenderStyle*)82 {83 auto* style = m_hostElement->renderer()->getCachedPseudoStyle(m_pseudoId, &parentStyle);84 if (!style)85 return std::nullopt;86 return ElementStyle(RenderStyle::clonePtr(*style));87 }88 89 void PseudoElement::didAttachRenderers()90 {91 RenderElement* renderer = this->renderer();92 if (!renderer || renderer->style().hasFlowFrom())93 return;94 95 const RenderStyle& style = renderer->style();96 ASSERT(style.contentData());97 98 for (const ContentData* content = style.contentData(); content; content = content->next()) {99 auto child = content->createContentRenderer(document(), style);100 if (renderer->isChildAllowed(*child, style))101 renderer->addChild(child.leakPtr());102 }103 }104 105 81 bool PseudoElement::rendererIsNeeded(const RenderStyle& style) 106 82 { … … 108 84 } 109 85 110 void PseudoElement::didRecalcStyle(Style::Change)111 {112 if (!renderer())113 return;114 115 // The renderers inside pseudo elements are anonymous so they don't get notified of recalcStyle and must have116 // the style propagated downward manually similar to RenderObject::propagateStyleToAnonymousChildren.117 RenderElement& renderer = *this->renderer();118 for (RenderObject* child = renderer.nextInPreOrder(&renderer); child; child = child->nextInPreOrder(&renderer)) {119 // We only manage the style for the generated content which must be images or text.120 if (!is<RenderImage>(*child) && !is<RenderQuote>(*child))121 continue;122 auto createdStyle = RenderStyle::createStyleInheritingFromPseudoStyle(renderer.style());123 downcast<RenderElement>(*child).setStyle(WTFMove(createdStyle));124 }125 }126 127 86 } // namespace -
trunk/Source/WebCore/dom/PseudoElement.h
r218593 r220956 43 43 void clearHostElement(); 44 44 45 std::optional<ElementStyle> resolveCustomStyle(const RenderStyle& parentStyle, const RenderStyle* shadowHostStyle) override;46 void didAttachRenderers() override;47 void didRecalcStyle(Style::Change) override;48 45 bool rendererIsNeeded(const RenderStyle&) override; 49 46 -
trunk/Source/WebCore/style/RenderTreeUpdater.cpp
r220916 r220956 42 42 #include "RenderListItem.h" 43 43 #include "RenderNamedFlowThread.h" 44 #include "RenderQuote.h"45 44 #include "RenderTreeUpdaterFirstLetter.h" 45 #include "RenderTreeUpdaterGeneratedContent.h" 46 46 #include "RenderTreeUpdaterListItem.h" 47 47 #include "StyleResolver.h" … … 83 83 } 84 84 85 86 85 RenderTreeUpdater::RenderTreeUpdater(Document& document) 87 86 : m_document(document) 87 , m_generatedContent(std::make_unique<GeneratedContent>(*this)) 88 { 89 } 90 91 RenderTreeUpdater::~RenderTreeUpdater() 88 92 { 89 93 } … … 130 134 updateRenderTree(*root); 131 135 132 if (m_document.renderView()->hasQuotesNeedingUpdate()) { 133 updateQuotesUpTo(nullptr); 134 m_previousUpdatedQuote = nullptr; 135 m_document.renderView()->setHasQuotesNeedingUpdate(false); 136 } 136 generatedContent().updateRemainingQuotes(); 137 137 138 138 m_styleUpdate = nullptr; … … 248 248 void RenderTreeUpdater::updateBeforeDescendants(Element& element) 249 249 { 250 updateBeforeOrAfterPseudoElement(element, BEFORE);250 generatedContent().updateBeforePseudoElement(element); 251 251 } 252 252 253 253 void RenderTreeUpdater::updateAfterDescendants(Element& element, Style::Change styleChange) 254 254 { 255 updateBeforeOrAfterPseudoElement(element, AFTER);255 generatedContent().updateAfterPseudoElement(element); 256 256 257 257 auto* renderer = element.renderer(); … … 348 348 if (!element.shouldMoveToFlowThread(style)) 349 349 return; 350 FlowThreadController& flowThreadController = element.document().renderView()->flowThreadController();350 FlowThreadController& flowThreadController = renderView().flowThreadController(); 351 351 flowThreadController.registerNamedFlowContentElement(element, flowThreadController.ensureRenderFlowThreadWithName(style.flowThread())); 352 352 } … … 519 519 } 520 520 521 static bool needsPseudoElement(Element& current, PseudoId pseudoId)522 {523 if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())524 return false;525 if (current.isPseudoElement())526 return false;527 if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))528 return false;529 return true;530 }531 532 void RenderTreeUpdater::updateBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)533 {534 PseudoElement* pseudoElement = pseudoId == BEFORE ? current.beforePseudoElement() : current.afterPseudoElement();535 536 if (auto* renderer = pseudoElement ? pseudoElement->renderer() : nullptr)537 renderTreePosition().invalidateNextSibling(*renderer);538 539 bool needsPseudoElement = WebCore::needsPseudoElement(current, pseudoId);540 if (!needsPseudoElement) {541 if (pseudoElement) {542 if (pseudoId == BEFORE)543 current.clearBeforePseudoElement();544 else545 current.clearAfterPseudoElement();546 }547 return;548 }549 550 RefPtr<PseudoElement> newPseudoElement;551 if (!pseudoElement) {552 newPseudoElement = PseudoElement::create(current, pseudoId);553 pseudoElement = newPseudoElement.get();554 }555 556 auto newStyle = RenderStyle::clonePtr(*current.renderer()->getCachedPseudoStyle(pseudoId, ¤t.renderer()->style()));557 558 auto elementUpdate = Style::TreeResolver::createAnimatedElementUpdate(WTFMove(newStyle), *pseudoElement, Style::NoChange);559 560 if (elementUpdate.change == Style::NoChange)561 return;562 563 if (newPseudoElement) {564 InspectorInstrumentation::pseudoElementCreated(m_document.page(), *newPseudoElement);565 if (pseudoId == BEFORE)566 current.setBeforePseudoElement(newPseudoElement.releaseNonNull());567 else568 current.setAfterPseudoElement(newPseudoElement.releaseNonNull());569 }570 571 updateElementRenderer(*pseudoElement, elementUpdate);572 573 auto* pseudoRenderer = pseudoElement->renderer();574 if (!pseudoRenderer)575 return;576 577 if (elementUpdate.change == Style::Detach)578 pseudoElement->didAttachRenderers();579 else580 pseudoElement->didRecalcStyle(elementUpdate.change);581 582 if (m_document.renderView()->hasQuotesNeedingUpdate()) {583 for (auto& child : descendantsOfType<RenderQuote>(*pseudoRenderer))584 updateQuotesUpTo(&child);585 }586 if (is<RenderListItem>(*pseudoRenderer))587 ListItem::updateMarker(downcast<RenderListItem>(*pseudoRenderer));588 }589 590 521 void RenderTreeUpdater::tearDownRenderers(Element& root, TeardownType teardownType) 591 522 { … … 643 574 } 644 575 645 void RenderTreeUpdater::updateQuotesUpTo(RenderQuote* lastQuote) 646 { 647 auto quoteRenderers = descendantsOfType<RenderQuote>(*m_document.renderView()); 648 auto it = m_previousUpdatedQuote ? ++quoteRenderers.at(*m_previousUpdatedQuote) : quoteRenderers.begin(); 649 auto end = quoteRenderers.end(); 650 for (; it != end; ++it) { 651 auto& quote = *it; 652 // Quote character depends on quote depth so we chain the updates. 653 quote.updateRenderer(m_previousUpdatedQuote); 654 m_previousUpdatedQuote = "e; 655 if ("e == lastQuote) 656 return; 657 } 658 ASSERT(!lastQuote); 576 RenderView& RenderTreeUpdater::renderView() 577 { 578 return *m_document.renderView(); 659 579 } 660 580 -
trunk/Source/WebCore/style/RenderTreeUpdater.h
r220916 r220956 38 38 class Element; 39 39 class Node; 40 class RenderQuote;41 40 class RenderStyle; 42 41 class Text; … … 45 44 public: 46 45 RenderTreeUpdater(Document&); 46 ~RenderTreeUpdater(); 47 47 48 48 void commit(std::unique_ptr<const Style::Update>); … … 56 56 57 57 private: 58 class GeneratedContent; 59 58 60 void updateRenderTree(ContainerNode& root); 59 61 void updateTextRenderer(Text&, const Style::TextUpdate*); … … 63 65 void updateBeforeDescendants(Element&); 64 66 void updateAfterDescendants(Element&, Style::Change); 65 void updateBeforeOrAfterPseudoElement(Element&, PseudoId);66 67 67 68 struct Parent { … … 76 77 RenderTreePosition& renderTreePosition(); 77 78 79 GeneratedContent& generatedContent() { return *m_generatedContent; } 80 78 81 void pushParent(Element&, Style::Change); 79 82 void popParent(); 80 83 void popParentsToDepth(unsigned depth); 81 84 82 void updateQuotesUpTo(RenderQuote*);85 RenderView& renderView(); 83 86 84 87 Document& m_document; … … 88 91 89 92 HashSet<Text*> m_invalidatedWhitespaceOnlyTextSiblings; 90 RenderQuote* m_previousUpdatedQuote { nullptr }; 93 94 std::unique_ptr<GeneratedContent> m_generatedContent; 91 95 }; 92 96
Note: See TracChangeset
for help on using the changeset viewer.