Changeset 194691 in webkit


Ignore:
Timestamp:
Jan 7, 2016 12:16:49 AM (8 years ago)
Author:
Antti Koivisto
Message:

Factor free standing tree style resolve functions into a class
https://bugs.webkit.org/show_bug.cgi?id=152786

Reviewed by Simon Fraser.

Factor the free standing tree style resolve functions into a class that can keep state.
Style::TreeResolver instances resolve a single tree scope. It is instantiated for resolving
the document style and then recursively for each encountered shadow tree.

This will enable new features and optimizations later.

  • dom/Document.cpp:

(WebCore::Document::recalcStyle):

Move the root style computation code back to Document. It fits better here and avoid some
awkwardness with style resolver construction order.

  • style/StyleResolveTree.cpp:

(WebCore::Style::TreeResolver::TreeResolver):

TreeResolver knows the current tree context and the StyleResolver to use for it.
Switch the functions to use these instead of recomputing them repeatedly.

(WebCore::Style::shouldCreateRenderer):
(WebCore::Style::TreeResolver::styleForElement):
(WebCore::Style::moveToFlowThreadIfNeeded):
(WebCore::Style::TreeResolver::createRenderer):
(WebCore::Style::updateTextRendererAfterContentChange):
(WebCore::Style::TreeResolver::createRenderTreeForChildren):
(WebCore::Style::TreeResolver::createRenderTreeForShadowRoot):
(WebCore::Style::needsPseudoElement):
(WebCore::Style::TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement):
(WebCore::Style::TreeResolver::createRenderTreeForSlotAssignees):
(WebCore::Style::TreeResolver::createRenderTreeRecursively):

Rename to reduce the use of confusing "attach" terminology.

(WebCore::Style::pseudoStyleCacheIsInvalid):
(WebCore::Style::TreeResolver::resolveLocally):
(WebCore::Style::resolveTextNode):
(WebCore::Style::TreeResolver::resolveChildAtShadowBoundary):
(WebCore::Style::TreeResolver::resolveShadowTree):
(WebCore::Style::TreeResolver::resolveBeforeOrAfterPseudoElement):
(WebCore::Style::TreeResolver::resolveChildren):
(WebCore::Style::TreeResolver::resolveSlotAssignees):
(WebCore::Style::TreeResolver::resolveRecursively):
(WebCore::Style::TreeResolver::resolve):
(WebCore::Style::detachRenderTree):
(WebCore::Style::styleForElement): Deleted.
(WebCore::Style::createRendererIfNeeded): Deleted.
(WebCore::Style::attachChildren): Deleted.
(WebCore::Style::attachShadowRoot): Deleted.
(WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded): Deleted.
(WebCore::Style::attachSlotAssignees): Deleted.
(WebCore::Style::attachRenderTree): Deleted.
(WebCore::Style::resolveLocal): Deleted.
(WebCore::Style::resolveChildAtShadowBoundary): Deleted.
(WebCore::Style::resolveShadowTree): Deleted.
(WebCore::Style::updateBeforeOrAfterPseudoElement): Deleted.
(WebCore::Style::resolveChildren): Deleted.
(WebCore::Style::resolveSlotAssignees): Deleted.
(WebCore::Style::resolveTree): Deleted.

  • style/StyleResolveTree.h:
