Changeset 198828 in webkit
- Timestamp:
- Mar 29, 2016 11:00:22 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r198819 r198828 1 2016-03-26 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-29 Nan Wang <n_wang@apple.com> 2 41 -
trunk/LayoutTests/TestExpectations
r198665 r198828 989 989 webkit.org/b/155028 storage/indexeddb/modern/256-open-databases.html [ Skip ] 990 990 991 # Fixed by upcoming MathML refactoring 992 webkit.org/b/155019 mathml/presentation/menclose-notation-attribute-change-value.html [ Skip ] 993 991 994 ### END OF IndexedDB failures 992 995 ######################################## -
trunk/LayoutTests/css3/blending/repaint/blend-mode-isolate-stacking-context-expected.txt
r190658 r198828 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
r169505 r198828 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
r187932 r198828 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
r187932 r198828 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
r187932 r198828 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
r187932 r198828 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
r96257 r198828 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
r96257 r198828 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/platform/ios-simulator/TestExpectations
r198789 r198828 2044 2044 fast/regions/percentage-margins-rtl-variable-width-regions.html [ ImageOnlyFailure ] 2045 2045 fast/regions/percentage-margins-variable-width-regions.html [ ImageOnlyFailure ] 2046 fast/regions/position-writing-modes-in-variable-width-regions.html [ ImageOnlyFailure ] 2046 2047 fast/regions/positioning/fixed-in-named-flow-position-changed.html [ ImageOnlyFailure ] 2047 2048 fast/regions/positioning/fixed-inside-fixed-in-named-flow.html [ ImageOnlyFailure ] -
trunk/LayoutTests/platform/mac-wk2/editing/mac/spelling/autocorrection-contraction-expected.txt
r187932 r198828 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
r177774 r198828 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
r177774 r198828 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
r180867 r198828 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
r180867 r198828 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
r177774 r198828 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/Source/WebCore/CMakeLists.txt
r198811 r198828 2627 2627 style/InlineTextBoxStyle.cpp 2628 2628 style/RenderTreePosition.cpp 2629 style/RenderTreeUpdater.cpp 2629 2630 style/StyleChange.cpp 2630 2631 style/StyleFontSizeFunctions.cpp … … 2633 2634 style/StyleSharingResolver.cpp 2634 2635 style/StyleTreeResolver.cpp 2636 style/StyleUpdate.cpp 2635 2637 2636 2638 svg/SVGAElement.cpp -
trunk/Source/WebCore/ChangeLog
r198819 r198828 1 2016-03-26 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 Switch willAttachRenderers to willRecalcStyle as the former is now called too late. 213 214 * svg/SVGUseElement.h: 215 1 216 2016-03-29 Nan Wang <n_wang@apple.com> 2 217 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r198762 r198828 6556 6556 E425A49A18292B840020CFCF /* CollectionIndexCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E425A49918292B840020CFCF /* CollectionIndexCache.h */; }; 6557 6557 E4295FA412B0614E00D1ACE0 /* ResourceLoadPriority.h in Headers */ = {isa = PBXBuildFile; fileRef = E4295FA312B0614E00D1ACE0 /* ResourceLoadPriority.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6558 E42E76DA1C7AF76C00E3614D /* StyleUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */; }; 6559 E42E76DC1C7AF77600E3614D /* StyleUpdate.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E76DB1C7AF77600E3614D /* StyleUpdate.h */; }; 6558 6560 E43105B816750F0C00DB2FB8 /* NodeTraversal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43105B716750F0C00DB2FB8 /* NodeTraversal.cpp */; }; 6559 6561 E43105BB16750F1600DB2FB8 /* NodeTraversal.h in Headers */ = {isa = PBXBuildFile; fileRef = E43105BA16750F1600DB2FB8 /* NodeTraversal.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 6611 6613 E453904D0EAFD637003695C8 /* WidgetIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = E453903C0EAFD637003695C8 /* WidgetIOS.mm */; }; 6612 6614 E45390AE0EAFF4B5003695C8 /* SystemMemoryIOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E45390AD0EAFF4B5003695C8 /* SystemMemoryIOS.cpp */; }; 6615 E46180291C8A06CD0026C02C /* RenderTreeUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */; }; 6616 E461802B1C8A06D90026C02C /* RenderTreeUpdater.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */; }; 6613 6617 E461802D1C8DD2900026C02C /* StyleRelations.h in Headers */ = {isa = PBXBuildFile; fileRef = E461802C1C8DD2900026C02C /* StyleRelations.h */; }; 6614 6618 E461802F1C8DD4D20026C02C /* StyleRelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E461802E1C8DD4D20026C02C /* StyleRelations.cpp */; }; … … 14588 14592 E425A49918292B840020CFCF /* CollectionIndexCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionIndexCache.h; sourceTree = "<group>"; }; 14589 14593 E4295FA312B0614E00D1ACE0 /* ResourceLoadPriority.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadPriority.h; sourceTree = "<group>"; }; 14594 E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleUpdate.cpp; sourceTree = "<group>"; }; 14595 E42E76DB1C7AF77600E3614D /* StyleUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleUpdate.h; sourceTree = "<group>"; }; 14590 14596 E43105B716750F0C00DB2FB8 /* NodeTraversal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeTraversal.cpp; sourceTree = "<group>"; }; 14591 14597 E43105BA16750F1600DB2FB8 /* NodeTraversal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeTraversal.h; sourceTree = "<group>"; }; … … 14635 14641 E453903C0EAFD637003695C8 /* WidgetIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WidgetIOS.mm; sourceTree = "<group>"; }; 14636 14642 E45390AD0EAFF4B5003695C8 /* SystemMemoryIOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SystemMemoryIOS.cpp; sourceTree = "<group>"; }; 14643 E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdater.h; sourceTree = "<group>"; }; 14644 E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdater.cpp; sourceTree = "<group>"; }; 14637 14645 E461802C1C8DD2900026C02C /* StyleRelations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleRelations.h; sourceTree = "<group>"; }; 14638 14646 E461802E1C8DD4D20026C02C /* StyleRelations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleRelations.cpp; sourceTree = "<group>"; }; … … 23501 23509 5824ABA81AE849C8009074B7 /* RenderTreePosition.cpp */, 23502 23510 5824ABA91AE849C8009074B7 /* RenderTreePosition.h */, 23511 E461802A1C8A06D90026C02C /* RenderTreeUpdater.cpp */, 23512 E46180281C8A06CD0026C02C /* RenderTreeUpdater.h */, 23503 23513 E401E0A51C3C0CF700F34D10 /* StyleChange.cpp */, 23504 23514 E401E0A31C3C0B8300F34D10 /* StyleChange.h */, … … 23513 23523 E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */, 23514 23524 E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */, 23525 E42E76D91C7AF76C00E3614D /* StyleUpdate.cpp */, 23526 E42E76DB1C7AF77600E3614D /* StyleUpdate.h */, 23515 23527 ); 23516 23528 path = style; … … 25948 25960 7728694F14F8882500F484DC /* EXTTextureFilterAnisotropic.h in Headers */, 25949 25961 A75E8B890E1DE2D6007F2481 /* FEBlend.h in Headers */, 25962 E46180291C8A06CD0026C02C /* RenderTreeUpdater.h in Headers */, 25950 25963 A75E8B8B0E1DE2D6007F2481 /* FEColorMatrix.h in Headers */, 25951 25964 A75E8B8D0E1DE2D6007F2481 /* FEComponentTransfer.h in Headers */, … … 26139 26152 93F198E508245E59001E9ABC /* HTMLDocument.h in Headers */, 26140 26153 977B3867122883E900B81FF8 /* HTMLDocumentParser.h in Headers */, 26154 E42E76DC1C7AF77600E3614D /* StyleUpdate.h in Headers */, 26141 26155 93309DE8099E64920056E581 /* htmlediting.h in Headers */, 26142 26156 93F198E608245E59001E9ABC /* HTMLElement.h in Headers */, … … 30524 30538 E1FF8F64180745D800132674 /* JSSubtleCrypto.cpp in Sources */, 30525 30539 E1FF8F681807460800132674 /* JSSubtleCryptoCustom.cpp in Sources */, 30540 E461802B1C8A06D90026C02C /* RenderTreeUpdater.cpp in Sources */, 30526 30541 B20111070AB7740500DB0E68 /* JSSVGAElement.cpp in Sources */, 30527 30542 24D9129113CA951E00D21915 /* JSSVGAltGlyphDefElement.cpp in Sources */, … … 31062 31077 FD581FB41520F93B003A7A75 /* PeriodicWave.cpp in Sources */, 31063 31078 49D5DC2D0F423A73008F20FD /* PerspectiveTransformOperation.cpp in Sources */, 31079 E42E76DA1C7AF76C00E3614D /* StyleUpdate.cpp in Sources */, 31064 31080 D0FF2A5D11F8C45A007E74E0 /* PingLoader.cpp in Sources */, 31065 31081 CD7D33431C7A123F00041293 /* PixelBufferConformerCV.cpp in Sources */, -
trunk/Source/WebCore/css/StyleResolver.cpp
r198255 r198828 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
r197764 r198828 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
r198658 r198828 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
r198658 r198828 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
r198701 r198828 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
r197887 r198828 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
r198568 r198828 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
r198701 r198828 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
r191112 r198828 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
r197764 r198828 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
r197764 r198828 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
r198584 r198828 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
r198584 r198828 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
r198584 r198828 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 … … 132 119 : element(nullptr) 133 120 , style(*document.renderStyle()) 134 , renderTreePosition(*document.renderView())135 121 , change(change) 136 122 { 137 123 } 138 124 139 TreeResolver::Parent::Parent(Element& element, RenderStyle& style, RenderTreePosition renderTreePosition, Change change)125 TreeResolver::Parent::Parent(Element& element, ElementUpdate& update) 140 126 : element(&element) 141 , style(style) 142 , renderTreePosition(renderTreePosition) 143 , change(change) 127 , style(*update.style) 128 , change(update.change) 144 129 { 145 130 } … … 159 144 { 160 145 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 146 } 173 147 … … 179 153 } 180 154 155 scope().styleResolver.setOverrideDocumentElementStyle(m_documentElementStyle.get()); 156 181 157 if (element.hasCustomStyleResolveCallbacks()) { 182 RenderStyle* shadowHostStyle = scope().shadowRoot ? scope().shadowRoot->host()->renderStyle() : nullptr;158 RenderStyle* shadowHostStyle = scope().shadowRoot ? m_update->elementStyle(*scope().shadowRoot->host()) : nullptr; 183 159 if (auto customStyle = element.resolveCustomStyle(inheritedStyle, shadowHostStyle)) { 184 Style::commitRelationsToDocument(WTFMove(customStyle->relations)); 160 if (customStyle->relations) 161 commitRelations(WTFMove(customStyle->relations), *m_update); 162 185 163 return WTFMove(customStyle->renderStyle); 186 164 } 187 165 } 188 166 189 if (auto style = scope().sharingResolver.resolve(element ))167 if (auto style = scope().sharingResolver.resolve(element, *m_update)) 190 168 return *style; 191 169 192 170 auto elementStyle = scope().styleResolver.styleForElement(element, &inheritedStyle, MatchAllRules, nullptr, &scope().selectorFilter); 193 171 194 Style::commitRelationsToDocument(WTFMove(elementStyle.relations)); 172 if (elementStyle.relations) 173 commitRelations(WTFMove(elementStyle.relations), *m_update); 174 195 175 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 176 } 263 177 … … 349 263 350 264 textNode.setRenderer(newRenderer.get()); 351 // Parent takes care of the animations, no need to call setAnimatableStyle.352 265 renderTreePosition.insert(*newRenderer.leakPtr()); 353 266 } … … 382 295 } 383 296 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 297 static void resetStyleForNonRenderedDescendants(Element& current) 447 298 { 448 299 // FIXME: This is not correct with shadow trees. This should be done with ComposedTreeIterator. 449 ASSERT(!current.renderer());450 300 bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle = false; 451 301 for (auto& child : childrenOfType<Element>(current)) { 452 ASSERT(!child.renderer());453 302 bool affectedByPreviousSibling = child.styleIsAffectedByPreviousSibling() && elementNeedingStyleRecalcAffectsNextSiblingElementStyle; 454 303 if (child.needsStyleRecalc() || elementNeedingStyleRecalcAffectsNextSiblingElementStyle) … … 465 314 } 466 315 } 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 316 } 573 317 … … 607 351 #endif 608 352 609 staticvoid detachRenderTree(Element& current, DetachType detachType)353 void detachRenderTree(Element& current, DetachType detachType) 610 354 { 611 355 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; … … 638 382 } 639 383 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; 384 ElementUpdate TreeResolver::resolveElement(Element& element) 385 { 386 ElementUpdate update; 387 388 auto newStyle = styleForElement(element, parent().style); 389 390 auto* renderer = element.renderer(); 391 bool needsNewRenderer = !renderer || element.styleChangeType() == ReconstructRenderTree || parent().change == Detach; 392 393 if (!needsNewRenderer && m_document.frame()->animation().updateAnimations(*renderer, newStyle, newStyle)) 394 update.isSynthetic = true; 395 396 update.change = needsNewRenderer ? Detach : determineChange(renderer->style(), newStyle); 397 update.style = WTFMove(newStyle); 398 399 if (element.styleChangeType() == SyntheticStyleChange) 400 update.isSynthetic = true; 401 402 if (&element == m_document.documentElement()) { 403 m_documentElementStyle = update.style; 404 405 // If "rem" units are used anywhere in the document, and if the document element's font size changes, then force font updating 406 // 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). 407 if (m_document.authorStyleSheets().usesRemUnits() && update.change != NoChange && renderer && update.style && renderer->style().fontSize() != update.style->fontSize()) { 408 // Cached RenderStyles may depend on the rem units. 409 scope().styleResolver.invalidateMatchedPropertiesCache(); 410 update.change = Force; 411 } 412 } 413 414 // This is needed for resolving color:-webkit-text for subsequent elements. 415 // FIXME: We shouldn't mutate document when resolving style. 416 if (&element == m_document.body()) 417 m_document.setTextColor(update.style->visitedDependentColor(CSSPropertyColor)); 418 419 if (update.change != Detach && (parent().change == Force || element.styleChangeType() >= FullStyleChange)) 420 update.change = Force; 421 422 return update; 713 423 } 714 424 … … 730 440 attachTextRenderer(text, renderTreePosition); 731 441 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 442 } 757 443 … … 810 496 #endif // PLATFORM(IOS) 811 497 812 void TreeResolver::pushParent(Element& element, RenderStyle& style, RenderTreePosition renderTreePosition, Change change)498 void TreeResolver::pushParent(Element& element, ElementUpdate& update) 813 499 { 814 500 scope().selectorFilter.pushParent(&element); 815 501 816 Parent parent(element, style, renderTreePosition, change);502 Parent parent(element, update); 817 503 818 504 if (auto* shadowRoot = element.shadowRoot()) { … … 828 514 829 515 m_parentStack.append(WTFMove(parent)); 830 831 resolveBeforeOrAfterPseudoElement(element, change, BEFORE, renderTreePosition);832 516 } 833 517 … … 835 519 { 836 520 auto& parentElement = *parent().element; 837 838 resolveBeforeOrAfterPseudoElement(parentElement, parent().change, AFTER, parent().renderTreePosition);839 521 840 522 parentElement.clearNeedsStyleRecalc(); … … 856 538 while (m_parentStack.size() > depth) 857 539 popParent(); 540 } 541 542 static bool shouldResolvePseudoElement(PseudoElement* pseudoElement) 543 { 544 if (!pseudoElement) 545 return false; 546 bool needsStyleRecalc = pseudoElement->needsStyleRecalc(); 547 pseudoElement->clearNeedsStyleRecalc(); 548 return needsStyleRecalc; 858 549 } 859 550 … … 879 570 ASSERT(node.parentElement() == parent.element || is<ShadowRoot>(node.parentNode()) || node.parentElement()->shadowRoot()); 880 571 881 if (auto* existingRenderer = node.renderer())882 parent.renderTreePosition.invalidateNextSibling(*existingRenderer);883 884 572 if (is<Text>(node)) { 885 if (node.needsStyleRecalc()) 886 resolveTextNode(downcast<Text>(node), parent.renderTreePosition); 573 auto& text = downcast<Text>(node); 574 if (text.styleChangeType() == ReconstructRenderTree && parent.change != Detach) 575 m_update->addText(text, parent.element); 576 577 text.clearNeedsStyleRecalc(); 887 578 it.traverseNextSkippingChildren(); 888 579 continue; … … 896 587 parent.elementNeedingStyleRecalcAffectsNextSiblingElementStyle = element.affectsNextSiblingElementStyle(); 897 588 898 Change change = NoChange; 899 900 bool shouldResolve = parent.change >= Inherit || element.needsStyleRecalc() || affectedByPreviousSibling; 589 bool shouldResolveForPseudoElement = shouldResolvePseudoElement(element.beforePseudoElement()) || shouldResolvePseudoElement(element.afterPseudoElement()); 590 591 ElementUpdate update; 592 update.style = element.renderStyle(); 593 594 bool shouldResolve = parent.change >= Inherit || element.needsStyleRecalc() || shouldResolveForPseudoElement || affectedByPreviousSibling; 901 595 if (shouldResolve) { 902 596 #if PLATFORM(IOS) … … 911 605 } 912 606 } 913 change = resolveElement(element); 607 update = resolveElement(element); 608 609 if (element.hasCustomStyleResolveCallbacks()) 610 element.didRecalcStyle(update.change); 611 612 if (affectedByPreviousSibling && update.change != Detach) 613 update.change = Force; 614 615 m_update->addElement(element, parent.element, update); 914 616 915 617 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 } 618 } 619 928 620 929 621 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 930 622 if (is<HTMLSlotElement>(element)) { 931 623 // 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); 624 // Duplicate the style from the parent context. 625 ElementUpdate slotUpdate; 626 slotUpdate.style = parent.style.ptr(); 627 slotUpdate.change = update.change; 628 if (!shouldResolve) 629 m_update->addElement(element, parent.element, update); 630 pushParent(element, slotUpdate); 935 631 it.traverseNext(); 936 632 continue; 937 633 } 938 634 #endif 939 auto* renderer = element.renderer(); 940 if (!renderer) { 635 if (!update.style) { 941 636 resetStyleForNonRenderedDescendants(element); 942 637 element.clearChildNeedsStyleRecalc(); 943 638 } 944 639 945 bool shouldIterateChildren = renderer && (element.childNeedsStyleRecalc() ||change != NoChange);640 bool shouldIterateChildren = update.style && (element.childNeedsStyleRecalc() || update.change != NoChange); 946 641 if (!shouldIterateChildren) { 947 642 it.traverseNextSkippingChildren(); … … 949 644 } 950 645 951 pushParent(element, renderer->style(), RenderTreePosition(*renderer), change);646 pushParent(element, update); 952 647 953 648 it.traverseNext(); … … 957 652 } 958 653 959 voidTreeResolver::resolve(Change change)654 std::unique_ptr<const Update> TreeResolver::resolve(Change change) 960 655 { 961 656 auto& renderView = *m_document.renderView(); … … 963 658 Element* documentElement = m_document.documentElement(); 964 659 if (!documentElement) 965 return ;660 return nullptr; 966 661 if (change != Force && !documentElement->childNeedsStyleRecalc() && !documentElement->needsStyleRecalc()) 967 return; 968 662 return nullptr; 663 664 m_update = std::make_unique<Update>(m_document); 969 665 m_scopeStack.append(adoptRef(*new Scope(m_document))); 666 m_parentStack.append(Parent(m_document, change)); 970 667 971 668 // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. … … 973 670 renderView.setUsesFirstLetterRules(renderView.usesFirstLetterRules() || scope().styleResolver.usesFirstLetterRules()); 974 671 975 m_parentStack.append(Parent(m_document, change));976 977 672 resolveComposedTree(); 978 673 … … 982 677 m_parentStack.clear(); 983 678 m_scopeStack.clear(); 984 } 985 986 void detachRenderTree(Element& element) 987 { 988 detachRenderTree(element, NormalDetach);679 680 if (m_update->roots().isEmpty()) 681 return nullptr; 682 683 return WTFMove(m_update); 989 684 } 990 685 -
trunk/Source/WebCore/style/StyleTreeResolver.h
r197764 r198828 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 { … … 55 58 TreeResolver(Document&); 56 59 57 voidresolve(Change);60 std::unique_ptr<const Update> resolve(Change); 58 61 59 62 private: … … 61 64 62 65 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 66 ElementUpdate resolveElement(Element&); 76 67 77 68 struct Scope : RefCounted<Scope> { … … 89 80 Element* element; 90 81 Ref<RenderStyle> style; 91 RenderTreePosition renderTreePosition;92 82 Change change; 93 83 bool didPushScope { false }; … … 95 85 96 86 Parent(Document&, Change); 97 Parent(Element&, RenderStyle&, RenderTreePosition, Change);87 Parent(Element&, ElementUpdate&); 98 88 }; 99 89 … … 105 95 void popScope(); 106 96 107 void pushParent(Element&, RenderStyle&, RenderTreePosition, Change);97 void pushParent(Element&, ElementUpdate&); 108 98 void popParent(); 109 99 void popParentsToDepth(unsigned depth); 110 100 111 101 Document& m_document; 102 RefPtr<RenderStyle> m_documentElementStyle; 103 112 104 Vector<Ref<Scope>, 4> m_scopeStack; 113 105 Vector<Parent, 32> m_parentStack; 106 107 std::unique_ptr<Update> m_update; 114 108 }; 115 109 116 void detachRenderTree(Element&); 110 enum DetachType { NormalDetach, ReattachDetach }; 111 void detachRenderTree(Element&, DetachType = NormalDetach); 117 112 void detachTextRenderer(Text&); 118 113 -
trunk/Source/WebCore/svg/SVGElement.h
r197764 r198828 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
r197194 r198828 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
r197563 r198828 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.