Changeset 198943 in webkit
- Timestamp:
- Apr 1, 2016 2:54:12 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 41 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r198942 r198943 1 2016-03-31 Antti Koivisto <antti@apple.com> 2 3 Separate render tree updating from style resolve 4 https://bugs.webkit.org/show_bug.cgi?id=155298 5 6 Reviewed by Andreas Kling. 7 8 * TestExpectations: 9 10 Skip mathml/presentation/menclose-notation-attribute-change-value.html. It will be fixed by upcoming MathML refactoring. 11 12 * css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt: 13 * css3/viewport-percentage-lengths/viewport-percentage-lengths-resize-expected.txt: 14 15 This is a progression. 16 17 * editing/mac/spelling/autocorrection-contraction-expected.txt: 18 * editing/mac/spelling/autocorrection-removing-underline-after-paste-expected.txt: 19 * editing/mac/spelling/autocorrection-removing-underline-expected.txt: 20 * editing/mac/spelling/autocorrection-simple-expected.txt: 21 * editing/style/remove-underline-from-stylesheet-expected.txt: 22 * editing/style/typing-style-003-expected.txt: 23 24 Non-rendered whitespace related changes. 25 26 * platform/ios-simulator/TestExpectations: 27 28 Skip fast/regions/position-writing-modes-in-variable-width-regions.html on iOS. Similar tests are mostly already skipped. 29 30 * platform/ios-simulator/editing/style/typing-style-003-expected.txt: Added. 31 * platform/mac-wk2/editing/mac/spelling/autocorrection-contraction-expected.txt: 32 * platform/mac/editing/inserting/editable-html-element-expected.txt: 33 * platform/mac/editing/inserting/editing-empty-divs-expected.txt: 34 * platform/mac/editing/inserting/insert-at-end-02-expected.txt: 35 * platform/mac/editing/pasteboard/4989774-expected.txt: 36 * platform/mac/editing/selection/4983858-expected.txt: 37 38 Non-rendered whitespace related changes. 39 1 40 2016-03-31 Chris Fleizach <cfleizach@apple.com> 2 41 -
trunk/LayoutTests/TestExpectations
r198888 r198943 991 991 webkit.org/b/155028 storage/indexeddb/modern/256-open-databases.html [ Skip ] 992 992 993 # Fixed by upcoming MathML refactoring 994 webkit.org/b/155019 mathml/presentation/menclose-notation-attribute-change-value.html [ Skip ] 995 993 996 ### END OF IndexedDB failures 994 997 ######################################## -
trunk/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt
r198847 r198943 22 22 (rect 28 290 60 60) 23 23 (rect 48 290 60 60) 24 (rect 28 526 60 60) 25 (rect 48 526 60 60) 24 26 (rect 48 408 60 60) 25 27 (rect 48 408 60 60) 26 (rect 28 526 60 60)27 (rect 48 526 60 60)28 28 (rect 48 644 60 60) 29 29 (rect 68 644 60 60) -
trunk/LayoutTests/css3/viewport-percentage-lengths/viewport-percentage-lengths-resize-expected.txt
r198847 r198943 18 18 PASS getComputedStyle(test).width is "450px" 19 19 PASS getComputedStyle(testpseudo, ':after').marginLeft is "120px" 20 FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 225px. Was 200px. 20 PASS getComputedStyle(testpseudo, ':after').paddingRight is "225px" 21 21 PASS innerWidth is 900 22 22 PASS innerHeight is 640 23 23 PASS getComputedStyle(test).fontSize is "32px" 24 24 PASS getComputedStyle(test).width is "450px" 25 FAIL getComputedStyle(testpseudo, ':after').marginLeft should be 128px. Was 120px. 26 FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 225px. Was 200px. 25 PASS getComputedStyle(testpseudo, ':after').marginLeft is "128px" 26 PASS getComputedStyle(testpseudo, ':after').paddingRight is "225px" 27 27 PASS innerWidth is 500 28 28 PASS innerHeight is 640 29 29 PASS getComputedStyle(test).fontSize is "32px" 30 30 PASS getComputedStyle(test).width is "250px" 31 FAIL getComputedStyle(testpseudo, ':after').marginLeft should be 100px. Was 120px. 32 FAIL getComputedStyle(testpseudo, ':after').paddingRight should be 160px. Was 200px. 31 PASS getComputedStyle(testpseudo, ':after').marginLeft is "100px" 32 PASS getComputedStyle(testpseudo, ':after').paddingRight is "160px" 33 33 PASS innerWidth is 800 34 34 PASS innerHeight is 600 -
trunk/LayoutTests/editing/mac/spelling/autocorrection-contraction-expected.txt
r198847 r198943 280 280 text run at (0,0) width 154: "would' wouldn't" 281 281 text run at (153,0) width 7: " " 282 caret: position 16 of child 0 {#text} of child 5{DIV} of child 3 {DIV} of body282 caret: position 16 of child 0 {#text} of child 6 {DIV} of child 3 {DIV} of body -
trunk/LayoutTests/editing/mac/spelling/autocorrection-removing-underline-after-paste-expected.txt
r198847 r198943 83 83 RenderBlock {DIV} at (14,70) size 756x28 84 84 RenderBR {BR} at (0,0) size 0x28 85 caret: position 0 of child 0 {BR} of child 4{DIV} of child 5 {DIV} of body85 caret: position 0 of child 0 {BR} of child 5 {DIV} of child 5 {DIV} of body -
trunk/LayoutTests/editing/mac/spelling/autocorrection-removing-underline-expected.txt
r198847 r198943 79 79 RenderBlock {DIV} at (14,42) size 756x28 80 80 RenderBR {BR} at (0,0) size 0x28 81 caret: position 0 of child 0 {BR} of child 2{DIV} of child 5 {DIV} of body81 caret: position 0 of child 0 {BR} of child 3 {DIV} of child 5 {DIV} of body -
trunk/LayoutTests/editing/mac/spelling/autocorrection-simple-expected.txt
r198847 r198943 138 138 RenderText {#text} at (0,0) size 138x28 139 139 text run at (0,0) width 138: "the notational," 140 caret: position 15 of child 0 {#text} of child 2{DIV} of child 7 {DIV} of body140 caret: position 15 of child 0 {#text} of child 3 {DIV} of child 7 {DIV} of body -
trunk/LayoutTests/editing/style/remove-underline-from-stylesheet-expected.txt
r198847 r198943 77 77 | "<#selection-anchor>xxxxxx<#selection-focus>" 78 78 | " xxxxxx" 79 | " 80 " 79 81 | <span> 80 82 | id="test" -
trunk/LayoutTests/editing/style/typing-style-003-expected.txt
r198847 r198943 53 53 xxxxxxxxxxxxxxx 54 54 execTypeCharacterCommand: x <span id="test"></span> 55 execTypeCharacterCommand: xx <span id="test"></span>56 execTypeCharacterCommand: xxx <span id="test"></span>57 execBoldCommand: xxx <span id="test"></span>58 execTypeCharacterCommand: xxx<b>x</b> <span id="test"></span>55 execTypeCharacterCommand: xx <span id="test"></span> 56 execTypeCharacterCommand: xxx <span id="test"></span> 57 execBoldCommand: xxx <span id="test"></span> 58 execTypeCharacterCommand: xxx<b>x</b> <span id="test"></span> 59 59 execTypeCharacterCommand: xxx<b>xx</b><span id="test"></span> 60 60 execTypeCharacterCommand: xxx<b>xxx</b><span id="test"></span> -
trunk/LayoutTests/fast/dom/beforeload/remove-bad-object-in-beforeload-listener-expected.txt
r61721 r198943 2 2 3 3 PASS 4 -
trunk/LayoutTests/fast/dom/beforeload/remove-flash-in-beforeload-listener-expected.txt
r61744 r198943 2 2 3 3 PASS 4 -
trunk/LayoutTests/platform/ios-simulator/TestExpectations
r198936 r198943 2054 2054 fast/regions/percentage-margins-rtl-variable-width-regions.html [ ImageOnlyFailure ] 2055 2055 fast/regions/percentage-margins-variable-width-regions.html [ ImageOnlyFailure ] 2056 fast/regions/position-writing-modes-in-variable-width-regions.html [ ImageOnlyFailure ] 2056 2057 fast/regions/positioning/fixed-in-named-flow-position-changed.html [ ImageOnlyFailure ] 2057 2058 fast/regions/positioning/fixed-inside-fixed-in-named-flow.html [ ImageOnlyFailure ] -
trunk/LayoutTests/platform/mac-wk2/editing/mac/spelling/autocorrection-contraction-expected.txt
r198847 r198943 260 260 text run at (0,0) width 166: "wouldn' wouldn't" 261 261 text run at (165,0) width 7: " " 262 caret: position 17 of child 0 {#text} of child 5{DIV} of child 3 {DIV} of body262 caret: position 17 of child 0 {#text} of child 6 {DIV} of child 3 {DIV} of body -
trunk/LayoutTests/platform/mac/editing/inserting/editable-html-element-expected.txt
r198847 r198943 23 23 text run at (766,18) width 5: " " 24 24 text run at (0,36) width 132: "block flow element)." 25 RenderText {#text} at (0,0) size 0x026 25 RenderBlock {DIV} at (0,54) size 784x18 27 26 RenderBR {BR} at (0,0) size 0x18 -
trunk/LayoutTests/platform/mac/editing/inserting/editing-empty-divs-expected.txt
r198847 r198943 66 66 RenderText {#text} at (1,1) size 8x18 67 67 text run at (1,1) width 8: "c" 68 RenderText {#text} at (0,0) size 0x069 68 RenderBlock {P} at (0,268) size 784x18 70 69 RenderText {#text} at (0,0) size 240x18 … … 82 81 RenderText {#text} at (0,0) size 8x18 83 82 text run at (0,0) width 8: "c" 84 RenderText {#text} at (0,0) size 0x085 83 RenderBlock {P} at (1,35) size 706x0 86 84 caret: position 1 of child 0 {#text} of child 21 {DIV} of body -
trunk/LayoutTests/platform/mac/editing/inserting/insert-at-end-02-expected.txt
r198847 r198943 30 30 RenderText {#text} at (0,0) size 8x18 31 31 text run at (0,0) width 8: "x" 32 RenderText {#text} at (0,0) size 0x033 32 caret: position 1 of child 5 {#text} of child 5 {DIV} of body -
trunk/LayoutTests/platform/mac/editing/pasteboard/4989774-expected.txt
r198847 r198943 13 13 text run at (735,103) width 5: " " 14 14 text run at (0,121) width 364: "several pictures above all in the same line/paragraph." 15 RenderText {#text} at (0,0) size 0x016 RenderText {#text} at (0,0) size 0x017 15 caret: position 164 of child 4 {#text} of body -
trunk/LayoutTests/platform/mac/editing/selection/4983858-expected.txt
r198847 r198943 11 11 text run at (780,0) width 4: " " 12 12 text run at (0,18) width 165: "below should be selected:" 13 RenderText {#text} at (0,0) size 0x014 13 RenderBlock {DIV} at (0,36) size 784x18 15 14 RenderText {#text} at (0,0) size 22x18 -
trunk/LayoutTests/plugins/focus-expected.txt
r147591 r198943 25 25 26 26 Fallback contents. Fallback contents. Fallback contents. 27 -
trunk/Source/WebCore/CMakeLists.txt
r198942 r198943 2628 2628 style/InlineTextBoxStyle.cpp 2629 2629 style/RenderTreePosition.cpp 2630 style/RenderTreeUpdater.cpp 2630 2631 style/StyleChange.cpp 2631 2632 style/StyleFontSizeFunctions.cpp … … 2634 2635 style/StyleSharingResolver.cpp 2635 2636 style/StyleTreeResolver.cpp 2637 style/StyleUpdate.cpp 2636 2638 2637 2639 svg/SVGAElement.cpp -
trunk/Source/WebCore/ChangeLog
r198942 r198943 1 2016-03-31 Antti Koivisto <antti@apple.com> 2 3 Separate render tree updating from style resolve 4 https://bugs.webkit.org/show_bug.cgi?id=155298 5 6 Reviewed by Andreas Kling. 7 8 This patch splits computing document style and applying the results into two distinct steps: 9 10 Style::TreeResolver::resolve() 11 | 12 | Style::Update 13 V 14 RenderTreeUpdater::commit() 15 16 Style::TreeResolver::resolve() returns a Style::Update object that contains all the changes to be made 17 for the whole composed tree. RenderTreeUpdater then applies the changes updating, building or tearing 18 down portions of the render tree as needed. 19 20 Style::Update consists of a map that contains new style for each newly resolved element along with some 21 metadata. A separate map contains text nodes that require reconstruction. It also tracks change roots so 22 RenderTreeUpdater needs to traverse the changed subtrees only. 23 24 The patch eliminates the recursive render tree build code path replacing it with iterative functions. 25 26 This will enable future optimizations. For example we won't need to commit to immediate rendering 27 changes simply because some script or internal function requires up-to-date style. 28 29 * CMakeLists.txt: 30 * WebCore.xcodeproj/project.pbxproj: 31 * css/StyleResolver.cpp: 32 (WebCore::StyleResolver::State::State): 33 (WebCore::StyleResolver::styleForElement): 34 * css/StyleResolver.h: 35 (WebCore::StyleResolver::setOverrideDocumentElementStyle): 36 (WebCore::StyleResolver::State::State): 37 38 Root element style is needed for resolving other elements. Add a way to provide it without looking 39 into active document style. 40 41 * dom/Document.cpp: 42 (WebCore::Document::recalcStyle): 43 44 Resolve the document style and commit it immediately (for now). 45 46 (WebCore::Document::styleForElementIgnoringPendingStylesheets): 47 * dom/Document.h: 48 (WebCore::Document::setNeedsNotifyRemoveAllPendingStylesheet): 49 (WebCore::Document::inStyleRecalc): 50 (WebCore::Document::inRenderTreeUpdate): 51 * dom/Element.cpp: 52 (WebCore::Element::setChildIndex): 53 54 Setting the unique bit is now done by style relations update code. 55 56 * dom/Node.cpp: 57 (WebCore::Node::setNeedsStyleRecalc): 58 59 Prevent spurious style invalidation during render tree updating. 60 61 * rendering/RenderBox.cpp: 62 (WebCore::RenderBox::styleDidChange): 63 64 Capturing body element color for color:-webkit-text is now done by TreeResolver. 65 66 * rendering/RenderElement.h: 67 (WebCore::RenderElement::setAnimatableStyle): Deleted. 68 69 No longer used. 70 71 * style/RenderTreePosition.cpp: 72 (WebCore::RenderTreePosition::nextSiblingRenderer): 73 74 Skip over non-rendered slot elements. 75 76 * style/RenderTreeUpdater.cpp: Added. 77 (WebCore::RenderTreeUpdater::Parent::Parent): 78 (WebCore::RenderTreeUpdater::RenderTreeUpdater): 79 (WebCore::hasDisplayContents): 80 (WebCore::findRenderingRoot): 81 (WebCore::RenderTreeUpdater::commit): 82 83 Call updateRenderTree for each change root. 84 85 (WebCore::shouldCreateRenderer): 86 (WebCore::RenderTreeUpdater::updateRenderTree): 87 88 Iteratively traverse the composed tree starting for a change root. 89 Apply the changes calling updateElementRenderer and updateTextRenderer as needed. 90 Enter subtrees that haves changes to apply. 91 92 (WebCore::RenderTreeUpdater::renderTreePosition): 93 94 We may not create renderers for all elements (<slot> or more generally display:contents) that 95 have rendered descendants. Search the parent stack to find the valid position. 96 97 (WebCore::RenderTreeUpdater::pushParent): 98 (WebCore::RenderTreeUpdater::popParent): 99 (WebCore::RenderTreeUpdater::popParentsToDepth): 100 101 Maintain parent stack. 102 103 (WebCore::pseudoStyleCacheIsInvalid): 104 (WebCore::RenderTreeUpdater::updateElementRenderer): 105 106 Create, delete or update the renderer. 107 108 (WebCore::moveToFlowThreadIfNeeded): 109 (WebCore::RenderTreeUpdater::createRenderer): 110 (WebCore::textRendererIsNeeded): 111 (WebCore::createTextRenderer): 112 (WebCore::RenderTreeUpdater::updateTextRenderer): 113 (WebCore::RenderTreeUpdater::invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded): 114 115 This is moved from TreeResolver. 116 117 (WebCore::needsPseudoElement): 118 (WebCore::RenderTreeUpdater::updateBeforeOrAfterPseudoElement): 119 120 Pseudo elements are handled entirely during render tree construction. Compute their style and 121 create or delete them as needed. 122 123 * style/RenderTreeUpdater.h: Added. 124 (WebCore::RenderTreeUpdater::parent): 125 * style/StyleRelations.cpp: 126 (WebCore::Style::commitRelationsToRenderStyle): 127 (WebCore::Style::commitRelations): 128 129 Commit to Style::Update instead of the document if needed. 130 131 (WebCore::Style::commitRelationsToDocument): Deleted. 132 * style/StyleRelations.h: 133 * style/StyleSharingResolver.cpp: 134 (WebCore::Style::elementHasDirectionAuto): 135 (WebCore::Style::SharingResolver::resolve): 136 137 Fetch the shareable style from Style::Update instead of the active document style. 138 139 (WebCore::Style::SharingResolver::findSibling): 140 (WebCore::Style::SharingResolver::canShareStyleWithElement): 141 * style/StyleSharingResolver.h: 142 * style/StyleTreeResolver.cpp: 143 (WebCore::Style::TreeResolver::Parent::Parent): 144 145 No need for render tree position anymore. 146 147 (WebCore::Style::TreeResolver::popScope): 148 (WebCore::Style::TreeResolver::styleForElement): 149 (WebCore::Style::invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded): 150 (WebCore::Style::createTextRendererIfNeeded): 151 (WebCore::Style::updateTextRendererAfterContentChange): 152 (WebCore::Style::resetStyleForNonRenderedDescendants): 153 (WebCore::Style::detachChildren): 154 (WebCore::Style::detachSlotAssignees): 155 (WebCore::Style::detachRenderTree): 156 (WebCore::Style::TreeResolver::resolveElement): 157 158 Just resolve the style and return it, no more applying or entering render tree construction code paths. 159 160 (WebCore::Style::resolveTextNode): 161 (WebCore::Style::elementImplicitVisibility): 162 (WebCore::Style::TreeResolver::pushParent): 163 (WebCore::Style::TreeResolver::popParent): 164 (WebCore::Style::TreeResolver::popParentsToDepth): 165 (WebCore::Style::shouldResolvePseudoElement): 166 (WebCore::Style::TreeResolver::resolveComposedTree): 167 168 Add style changes to Style::Update. 169 170 (WebCore::Style::TreeResolver::resolve): 171 172 Return Style::Update object if non-empty. 173 174 (WebCore::Style::postResolutionCallbackQueue): 175 (WebCore::Style::shouldCreateRenderer): Deleted. 176 (WebCore::Style::moveToFlowThreadIfNeeded): Deleted. 177 (WebCore::Style::TreeResolver::createRenderer): Deleted. 178 (WebCore::Style::TreeResolver::createRenderTreeForChildren): Deleted. 179 (WebCore::Style::TreeResolver::createRenderTreeForShadowRoot): Deleted. 180 (WebCore::Style::beforeOrAfterPseudoElement): Deleted. 181 (WebCore::Style::setBeforeOrAfterPseudoElement): Deleted. 182 (WebCore::Style::clearBeforeOrAfterPseudoElement): Deleted. 183 (WebCore::Style::needsPseudoElement): Deleted. 184 (WebCore::Style::TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement): Deleted. 185 (WebCore::Style::TreeResolver::createRenderTreeForSlotAssignees): Deleted. 186 (WebCore::Style::TreeResolver::createRenderTreeRecursively): Deleted. 187 (WebCore::Style::pseudoStyleCacheIsInvalid): Deleted. 188 (WebCore::Style::TreeResolver::resolveBeforeOrAfterPseudoElement): Deleted. 189 190 Remove the recursive render tree building code path. 191 192 * style/StyleTreeResolver.h: 193 (WebCore::Style::TreeResolver::scope): 194 * style/StyleUpdate.cpp: Added. 195 (WebCore::Style::Update::Update): 196 (WebCore::Style::Update::elementUpdate): 197 (WebCore::Style::Update::textUpdate): 198 (WebCore::Style::Update::elementStyle): 199 (WebCore::Style::Update::addElement): 200 (WebCore::Style::Update::addText): 201 (WebCore::Style::Update::addPossibleRoot): 202 * style/StyleUpdate.h: Added. 203 (WebCore::Style::Update::roots): 204 (WebCore::Style::Update::document): 205 * svg/SVGElement.h: 206 (WebCore::SVGElement::updateRelativeLengthsInformation): 207 * svg/SVGUseElement.cpp: 208 (WebCore::SVGUseElement::svgAttributeChanged): 209 (WebCore::SVGUseElement::willRecalcStyle): 210 (WebCore::SVGUseElement::willAttachRenderers): Deleted. 211 212 Switvh willAttachRenderers to willRecalcStyle as the former is now called too late. 213 214 * svg/SVGUseElement.h: 215 1 216 2016-03-31 Chris Fleizach <cfleizach@apple.com> 2 217 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r198942 r198943 6560 6560 E425A49A18292B840020CFCF /* CollectionIndexCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E425A49918292B840020CFCF /* CollectionIndexCache.h */; }; 6561 6561 E4295FA412B0614E00D1ACE0 /* ResourceLoadPriority.h in Headers */ = {isa = PBXBuildFile; fileRef = E4295FA312B0614E00D1ACE0 /* ResourceLoadPriority.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6562 E42E76DA1C7AF76C00E3614D /* StyleUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */; }; 6563 E42E76DC1C7AF77600E3614D /* StyleUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E76DB1C7AF77600E3614D /* StyleUpdate.h */; }; 6562 6564 E43105B816750F0C00DB2FB8 /* NodeTraversal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43105B716750F0C00DB2FB8 /* NodeTraversal.cpp */; }; 6563 6565 E43105BB16750F1600DB2FB8 /* NodeTraversal.h in Headers */ = {isa = PBXBuildFile; fileRef = E43105BA16750F1600DB2FB8 /* NodeTraversal.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 6615 6617 E453904D0EAFD637003695C8 /* WidgetIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E453903C0EAFD637003695C8 /* WidgetIOS.mm */; }; 6616 6618 E45390AE0EAFF4B5003695C8 /* SystemMemoryIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E45390AD0EAFF4B5003695C8 /* SystemMemoryIOS.cpp */; }; 6619 E46180291C8A06CD0026C02C /* RenderTreeUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */; }; 6620 E461802B1C8A06D90026C02C /* RenderTreeUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */; }; 6617 6621 E461802D1C8DD2900026C02C /* StyleRelations.h in Headers */ = {isa = PBXBuildFile; fileRef = E461802C1C8DD2900026C02C /* StyleRelations.h */; }; 6618 6622 E461802F1C8DD4D20026C02C /* StyleRelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E461802E1C8DD4D20026C02C /* StyleRelations.cpp */; }; … … 14596 14600 E425A49918292B840020CFCF /* CollectionIndexCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionIndexCache.h; sourceTree = "<group>"; }; 14597 14601 E4295FA312B0614E00D1ACE0 /* ResourceLoadPriority.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadPriority.h; sourceTree = "<group>"; }; 14602 E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleUpdate.cpp; sourceTree = "<group>"; }; 14603 E42E76DB1C7AF77600E3614D /* StyleUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleUpdate.h; sourceTree = "<group>"; }; 14598 14604 E43105B716750F0C00DB2FB8 /* NodeTraversal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeTraversal.cpp; sourceTree = "<group>"; }; 14599 14605 E43105BA16750F1600DB2FB8 /* NodeTraversal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeTraversal.h; sourceTree = "<group>"; }; … … 14643 14649 E453903C0EAFD637003695C8 /* WidgetIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WidgetIOS.mm; sourceTree = "<group>"; }; 14644 14650 E45390AD0EAFF4B5003695C8 /* SystemMemoryIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SystemMemoryIOS.cpp; sourceTree = "<group>"; }; 14651 E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdater.h; sourceTree = "<group>"; }; 14652 E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdater.cpp; sourceTree = "<group>"; }; 14645 14653 E461802C1C8DD2900026C02C /* StyleRelations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleRelations.h; sourceTree = "<group>"; }; 14646 14654 E461802E1C8DD4D20026C02C /* StyleRelations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleRelations.cpp; sourceTree = "<group>"; }; … … 23513 23521 5824ABA81AE849C8009074B7 /* RenderTreePosition.cpp */, 23514 23522 5824ABA91AE849C8009074B7 /* RenderTreePosition.h */, 23523 E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */, 23524 E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */, 23515 23525 E401E0A51C3C0CF700F34D10 /* StyleChange.cpp */, 23516 23526 E401E0A31C3C0B8300F34D10 /* StyleChange.h */, … … 23525 23535 E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */, 23526 23536 E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */, 23537 E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */, 23538 E42E76DB1C7AF77600E3614D /* StyleUpdate.h */, 23527 23539 ); 23528 23540 path = style; … … 25960 25972 7728694F14F8882500F484DC /* EXTTextureFilterAnisotropic.h in Headers */, 25961 25973 A75E8B890E1DE2D6007F2481 /* FEBlend.h in Headers */, 25974 E46180291C8A06CD0026C02C /* RenderTreeUpdater.h in Headers */, 25962 25975 A75E8B8B0E1DE2D6007F2481 /* FEColorMatrix.h in Headers */, 25963 25976 A75E8B8D0E1DE2D6007F2481 /* FEComponentTransfer.h in Headers */, … … 26152 26165 93F198E508245E59001E9ABC /* HTMLDocument.h in Headers */, 26153 26166 977B3867122883E900B81FF8 /* HTMLDocumentParser.h in Headers */, 26167 E42E76DC1C7AF77600E3614D /* StyleUpdate.h in Headers */, 26154 26168 93309DE8099E64920056E581 /* htmlediting.h in Headers */, 26155 26169 93F198E608245E59001E9ABC /* HTMLElement.h in Headers */, … … 30538 30552 E1FF8F64180745D800132674 /* JSSubtleCrypto.cpp in Sources */, 30539 30553 E1FF8F681807460800132674 /* JSSubtleCryptoCustom.cpp in Sources */, 30554 E461802B1C8A06D90026C02C /* RenderTreeUpdater.cpp in Sources */, 30540 30555 B20111070AB7740500DB0E68 /* JSSVGAElement.cpp in Sources */, 30541 30556 24D9129113CA951E00D21915 /* JSSVGAltGlyphDefElement.cpp in Sources */, … … 31076 31091 FD581FB41520F93B003A7A75 /* PeriodicWave.cpp in Sources */, 31077 31092 49D5DC2D0F423A73008F20FD /* PerspectiveTransformOperation.cpp in Sources */, 31093 E42E76DA1C7AF76C00E3614D /* StyleUpdate.cpp in Sources */, 31078 31094 D0FF2A5D11F8C45A007E74E0 /* PingLoader.cpp in Sources */, 31079 31095 CD7D33431C7A123F00041293 /* PixelBufferConformerCV.cpp in Sources */, -
trunk/Source/WebCore/css/StyleResolver.cpp
r198847 r198943 336 336 } 337 337 338 StyleResolver::State::State(Element& element, RenderStyle* parentStyle, const RenderRegion* regionForStyling, const SelectorFilter* selectorFilter)338 StyleResolver::State::State(Element& element, RenderStyle* parentStyle, RenderStyle* documentElementStyle, const RenderRegion* regionForStyling, const SelectorFilter* selectorFilter) 339 339 : m_element(&element) 340 340 , m_parentStyle(parentStyle) … … 349 349 auto& document = element.document(); 350 350 auto* documentElement = document.documentElement(); 351 m_rootElementStyle = (!documentElement || documentElement == &element) ? document.renderStyle() : documentElement->renderStyle(); 351 if (!documentElement || documentElement == &element) 352 m_rootElementStyle = document.renderStyle(); 353 else 354 m_rootElementStyle = documentElementStyle ? documentElementStyle : documentElement->renderStyle(); 352 355 353 356 updateConversionData(); … … 376 379 RELEASE_ASSERT(!m_inLoadPendingImages); 377 380 378 m_state = State(element, parentStyle, regionForStyling, selectorFilter);381 m_state = State(element, parentStyle, m_overrideDocumentElementStyle.get(), regionForStyling, selectorFilter); 379 382 State& state = m_state; 380 383 -
trunk/Source/WebCore/css/StyleResolver.h
r198847 r198943 165 165 const MediaQueryEvaluator& mediaQueryEvaluator() const { return *m_medium; } 166 166 167 void setOverrideDocumentElementStyle(RenderStyle* style) { m_overrideDocumentElementStyle = style; } 168 167 169 private: 168 170 Ref<RenderStyle> styleForKeyframe(const RenderStyle*, const StyleKeyframe*, KeyframeValue&); … … 360 362 public: 361 363 State() { } 362 State(Element&, RenderStyle* parentStyle, const RenderRegion* regionForStyling = nullptr, const SelectorFilter* = nullptr);364 State(Element&, RenderStyle* parentStyle, RenderStyle* documentElementStyle = nullptr, const RenderRegion* regionForStyling = nullptr, const SelectorFilter* = nullptr); 363 365 364 366 public: … … 525 527 bool m_matchAuthorAndUserStyles; 526 528 529 RefPtr<RenderStyle> m_overrideDocumentElementStyle; 530 527 531 Vector<std::unique_ptr<MediaQueryResult>> m_viewportDependentMediaQueryResults; 528 532 -
trunk/Source/WebCore/dom/Document.cpp
r198847 r198943 134 134 #include "RenderChildIterator.h" 135 135 #include "RenderLayerCompositor.h" 136 #include "RenderTreeUpdater.h" 136 137 #include "RenderView.h" 137 138 #include "RenderWidget.h" … … 1927 1928 1928 1929 Style::TreeResolver resolver(*this); 1929 resolver.resolve(change); 1930 1931 updatedCompositingLayers = frameView.updateCompositingLayersAfterStyleChange(); 1930 auto styleUpdate = resolver.resolve(change); 1932 1931 1933 1932 clearNeedsStyleRecalc(); … … 1936 1935 1937 1936 m_inStyleRecalc = false; 1937 1938 if (styleUpdate) { 1939 TemporaryChange<bool> inRenderTreeUpdate(m_inRenderTreeUpdate, true); 1940 1941 RenderTreeUpdater updater(*this); 1942 updater.commit(WTFMove(styleUpdate)); 1943 } 1944 1945 updatedCompositingLayers = frameView.updateCompositingLayersAfterStyleChange(); 1938 1946 } 1939 1947 … … 2053 2061 auto elementStyle = element.resolveStyle(parentStyle); 2054 2062 2055 Style::commitRelationsToDocument(WTFMove(elementStyle.relations)); 2063 if (elementStyle.relations) { 2064 Style::Update emptyUpdate(*this); 2065 Style::commitRelations(WTFMove(elementStyle.relations), emptyUpdate); 2066 } 2056 2067 2057 2068 return WTFMove(elementStyle.renderStyle); -
trunk/Source/WebCore/dom/Document.h
r198847 r198943 1245 1245 void clearStyleResolver(); 1246 1246 1247 bool inStyleRecalc() { return m_inStyleRecalc; } 1247 bool inStyleRecalc() const { return m_inStyleRecalc; } 1248 bool inRenderTreeUpdate() const { return m_inRenderTreeUpdate; } 1248 1249 1249 1250 // Return a Locale for the default locale if the argument is null or empty. … … 1509 1510 bool m_inStyleRecalc; 1510 1511 bool m_closeAfterStyleRecalc; 1512 bool m_inRenderTreeUpdate { false }; 1511 1513 1512 1514 bool m_gotoAnchorNeededAfterStylesheetsLoad; -
trunk/Source/WebCore/dom/Element.cpp
r198847 r198943 2565 2565 { 2566 2566 ElementRareData& rareData = ensureElementRareData(); 2567 if (RenderStyle* style = renderStyle())2568 style->setUnique();2569 2567 rareData.setChildIndex(index); 2570 2568 } -
trunk/Source/WebCore/dom/Node.cpp
r198847 r198943 773 773 return; 774 774 775 // FIXME: This should eventually be an ASSERT. 776 if (document().inRenderTreeUpdate()) 777 return; 778 775 779 StyleChangeType existingChangeType = styleChangeType(); 776 780 if (changeType > existingChangeType) -
trunk/Source/WebCore/rendering/RenderBox.cpp
r198847 r198943 382 382 bool isDocElementRenderer = isDocumentElementRenderer(); 383 383 384 // Set the text color if we're the body.385 if (isBodyRenderer)386 document().setTextColor(newStyle.visitedDependentColor(CSSPropertyColor));387 388 384 if (isDocElementRenderer || isBodyRenderer) { 389 385 // Propagate the new writing mode and direction up to the RenderView. -
trunk/Source/WebCore/rendering/RenderElement.h
r198847 r198943 51 51 void setStyle(Ref<RenderStyle>&&, StyleDifference minimalStyleDifference = StyleDifferenceEqual); 52 52 53 // Called to update a style that is allowed to trigger animations.54 void setAnimatableStyle(Ref<RenderStyle>&&, StyleDifference minimalStyleDifference);55 56 53 // The pseudo element style can be cached or uncached. Use the cached method if the pseudo element doesn't respect 57 54 // any pseudo classes (and therefore has no concept of changing state). … … 344 341 }; 345 342 346 inline void RenderElement::setAnimatableStyle(Ref<RenderStyle>&& style, StyleDifference minimalStyleDifference)347 {348 Ref<RenderStyle> animatedStyle = WTFMove(style);349 if (animation().updateAnimations(*this, animatedStyle, animatedStyle))350 minimalStyleDifference = std::max(minimalStyleDifference, StyleDifferenceRecompositeLayer);351 352 setStyle(WTFMove(animatedStyle), minimalStyleDifference);353 }354 355 343 inline void RenderElement::setAncestorLineBoxDirty(bool f) 356 344 { -
trunk/Source/WebCore/style/RenderTreePosition.cpp
r198847 r198943 28 28 29 29 #include "ComposedTreeIterator.h" 30 #include "HTMLSlotElement.h" 30 31 #include "PseudoElement.h" 31 32 #include "RenderObject.h" … … 83 84 return nullptr; 84 85 85 auto composedChildren = composedTreeChildren(*parentElement); 86 auto composedDescendants = composedTreeDescendants(*parentElement); 87 auto it = node.isBeforePseudoElement() ? composedDescendants.begin() : composedDescendants.at(node); 88 auto end = composedDescendants.end(); 86 89 87 auto it = node.isBeforePseudoElement() ? composedChildren.begin() : composedChildren.at(node); 88 for (auto end = composedChildren.end(); it != end; ++it) { 89 RenderObject* renderer = it->renderer(); 90 while (it != end) { 91 auto& node = *it; 92 bool hasDisplayContents = is<HTMLSlotElement>(node); 93 if (hasDisplayContents) { 94 it.traverseNext(); 95 continue; 96 } 97 RenderObject* renderer = node.renderer(); 90 98 if (renderer && !isRendererReparented(*renderer)) 91 99 return renderer; 100 101 it.traverseNextSkippingChildren(); 92 102 } 93 103 if (PseudoElement* after = parentElement->afterPseudoElement()) -
trunk/Source/WebCore/style/StyleRelations.cpp
r198847 r198943 30 30 #include "NodeRenderStyle.h" 31 31 #include "RenderStyle.h" 32 #include "StyleUpdate.h" 32 33 33 34 namespace WebCore { … … 86 87 } 87 88 88 void commitRelations ToDocument(std::unique_ptr<Relations> relations)89 void commitRelations(std::unique_ptr<Relations> relations, Update& update) 89 90 { 90 91 if (!relations) … … 125 126 break; 126 127 case Relation::FirstChild: 127 if (auto* style = element.renderStyle())128 if (auto* style = update.elementStyle(element)) 128 129 style->setFirstChildState(); 129 130 break; 130 131 case Relation::LastChild: 131 if (auto* style = element.renderStyle())132 if (auto* style = update.elementStyle(element)) 132 133 style->setLastChildState(); 133 134 break; 134 135 case Relation::NthChildIndex: 136 if (auto* style = update.elementStyle(element)) 137 style->setUnique(); 135 138 element.setChildIndex(relation.value); 136 139 break; 137 140 case Relation::Unique: 138 if (auto* style = element.renderStyle())141 if (auto* style = update.elementStyle(element)) 139 142 style->setUnique(); 140 143 break; -
trunk/Source/WebCore/style/StyleRelations.h
r198847 r198943 36 36 namespace Style { 37 37 38 class Update; 39 38 40 struct Relation { 39 41 enum Type { … … 67 69 68 70 std::unique_ptr<Relations> commitRelationsToRenderStyle(RenderStyle&, const Element&, const Relations&); 69 void commitRelations ToDocument(std::unique_ptr<Relations>);71 void commitRelations(std::unique_ptr<Relations>, Update&); 70 72 71 73 } -
trunk/Source/WebCore/style/StyleSharingResolver.cpp
r198847 r198943 34 34 #include "RenderStyle.h" 35 35 #include "SVGElement.h" 36 #include "StyleUpdate.h" 36 37 #include "StyledElement.h" 37 38 #include "VisitedLinkState.h" … … 45 46 46 47 struct SharingResolver::Context { 48 const Update& update; 47 49 const StyledElement& element; 48 50 bool elementAffectedByClassRules; … … 68 70 } 69 71 70 RefPtr<RenderStyle> SharingResolver::resolve(const Element& searchElement )72 RefPtr<RenderStyle> SharingResolver::resolve(const Element& searchElement, const Update& update) 71 73 { 72 74 if (!is<StyledElement>(searchElement)) … … 78 80 if (parentElement.shadowRoot()) 79 81 return nullptr; 80 if (! parentElement.renderStyle())82 if (!update.elementStyle(parentElement)) 81 83 return nullptr; 82 84 // If the element has inline style it is probably unique. … … 96 98 97 99 Context context { 100 update, 98 101 element, 99 102 element.hasClass() && classNamesAffectedByRules(element.classNames()), … … 128 131 m_elementsSharingStyle.add(&element, shareElement); 129 132 130 return RenderStyle::clone( shareElement->renderStyle());133 return RenderStyle::clone(update.elementStyle(*shareElement)); 131 134 } 132 135 … … 196 199 { 197 200 auto& element = context.element; 198 auto* style = c andidateElement.renderStyle();201 auto* style = context.update.elementStyle(candidateElement); 199 202 if (!style) 200 203 return false; -
trunk/Source/WebCore/style/StyleSharingResolver.h
r198847 r198943 43 43 namespace Style { 44 44 45 class Update; 46 45 47 class SharingResolver { 46 48 public: 47 49 SharingResolver(const Document&, const DocumentRuleSets&, const SelectorFilter&); 48 50 49 RefPtr<RenderStyle> resolve(const Element& );51 RefPtr<RenderStyle> resolve(const Element&, const Update&); 50 52 51 53 private: -
trunk/Source/WebCore/style/StyleTreeResolver.cpp
r198847 r198943 5 5 * (C) 2001 Dirk Mueller (mueller@kde.org) 6 6 * (C) 2007 David Smith (catfish.man@gmail.com) 7 * Copyright (C) 2004-2010, 2012-201 4Apple Inc. All rights reserved.7 * Copyright (C) 2004-2010, 2012-2016 Apple Inc. All rights reserved. 8 8 * (C) 2007 Eric Seidel (eric@webkit.org) 9 9 * … … 27 27 #include "StyleTreeResolver.h" 28 28 29 #include "AXObjectCache.h"30 #include "AnimationController.h"31 29 #include "AuthorStyleSheets.h" 32 30 #include "CSSFontSelector.h" … … 34 32 #include "ComposedTreeIterator.h" 35 33 #include "ElementIterator.h" 36 #include "ElementRareData.h" 37 #include "FlowThreadController.h" 34 #include "HTMLBodyElement.h" 38 35 #include "HTMLSlotElement.h" 39 #include "InspectorInstrumentation.h"40 36 #include "LoaderStrategy.h" 41 37 #include "MainFrame.h" 42 38 #include "NodeRenderStyle.h" 43 #include "NodeTraversal.h"44 39 #include "PlatformStrategies.h" 45 #include "RenderFullScreen.h"46 #include "RenderNamedFlowThread.h"47 #include "RenderText.h"48 #include "RenderTreePosition.h"49 #include "RenderWidget.h"50 40 #include "Settings.h" 51 41 #include "ShadowRoot.h" … … 61 51 namespace Style { 62 52 63 enum DetachType { NormalDetach, ReattachDetach };64 65 53 static void attachTextRenderer(Text&, RenderTreePosition&); 66 static void detachRenderTree(Element&, DetachType);67 54 static void resolveTextNode(Text&, RenderTreePosition&); 68 55 … … 115 102 } 116 103 104 TreeResolver::~TreeResolver() 105 { 106 } 107 117 108 TreeResolver::Scope::Scope(Document& document) 118 109 : styleResolver(document.ensureStyleResolver()) … … 132 123 : element(nullptr) 133 124 , style(*document.renderStyle()) 134 , renderTreePosition(*document.renderView())135 125 , change(change) 136 126 { 137 127 } 138 128 139 TreeResolver::Parent::Parent(Element& element, RenderStyle& style, RenderTreePosition renderTreePosition, Change change)129 TreeResolver::Parent::Parent(Element& element, ElementUpdate& update) 140 130 : element(&element) 141 , style(style) 142 , renderTreePosition(renderTreePosition) 143 , change(change) 131 , style(*update.style) 132 , change(update.change) 144 133 { 145 134 } … … 159 148 { 160 149 return m_scopeStack.removeLast(); 161 }162 163 static bool shouldCreateRenderer(const Element& element, const RenderElement& parentRenderer)164 {165 if (!element.document().shouldCreateRenderers())166 return false;167 if (!parentRenderer.canHaveChildren() && !(element.isPseudoElement() && parentRenderer.canHaveGeneratedChildren()))168 return false;169 if (parentRenderer.element() && !parentRenderer.element()->childShouldCreateRenderer(element))170 return false;171 return true;172 150 } 173 151 … … 179 157 } 180 158 159 scope().styleResolver.setOverrideDocumentElementStyle(m_documentElementStyle.get()); 160 181 161 if (element.hasCustomStyleResolveCallbacks()) { 182 RenderStyle* shadowHostStyle = scope().shadowRoot ? scope().shadowRoot->host()->renderStyle() : nullptr;162 RenderStyle* shadowHostStyle = scope().shadowRoot ? m_update->elementStyle(*scope().shadowRoot->host()) : nullptr; 183 163 if (auto customStyle = element.resolveCustomStyle(inheritedStyle, shadowHostStyle)) { 184 Style::commitRelationsToDocument(WTFMove(customStyle->relations)); 164 if (customStyle->relations) 165 commitRelations(WTFMove(customStyle->relations), *m_update); 166 185 167 return WTFMove(customStyle->renderStyle); 186 168 } 187 169 } 188 170 189 if (auto style = scope().sharingResolver.resolve(element ))171 if (auto style = scope().sharingResolver.resolve(element, *m_update)) 190 172 return *style; 191 173 192 174 auto elementStyle = scope().styleResolver.styleForElement(element, &inheritedStyle, MatchAllRules, nullptr, &scope().selectorFilter); 193 175 194 Style::commitRelationsToDocument(WTFMove(elementStyle.relations)); 176 if (elementStyle.relations) 177 commitRelations(WTFMove(elementStyle.relations), *m_update); 178 195 179 return WTFMove(elementStyle.renderStyle); 196 }197 198 #if ENABLE(CSS_REGIONS)199 static RenderNamedFlowThread* moveToFlowThreadIfNeeded(Element& element, const RenderStyle& style)200 {201 if (!element.shouldMoveToFlowThread(style))202 return 0;203 204 FlowThreadController& flowThreadController = element.document().renderView()->flowThreadController();205 RenderNamedFlowThread& parentFlowRenderer = flowThreadController.ensureRenderFlowThreadWithName(style.flowThread());206 flowThreadController.registerNamedFlowContentElement(element, parentFlowRenderer);207 return &parentFlowRenderer;208 }209 #endif210 211 void TreeResolver::createRenderer(Element& element, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle)212 {213 ASSERT(shouldCreateRenderer(element, renderTreePosition.parent()));214 ASSERT(resolvedStyle);215 216 RenderNamedFlowThread* parentFlowRenderer = 0;217 #if ENABLE(CSS_REGIONS)218 parentFlowRenderer = moveToFlowThreadIfNeeded(element, *resolvedStyle);219 #endif220 221 if (!element.rendererIsNeeded(*resolvedStyle))222 return;223 224 renderTreePosition.computeNextSibling(element);225 226 RenderTreePosition insertionPosition = parentFlowRenderer227 ? RenderTreePosition(*parentFlowRenderer, parentFlowRenderer->nextRendererForElement(element))228 : renderTreePosition;229 230 RenderElement* newRenderer = element.createElementRenderer(resolvedStyle.releaseNonNull(), insertionPosition).leakPtr();231 if (!newRenderer)232 return;233 if (!insertionPosition.canInsert(*newRenderer)) {234 newRenderer->destroy();235 return;236 }237 238 // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style239 // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail.240 newRenderer->setFlowThreadState(insertionPosition.parent().flowThreadState());241 242 // Code below updateAnimations() can depend on Element::renderer() already being set.243 element.setRenderer(newRenderer);244 245 // FIXME: There's probably a better way to factor this.246 // This just does what setAnimatedStyle() does, except with setStyleInternal() instead of setStyle().247 Ref<RenderStyle> animatedStyle = newRenderer->style();248 newRenderer->animation().updateAnimations(*newRenderer, animatedStyle, animatedStyle);249 newRenderer->setStyleInternal(WTFMove(animatedStyle));250 251 newRenderer->initializeStyle();252 253 #if ENABLE(FULLSCREEN_API)254 if (m_document.webkitIsFullScreen() && m_document.webkitCurrentFullScreenElement() == &element) {255 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), m_document);256 if (!newRenderer)257 return;258 }259 #endif260 // Note: Adding newRenderer instead of renderer(). renderer() may be a child of newRenderer.261 insertionPosition.insert(*newRenderer);262 180 } 263 181 … … 349 267 350 268 textNode.setRenderer(newRenderer.get()); 351 // Parent takes care of the animations, no need to call setAnimatableStyle.352 269 renderTreePosition.insert(*newRenderer.leakPtr()); 353 270 } … … 382 299 } 383 300 384 void TreeResolver::createRenderTreeForChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)385 {386 for (Node* child = current.firstChild(); child; child = child->nextSibling()) {387 ASSERT((!child->renderer() || child->isNamedFlowContentNode()) || current.shadowRoot());388 if (child->renderer()) {389 renderTreePosition.invalidateNextSibling(*child->renderer());390 continue;391 }392 if (is<Text>(*child)) {393 attachTextRenderer(downcast<Text>(*child), renderTreePosition);394 continue;395 }396 if (is<Element>(*child))397 createRenderTreeRecursively(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);398 }399 }400 401 void TreeResolver::createRenderTreeForShadowRoot(ShadowRoot& shadowRoot)402 {403 ASSERT(shadowRoot.host());404 ASSERT(shadowRoot.host()->renderer());405 406 pushScope(shadowRoot);407 408 auto& renderer = *shadowRoot.host()->renderer();409 RenderTreePosition renderTreePosition(renderer);410 createRenderTreeForChildren(shadowRoot, renderer.style(), renderTreePosition);411 412 popScope();413 414 shadowRoot.clearNeedsStyleRecalc();415 shadowRoot.clearChildNeedsStyleRecalc();416 }417 418 static PseudoElement* beforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)419 {420 ASSERT(pseudoId == BEFORE || pseudoId == AFTER);421 if (pseudoId == BEFORE)422 return current.beforePseudoElement();423 return current.afterPseudoElement();424 }425 426 static void setBeforeOrAfterPseudoElement(Element& current, Ref<PseudoElement>&& pseudoElement, PseudoId pseudoId)427 {428 ASSERT(pseudoId == BEFORE || pseudoId == AFTER);429 if (pseudoId == BEFORE) {430 current.setBeforePseudoElement(WTFMove(pseudoElement));431 return;432 }433 current.setAfterPseudoElement(WTFMove(pseudoElement));434 }435 436 static void clearBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)437 {438 ASSERT(pseudoId == BEFORE || pseudoId == AFTER);439 if (pseudoId == BEFORE) {440 current.clearBeforePseudoElement();441 return;442 }443 current.clearAfterPseudoElement();444 }445 446 301 static void resetStyleForNonRenderedDescendants(Element& current) 447 302 { 448 303 // FIXME: This is not correct with shadow trees. This should be done with ComposedTreeIterator. 449 ASSERT(!current.renderer());450 304 bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle = false; 451 305 for (auto& child : childrenOfType<Element>(current)) { 452 ASSERT(!child.renderer());453 306 bool affectedByPreviousSibling = child.styleIsAffectedByPreviousSibling() && elementNeedingStyleRecalcAffectsNextSiblingElementStyle; 454 307 if (child.needsStyleRecalc() || elementNeedingStyleRecalcAffectsNextSiblingElementStyle) … … 465 318 } 466 319 } 467 }468 469 static bool needsPseudoElement(Element& current, PseudoId pseudoId)470 {471 if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())472 return false;473 if (current.isPseudoElement())474 return false;475 if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))476 return false;477 return true;478 }479 480 void TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId, RenderTreePosition& renderTreePosition)481 {482 if (!needsPseudoElement(current, pseudoId))483 return;484 Ref<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId);485 InspectorInstrumentation::pseudoElementCreated(m_document.page(), pseudoElement.get());486 setBeforeOrAfterPseudoElement(current, pseudoElement.copyRef(), pseudoId);487 createRenderTreeRecursively(pseudoElement.get(), *current.renderStyle(), renderTreePosition, nullptr);488 }489 490 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)491 void TreeResolver::createRenderTreeForSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)492 {493 ASSERT(shouldCreateRenderer(slot, renderTreePosition.parent()));494 495 if (auto* assignedNodes = slot.assignedNodes()) {496 pushEnclosingScope();497 for (auto* child : *assignedNodes) {498 if (is<Text>(*child))499 attachTextRenderer(downcast<Text>(*child), renderTreePosition);500 else if (is<Element>(*child))501 createRenderTreeRecursively(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);502 }503 popScope();504 } else {505 SelectorFilterPusher selectorFilterPusher(scope().selectorFilter, slot);506 createRenderTreeForChildren(slot, inheritedStyle, renderTreePosition);507 }508 509 slot.clearNeedsStyleRecalc();510 slot.clearChildNeedsStyleRecalc();511 }512 #endif513 514 void TreeResolver::createRenderTreeRecursively(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle)515 {516 ASSERT(!current.renderer());517 518 PostResolutionCallbackDisabler callbackDisabler(m_document);519 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;520 521 bool shouldCallCreateRenderer = shouldCreateRenderer(current, renderTreePosition.parent());522 523 RefPtr<RenderStyle> style = resolvedStyle;524 if (!style)525 style = styleForElement(current, inheritedStyle);526 527 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)528 if (is<HTMLSlotElement>(current)) {529 if (shouldCallCreateRenderer && current.rendererIsNeeded(*style))530 createRenderTreeForSlotAssignees(downcast<HTMLSlotElement>(current), inheritedStyle, renderTreePosition);531 return;532 }533 #endif534 535 if (current.hasCustomStyleResolveCallbacks())536 current.willAttachRenderers();537 538 if (shouldCallCreateRenderer)539 createRenderer(current, renderTreePosition, style.releaseNonNull());540 541 if (auto* renderer = current.renderer()) {542 SelectorFilterPusher selectorFilterPusher(scope().selectorFilter, current, SelectorFilterPusher::NoPush);543 544 RenderTreePosition childRenderTreePosition(*renderer);545 createRenderTreeForBeforeOrAfterPseudoElement(current, BEFORE, childRenderTreePosition);546 547 auto* shadowRoot = current.shadowRoot();548 if (shadowRoot) {549 selectorFilterPusher.push();550 createRenderTreeForShadowRoot(*shadowRoot);551 } else if (current.firstChild())552 selectorFilterPusher.push();553 554 bool skipChildren = shadowRoot;555 if (!skipChildren)556 createRenderTreeForChildren(current, renderer->style(), childRenderTreePosition);557 558 if (AXObjectCache* cache = m_document.axObjectCache())559 cache->updateCacheAfterNodeIsAttached(¤t);560 561 createRenderTreeForBeforeOrAfterPseudoElement(current, AFTER, childRenderTreePosition);562 563 current.updateFocusAppearanceAfterAttachIfNeeded();564 } else565 resetStyleForNonRenderedDescendants(current);566 567 current.clearNeedsStyleRecalc();568 current.clearChildNeedsStyleRecalc();569 570 if (current.hasCustomStyleResolveCallbacks())571 current.didAttachRenderers();572 320 } 573 321 … … 607 355 #endif 608 356 609 staticvoid detachRenderTree(Element& current, DetachType detachType)357 void detachRenderTree(Element& current, DetachType detachType) 610 358 { 611 359 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; … … 638 386 } 639 387 640 static bool pseudoStyleCacheIsInvalid(RenderElement* renderer, RenderStyle* newStyle) 641 { 642 const RenderStyle& currentStyle = renderer->style(); 643 644 const PseudoStyleCache* pseudoStyleCache = currentStyle.cachedPseudoStyles(); 645 if (!pseudoStyleCache) 646 return false; 647 648 for (auto& cache : *pseudoStyleCache) { 649 RefPtr<RenderStyle> newPseudoStyle; 650 PseudoId pseudoId = cache->styleType(); 651 if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED) 652 newPseudoStyle = renderer->uncachedFirstLineStyle(newStyle); 653 else 654 newPseudoStyle = renderer->getUncachedPseudoStyle(PseudoStyleRequest(pseudoId), newStyle, newStyle); 655 if (!newPseudoStyle) 656 return true; 657 if (*newPseudoStyle != *cache) { 658 if (pseudoId < FIRST_INTERNAL_PSEUDOID) 659 newStyle->setHasPseudoStyle(pseudoId); 660 newStyle->addCachedPseudoStyle(newPseudoStyle); 661 if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED) { 662 // FIXME: We should do an actual diff to determine whether a repaint vs. layout 663 // is needed, but for now just assume a layout will be required. The diff code 664 // in RenderObject::setStyle would need to be factored out so that it could be reused. 665 renderer->setNeedsLayoutAndPrefWidthsRecalc(); 666 } 667 return true; 668 } 669 } 670 return false; 671 } 672 673 Change TreeResolver::resolveElement(Element& current) 674 { 675 Change localChange = Detach; 676 RefPtr<RenderStyle> newStyle; 677 RefPtr<RenderStyle> currentStyle = current.renderStyle(); 678 679 if (currentStyle && current.styleChangeType() != ReconstructRenderTree) { 680 Ref<RenderStyle> style(styleForElement(current, parent().style)); 681 newStyle = style.ptr(); 682 localChange = determineChange(*currentStyle, style); 683 } 684 if (localChange == Detach) { 685 if (current.renderer() || current.isNamedFlowContentNode()) 686 detachRenderTree(current, ReattachDetach); 687 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 688 else if (is<HTMLSlotElement>(current)) 689 detachRenderTree(current, ReattachDetach); 690 #endif 691 createRenderTreeRecursively(current, parent().style, parent().renderTreePosition, newStyle.release()); 692 invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(current); 693 694 return Detach; 695 } 696 697 if (RenderElement* renderer = current.renderer()) { 698 if (localChange != NoChange || pseudoStyleCacheIsInvalid(renderer, newStyle.get()) || (parent().change == Force && renderer->requiresForcedStyleRecalcPropagation()) || current.styleChangeType() == SyntheticStyleChange) 699 renderer->setAnimatableStyle(*newStyle, current.styleChangeType() == SyntheticStyleChange ? StyleDifferenceRecompositeLayer : StyleDifferenceEqual); 700 } 701 702 // If "rem" units are used anywhere in the document, and if the document element's font size changes, then force font updating 703 // all the way down the tree. This is simpler than having to maintain a cache of objects (and such font size changes should be rare anyway). 704 if (m_document.authorStyleSheets().usesRemUnits() && m_document.documentElement() == ¤t && localChange != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize()) { 705 // Cached RenderStyles may depend on the re units. 706 scope().styleResolver.invalidateMatchedPropertiesCache(); 707 return Force; 708 } 709 if (parent().change == Force || current.styleChangeType() >= FullStyleChange) 710 return Force; 711 712 return localChange; 388 ElementUpdate TreeResolver::resolveElement(Element& element) 389 { 390 auto newStyle = styleForElement(element, parent().style); 391 392 auto* renderer = element.renderer(); 393 394 bool affectsRenderedSubtree = renderer || newStyle->display() != NONE || element.rendererIsNeeded(newStyle) || element.shouldMoveToFlowThread(newStyle); 395 if (!affectsRenderedSubtree) 396 return { }; 397 398 ElementUpdate update; 399 400 bool needsNewRenderer = !renderer || element.styleChangeType() == ReconstructRenderTree || parent().change == Detach; 401 if (!needsNewRenderer && m_document.frame()->animation().updateAnimations(*renderer, newStyle, newStyle)) 402 update.isSynthetic = true; 403 404 update.change = needsNewRenderer ? Detach : determineChange(renderer->style(), newStyle); 405 update.style = WTFMove(newStyle); 406 407 if (element.styleChangeType() == SyntheticStyleChange) 408 update.isSynthetic = true; 409 410 if (&element == m_document.documentElement()) { 411 m_documentElementStyle = update.style; 412 413 // If "rem" units are used anywhere in the document, and if the document element's font size changes, then force font updating 414 // all the way down the tree. This is simpler than having to maintain a cache of objects (and such font size changes should be rare anyway). 415 if (m_document.authorStyleSheets().usesRemUnits() && update.change != NoChange && renderer && renderer->style().fontSize() != update.style->fontSize()) { 416 // Cached RenderStyles may depend on the rem units. 417 scope().styleResolver.invalidateMatchedPropertiesCache(); 418 update.change = Force; 419 } 420 } 421 422 // This is needed for resolving color:-webkit-text for subsequent elements. 423 // FIXME: We shouldn't mutate document when resolving style. 424 if (&element == m_document.body()) 425 m_document.setTextColor(update.style->visitedDependentColor(CSSPropertyColor)); 426 427 if (update.change != Detach && (parent().change == Force || element.styleChangeType() >= FullStyleChange)) 428 update.change = Force; 429 430 return update; 713 431 } 714 432 … … 730 448 attachTextRenderer(text, renderTreePosition); 731 449 invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(text); 732 }733 734 void TreeResolver::resolveBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition)735 {736 if (!current.renderer())737 return;738 PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId);739 if (!existingPseudoElement) {740 createRenderTreeForBeforeOrAfterPseudoElement(current, pseudoId, renderTreePosition);741 return;742 }743 744 if (existingPseudoElement->renderer())745 renderTreePosition.invalidateNextSibling(*existingPseudoElement->renderer());746 747 if (change == NoChange && !existingPseudoElement->needsStyleRecalc())748 return;749 750 if (needsPseudoElement(current, pseudoId)) {751 auto change = resolveElement(*existingPseudoElement);752 existingPseudoElement->didRecalcStyle(change);753 existingPseudoElement->clearNeedsStyleRecalc();754 } else755 clearBeforeOrAfterPseudoElement(current, pseudoId);756 450 } 757 451 … … 810 504 #endif // PLATFORM(IOS) 811 505 812 void TreeResolver::pushParent(Element& element, RenderStyle& style, RenderTreePosition renderTreePosition, Change change)506 void TreeResolver::pushParent(Element& element, ElementUpdate& update) 813 507 { 814 508 scope().selectorFilter.pushParent(&element); 815 509 816 Parent parent(element, style, renderTreePosition, change);510 Parent parent(element, update); 817 511 818 512 if (auto* shadowRoot = element.shadowRoot()) { … … 828 522 829 523 m_parentStack.append(WTFMove(parent)); 830 831 resolveBeforeOrAfterPseudoElement(element, change, BEFORE, renderTreePosition);832 524 } 833 525 … … 835 527 { 836 528 auto& parentElement = *parent().element; 837 838 resolveBeforeOrAfterPseudoElement(parentElement, parent().change, AFTER, parent().renderTreePosition);839 529 840 530 parentElement.clearNeedsStyleRecalc(); … … 856 546 while (m_parentStack.size() > depth) 857 547 popParent(); 548 } 549 550 static bool shouldResolvePseudoElement(PseudoElement* pseudoElement) 551 { 552 if (!pseudoElement) 553 return false; 554 bool needsStyleRecalc = pseudoElement->needsStyleRecalc(); 555 pseudoElement->clearNeedsStyleRecalc(); 556 return needsStyleRecalc; 858 557 } 859 558 … … 879 578 ASSERT(node.parentElement() == parent.element || is<ShadowRoot>(node.parentNode()) || node.parentElement()->shadowRoot()); 880 579 881 if (auto* existingRenderer = node.renderer())882 parent.renderTreePosition.invalidateNextSibling(*existingRenderer);883 884 580 if (is<Text>(node)) { 885 if (node.needsStyleRecalc()) 886 resolveTextNode(downcast<Text>(node), parent.renderTreePosition); 581 auto& text = downcast<Text>(node); 582 if (text.styleChangeType() == ReconstructRenderTree && parent.change != Detach) 583 m_update->addText(text, parent.element); 584 585 text.clearNeedsStyleRecalc(); 887 586 it.traverseNextSkippingChildren(); 888 587 continue; … … 896 595 parent.elementNeedingStyleRecalcAffectsNextSiblingElementStyle = element.affectsNextSiblingElementStyle(); 897 596 898 Change change = NoChange; 899 900 bool shouldResolve = parent.change >= Inherit || element.needsStyleRecalc() || affectedByPreviousSibling; 597 bool shouldResolveForPseudoElement = shouldResolvePseudoElement(element.beforePseudoElement()) || shouldResolvePseudoElement(element.afterPseudoElement()); 598 599 ElementUpdate update; 600 update.style = element.renderStyle(); 601 602 bool shouldResolve = parent.change >= Inherit || element.needsStyleRecalc() || shouldResolveForPseudoElement || affectedByPreviousSibling; 901 603 if (shouldResolve) { 902 604 #if PLATFORM(IOS) … … 911 613 } 912 614 } 913 change = resolveElement(element); 615 616 update = resolveElement(element); 617 618 if (element.hasCustomStyleResolveCallbacks()) 619 element.didRecalcStyle(update.change); 620 621 if (affectedByPreviousSibling && update.change != Detach) 622 update.change = Force; 623 624 if (update.style) 625 m_update->addElement(element, parent.element, update); 914 626 915 627 element.clearNeedsStyleRecalc(); 916 917 if (element.hasCustomStyleResolveCallbacks()) 918 element.didRecalcStyle(change); 919 920 if (change == Detach) { 921 it.traverseNextSkippingChildren(); 922 continue; 923 } 924 925 if (affectedByPreviousSibling) 926 change = Force; 927 } 628 } 629 928 630 929 631 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 930 632 if (is<HTMLSlotElement>(element)) { 931 633 // FIXME: We should compute style for the slot and use it as parent style. 932 // FIXME: This should be display:contents check. 933 // Duplicate the style and render tree position from the current context. 934 pushParent(element, parent.style.get(), parent.renderTreePosition, change); 634 // Duplicate the style from the parent context. 635 ElementUpdate slotUpdate; 636 slotUpdate.style = parent.style.ptr(); 637 slotUpdate.change = update.change; 638 if (!shouldResolve) 639 m_update->addElement(element, parent.element, update); 640 pushParent(element, slotUpdate); 935 641 it.traverseNext(); 936 642 continue; 937 643 } 938 644 #endif 939 auto* renderer = element.renderer(); 940 if (!renderer) { 645 if (!update.style) { 941 646 resetStyleForNonRenderedDescendants(element); 942 647 element.clearChildNeedsStyleRecalc(); 943 648 } 944 649 945 bool shouldIterateChildren = renderer && (element.childNeedsStyleRecalc() ||change != NoChange);650 bool shouldIterateChildren = update.style && (element.childNeedsStyleRecalc() || update.change != NoChange); 946 651 if (!shouldIterateChildren) { 947 652 it.traverseNextSkippingChildren(); … … 949 654 } 950 655 951 pushParent(element, renderer->style(), RenderTreePosition(*renderer), change);656 pushParent(element, update); 952 657 953 658 it.traverseNext(); … … 957 662 } 958 663 959 voidTreeResolver::resolve(Change change)664 std::unique_ptr<const Update> TreeResolver::resolve(Change change) 960 665 { 961 666 auto& renderView = *m_document.renderView(); … … 963 668 Element* documentElement = m_document.documentElement(); 964 669 if (!documentElement) 965 return ;670 return nullptr; 966 671 if (change != Force && !documentElement->childNeedsStyleRecalc() && !documentElement->needsStyleRecalc()) 967 return; 968 672 return nullptr; 673 674 m_update = std::make_unique<Update>(m_document); 969 675 m_scopeStack.append(adoptRef(*new Scope(m_document))); 676 m_parentStack.append(Parent(m_document, change)); 970 677 971 678 // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. … … 973 680 renderView.setUsesFirstLetterRules(renderView.usesFirstLetterRules() || scope().styleResolver.usesFirstLetterRules()); 974 681 975 m_parentStack.append(Parent(m_document, change));976 977 682 resolveComposedTree(); 978 683 … … 982 687 m_parentStack.clear(); 983 688 m_scopeStack.clear(); 984 } 985 986 void detachRenderTree(Element& element) 987 { 988 detachRenderTree(element, NormalDetach);689 690 if (m_update->roots().isEmpty()) 691 return { }; 692 693 return WTFMove(m_update); 989 694 } 990 695 -
trunk/Source/WebCore/style/StyleTreeResolver.h
r198847 r198943 33 33 #include "StyleChange.h" 34 34 #include "StyleSharingResolver.h" 35 #include "StyleUpdate.h" 35 36 #include <functional> 37 #include <wtf/HashMap.h> 36 38 #include <wtf/RefPtr.h> 37 39 … … 48 50 class StyleResolver; 49 51 class Text; 52 class TreeChange; 50 53 51 54 namespace Style { … … 54 57 public: 55 58 TreeResolver(Document&); 59 ~TreeResolver(); 56 60 57 voidresolve(Change);61 std::unique_ptr<const Update> resolve(Change); 58 62 59 63 private: … … 61 65 62 66 void resolveComposedTree(); 63 Change resolveElement(Element&); 64 void resolveBeforeOrAfterPseudoElement(Element&, Change, PseudoId, RenderTreePosition&); 65 66 67 void createRenderTreeRecursively(Element&, RenderStyle&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle); 68 void createRenderer(Element&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle); 69 void createRenderTreeForBeforeOrAfterPseudoElement(Element&, PseudoId, RenderTreePosition&); 70 void createRenderTreeForChildren(ContainerNode&, RenderStyle&, RenderTreePosition&); 71 void createRenderTreeForShadowRoot(ShadowRoot&); 72 73 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 74 void createRenderTreeForSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&); 75 #endif 67 ElementUpdate resolveElement(Element&); 76 68 77 69 struct Scope : RefCounted<Scope> { … … 89 81 Element* element; 90 82 Ref<RenderStyle> style; 91 RenderTreePosition renderTreePosition;92 83 Change change; 93 84 bool didPushScope { false }; … … 95 86 96 87 Parent(Document&, Change); 97 Parent(Element&, RenderStyle&, RenderTreePosition, Change);88 Parent(Element&, ElementUpdate&); 98 89 }; 99 90 … … 105 96 void popScope(); 106 97 107 void pushParent(Element&, RenderStyle&, RenderTreePosition, Change);98 void pushParent(Element&, ElementUpdate&); 108 99 void popParent(); 109 100 void popParentsToDepth(unsigned depth); 110 101 111 102 Document& m_document; 103 RefPtr<RenderStyle> m_documentElementStyle; 104 112 105 Vector<Ref<Scope>, 4> m_scopeStack; 113 106 Vector<Parent, 32> m_parentStack; 107 108 std::unique_ptr<Update> m_update; 114 109 }; 115 110 116 void detachRenderTree(Element&); 111 enum DetachType { NormalDetach, ReattachDetach }; 112 void detachRenderTree(Element&, DetachType = NormalDetach); 117 113 void detachTextRenderer(Text&); 118 114 -
trunk/Source/WebCore/svg/SVGElement.h
r198847 r198943 184 184 void updateRelativeLengthsInformation(bool hasRelativeLengths, SVGElement*); 185 185 186 bool willRecalcStyle(Style::Change) override; 187 186 188 class InstanceInvalidationGuard; 187 189 188 190 private: 189 191 RenderStyle* computedStyle(PseudoId = NOPSEUDO) final; 190 bool willRecalcStyle(Style::Change) override;191 192 192 193 virtual bool isSupported(StringImpl* feature, StringImpl* version) const; -
trunk/Source/WebCore/svg/SVGUseElement.cpp
r198847 r198943 179 179 } 180 180 181 void SVGUseElement::willAttachRenderers() 182 { 181 bool SVGUseElement::willRecalcStyle(Style::Change change) 182 { 183 // FIXME: Shadow tree should be updated before style recalc. 183 184 if (m_shadowTreeNeedsUpdate) 184 185 updateShadowTree(); 185 SVGGraphicsElement::willAttachRenderers();186 return SVGGraphicsElement::willRecalcStyle(change); 186 187 } 187 188 -
trunk/Source/WebCore/svg/SVGUseElement.h
r198847 r198943 64 64 void parseAttribute(const QualifiedName&, const AtomicString&) override; 65 65 void svgAttributeChanged(const QualifiedName&) override; 66 void willAttachRenderers() override;66 bool willRecalcStyle(Style::Change) override; 67 67 RenderPtr<RenderElement> createElementRenderer(Ref<RenderStyle>&&, const RenderTreePosition&) override; 68 68 void toClipPath(Path&) override;
Note: See TracChangeset
for help on using the changeset viewer.