Changeset 190006 in webkit


Ignore:
Timestamp:
Sep 18, 2015 7:31:01 PM (9 years ago)
Author:
Antti Koivisto
Message:

Don't create renderers for children of shadow host
https://bugs.webkit.org/show_bug.cgi?id=149363

Reviewed by Ryosuke Niwa.

Source/WebCore:

Test: fast/shadow-dom/css-scoping-shadow-root-hides-children.html

  • dom/ShadowRoot.h:
  • style/StyleResolveTree.cpp:

(WebCore::Style::attachRenderTree):
(WebCore::Style::resolveShadowTree):
(WebCore::Style::resolveChildren):
(WebCore::Style::resolveTree):

LayoutTests:

  • fast/shadow-dom/css-scoping-shadow-root-hides-children-expected.html: Added.
  • fast/shadow-dom/css-scoping-shadow-root-hides-children.html: Added.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r189998 r190006  
     12015-09-18  Antti Koivisto  <antti@apple.com>
     2
     3        Don't create renderers for children of shadow host
     4        https://bugs.webkit.org/show_bug.cgi?id=149363
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * fast/shadow-dom/css-scoping-shadow-root-hides-children-expected.html: Added.
     9        * fast/shadow-dom/css-scoping-shadow-root-hides-children.html: Added.
     10
    1112015-09-18  Jake Nielsen  <jacob_nielsen@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r190003 r190006  
     12015-09-18  Antti Koivisto  <antti@apple.com>
     2
     3        Don't create renderers for children of shadow host
     4        https://bugs.webkit.org/show_bug.cgi?id=149363
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Test: fast/shadow-dom/css-scoping-shadow-root-hides-children.html
     9
     10        * dom/ShadowRoot.h:
     11        * style/StyleResolveTree.cpp:
     12        (WebCore::Style::attachRenderTree):
     13        (WebCore::Style::resolveShadowTree):
     14        (WebCore::Style::resolveChildren):
     15        (WebCore::Style::resolveTree):
     16
    1172015-09-08  Darin Adler  <darin@apple.com>
    218
  • trunk/Source/WebCore/dom/ShadowRoot.h

    r189987 r190006  
    9999    virtual Ref<Node> cloneNodeInternal(Document&, CloningOperation) override;
    100100
    101     bool m_resetStyleInheritance : 1;
     101    bool m_resetStyleInheritance;
    102102    Type m_type;
    103103
  • trunk/Source/WebCore/style/StyleResolveTree.cpp

    r189987 r190006  
    492492        attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE, childRenderTreePosition);
    493493
    494         if (ShadowRoot* shadowRoot = current.shadowRoot()) {
     494        auto* shadowRoot = current.shadowRoot();
     495        if (shadowRoot) {
    495496            parentPusher.push();
    496497            attachShadowRoot(*shadowRoot);
     
    498499            parentPusher.push();
    499500
    500         attachChildren(current, renderer->style(), childRenderTreePosition);
     501        bool skipChildren = shadowRoot && shadowRoot->type() != ShadowRoot::Type::UserAgent;
     502        if (!skipChildren)
     503            attachChildren(current, renderer->style(), childRenderTreePosition);
    501504
    502505        if (AXObjectCache* cache = current.document().axObjectCache())
     
    677680static void resolveShadowTree(ShadowRoot& shadowRoot, Element& host, Style::Change change)
    678681{
     682    StyleResolverParentPusher parentPusher(&host);
     683
    679684    ASSERT(shadowRoot.host() == &host);
    680685    ASSERT(host.renderer());
     
    687692            continue;
    688693        }
    689         if (is<Element>(*child))
     694        if (is<Element>(*child)) {
     695            parentPusher.push();
    690696            resolveTree(downcast<Element>(*child), host.renderer()->style(), renderTreePosition, change);
     697        }
    691698    }
    692699
     
    763770#endif // PLATFORM(IOS)
    764771
     772static void resolveChildren(Element& current, RenderStyle& inheritedStyle, Change change, RenderTreePosition& childRenderTreePosition)
     773{
     774    StyleResolverParentPusher parentPusher(&current);
     775
     776    bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle = false;
     777    for (Node* child = current.firstChild(); child; child = child->nextSibling()) {
     778        if (RenderObject* childRenderer = child->renderer())
     779            childRenderTreePosition.invalidateNextSibling(*childRenderer);
     780        if (is<Text>(*child) && child->needsStyleRecalc()) {
     781            resolveTextNode(downcast<Text>(*child), childRenderTreePosition);
     782            continue;
     783        }
     784        if (!is<Element>(*child))
     785            continue;
     786
     787        Element& childElement = downcast<Element>(*child);
     788        if (elementNeedingStyleRecalcAffectsNextSiblingElementStyle) {
     789            if (childElement.styleIsAffectedByPreviousSibling())
     790                childElement.setNeedsStyleRecalc();
     791            elementNeedingStyleRecalcAffectsNextSiblingElementStyle = childElement.affectsNextSiblingElementStyle();
     792        } else if (childElement.needsStyleRecalc())
     793            elementNeedingStyleRecalcAffectsNextSiblingElementStyle = childElement.affectsNextSiblingElementStyle();
     794        if (change >= Inherit || childElement.childNeedsStyleRecalc() || childElement.needsStyleRecalc()) {
     795            parentPusher.push();
     796            resolveTree(childElement, inheritedStyle, childRenderTreePosition, change);
     797        }
     798    }
     799}
     800
    765801void resolveTree(Element& current, RenderStyle& inheritedStyle, RenderTreePosition& renderTreePosition, Change change)
    766802{
     
    791827
    792828    if (change != Detach && renderer) {
    793         StyleResolverParentPusher parentPusher(&current);
    794 
    795         if (ShadowRoot* shadowRoot = current.shadowRoot()) {
    796             if (change >= Inherit || shadowRoot->childNeedsStyleRecalc() || shadowRoot->needsStyleRecalc()) {
    797                 parentPusher.push();
    798                 resolveShadowTree(*shadowRoot, current, change);
    799             }
    800         }
     829        auto* shadowRoot = current.shadowRoot();
     830        if (shadowRoot && (change >= Inherit || shadowRoot->childNeedsStyleRecalc() || shadowRoot->needsStyleRecalc()))
     831            resolveShadowTree(*shadowRoot, current, change);
    801832
    802833        RenderTreePosition childRenderTreePosition(*renderer);
    803834        updateBeforeOrAfterPseudoElement(current, change, BEFORE, childRenderTreePosition);
    804835
    805         bool elementNeedingStyleRecalcAffectsNextSiblingElementStyle = false;
    806         for (Node* child = current.firstChild(); child; child = child->nextSibling()) {
    807             if (RenderObject* childRenderer = child->renderer())
    808                 childRenderTreePosition.invalidateNextSibling(*childRenderer);
    809             if (is<Text>(*child) && child->needsStyleRecalc()) {
    810                 resolveTextNode(downcast<Text>(*child), childRenderTreePosition);
    811                 continue;
    812             }
    813             if (!is<Element>(*child))
    814                 continue;
    815 
    816             Element& childElement = downcast<Element>(*child);
    817             if (elementNeedingStyleRecalcAffectsNextSiblingElementStyle) {
    818                 if (childElement.styleIsAffectedByPreviousSibling())
    819                     childElement.setNeedsStyleRecalc();
    820                 elementNeedingStyleRecalcAffectsNextSiblingElementStyle = childElement.affectsNextSiblingElementStyle();
    821             } else if (childElement.needsStyleRecalc())
    822                 elementNeedingStyleRecalcAffectsNextSiblingElementStyle = childElement.affectsNextSiblingElementStyle();
    823             if (change >= Inherit || childElement.childNeedsStyleRecalc() || childElement.needsStyleRecalc()) {
    824                 parentPusher.push();
    825                 resolveTree(childElement, renderer->style(), childRenderTreePosition, change);
    826             }
    827         }
     836        bool skipChildren = shadowRoot && shadowRoot->type() != ShadowRoot::Type::UserAgent;
     837        if (!skipChildren)
     838            resolveChildren(current, renderer->style(), change, childRenderTreePosition);
    828839
    829840        updateBeforeOrAfterPseudoElement(current, change, AFTER, childRenderTreePosition);
Note: See TracChangeset for help on using the changeset viewer.