Changeset 194691 in webkit
- Timestamp:
- Jan 7, 2016 12:16:49 AM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 12 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r194586 r194691 2606 2606 style/StyleFontSizeFunctions.cpp 2607 2607 style/StyleResolveForDocument.cpp 2608 style/Style ResolveTree.cpp2608 style/StyleTreeResolver.cpp 2609 2609 2610 2610 svg/SVGAElement.cpp -
trunk/Source/WebCore/ChangeLog
r194690 r194691 1 2016-01-06 Antti Koivisto <antti@apple.com> 2 3 Factor free standing tree style resolve functions into a class 4 https://bugs.webkit.org/show_bug.cgi?id=152786 5 6 Reviewed by Simon Fraser. 7 8 Factor the free standing tree style resolve functions into a class that can keep state. 9 Style::TreeResolver instances resolve a single tree scope. It is instantiated for resolving 10 the document style and then recursively for each encountered shadow tree. 11 12 This will enable new features and optimizations later. 13 14 * dom/Document.cpp: 15 (WebCore::Document::recalcStyle): 16 17 Move the root style computation code back to Document. It fits better here and avoid some 18 awkwardness with style resolver construction order. 19 20 * style/StyleResolveTree.cpp: 21 (WebCore::Style::TreeResolver::TreeResolver): 22 23 TreeResolver knows the current tree context and the StyleResolver to use for it. 24 Switch the functions to use these instead of recomputing them repeatedly. 25 26 (WebCore::Style::shouldCreateRenderer): 27 (WebCore::Style::TreeResolver::styleForElement): 28 (WebCore::Style::moveToFlowThreadIfNeeded): 29 (WebCore::Style::TreeResolver::createRenderer): 30 (WebCore::Style::updateTextRendererAfterContentChange): 31 (WebCore::Style::TreeResolver::createRenderTreeForChildren): 32 (WebCore::Style::TreeResolver::createRenderTreeForShadowRoot): 33 (WebCore::Style::needsPseudoElement): 34 (WebCore::Style::TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement): 35 (WebCore::Style::TreeResolver::createRenderTreeForSlotAssignees): 36 (WebCore::Style::TreeResolver::createRenderTreeRecursively): 37 38 Rename to reduce the use of confusing "attach" terminology. 39 40 (WebCore::Style::pseudoStyleCacheIsInvalid): 41 (WebCore::Style::TreeResolver::resolveLocally): 42 (WebCore::Style::resolveTextNode): 43 (WebCore::Style::TreeResolver::resolveChildAtShadowBoundary): 44 (WebCore::Style::TreeResolver::resolveShadowTree): 45 (WebCore::Style::TreeResolver::resolveBeforeOrAfterPseudoElement): 46 (WebCore::Style::TreeResolver::resolveChildren): 47 (WebCore::Style::TreeResolver::resolveSlotAssignees): 48 (WebCore::Style::TreeResolver::resolveRecursively): 49 (WebCore::Style::TreeResolver::resolve): 50 (WebCore::Style::detachRenderTree): 51 (WebCore::Style::styleForElement): Deleted. 52 (WebCore::Style::createRendererIfNeeded): Deleted. 53 (WebCore::Style::attachChildren): Deleted. 54 (WebCore::Style::attachShadowRoot): Deleted. 55 (WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded): Deleted. 56 (WebCore::Style::attachSlotAssignees): Deleted. 57 (WebCore::Style::attachRenderTree): Deleted. 58 (WebCore::Style::resolveLocal): Deleted. 59 (WebCore::Style::resolveChildAtShadowBoundary): Deleted. 60 (WebCore::Style::resolveShadowTree): Deleted. 61 (WebCore::Style::updateBeforeOrAfterPseudoElement): Deleted. 62 (WebCore::Style::resolveChildren): Deleted. 63 (WebCore::Style::resolveSlotAssignees): Deleted. 64 (WebCore::Style::resolveTree): Deleted. 65 * style/StyleResolveTree.h: 66 1 67 2016-01-07 Doug Russell <d_russell@apple.com> 2 68 -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r194584 r194691 19203 19203 <ClCompile Include="..\style\StyleFontSizeFunctions.cpp" /> 19204 19204 <ClCompile Include="..\style\StyleResolveForDocument.cpp" /> 19205 <ClCompile Include="..\style\Style ResolveTree.cpp" />19205 <ClCompile Include="..\style\StyleTreeResolver.cpp" /> 19206 19206 <ClCompile Include="..\bridge\jsc\BridgeJSC.cpp" /> 19207 19207 <ClCompile Include="..\bridge\c\c_class.cpp" /> … … 22767 22767 <ClInclude Include="..\style\StyleFontSizeFunctions.h" /> 22768 22768 <ClInclude Include="..\style\StyleResolveForDocument.h" /> 22769 <ClInclude Include="..\style\Style ResolveTree.h" />22769 <ClInclude Include="..\style\StyleTreeResolver.h" /> 22770 22770 <ClInclude Include="..\bridge\Bridge.h" /> 22771 22771 <ClInclude Include="..\bridge\jsc\BridgeJSC.h" /> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r194684 r194691 6580 6580 E4D988B417BFD1F60084FB88 /* TextNodeTraversal.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D988B317BFD1F60084FB88 /* TextNodeTraversal.h */; }; 6581 6581 E4D988B617BFEB210084FB88 /* TextNodeTraversal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4D988B517BFEB210084FB88 /* TextNodeTraversal.cpp */; }; 6582 E4DEAA1717A93DC3000E0430 /* Style ResolveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DEAA1517A93DC3000E0430 /* StyleResolveTree.cpp */; };6583 E4DEAA1817A93DC3000E0430 /* Style ResolveTree.h in Headers */ = {isa = PBXBuildFile; fileRef = E4DEAA1617A93DC3000E0430 /* StyleResolveTree.h */; settings = {ATTRIBUTES = (Private, ); }; };6582 E4DEAA1717A93DC3000E0430 /* StyleTreeResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */; }; 6583 E4DEAA1817A93DC3000E0430 /* StyleTreeResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6584 6584 E4E39AFB1330EFA8003AB274 /* LegacyTileLayerPool.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E39AFA1330EFA8003AB274 /* LegacyTileLayerPool.h */; }; 6585 6585 E4E39AFD1330EFC6003AB274 /* LegacyTileLayerPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4E39AFC1330EFC5003AB274 /* LegacyTileLayerPool.mm */; }; … … 14497 14497 E4D988B317BFD1F60084FB88 /* TextNodeTraversal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextNodeTraversal.h; sourceTree = "<group>"; }; 14498 14498 E4D988B517BFEB210084FB88 /* TextNodeTraversal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextNodeTraversal.cpp; sourceTree = "<group>"; }; 14499 E4DEAA1517A93DC3000E0430 /* Style ResolveTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleResolveTree.cpp; sourceTree = "<group>"; };14500 E4DEAA1617A93DC3000E0430 /* Style ResolveTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleResolveTree.h; sourceTree = "<group>"; };14499 E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleTreeResolver.cpp; sourceTree = "<group>"; }; 14500 E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleTreeResolver.h; sourceTree = "<group>"; }; 14501 14501 E4E39AFA1330EFA8003AB274 /* LegacyTileLayerPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTileLayerPool.h; sourceTree = "<group>"; }; 14502 14502 E4E39AFC1330EFC5003AB274 /* LegacyTileLayerPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LegacyTileLayerPool.mm; sourceTree = "<group>"; }; … … 23121 23121 E4D58EB217B4DBDC00CBDCA8 /* StyleResolveForDocument.cpp */, 23122 23122 E4D58EB317B4DBDC00CBDCA8 /* StyleResolveForDocument.h */, 23123 E4DEAA1517A93DC3000E0430 /* Style ResolveTree.cpp */,23124 E4DEAA1617A93DC3000E0430 /* Style ResolveTree.h */,23123 E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */, 23124 E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */, 23125 23125 ); 23126 23126 path = style; … … 27509 27509 E4D58EB517B4DBDC00CBDCA8 /* StyleResolveForDocument.h in Headers */, 27510 27510 E139866415478474001E3F65 /* StyleResolver.h in Headers */, 27511 E4DEAA1817A93DC3000E0430 /* Style ResolveTree.h in Headers */,27511 E4DEAA1817A93DC3000E0430 /* StyleTreeResolver.h in Headers */, 27512 27512 E4BBED4D14FCDBA1003F0B98 /* StyleRule.h in Headers */, 27513 27513 E4946EAF156E64DD00D3297F /* StyleRuleImport.h in Headers */, … … 31040 31040 E4D58EB417B4DBDC00CBDCA8 /* StyleResolveForDocument.cpp in Sources */, 31041 31041 E139866315478474001E3F65 /* StyleResolver.cpp in Sources */, 31042 E4DEAA1717A93DC3000E0430 /* Style ResolveTree.cpp in Sources */,31042 E4DEAA1717A93DC3000E0430 /* StyleTreeResolver.cpp in Sources */, 31043 31043 E4BBED4C14FCDBA1003F0B98 /* StyleRule.cpp in Sources */, 31044 31044 E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */, -
trunk/Source/WebCore/dom/CharacterData.cpp
r194584 r194691 33 33 #include "RenderText.h" 34 34 #include "StyleInheritedData.h" 35 #include "Style ResolveTree.h"35 #include "StyleTreeResolver.h" 36 36 #include "TextBreakIterator.h" 37 37 #include <wtf/Ref.h> -
trunk/Source/WebCore/dom/ContainerNode.cpp
r194584 r194691 55 55 #include "SVGNames.h" 56 56 #include "SelectorQuery.h" 57 #include "Style ResolveTree.h"57 #include "StyleTreeResolver.h" 58 58 #include "TemplateContentDocumentFragment.h" 59 59 #include <algorithm> -
trunk/Source/WebCore/dom/Document.cpp
r194584 r194691 155 155 #include "StorageEvent.h" 156 156 #include "StyleProperties.h" 157 #include "StyleResolve Tree.h"157 #include "StyleResolveForDocument.h" 158 158 #include "StyleResolver.h" 159 159 #include "StyleSheetContents.h" 160 160 #include "StyleSheetList.h" 161 #include "StyleTreeResolver.h" 161 162 #include "SubresourceLoader.h" 162 163 #include "TextEvent.h" … … 1852 1853 // This may get set again during style resolve. 1853 1854 m_hasNodesWithPlaceholderStyle = false; 1855 1856 auto documentStyle = Style::resolveForDocument(*this); 1857 1858 // Inserting the pictograph font at the end of the font fallback list is done by the 1859 // font selector, so set a font selector if needed. 1860 if (Settings* settings = this->settings()) { 1861 if (settings->fontFallbackPrefersPictographs()) 1862 documentStyle.get().fontCascade().update(&fontSelector()); 1863 } 1864 1865 auto documentChange = Style::determineChange(documentStyle.get(), m_renderView->style()); 1866 if (documentChange != Style::NoChange) 1867 renderView()->setStyle(WTFMove(documentStyle)); 1854 1868 } 1855 1869 1856 Style::resolveTree(*this, change); 1870 Style::TreeResolver resolver(*this); 1871 resolver.resolve(change); 1857 1872 1858 1873 updatedCompositingLayers = frameView.updateCompositingLayersAfterStyleChange(); -
trunk/Source/WebCore/dom/Element.cpp
r194596 r194691 78 78 #include "Settings.h" 79 79 #include "StyleProperties.h" 80 #include "StyleResolveTree.h"81 80 #include "StyleResolver.h" 81 #include "StyleTreeResolver.h" 82 82 #include "TextIterator.h" 83 83 #include "VoidCallback.h" -
trunk/Source/WebCore/html/HTMLFormControlElement.cpp
r194584 r194691 39 39 #include "RenderBox.h" 40 40 #include "RenderTheme.h" 41 #include "Style ResolveTree.h"41 #include "StyleTreeResolver.h" 42 42 #include "ValidationMessage.h" 43 43 #include <wtf/NeverDestroyed.h> -
trunk/Source/WebCore/html/HTMLFrameOwnerElement.cpp
r194584 r194691 29 29 #include "ShadowRoot.h" 30 30 #include "SVGDocument.h" 31 #include "Style ResolveTree.h"31 #include "StyleTreeResolver.h" 32 32 #include <wtf/Ref.h> 33 33 -
trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp
r194584 r194691 49 49 #include "Settings.h" 50 50 #include "ShadowRoot.h" 51 #include "StyleResolveTree.h"52 51 #include "StyleResolver.h" 52 #include "StyleTreeResolver.h" 53 53 #include "SubframeLoader.h" 54 54 #include "TypedElementDescendantIterator.h" -
trunk/Source/WebCore/mathml/MathMLSelectElement.cpp
r194584 r194691 36 36 #include "SVGElement.h" 37 37 #include "SVGNames.h" 38 #include "Style ResolveTree.h"38 #include "StyleTreeResolver.h" 39 39 40 40 namespace WebCore { -
trunk/Source/WebCore/style/StyleTreeResolver.cpp
r194584 r194691 25 25 26 26 #include "config.h" 27 #include "Style ResolveTree.h"27 #include "StyleTreeResolver.h" 28 28 29 29 #include "AXObjectCache.h" … … 50 50 #include "Settings.h" 51 51 #include "ShadowRoot.h" 52 #include "StyleResolveForDocument.h"53 52 #include "StyleResolver.h" 54 53 #include "Text.h" 55 54 56 55 #if PLATFORM(IOS) 57 #include "CSSFontSelector.h"58 56 #include "WKContentObservation.h" 59 57 #endif … … 65 63 enum DetachType { NormalDetach, ReattachDetach }; 66 64 67 static void attachRenderTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>);68 65 static void attachTextRenderer(Text&, RenderTreePosition&); 69 66 static void detachRenderTree(Element&, DetachType); 70 67 static void resolveTextNode(Text&, RenderTreePosition&); 71 static void resolveTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change); 68 69 TreeResolver::TreeResolver(Document& document) 70 : m_document(document) 71 , m_styleResolver(document.ensureStyleResolver()) 72 { 73 } 74 75 TreeResolver::TreeResolver(ShadowRoot& shadowRoot, TreeResolver& shadowHostTreeResolver) 76 : m_document(shadowRoot.document()) 77 , m_styleResolver(shadowRoot.styleResolver()) 78 , m_shadowRoot(&shadowRoot) 79 , m_shadowHostTreeResolver(&shadowHostTreeResolver) 80 { 81 } 72 82 73 83 static bool shouldCreateRenderer(const Element& element, const RenderElement& parentRenderer) … … 82 92 } 83 93 84 static Ref<RenderStyle>styleForElement(Element& element, RenderStyle& inheritedStyle)94 Ref<RenderStyle> TreeResolver::styleForElement(Element& element, RenderStyle& inheritedStyle) 85 95 { 86 96 if (element.hasCustomStyleResolveCallbacks()) { … … 88 98 return style.releaseNonNull(); 89 99 } 90 return element.resolveStyle(&inheritedStyle);100 return m_styleResolver.styleForElement(&element, &inheritedStyle); 91 101 } 92 102 … … 104 114 #endif 105 115 106 static void createRendererIfNeeded(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle>resolvedStyle)116 void TreeResolver::createRenderer(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle) 107 117 { 108 118 ASSERT(!element.renderer()); … … 154 164 155 165 #if ENABLE(FULLSCREEN_API) 156 Document& document = element.document(); 157 if (document.webkitIsFullScreen() && document.webkitCurrentFullScreenElement() == &element) { 158 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), document); 166 if (m_document.webkitIsFullScreen() && m_document.webkitCurrentFullScreenElement() == &element) { 167 newRenderer = RenderFullScreen::wrapRenderer(newRenderer, &insertionPosition.parent(), m_document); 159 168 if (!newRenderer) 160 169 return; … … 211 220 if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span> 212 221 return false; 213 222 214 223 if (parentRenderer.isRenderInline()) { 215 224 // <span><div/> <div/></span> … … 285 294 } 286 295 287 static void attachChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)296 void TreeResolver::createRenderTreeForChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition) 288 297 { 289 298 for (Node* child = current.firstChild(); child; child = child->nextSibling()) { … … 298 307 } 299 308 if (is<Element>(*child)) 300 attachRenderTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);301 } 302 } 303 304 static void attachShadowRoot(ShadowRoot& shadowRoot)309 createRenderTreeRecursively(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr); 310 } 311 } 312 313 void TreeResolver::createRenderTreeForShadowRoot(ShadowRoot& shadowRoot) 305 314 { 306 315 ASSERT(shadowRoot.host()); 307 316 ASSERT(shadowRoot.host()->renderer()); 308 317 318 TreeResolver shadowTreeResolver(shadowRoot, *this); 319 309 320 auto& renderer = *shadowRoot.host()->renderer(); 310 321 RenderTreePosition renderTreePosition(renderer); 311 attachChildren(shadowRoot, renderer.style(), renderTreePosition);322 shadowTreeResolver.createRenderTreeForChildren(shadowRoot, renderer.style(), renderTreePosition); 312 323 313 324 shadowRoot.clearNeedsStyleRecalc(); … … 379 390 } 380 391 381 static void attachBeforeOrAfterPseudoElementIfNeeded(Element& current, PseudoId pseudoId, RenderTreePosition& renderTreePosition)392 void TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId, RenderTreePosition& renderTreePosition) 382 393 { 383 394 if (!needsPseudoElement(current, pseudoId)) 384 395 return; 385 396 Ref<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId); 386 InspectorInstrumentation::pseudoElementCreated( pseudoElement->document().page(), pseudoElement.get());397 InspectorInstrumentation::pseudoElementCreated(m_document.page(), pseudoElement.get()); 387 398 setBeforeOrAfterPseudoElement(current, pseudoElement.copyRef(), pseudoId); 388 attachRenderTree(pseudoElement.get(), *current.renderStyle(), renderTreePosition, nullptr);399 createRenderTreeRecursively(pseudoElement.get(), *current.renderStyle(), renderTreePosition, nullptr); 389 400 } 390 401 391 402 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 392 static void attachSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)403 void TreeResolver::createRenderTreeForSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition) 393 404 { 394 405 if (auto* assignedNodes = slot.assignedNodes()) { 406 ASSERT(m_shadowHostTreeResolver); 395 407 for (auto* child : *assignedNodes) { 396 408 if (is<Text>(*child)) 397 409 attachTextRenderer(downcast<Text>(*child), renderTreePosition); 398 410 else if (is<Element>(*child)) 399 attachRenderTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);411 m_shadowHostTreeResolver->createRenderTreeRecursively(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr); 400 412 } 401 413 } else 402 attachChildren(slot, inheritedStyle, renderTreePosition);414 createRenderTreeForChildren(slot, inheritedStyle, renderTreePosition); 403 415 404 416 slot.clearNeedsStyleRecalc(); … … 407 419 #endif 408 420 409 static void attachRenderTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle>resolvedStyle)410 { 411 PostResolutionCallbackDisabler callbackDisabler( current.document());421 void TreeResolver::createRenderTreeRecursively(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle) 422 { 423 PostResolutionCallbackDisabler callbackDisabler(m_document); 412 424 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; 413 425 414 426 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 415 427 if (is<HTMLSlotElement>(current)) { 416 attachSlotAssignees(downcast<HTMLSlotElement>(current), inheritedStyle, renderTreePosition);428 createRenderTreeForSlotAssignees(downcast<HTMLSlotElement>(current), inheritedStyle, renderTreePosition); 417 429 return; 418 430 } … … 422 434 current.willAttachRenderers(); 423 435 424 createRenderer IfNeeded(current, inheritedStyle, renderTreePosition, resolvedStyle);436 createRenderer(current, inheritedStyle, renderTreePosition, WTFMove(resolvedStyle)); 425 437 426 438 if (auto* renderer = current.renderer()) { … … 428 440 429 441 RenderTreePosition childRenderTreePosition(*renderer); 430 attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);442 createRenderTreeForBeforeOrAfterPseudoElement(current, BEFORE, childRenderTreePosition); 431 443 432 444 auto* shadowRoot = current.shadowRoot(); 433 if (shadowRoot) { 434 parentPusher.push(); 435 attachShadowRoot(*shadowRoot); 436 } else if (current.firstChild()) 445 if (shadowRoot) 446 createRenderTreeForShadowRoot(*shadowRoot); 447 else if (current.firstChild()) 437 448 parentPusher.push(); 438 449 439 450 bool skipChildren = shadowRoot; 440 451 if (!skipChildren) 441 attachChildren(current, renderer->style(), childRenderTreePosition);442 443 if (AXObjectCache* cache = current.document().axObjectCache())452 createRenderTreeForChildren(current, renderer->style(), childRenderTreePosition); 453 454 if (AXObjectCache* cache = m_document.axObjectCache()) 444 455 cache->updateCacheAfterNodeIsAttached(¤t); 445 456 446 attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER, childRenderTreePosition);457 createRenderTreeForBeforeOrAfterPseudoElement(current, AFTER, childRenderTreePosition); 447 458 448 459 current.updateFocusAppearanceAfterAttachIfNeeded(); … … 556 567 } 557 568 558 static Change resolveLocal(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)569 Change TreeResolver::resolveLocally(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange) 559 570 { 560 571 Change localChange = Detach; … … 562 573 RefPtr<RenderStyle> currentStyle = current.renderStyle(); 563 574 564 Document& document = current.document();565 575 if (currentStyle && current.styleChangeType() != ReconstructRenderTree) { 566 576 Ref<RenderStyle> style(styleForElement(current, inheritedStyle)); … … 571 581 if (current.renderer() || current.isNamedFlowContentNode()) 572 582 detachRenderTree(current, ReattachDetach); 573 attachRenderTree(current, inheritedStyle, renderTreePosition, newStyle.release());583 createRenderTreeRecursively(current, inheritedStyle, renderTreePosition, newStyle.release()); 574 584 invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(current); 575 585 … … 589 599 // If "rem" units are used anywhere in the document, and if the document element's font size changes, then force font updating 590 600 // 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). 591 if ( document.authorStyleSheets().usesRemUnits() &&document.documentElement() == ¤t && localChange != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize()) {601 if (m_document.authorStyleSheets().usesRemUnits() && m_document.documentElement() == ¤t && localChange != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize()) { 592 602 // Cached RenderStyles may depend on the re units. 593 if (StyleResolver* styleResolver = document.styleResolverIfExists()) 594 styleResolver->invalidateMatchedPropertiesCache(); 603 m_styleResolver.invalidateMatchedPropertiesCache(); 595 604 return Force; 596 605 } … … 622 631 } 623 632 624 static voidresolveChildAtShadowBoundary(Node& child, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Style::Change change)633 void TreeResolver::resolveChildAtShadowBoundary(Node& child, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Style::Change change) 625 634 { 626 635 if (auto* renderer = child.renderer()) … … 632 641 } 633 642 if (is<Element>(child)) 634 resolveTree(downcast<Element>(child), inheritedStyle, renderTreePosition, change); 635 } 636 637 static void resolveShadowTree(ShadowRoot& shadowRoot, Element& host, Style::Change change) 638 { 639 ASSERT(shadowRoot.host() == &host); 643 resolveRecursively(downcast<Element>(child), inheritedStyle, renderTreePosition, change); 644 } 645 646 void TreeResolver::resolveShadowTree(Style::Change change, RenderStyle& inheritedStyle) 647 { 648 ASSERT(m_shadowRoot); 649 auto& host = *m_shadowRoot->host(); 640 650 ASSERT(host.renderer()); 641 auto& inheritedStyle = host.renderer()->style(); 642 if (shadowRoot.styleChangeType() >= FullStyleChange) 651 if (m_shadowRoot->styleChangeType() >= FullStyleChange) 643 652 change = Force; 644 653 RenderTreePosition renderTreePosition(*host.renderer()); 645 for (auto* child = shadowRoot.firstChild(); child; child = child->nextSibling())654 for (auto* child = m_shadowRoot->firstChild(); child; child = child->nextSibling()) 646 655 resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change); 647 656 648 shadowRoot.clearNeedsStyleRecalc();649 shadowRoot.clearChildNeedsStyleRecalc();650 } 651 652 static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition)657 m_shadowRoot->clearNeedsStyleRecalc(); 658 m_shadowRoot->clearChildNeedsStyleRecalc(); 659 } 660 661 void TreeResolver::resolveBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition) 653 662 { 654 663 ASSERT(current.renderer()); … … 658 667 659 668 if (needsPseudoElement(current, pseudoId)) 660 resolve Tree(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change);669 resolveRecursively(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change); 661 670 else 662 671 clearBeforeOrAfterPseudoElement(current, pseudoId); 663 672 return; 664 673 } 665 attachBeforeOrAfterPseudoElementIfNeeded(current, pseudoId, renderTreePosition);674 createRenderTreeForBeforeOrAfterPseudoElement(current, pseudoId, renderTreePosition); 666 675 } 667 676 … … 720 729 #endif // PLATFORM(IOS) 721 730 722 static voidresolveChildren(Element& current, RenderStyle& inheritedStyle, Change change, RenderTreePosition& childRenderTreePosition)731 void TreeResolver::resolveChildren(Element& current, RenderStyle& inheritedStyle, Change change, RenderTreePosition& childRenderTreePosition) 723 732 { 724 733 StyleResolverParentPusher parentPusher(¤t); … … 744 753 if (change >= Inherit || childElement.childNeedsStyleRecalc() || childElement.needsStyleRecalc()) { 745 754 parentPusher.push(); 746 resolve Tree(childElement, inheritedStyle, childRenderTreePosition, change);755 resolveRecursively(childElement, inheritedStyle, childRenderTreePosition, change); 747 756 } 748 757 } … … 750 759 751 760 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 752 static voidresolveSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)761 void TreeResolver::resolveSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change) 753 762 { 754 763 if (auto* assignedNodes = slot.assignedNodes()) { 764 ASSERT(m_shadowHostTreeResolver); 755 765 for (auto* child : *assignedNodes) 756 resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change);766 m_shadowHostTreeResolver->resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change); 757 767 } else 758 768 resolveChildren(slot, inheritedStyle, change, renderTreePosition); … … 763 773 #endif 764 774 765 void resolveTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)775 void TreeResolver::resolveRecursively(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change) 766 776 { 767 777 ASSERT(change != Detach); … … 787 797 788 798 if (change >= Inherit || current.needsStyleRecalc()) 789 change = resolveLocal (current, inheritedStyle, renderTreePosition, change);799 change = resolveLocally(current, inheritedStyle, renderTreePosition, change); 790 800 791 801 auto* renderer = current.renderer(); … … 793 803 if (change != Detach && renderer) { 794 804 auto* shadowRoot = current.shadowRoot(); 795 if (shadowRoot && (change >= Inherit || shadowRoot->childNeedsStyleRecalc() || shadowRoot->needsStyleRecalc())) 796 resolveShadowTree(*shadowRoot, current, change); 805 if (shadowRoot && (change >= Inherit || shadowRoot->childNeedsStyleRecalc() || shadowRoot->needsStyleRecalc())) { 806 TreeResolver shadowTreeResolver(*shadowRoot, *this); 807 shadowTreeResolver.resolveShadowTree(change, renderer->style()); 808 } 797 809 798 810 RenderTreePosition childRenderTreePosition(*renderer); 799 updateBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition);811 resolveBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition); 800 812 801 813 bool skipChildren = shadowRoot; … … 803 815 resolveChildren(current, renderer->style(), change, childRenderTreePosition); 804 816 805 updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);817 resolveBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition); 806 818 } 807 819 if (change != Detach && !renderer) … … 815 827 } 816 828 817 void resolveTree(Document& document, Change change) 818 { 819 auto& renderView = *document.renderView(); 820 821 if (change == Force) { 822 auto documentStyle = resolveForDocument(document); 823 824 // Inserting the pictograph font at the end of the font fallback list is done by the 825 // font selector, so set a font selector if needed. 826 if (Settings* settings = document.settings()) { 827 if (settings->fontFallbackPrefersPictographs()) 828 documentStyle.get().fontCascade().update(&document.fontSelector()); 829 } 830 831 Style::Change documentChange = determineChange(documentStyle.get(), renderView.style()); 832 if (documentChange != NoChange) 833 renderView.setStyle(WTFMove(documentStyle)); 834 } 835 836 Element* documentElement = document.documentElement(); 829 void TreeResolver::resolve(Change change) 830 { 831 ASSERT(!m_shadowRoot); 832 833 auto& renderView = *m_document.renderView(); 834 835 Element* documentElement = m_document.documentElement(); 837 836 if (!documentElement) 838 837 return; 839 if (change < Inherit && !documentElement->childNeedsStyleRecalc() && !documentElement->needsStyleRecalc()) 840 return; 841 842 auto& styleResolved = document.ensureStyleResolver(); 838 if (change != Force && !documentElement->childNeedsStyleRecalc() && !documentElement->needsStyleRecalc()) 839 return; 843 840 844 841 // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. 845 renderView.setUsesFirstLineRules(renderView.usesFirstLineRules() || styleResolved.usesFirstLineRules());846 renderView.setUsesFirstLetterRules(renderView.usesFirstLetterRules() || styleResolved.usesFirstLetterRules());842 renderView.setUsesFirstLineRules(renderView.usesFirstLineRules() || m_styleResolver.usesFirstLineRules()); 843 renderView.setUsesFirstLetterRules(renderView.usesFirstLetterRules() || m_styleResolver.usesFirstLetterRules()); 847 844 848 845 RenderTreePosition renderTreePosition(renderView); 849 resolve Tree(*documentElement, *document.renderStyle(), renderTreePosition, change);850 851 renderView.setUsesFirstLineRules( styleResolved.usesFirstLineRules());852 renderView.setUsesFirstLetterRules( styleResolved.usesFirstLetterRules());846 resolveRecursively(*documentElement, *m_document.renderStyle(), renderTreePosition, change); 847 848 renderView.setUsesFirstLineRules(m_styleResolver.usesFirstLineRules()); 849 renderView.setUsesFirstLetterRules(m_styleResolver.usesFirstLetterRules()); 853 850 } 854 851 -
trunk/Source/WebCore/style/StyleTreeResolver.h
r194584 r194691 24 24 */ 25 25 26 #ifndef Style ResolveTree_h27 #define Style ResolveTree_h26 #ifndef StyleTreeResolver_h 27 #define StyleTreeResolver_h 28 28 29 #include "RenderStyleConstants.h" 29 30 #include "StyleChange.h" 30 31 #include <functional> 32 #include <wtf/RefPtr.h> 31 33 32 34 namespace WebCore { 33 35 36 class ContainerNode; 34 37 class Document; 35 38 class Element; 39 class HTMLSlotElement; 40 class Node; 36 41 class RenderStyle; 42 class RenderTreePosition; 37 43 class Settings; 44 class ShadowRoot; 45 class StyleResolver; 38 46 class Text; 39 47 40 48 namespace Style { 41 49 42 void resolveTree(Document&, Change); 50 class TreeResolver { 51 public: 52 TreeResolver(Document&); 53 54 void resolve(Change); 55 56 private: 57 TreeResolver(ShadowRoot&, TreeResolver& shadowHostTreeResolver); 58 59 void resolveShadowTree(Change, RenderStyle& inheritedStyle); 60 61 Ref<RenderStyle> styleForElement(Element&, RenderStyle& inheritedStyle); 62 63 void resolveRecursively(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change); 64 Change resolveLocally(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change inheritedChange); 65 void resolveChildren(Element&, RenderStyle&, Change, RenderTreePosition&); 66 void resolveChildAtShadowBoundary(Node&, RenderStyle& inheritedStyle, RenderTreePosition&, Change); 67 void resolveBeforeOrAfterPseudoElement(Element&, Change, PseudoId, RenderTreePosition&); 68 69 void createRenderTreeRecursively(Element&, RenderStyle&, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle); 70 void createRenderer(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, RefPtr<RenderStyle>&& resolvedStyle); 71 void createRenderTreeForBeforeOrAfterPseudoElement(Element&, PseudoId, RenderTreePosition&); 72 void createRenderTreeForChildren(ContainerNode&, RenderStyle&, RenderTreePosition&); 73 void createRenderTreeForShadowRoot(ShadowRoot&); 74 75 #if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT) 76 void resolveSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&, Change); 77 void createRenderTreeForSlotAssignees(HTMLSlotElement&, RenderStyle& inheritedStyle, RenderTreePosition&); 78 #endif 79 80 Document& m_document; 81 StyleResolver& m_styleResolver; 82 83 ShadowRoot* m_shadowRoot { nullptr }; 84 TreeResolver* m_shadowHostTreeResolver { nullptr }; 85 }; 43 86 44 87 void detachRenderTree(Element&);
Note: See TracChangeset
for help on using the changeset viewer.