Location:
trunk/Source/WebCore
Files:
12 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r194586 r194691  
    26062606    style/StyleFontSizeFunctions.cpp
    26072607    style/StyleResolveForDocument.cpp
    2608     style/StyleResolveTree.cpp
     2608    style/StyleTreeResolver.cpp
    26092609
    26102610    svg/SVGAElement.cpp
  • trunk/Source/WebCore/ChangeLog

    r194690 r194691  
     12016-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
    1672016-01-07  Doug Russell  <d_russell@apple.com>
    268
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r194584 r194691  
    1920319203    <ClCompile Include="..\style\StyleFontSizeFunctions.cpp" />
    1920419204    <ClCompile Include="..\style\StyleResolveForDocument.cpp" />
    19205     <ClCompile Include="..\style\StyleResolveTree.cpp" />
     19205    <ClCompile Include="..\style\StyleTreeResolver.cpp" />
    1920619206    <ClCompile Include="..\bridge\jsc\BridgeJSC.cpp" />
    1920719207    <ClCompile Include="..\bridge\c\c_class.cpp" />
     
    2276722767    <ClInclude Include="..\style\StyleFontSizeFunctions.h" />
    2276822768    <ClInclude Include="..\style\StyleResolveForDocument.h" />
    22769     <ClInclude Include="..\style\StyleResolveTree.h" />
     22769    <ClInclude Include="..\style\StyleTreeResolver.h" />
    2277022770    <ClInclude Include="..\bridge\Bridge.h" />
    2277122771    <ClInclude Include="..\bridge\jsc\BridgeJSC.h" />
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r194684 r194691  
    65806580                E4D988B417BFD1F60084FB88 /* TextNodeTraversal.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D988B317BFD1F60084FB88 /* TextNodeTraversal.h */; };
    65816581                E4D988B617BFEB210084FB88 /* TextNodeTraversal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4D988B517BFEB210084FB88 /* TextNodeTraversal.cpp */; };
    6582                 E4DEAA1717A93DC3000E0430 /* StyleResolveTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4DEAA1517A93DC3000E0430 /* StyleResolveTree.cpp */; };
    6583                 E4DEAA1817A93DC3000E0430 /* StyleResolveTree.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, ); }; };
    65846584                E4E39AFB1330EFA8003AB274 /* LegacyTileLayerPool.h in Headers */ = {isa = PBXBuildFile; fileRef = E4E39AFA1330EFA8003AB274 /* LegacyTileLayerPool.h */; };
    65856585                E4E39AFD1330EFC6003AB274 /* LegacyTileLayerPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = E4E39AFC1330EFC5003AB274 /* LegacyTileLayerPool.mm */; };
     
    1449714497                E4D988B317BFD1F60084FB88 /* TextNodeTraversal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextNodeTraversal.h; sourceTree = "<group>"; };
    1449814498                E4D988B517BFEB210084FB88 /* TextNodeTraversal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextNodeTraversal.cpp; sourceTree = "<group>"; };
    14499                 E4DEAA1517A93DC3000E0430 /* StyleResolveTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleResolveTree.cpp; sourceTree = "<group>"; };
    14500                 E4DEAA1617A93DC3000E0430 /* StyleResolveTree.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>"; };
    1450114501                E4E39AFA1330EFA8003AB274 /* LegacyTileLayerPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTileLayerPool.h; sourceTree = "<group>"; };
    1450214502                E4E39AFC1330EFC5003AB274 /* LegacyTileLayerPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LegacyTileLayerPool.mm; sourceTree = "<group>"; };
     
    2312123121                                E4D58EB217B4DBDC00CBDCA8 /* StyleResolveForDocument.cpp */,
    2312223122                                E4D58EB317B4DBDC00CBDCA8 /* StyleResolveForDocument.h */,
    23123                                 E4DEAA1517A93DC3000E0430 /* StyleResolveTree.cpp */,
    23124                                 E4DEAA1617A93DC3000E0430 /* StyleResolveTree.h */,
     23123                                E4DEAA1517A93DC3000E0430 /* StyleTreeResolver.cpp */,
     23124                                E4DEAA1617A93DC3000E0430 /* StyleTreeResolver.h */,
    2312523125                        );
    2312623126                        path = style;
     
    2750927509                                E4D58EB517B4DBDC00CBDCA8 /* StyleResolveForDocument.h in Headers */,
    2751027510                                E139866415478474001E3F65 /* StyleResolver.h in Headers */,
    27511                                 E4DEAA1817A93DC3000E0430 /* StyleResolveTree.h in Headers */,
     27511                                E4DEAA1817A93DC3000E0430 /* StyleTreeResolver.h in Headers */,
    2751227512                                E4BBED4D14FCDBA1003F0B98 /* StyleRule.h in Headers */,
    2751327513                                E4946EAF156E64DD00D3297F /* StyleRuleImport.h in Headers */,
     
    3104031040                                E4D58EB417B4DBDC00CBDCA8 /* StyleResolveForDocument.cpp in Sources */,
    3104131041                                E139866315478474001E3F65 /* StyleResolver.cpp in Sources */,
    31042                                 E4DEAA1717A93DC3000E0430 /* StyleResolveTree.cpp in Sources */,
     31042                                E4DEAA1717A93DC3000E0430 /* StyleTreeResolver.cpp in Sources */,
    3104331043                                E4BBED4C14FCDBA1003F0B98 /* StyleRule.cpp in Sources */,
    3104431044                                E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */,
  • trunk/Source/WebCore/dom/CharacterData.cpp

    r194584 r194691  
    3333#include "RenderText.h"
    3434#include "StyleInheritedData.h"
    35 #include "StyleResolveTree.h"
     35#include "StyleTreeResolver.h"
    3636#include "TextBreakIterator.h"
    3737#include <wtf/Ref.h>
  • trunk/Source/WebCore/dom/ContainerNode.cpp

    r194584 r194691  
    5555#include "SVGNames.h"
    5656#include "SelectorQuery.h"
    57 #include "StyleResolveTree.h"
     57#include "StyleTreeResolver.h"
    5858#include "TemplateContentDocumentFragment.h"
    5959#include <algorithm>
  • trunk/Source/WebCore/dom/Document.cpp

    r194584 r194691  
    155155#include "StorageEvent.h"
    156156#include "StyleProperties.h"
    157 #include "StyleResolveTree.h"
     157#include "StyleResolveForDocument.h"
    158158#include "StyleResolver.h"
    159159#include "StyleSheetContents.h"
    160160#include "StyleSheetList.h"
     161#include "StyleTreeResolver.h"
    161162#include "SubresourceLoader.h"
    162163#include "TextEvent.h"
     
    18521853            // This may get set again during style resolve.
    18531854            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));
    18541868        }
    18551869
    1856         Style::resolveTree(*this, change);
     1870        Style::TreeResolver resolver(*this);
     1871        resolver.resolve(change);
    18571872
    18581873        updatedCompositingLayers = frameView.updateCompositingLayersAfterStyleChange();
  • trunk/Source/WebCore/dom/Element.cpp

    r194596 r194691  
    7878#include "Settings.h"
    7979#include "StyleProperties.h"
    80 #include "StyleResolveTree.h"
    8180#include "StyleResolver.h"
     81#include "StyleTreeResolver.h"
    8282#include "TextIterator.h"
    8383#include "VoidCallback.h"
  • trunk/Source/WebCore/html/HTMLFormControlElement.cpp

    r194584 r194691  
    3939#include "RenderBox.h"
    4040#include "RenderTheme.h"
    41 #include "StyleResolveTree.h"
     41#include "StyleTreeResolver.h"
    4242#include "ValidationMessage.h"
    4343#include <wtf/NeverDestroyed.h>
  • trunk/Source/WebCore/html/HTMLFrameOwnerElement.cpp

    r194584 r194691  
    2929#include "ShadowRoot.h"
    3030#include "SVGDocument.h"
    31 #include "StyleResolveTree.h"
     31#include "StyleTreeResolver.h"
    3232#include <wtf/Ref.h>
    3333
  • trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp

    r194584 r194691  
    4949#include "Settings.h"
    5050#include "ShadowRoot.h"
    51 #include "StyleResolveTree.h"
    5251#include "StyleResolver.h"
     52#include "StyleTreeResolver.h"
    5353#include "SubframeLoader.h"
    5454#include "TypedElementDescendantIterator.h"
  • trunk/Source/WebCore/mathml/MathMLSelectElement.cpp

    r194584 r194691  
    3636#include "SVGElement.h"
    3737#include "SVGNames.h"
    38 #include "StyleResolveTree.h"
     38#include "StyleTreeResolver.h"
    3939
    4040namespace WebCore {
  • trunk/Source/WebCore/style/StyleTreeResolver.cpp

    r194584 r194691  
    2525
    2626#include "config.h"
    27 #include "StyleResolveTree.h"
     27#include "StyleTreeResolver.h"
    2828
    2929#include "AXObjectCache.h"
     
    5050#include "Settings.h"
    5151#include "ShadowRoot.h"
    52 #include "StyleResolveForDocument.h"
    5352#include "StyleResolver.h"
    5453#include "Text.h"
    5554
    5655#if PLATFORM(IOS)
    57 #include "CSSFontSelector.h"
    5856#include "WKContentObservation.h"
    5957#endif
     
    6563enum DetachType { NormalDetach, ReattachDetach };
    6664
    67 static void attachRenderTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, PassRefPtr<RenderStyle>);
    6865static void attachTextRenderer(Text&, RenderTreePosition&);
    6966static void detachRenderTree(Element&, DetachType);
    7067static void resolveTextNode(Text&, RenderTreePosition&);
    71 static void resolveTree(Element&, RenderStyle& inheritedStyle, RenderTreePosition&, Change);
     68
     69TreeResolver::TreeResolver(Document& document)
     70    : m_document(document)
     71    , m_styleResolver(document.ensureStyleResolver())
     72{
     73}
     74
     75TreeResolver::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}
    7282
    7383static bool shouldCreateRenderer(const Element& element, const RenderElement& parentRenderer)
     
    8292}
    8393
    84 static Ref<RenderStyle> styleForElement(Element& element, RenderStyle& inheritedStyle)
     94Ref<RenderStyle> TreeResolver::styleForElement(Element& element, RenderStyle& inheritedStyle)
    8595{
    8696    if (element.hasCustomStyleResolveCallbacks()) {
     
    8898            return style.releaseNonNull();
    8999    }
    90     return element.resolveStyle(&inheritedStyle);
     100    return m_styleResolver.styleForElement(&element, &inheritedStyle);
    91101}
    92102
     
    104114#endif
    105115
    106 static void createRendererIfNeeded(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
     116void TreeResolver::createRenderer(Element& element, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle)
    107117{
    108118    ASSERT(!element.renderer());
     
    154164
    155165#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);
    159168        if (!newRenderer)
    160169            return;
     
    211220    if (previousRenderer && previousRenderer->isBR()) // <span><br/> <br/></span>
    212221        return false;
    213        
     222
    214223    if (parentRenderer.isRenderInline()) {
    215224        // <span><div/> <div/></span>
     
    285294}
    286295
    287 static void attachChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
     296void TreeResolver::createRenderTreeForChildren(ContainerNode& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
    288297{
    289298    for (Node* child = current.firstChild(); child; child = child->nextSibling()) {
     
    298307        }
    299308        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
     313void TreeResolver::createRenderTreeForShadowRoot(ShadowRoot& shadowRoot)
    305314{
    306315    ASSERT(shadowRoot.host());
    307316    ASSERT(shadowRoot.host()->renderer());
    308317
     318    TreeResolver shadowTreeResolver(shadowRoot, *this);
     319
    309320    auto& renderer = *shadowRoot.host()->renderer();
    310321    RenderTreePosition renderTreePosition(renderer);
    311     attachChildren(shadowRoot, renderer.style(), renderTreePosition);
     322    shadowTreeResolver.createRenderTreeForChildren(shadowRoot, renderer.style(), renderTreePosition);
    312323
    313324    shadowRoot.clearNeedsStyleRecalc();
     
    379390}
    380391
    381 static void attachBeforeOrAfterPseudoElementIfNeeded(Element& current, PseudoId pseudoId, RenderTreePosition& renderTreePosition)
     392void TreeResolver::createRenderTreeForBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId, RenderTreePosition& renderTreePosition)
    382393{
    383394    if (!needsPseudoElement(current, pseudoId))
    384395        return;
    385396    Ref<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId);
    386     InspectorInstrumentation::pseudoElementCreated(pseudoElement->document().page(), pseudoElement.get());
     397    InspectorInstrumentation::pseudoElementCreated(m_document.page(), pseudoElement.get());
    387398    setBeforeOrAfterPseudoElement(current, pseudoElement.copyRef(), pseudoId);
    388     attachRenderTree(pseudoElement.get(), *current.renderStyle(), renderTreePosition, nullptr);
     399    createRenderTreeRecursively(pseudoElement.get(), *current.renderStyle(), renderTreePosition, nullptr);
    389400}
    390401
    391402#if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
    392 static void attachSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
     403void TreeResolver::createRenderTreeForSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition)
    393404{
    394405    if (auto* assignedNodes = slot.assignedNodes()) {
     406        ASSERT(m_shadowHostTreeResolver);
    395407        for (auto* child : *assignedNodes) {
    396408            if (is<Text>(*child))
    397409                attachTextRenderer(downcast<Text>(*child), renderTreePosition);
    398410            else if (is<Element>(*child))
    399                 attachRenderTree(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);
     411                m_shadowHostTreeResolver->createRenderTreeRecursively(downcast<Element>(*child), inheritedStyle, renderTreePosition, nullptr);
    400412        }
    401413    } else
    402         attachChildren(slot, inheritedStyle, renderTreePosition);
     414        createRenderTreeForChildren(slot, inheritedStyle, renderTreePosition);
    403415
    404416    slot.clearNeedsStyleRecalc();
     
    407419#endif
    408420
    409 static void attachRenderTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, PassRefPtr<RenderStyle> resolvedStyle)
    410 {
    411     PostResolutionCallbackDisabler callbackDisabler(current.document());
     421void TreeResolver::createRenderTreeRecursively(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, RefPtr<RenderStyle>&& resolvedStyle)
     422{
     423    PostResolutionCallbackDisabler callbackDisabler(m_document);
    412424    WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
    413425
    414426#if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
    415427    if (is<HTMLSlotElement>(current)) {
    416         attachSlotAssignees(downcast<HTMLSlotElement>(current), inheritedStyle, renderTreePosition);
     428        createRenderTreeForSlotAssignees(downcast<HTMLSlotElement>(current), inheritedStyle, renderTreePosition);
    417429        return;
    418430    }
     
    422434        current.willAttachRenderers();
    423435
    424     createRendererIfNeeded(current, inheritedStyle, renderTreePosition, resolvedStyle);
     436    createRenderer(current, inheritedStyle, renderTreePosition, WTFMove(resolvedStyle));
    425437
    426438    if (auto* renderer = current.renderer()) {
     
    428440
    429441        RenderTreePosition childRenderTreePosition(*renderer);
    430         attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);
     442        createRenderTreeForBeforeOrAfterPseudoElement(current, BEFORE, childRenderTreePosition);
    431443
    432444        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())
    437448            parentPusher.push();
    438449
    439450        bool skipChildren = shadowRoot;
    440451        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())
    444455            cache->updateCacheAfterNodeIsAttached(&current);
    445456
    446         attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER, childRenderTreePosition);
     457        createRenderTreeForBeforeOrAfterPseudoElement(current, AFTER, childRenderTreePosition);
    447458
    448459        current.updateFocusAppearanceAfterAttachIfNeeded();
     
    556567}
    557568
    558 static Change resolveLocal(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)
     569Change TreeResolver::resolveLocally(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change inheritedChange)
    559570{
    560571    Change localChange = Detach;
     
    562573    RefPtr<RenderStyle> currentStyle = current.renderStyle();
    563574
    564     Document& document = current.document();
    565575    if (currentStyle && current.styleChangeType() != ReconstructRenderTree) {
    566576        Ref<RenderStyle> style(styleForElement(current, inheritedStyle));
     
    571581        if (current.renderer() || current.isNamedFlowContentNode())
    572582            detachRenderTree(current, ReattachDetach);
    573         attachRenderTree(current, inheritedStyle, renderTreePosition, newStyle.release());
     583        createRenderTreeRecursively(current, inheritedStyle, renderTreePosition, newStyle.release());
    574584        invalidateWhitespaceOnlyTextSiblingsAfterAttachIfNeeded(current);
    575585
     
    589599    // If "rem" units are used anywhere in the document, and if the document element's font size changes, then force font updating
    590600    // 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() == &current && localChange != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize()) {
     601    if (m_document.authorStyleSheets().usesRemUnits() && m_document.documentElement() == &current && localChange != NoChange && currentStyle && newStyle && currentStyle->fontSize() != newStyle->fontSize()) {
    592602        // Cached RenderStyles may depend on the re units.
    593         if (StyleResolver* styleResolver = document.styleResolverIfExists())
    594             styleResolver->invalidateMatchedPropertiesCache();
     603        m_styleResolver.invalidateMatchedPropertiesCache();
    595604        return Force;
    596605    }
     
    622631}
    623632
    624 static void resolveChildAtShadowBoundary(Node& child, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Style::Change change)
     633void TreeResolver::resolveChildAtShadowBoundary(Node& child, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Style::Change change)
    625634{
    626635    if (auto* renderer = child.renderer())
     
    632641    }
    633642    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
     646void TreeResolver::resolveShadowTree(Style::Change change, RenderStyle& inheritedStyle)
     647{
     648    ASSERT(m_shadowRoot);
     649    auto& host = *m_shadowRoot->host();
    640650    ASSERT(host.renderer());
    641     auto& inheritedStyle = host.renderer()->style();
    642     if (shadowRoot.styleChangeType() >= FullStyleChange)
     651    if (m_shadowRoot->styleChangeType() >= FullStyleChange)
    643652        change = Force;
    644653    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())
    646655        resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change);
    647656
    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
     661void TreeResolver::resolveBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId, RenderTreePosition& renderTreePosition)
    653662{
    654663    ASSERT(current.renderer());
     
    658667
    659668        if (needsPseudoElement(current, pseudoId))
    660             resolveTree(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change);
     669            resolveRecursively(*existingPseudoElement, current.renderer()->style(), renderTreePosition, current.needsStyleRecalc() ? Force : change);
    661670        else
    662671            clearBeforeOrAfterPseudoElement(current, pseudoId);
    663672        return;
    664673    }
    665     attachBeforeOrAfterPseudoElementIfNeeded(current, pseudoId, renderTreePosition);
     674    createRenderTreeForBeforeOrAfterPseudoElement(current, pseudoId, renderTreePosition);
    666675}
    667676
     
    720729#endif // PLATFORM(IOS)
    721730
    722 static void resolveChildren(Element& current, RenderStyle& inheritedStyle, Change change, RenderTreePosition& childRenderTreePosition)
     731void TreeResolver::resolveChildren(Element& current, RenderStyle& inheritedStyle, Change change, RenderTreePosition& childRenderTreePosition)
    723732{
    724733    StyleResolverParentPusher parentPusher(&current);
     
    744753        if (change >= Inherit || childElement.childNeedsStyleRecalc() || childElement.needsStyleRecalc()) {
    745754            parentPusher.push();
    746             resolveTree(childElement, inheritedStyle, childRenderTreePosition, change);
     755            resolveRecursively(childElement, inheritedStyle, childRenderTreePosition, change);
    747756        }
    748757    }
     
    750759
    751760#if ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)
    752 static void resolveSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
     761void TreeResolver::resolveSlotAssignees(HTMLSlotElement& slot, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
    753762{
    754763    if (auto* assignedNodes = slot.assignedNodes()) {
     764        ASSERT(m_shadowHostTreeResolver);
    755765        for (auto* child : *assignedNodes)
    756             resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change);
     766            m_shadowHostTreeResolver->resolveChildAtShadowBoundary(*child, inheritedStyle, renderTreePosition, change);
    757767    } else
    758768        resolveChildren(slot, inheritedStyle, change, renderTreePosition);
     
    763773#endif
    764774
    765 void resolveTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
     775void TreeResolver::resolveRecursively(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
    766776{
    767777    ASSERT(change != Detach);
     
    787797
    788798    if (change >= Inherit || current.needsStyleRecalc())
    789         change = resolveLocal(current, inheritedStyle, renderTreePosition, change);
     799        change = resolveLocally(current, inheritedStyle, renderTreePosition, change);
    790800
    791801    auto* renderer = current.renderer();
     
    793803    if (change != Detach && renderer) {
    794804        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        }
    797809
    798810        RenderTreePosition childRenderTreePosition(*renderer);
    799         updateBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition);
     811        resolveBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition);
    800812
    801813        bool skipChildren = shadowRoot;
     
    803815            resolveChildren(current, renderer->style(), change, childRenderTreePosition);
    804816
    805         updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);
     817        resolveBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);
    806818    }
    807819    if (change != Detach && !renderer)
     
    815827}
    816828
    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();
     829void TreeResolver::resolve(Change change)
     830{
     831    ASSERT(!m_shadowRoot);
     832
     833    auto& renderView = *m_document.renderView();
     834
     835    Element* documentElement = m_document.documentElement();
    837836    if (!documentElement)
    838837        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;
    843840
    844841    // 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());
    847844
    848845    RenderTreePosition renderTreePosition(renderView);
    849     resolveTree(*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());
    853850}
    854851
  • trunk/Source/WebCore/style/StyleTreeResolver.h

    r194584 r194691  
    2424 */
    2525
    26 #ifndef StyleResolveTree_h
    27 #define StyleResolveTree_h
     26#ifndef StyleTreeResolver_h
     27#define StyleTreeResolver_h
    2828
     29#include "RenderStyleConstants.h"
    2930#include "StyleChange.h"
    3031#include <functional>
     32#include <wtf/RefPtr.h>
    3133
    3234namespace WebCore {
    3335
     36class ContainerNode;
    3437class Document;
    3538class Element;
     39class HTMLSlotElement;
     40class Node;
    3641class RenderStyle;
     42class RenderTreePosition;
    3743class Settings;
     44class ShadowRoot;
     45class StyleResolver;
    3846class Text;
    3947
    4048namespace Style {
    4149
    42 void resolveTree(Document&, Change);
     50class TreeResolver {
     51public:
     52    TreeResolver(Document&);
     53
     54    void resolve(Change);
     55
     56private:
     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};
    4386
    4487void detachRenderTree(Element&);
Note: See TracChangeset for help on using the changeset viewer.