Changeset 73618 in webkit


Ignore:
Timestamp:
Dec 9, 2010 9:23:00 AM (13 years ago)
Author:
Dimitri Glazkov
Message:

2010-12-08 Dimitri Glazkov <Dimitri Glazkov>

Reviewed by Darin Adler.

Provide a generic way to store shadowParent on a Node.
https://bugs.webkit.org/show_bug.cgi?id=50184

This patch makes TreeShared::m_parent act as either parentNode() or
shadowHost() for Node. The distinction is controlled by IsShadowRootFlag.

Refactoring, so no new tests. See performance result testing in bug.

  • dom/Element.cpp: (WebCore::Element::recalcStyle): Changed to use parentOrHostNode().
  • dom/Node.cpp: (WebCore::Node::shadowHost): Added. (WebCore::Node::setShadowHost): Added. (WebCore::Node::isContentEditable): Changed to use parentOrHostNode(). (WebCore::Node::isContentRichlyEditable): Ditto. (WebCore::Node::nextRenderer): Ditto. (WebCore::Node::virtualComputedStyle): Ditto. (WebCore::Node::canStartSelection): Ditto. (WebCore::Node::shadowTreeRootNode): Changed to use parentNodeGuaranteedHostFree(). (WebCore::Node::getEventAncestors): Ditto. (WebCore::Node::defaultEventHandler): Changed to use parentOrHostNode().
  • dom/Node.h: Added an extra flag and adjusted bit counts. (WebCore::Node::isShadowNode): Made non-virtual, switched to use flag. (WebCore::Node::parentNode): Made to recognize flag. (WebCore::Node::parentOrHostNode): Changed to use straight parent() and made const. (WebCore::Node::parentNodeGuaranteedHostFree): Added. (WebCore::Node::shadowParentNode): Made non-virtual and const.
  • editing/TextIterator.cpp: (WebCore::depthCrossingShadowBoundaries): Changed to use parentOrHostNode(); (WebCore::nextInPreOrderCrossingShadowBoundaries): Ditto. (WebCore::previousInPostOrderCrossingShadowBoundaries): Ditto. (WebCore::setUpFullyClippedStack): Ditto. (WebCore::TextIterator::advance): Ditto. (WebCore::SimplifiedBackwardsTextIterator::advance): Ditto.
  • page/DOMSelection.cpp: (WebCore::DOMSelection::anchorNode): Changed to use parentNodeGuaranteedHostFree(). (WebCore::DOMSelection::focusNode): Ditto. (WebCore::DOMSelection::baseNode): Ditto. (WebCore::DOMSelection::extentNode): Ditto. (WebCore::DOMSelection::getRangeAt): Ditto.
  • rendering/MediaControlElements.cpp: (WebCore::MediaControlShadowRootElement::MediaControlShadowRootElement):

Changed to setShadowHost().

(WebCore::MediaControlShadowRootElement::updateStyle): Changed to use shadowHost().
(WebCore::MediaControlShadowRootElement::detach): Added an override to

explicitly set shadowHost to 0. Otherwise, the element will leak.

  • rendering/MediaControlElements.h: Added detach def, removed members that are

no longer needed.

  • rendering/RenderSVGShadowTreeRootContainer.cpp: (WebCore::RenderSVGShadowTreeRootContainer::~RenderSVGShadowTreeRootContainer):

Added explicit clearing of shadowHost to avoid leaking and crashes,
because SVG shadow DOM can be dynamically attached/detached, producing
stale nodes in over/out event handling.

  • rendering/RenderSlider.cpp: (WebCore::SliderThumbElement::defaultEventHandler): Changed to use shadowHost().
  • rendering/RenderTextControlSingleLine.cpp: (WebCore::RenderTextControlSingleLine::~RenderTextControlSingleLine):

Added explicit clearing of shadowHost and explicit destruction to
avoid out-of-order removal of children.

  • rendering/RenderTreeAsText.cpp: (WebCore::nodePosition): Simplified code.
  • rendering/SVGShadowTreeElements.cpp: (WebCore::SVGShadowTreeRootElement::SVGShadowTreeRootElement): Added

setting of shadowHost.

(WebCore::SVGShadowTreeRootElement::attachElement): Changed to use shadowHost().
(WebCore::SVGShadowTreeRootElement::clearShadowHost): Added.

  • rendering/SVGShadowTreeElements.h: Added def, removed members that are

no longer needed.

  • rendering/ShadowElement.cpp: (WebCore::ShadowBlockElement::initAsPart): Changed to use shadowHost().
  • rendering/ShadowElement.h: Removed members that are no longer needed. (WebCore::ShadowElement::ShadowElement): Added setting of shadowHost. (WebCore::ShadowElement::detach): Added.
  • rendering/TextControlInnerElements.cpp: (WebCore::TextControlInnerElement::TextControlInnerElement): Added setting

of shadowHost.

(WebCore::TextControlInnerElement::attachInnerElement): Changed to use

isShadowNode().

(WebCore::TextControlInnerElement::detach): Added.

  • rendering/TextControlInnerElements.h: Removed members that are no

longer needed.

  • svg/SVGElement.cpp: (WebCore::SVGElement::ownerSVGElement): Simplified code. (WebCore::SVGElement::viewportElement): Ditto.
  • svg/SVGLocatable.cpp: (WebCore::SVGLocatable::computeCTM): Ditto.
  • svg/SVGStyledElement.cpp: (WebCore::SVGStyledElement::title): Ditto.
  • svg/SVGUseElement.cpp: (WebCore::ShadowTreeUpdateBlocker::while): Ditto.
Location:
trunk/WebCore
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r73616 r73618  
     12010-12-08  Dimitri Glazkov  <dglazkov@chromium.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Provide a generic way to store shadowParent on a Node.
     6        https://bugs.webkit.org/show_bug.cgi?id=50184
     7
     8        This patch makes TreeShared::m_parent act as either parentNode() or
     9        shadowHost() for Node. The distinction is controlled by IsShadowRootFlag.
     10
     11        Refactoring, so no new tests. See performance result testing in bug.
     12
     13        * dom/Element.cpp:
     14        (WebCore::Element::recalcStyle): Changed to use parentOrHostNode().
     15        * dom/Node.cpp:
     16        (WebCore::Node::shadowHost): Added.
     17        (WebCore::Node::setShadowHost): Added.
     18        (WebCore::Node::isContentEditable): Changed to use parentOrHostNode().
     19        (WebCore::Node::isContentRichlyEditable): Ditto.
     20        (WebCore::Node::nextRenderer): Ditto.
     21        (WebCore::Node::virtualComputedStyle): Ditto.
     22        (WebCore::Node::canStartSelection): Ditto.
     23        (WebCore::Node::shadowTreeRootNode): Changed to use parentNodeGuaranteedHostFree().
     24        (WebCore::Node::getEventAncestors): Ditto.
     25        (WebCore::Node::defaultEventHandler): Changed to use parentOrHostNode().
     26        * dom/Node.h: Added an extra flag and adjusted bit counts.
     27        (WebCore::Node::isShadowNode): Made non-virtual, switched to use flag.
     28        (WebCore::Node::parentNode): Made to recognize flag.
     29        (WebCore::Node::parentOrHostNode): Changed to use straight parent() and made const.
     30        (WebCore::Node::parentNodeGuaranteedHostFree): Added.
     31        (WebCore::Node::shadowParentNode): Made non-virtual and const.
     32        * editing/TextIterator.cpp:
     33        (WebCore::depthCrossingShadowBoundaries): Changed to use parentOrHostNode();
     34        (WebCore::nextInPreOrderCrossingShadowBoundaries): Ditto.
     35        (WebCore::previousInPostOrderCrossingShadowBoundaries):  Ditto.
     36        (WebCore::setUpFullyClippedStack): Ditto.
     37        (WebCore::TextIterator::advance): Ditto.
     38        (WebCore::SimplifiedBackwardsTextIterator::advance): Ditto.
     39        * page/DOMSelection.cpp:
     40        (WebCore::DOMSelection::anchorNode): Changed to use parentNodeGuaranteedHostFree().
     41        (WebCore::DOMSelection::focusNode): Ditto.
     42        (WebCore::DOMSelection::baseNode): Ditto.
     43        (WebCore::DOMSelection::extentNode): Ditto.
     44        (WebCore::DOMSelection::getRangeAt): Ditto.
     45        * rendering/MediaControlElements.cpp:
     46        (WebCore::MediaControlShadowRootElement::MediaControlShadowRootElement):
     47            Changed to setShadowHost().
     48        (WebCore::MediaControlShadowRootElement::updateStyle): Changed to use shadowHost().
     49        (WebCore::MediaControlShadowRootElement::detach): Added an override to
     50            explicitly set shadowHost to 0. Otherwise, the element will leak.
     51        * rendering/MediaControlElements.h: Added detach def, removed members that are
     52            no longer needed.
     53        * rendering/RenderSVGShadowTreeRootContainer.cpp:
     54        (WebCore::RenderSVGShadowTreeRootContainer::~RenderSVGShadowTreeRootContainer):
     55            Added explicit clearing of shadowHost to avoid leaking and crashes,
     56            because SVG shadow DOM can be dynamically attached/detached, producing
     57            stale nodes in over/out event handling.
     58        * rendering/RenderSlider.cpp:
     59        (WebCore::SliderThumbElement::defaultEventHandler): Changed to use shadowHost().
     60        * rendering/RenderTextControlSingleLine.cpp:
     61        (WebCore::RenderTextControlSingleLine::~RenderTextControlSingleLine):
     62            Added explicit clearing of shadowHost and explicit destruction to
     63            avoid out-of-order removal of children.
     64        * rendering/RenderTreeAsText.cpp:
     65        (WebCore::nodePosition): Simplified code.
     66        * rendering/SVGShadowTreeElements.cpp:
     67        (WebCore::SVGShadowTreeRootElement::SVGShadowTreeRootElement): Added
     68            setting of shadowHost.
     69        (WebCore::SVGShadowTreeRootElement::attachElement): Changed to use shadowHost().
     70        (WebCore::SVGShadowTreeRootElement::clearShadowHost): Added.
     71        * rendering/SVGShadowTreeElements.h: Added def, removed members that are
     72             no longer needed.
     73        * rendering/ShadowElement.cpp:
     74        (WebCore::ShadowBlockElement::initAsPart): Changed to use shadowHost().
     75        * rendering/ShadowElement.h: Removed members that are no longer needed.
     76        (WebCore::ShadowElement::ShadowElement): Added setting of shadowHost.
     77        (WebCore::ShadowElement::detach): Added.
     78        * rendering/TextControlInnerElements.cpp:
     79        (WebCore::TextControlInnerElement::TextControlInnerElement): Added setting
     80            of shadowHost.
     81        (WebCore::TextControlInnerElement::attachInnerElement): Changed to use
     82            isShadowNode().
     83        (WebCore::TextControlInnerElement::detach): Added.
     84        * rendering/TextControlInnerElements.h: Removed members that are no
     85            longer needed.
     86        * svg/SVGElement.cpp:
     87        (WebCore::SVGElement::ownerSVGElement): Simplified code.
     88        (WebCore::SVGElement::viewportElement): Ditto.
     89        * svg/SVGLocatable.cpp:
     90        (WebCore::SVGLocatable::computeCTM): Ditto.
     91        * svg/SVGStyledElement.cpp:
     92        (WebCore::SVGStyledElement::title): Ditto.
     93        * svg/SVGUseElement.cpp:
     94        (WebCore::ShadowTreeUpdateBlocker::while): Ditto.
     95
    1962010-12-09  Hans Wennborg  <hans@chromium.org>
    297
  • trunk/WebCore/dom/Element.cpp

    r73114 r73618  
    983983    // Ref currentStyle in case it would otherwise be deleted when setRenderStyle() is called.
    984984    RefPtr<RenderStyle> currentStyle(renderStyle());
    985     bool hasParentStyle = parentNode() ? parentNode()->renderStyle() : false;
     985    bool hasParentStyle = parentOrHostNode() ? parentOrHostNode()->renderStyle() : false;
    986986    bool hasPositionalRules = needsStyleRecalc() && currentStyle && currentStyle->childrenAffectedByPositionalRules();
    987987    bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
    988 
    989     if (!hasParentStyle && isShadowNode())
    990         hasParentStyle = true;
    991988
    992989    if ((change > NoChange || needsStyleRecalc())) {
  • trunk/WebCore/dom/Node.cpp

    r73559 r73618  
    481481    return new NodeRareData;
    482482}
    483    
     483
     484Element* Node::shadowHost() const
     485{
     486    return toElement(shadowParentNode());
     487}
     488
     489void Node::setShadowHost(Element* host)
     490{
     491    if (host)
     492        setFlag(IsShadowRootFlag);
     493    else
     494        clearFlag(IsShadowRootFlag);
     495
     496    setParent(host);
     497}
     498
    484499short Node::tabIndex() const
    485500{
     
    667682bool Node::isContentEditable() const
    668683{
    669     return parent() && parent()->isContentEditable();
     684    return parentOrHostNode() && parentOrHostNode()->isContentEditable();
    670685}
    671686
    672687bool Node::isContentRichlyEditable() const
    673688{
    674     return parent() && parent()->isContentRichlyEditable();
     689    return parentOrHostNode() && parentOrHostNode()->isContentRichlyEditable();
    675690}
    676691
     
    12681283    // Avoid an O(n^2) problem with this function by not checking for nextRenderer() when the parent element hasn't even
    12691284    // been attached yet.
    1270     if (parent() && !parent()->attached())
     1285    if (parentOrHostNode() && !parentOrHostNode()->attached())
    12711286        return 0;
    12721287
     
    13951410RenderStyle* Node::virtualComputedStyle(PseudoId pseudoElementSpecifier)
    13961411{
    1397     return parent() ? parent()->computedStyle(pseudoElementSpecifier) : 0;
     1412    return parentOrHostNode() ? parentOrHostNode()->computedStyle(pseudoElementSpecifier) : 0;
    13981413}
    13991414
     
    14181433            return false;
    14191434    }
    1420     return parent() ? parent()->canStartSelection() : true;
     1435    return parentOrHostNode() ? parentOrHostNode()->canStartSelection() : true;
    14211436}
    14221437
     
    14441459        if (root->isShadowNode())
    14451460            return root;
    1446         root = root->parentNode();
     1461        root = root->parentNodeGuaranteedHostFree();
    14471462    }
    14481463    return 0;
     
    25372552                target = ancestor;
    25382553        } else
    2539             ancestor = ancestor->parentNode();
     2554            ancestor = ancestor->parentNodeGuaranteedHostFree();
    25402555
    25412556        if (!ancestor)
     
    29492964        Node* startNode = this;
    29502965        while (startNode && !startNode->renderer())
    2951             startNode = startNode->parent();
     2966            startNode = startNode->parentOrHostNode();
    29522967       
    29532968        if (startNode && startNode->renderer())
  • trunk/WebCore/dom/Node.h

    r73270 r73618  
    7575typedef int ExceptionCode;
    7676
    77 const int nodeStyleChangeShift = 24;
     77const int nodeStyleChangeShift = 25;
    7878
    7979// SyntheticStyleChange means that we need to go through the entire style change logic even though
     
    139139    virtual void setNodeValue(const String&, ExceptionCode&);
    140140    virtual NodeType nodeType() const = 0;
    141     ContainerNode* parentNode() const { return parent(); }
     141    ContainerNode* parentNode() const;
    142142    Element* parentElement() const;
    143143    Node* previousSibling() const { return m_previous; }
     
    206206    virtual bool isCharacterDataNode() const { return false; }
    207207    bool isDocumentNode() const;
    208     virtual bool isShadowNode() const { return false; }
    209     virtual ContainerNode* shadowParentNode() { return 0; }
     208    bool isShadowNode() const { return getFlag(IsShadowRootFlag); }
     209    // FIXME: Eliminate all uses, fold into shadowHost.
     210    ContainerNode* shadowParentNode() const;
    210211    Node* shadowAncestorNode();
    211212    Node* shadowTreeRootNode();
    212213    bool isInShadowTree();
    213214    // Node's parent or shadow tree host.
    214     ContainerNode* parentOrHostNode();
     215    ContainerNode* parentOrHostNode() const;
     216    // Use when it's guaranteed to that shadowParentNode is 0.
     217    ContainerNode* parentNodeGuaranteedHostFree() const;
    215218
    216219    // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation.
     
    582585        InDetachFlag = 1 << 16,
    583586        HasRareDataFlag = 1 << 17,
     587        IsShadowRootFlag = 1 << 18,
    584588
    585589        // These bits are used by derived classes, pulled up here so they can
    586590        // be stored in the same memory word as the Node bits above.
    587         IsParsingChildrenFinishedFlag = 1 << 18, // Element
    588         IsStyleAttributeValidFlag = 1 << 19, // StyledElement
    589         IsSynchronizingStyleAttributeFlag = 1 << 20, // StyledElement
     591        IsParsingChildrenFinishedFlag = 1 << 19, // Element
     592        IsStyleAttributeValidFlag = 1 << 20, // StyledElement
     593        IsSynchronizingStyleAttributeFlag = 1 << 21, // StyledElement
    590594#if ENABLE(SVG)
    591         AreSVGAttributesValidFlag = 1 << 21, // Element
    592         IsSynchronizingSVGAttributesFlag = 1 << 22, // SVGElement
    593         HasSVGRareDataFlag = 1 << 23, // SVGElement
    594 #endif
     595        AreSVGAttributesValidFlag = 1 << 22, // Element
     596        IsSynchronizingSVGAttributesFlag = 1 << 23, // SVGElement
     597        HasSVGRareDataFlag = 1 << 24, // SVGElement
     598#endif
     599
    595600        StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1),
    596601
     
    602607    };
    603608
    604     // 5 bits remaining
     609    // 4 bits remaining
    605610
    606611    bool getFlag(NodeFlags mask) const { return m_nodeFlags & mask; }
     
    633638    NodeRareData* ensureRareData();
    634639
     640    Element* shadowHost() const;
     641    void setShadowHost(Element*);
     642
    635643private:
    636644#if USE(JSC)
     
    704712}
    705713
    706 inline ContainerNode* Node::parentOrHostNode()
     714inline ContainerNode* Node::parentNode() const
    707715{
    708     if (ContainerNode* parent = parentNode())
    709         return parent;
    710     return shadowParentNode();
     716    return getFlag(IsShadowRootFlag) ? 0 : parent();
     717}
     718
     719inline ContainerNode* Node::parentOrHostNode() const
     720{
     721    return parent();
     722}
     723
     724inline ContainerNode* Node::parentNodeGuaranteedHostFree() const
     725{
     726    ASSERT(!getFlag(IsShadowRootFlag));
     727    return parentOrHostNode();
     728}
     729
     730inline ContainerNode* Node::shadowParentNode() const
     731{
     732    return getFlag(IsShadowRootFlag) ? parent() : 0;
    711733}
    712734
  • trunk/WebCore/editing/TextIterator.cpp

    r72989 r73618  
    166166// --------
    167167
    168 static inline ContainerNode* parentCrossingShadowBoundaries(Node* node)
    169 {
    170     if (ContainerNode* parent = node->parentNode())
    171         return parent;
    172     return node->shadowParentNode();
    173 }
    174 
    175168#if !ASSERT_DISABLED
    176169
     
    178171{
    179172    unsigned depth = 0;
    180     for (Node* parent = parentCrossingShadowBoundaries(node); parent; parent = parentCrossingShadowBoundaries(parent))
     173    for (Node* parent = node->parentOrHostNode(); parent; parent = parent->parentOrHostNode())
    181174        ++depth;
    182175    return depth;
     
    194187            return next;
    195188    }
    196     for (Node* node = rangeEndContainer; node; node = parentCrossingShadowBoundaries(node)) {
     189    for (Node* node = rangeEndContainer; node; node = node->parentOrHostNode()) {
    197190        if (Node* next = node->nextSibling())
    198191            return next;
     
    209202            return previous;
    210203    }
    211     for (Node* node = rangeStartContainer; node; node = parentCrossingShadowBoundaries(node)) {
     204    for (Node* node = rangeStartContainer; node; node = node->parentOrHostNode()) {
    212205        if (Node* previous = node->previousSibling())
    213206            return previous;
     
    248241    // Put the nodes in a vector so we can iterate in reverse order.
    249242    Vector<Node*, 100> ancestry;
    250     for (Node* parent = parentCrossingShadowBoundaries(node); parent; parent = parentCrossingShadowBoundaries(parent))
     243    for (Node* parent = node->parentOrHostNode(); parent; parent = parent->parentOrHostNode())
    251244        ancestry.append(parent);
    252245
     
    428421            if (!next) {
    429422                bool pastEnd = m_node->traverseNextNode() == m_pastEndNode;
    430                 Node* parentNode = parentCrossingShadowBoundaries(m_node);
     423                Node* parentNode = m_node->parentOrHostNode();
    431424                while (!next && parentNode) {
    432425                    if ((pastEnd && parentNode == m_endContainer) || m_endContainer->isDescendantOf(parentNode))
     
    435428                    m_node = parentNode;
    436429                    m_fullyClippedStack.pop();
    437                     parentNode = parentCrossingShadowBoundaries(m_node);
     430                    parentNode = m_node->parentOrHostNode();
    438431                    if (haveRenderer)
    439432                        exitNode();
     
    11491142            // Exit all other containers.
    11501143            while (!m_node->previousSibling()) {
    1151                 if (!setCurrentNode(parentCrossingShadowBoundaries(m_node)))
     1144                if (!setCurrentNode(m_node->parentOrHostNode()))
    11521145                    break;
    11531146                m_fullyClippedStack.pop();
  • trunk/WebCore/page/DOMSelection.cpp

    r69868 r73618  
    101101        return 0;
    102102    if (Node* shadowAncestor = selectionShadowAncestor(m_frame))
    103         return shadowAncestor->parentNode();
     103        return shadowAncestor->parentNodeGuaranteedHostFree();
    104104    return anchorPosition(visibleSelection()).node();
    105105}
     
    119119        return 0;
    120120    if (Node* shadowAncestor = selectionShadowAncestor(m_frame))
    121         return shadowAncestor->parentNode();
     121        return shadowAncestor->parentNodeGuaranteedHostFree();
    122122    return focusPosition(visibleSelection()).node();
    123123}
     
    137137        return 0;
    138138    if (Node* shadowAncestor = selectionShadowAncestor(m_frame))
    139         return shadowAncestor->parentNode();
     139        return shadowAncestor->parentNodeGuaranteedHostFree();
    140140    return basePosition(visibleSelection()).node();
    141141}
     
    155155        return 0;
    156156    if (Node* shadowAncestor = selectionShadowAncestor(m_frame))
    157         return shadowAncestor->parentNode();
     157        return shadowAncestor->parentNodeGuaranteedHostFree();
    158158    return extentPosition(visibleSelection()).node();
    159159}
     
    371371
    372372    if (Node* shadowAncestor = selectionShadowAncestor(m_frame)) {
    373         ContainerNode* container = shadowAncestor->parentNode();
     373        ContainerNode* container = shadowAncestor->parentNodeGuaranteedHostFree();
    374374        int offset = shadowAncestor->nodeIndex();
    375375        return Range::create(shadowAncestor->document(), container, offset, container, offset);
  • trunk/WebCore/rendering/MediaControlElements.cpp

    r72259 r73618  
    6666inline MediaControlShadowRootElement::MediaControlShadowRootElement(HTMLMediaElement* mediaElement)
    6767    : HTMLDivElement(divTag, mediaElement->document())
    68     , m_mediaElement(mediaElement)
    69 {
     68{
     69    setShadowHost(mediaElement);
    7070}
    7171
     
    9292{
    9393    if (renderer()) {
    94         RenderStyle* timelineContainerStyle = m_mediaElement->renderer()->getCachedPseudoStyle(MEDIA_CONTROLS_TIMELINE_CONTAINER);
     94        RenderStyle* timelineContainerStyle = shadowHost()->renderer()->getCachedPseudoStyle(MEDIA_CONTROLS_TIMELINE_CONTAINER);
    9595        renderer()->setStyle(timelineContainerStyle);
    9696    }
     97}
     98
     99void MediaControlShadowRootElement::detach()
     100{
     101    HTMLDivElement::detach();
     102    // FIXME: Remove once shadow DOM uses Element::setShadowRoot().
     103    setShadowHost(0);
    97104}
    98105
  • trunk/WebCore/rendering/MediaControlElements.h

    r68126 r73618  
    7777
    7878    void updateStyle();
     79    virtual void detach();
    7980   
    8081private:
    8182    MediaControlShadowRootElement(HTMLMediaElement*);
    82    
    83     virtual bool isShadowNode() const { return true; }
    84     virtual ContainerNode* shadowParentNode() { return m_mediaElement; }
    85 
    86     HTMLMediaElement* m_mediaElement;   
    8783};
    8884
  • trunk/WebCore/rendering/RenderSVGShadowTreeRootContainer.cpp

    r66498 r73618  
    3737RenderSVGShadowTreeRootContainer::~RenderSVGShadowTreeRootContainer()
    3838{
    39     if (m_shadowRoot && m_shadowRoot->attached())
     39    if (m_shadowRoot && m_shadowRoot->attached()) {
    4040        m_shadowRoot->detach();
     41        m_shadowRoot->clearShadowHost();
     42    }
    4143}
    4244
  • trunk/WebCore/rendering/RenderSlider.cpp

    r73023 r73618  
    107107
    108108                m_inDragMode = true;
    109                 document()->frame()->eventHandler()->setCapturingMouseEventsNode(shadowParent());
     109                document()->frame()->eventHandler()->setCapturingMouseEventsNode(shadowHost());
    110110                event->setDefaultHandled();
    111111                return;
  • trunk/WebCore/rendering/RenderTextControlSingleLine.cpp

    r73572 r73618  
    6868    }
    6969 
    70     if (m_innerBlock)
     70    if (m_innerBlock) {
    7171        m_innerBlock->detach();
     72        m_innerBlock = 0;
     73    }
    7274
    7375    if (m_innerSpinButton)
  • trunk/WebCore/rendering/RenderTreeAsText.cpp

    r73385 r73618  
    686686    Node* parent;
    687687    for (Node* n = node; n; n = parent) {
    688         parent = n->parentNode();
    689         if (!parent)
    690             parent = n->shadowParentNode();
     688        parent = n->parentOrHostNode();
    691689        if (n != node)
    692690            result += " of ";
  • trunk/WebCore/rendering/SVGShadowTreeElements.cpp

    r66498 r73618  
    5252inline SVGShadowTreeRootElement::SVGShadowTreeRootElement(Document* document, SVGUseElement* shadowParent)
    5353    : SVGShadowTreeContainerElement(document)
    54     , m_shadowParent(shadowParent)
    5554{
     55    setShadowHost(shadowParent);
    5656    setInDocument();
    5757}
     
    6464void SVGShadowTreeRootElement::attachElement(PassRefPtr<RenderStyle> style, RenderArena* arena)
    6565{
    66     ASSERT(m_shadowParent);
     66    ASSERT(shadowHost());
    6767
    6868    // Create the renderer with the specified style
     
    7878    // Add the renderer to the render tree
    7979    if (renderer)
    80         m_shadowParent->renderer()->addChild(renderer);
     80        shadowHost()->renderer()->addChild(renderer);
     81}
     82
     83void SVGShadowTreeRootElement::clearShadowHost()
     84{
     85    setShadowHost(0);
    8186}
    8287
  • trunk/WebCore/rendering/SVGShadowTreeElements.h

    r66498 r73618  
    5656
    5757    void attachElement(PassRefPtr<RenderStyle>, RenderArena*);
    58 
    59     virtual ContainerNode* shadowParentNode() { return m_shadowParent; }
     58    void clearShadowHost();
    6059
    6160private:
    6261    SVGShadowTreeRootElement(Document*, SVGUseElement* shadowParent);
    63 
    64     virtual bool isShadowNode() const { return m_shadowParent; }
    65 
    66     ContainerNode* m_shadowParent;
    6762};
    6863
  • trunk/WebCore/rendering/ShadowElement.cpp

    r73488 r73618  
    7676void ShadowBlockElement::initAsPart(PseudoId pseudoId)
    7777{
    78     RenderObject* parentRenderer = shadowParent()->renderer();
     78    RenderObject* parentRenderer = shadowHost()->renderer();
    7979    RefPtr<RenderStyle> styleForPart = createStyleForPart(parentRenderer, pseudoId);
    8080    setRenderer(createRenderer(parentRenderer->renderArena(), styleForPart.get()));
  • trunk/WebCore/rendering/ShadowElement.h

    r73488 r73618  
    4242        , m_shadowParent(shadowParent)
    4343    {
     44        BaseElement::setShadowHost(shadowParent);
    4445    }
    4546
    46     HTMLElement* shadowParent() const { return m_shadowParent.get(); }
     47public:
     48    virtual void detach();
    4749
    4850private:
    49     virtual bool isShadowNode() const { return true; }
    50     virtual ContainerNode* shadowParentNode() { return m_shadowParent.get(); }
    51 
    5251    RefPtr<HTMLElement> m_shadowParent;
    5352};
     53
     54template<class BaseElement>
     55void ShadowElement<BaseElement>::detach()
     56{
     57    BaseElement::detach();
     58    // FIXME: Remove once shadow DOM uses Element::setShadowRoot().
     59    BaseElement::setShadowHost(0);
     60}
    5461
    5562class ShadowBlockElement : public ShadowElement<HTMLDivElement> {
  • trunk/WebCore/rendering/TextControlInnerElements.cpp

    r72807 r73618  
    8080    , m_shadowParent(shadowParent)
    8181{
     82    setShadowHost(shadowParent);
    8283}
    8384
     
    103104    setInDocument();
    104105
    105     // For elements without a shadow parent, add the node to the DOM normally.
    106     if (!m_shadowParent) {
     106    // For elements not yet in shadow DOM, add the node to the DOM normally.
     107    if (!isShadowNode()) {
    107108        // FIXME: This code seems very wrong.  Why are we magically adding |this| to the DOM here?
    108109        //        We shouldn't be calling parser API methods outside of the parser!
     
    113114    if (renderer)
    114115        parent->renderer()->addChild(renderer);
     116}
     117
     118void TextControlInnerElement::detach()
     119{
     120    HTMLDivElement::detach();
     121    // FIXME: Remove once shadow DOM uses Element::setShadowRoot().
     122    setShadowHost(0);
    115123}
    116124
  • trunk/WebCore/rendering/TextControlInnerElements.h

    r72782 r73618  
    4040public:
    4141    static PassRefPtr<TextControlInnerElement> create(HTMLElement* shadowParent);
     42    virtual void detach();
    4243
    4344    void attachInnerElement(Node*, PassRefPtr<RenderStyle>, RenderArena*);
     
    4748
    4849private:
    49     virtual bool isMouseFocusable() const { return false; }
    50     virtual bool isShadowNode() const { return m_shadowParent.get(); }
    51     virtual ContainerNode* shadowParentNode() { return m_shadowParent.get(); }
    52     void setShadowParentNode(HTMLElement* shadowParent) { m_shadowParent = shadowParent; }
     50    virtual bool isMouseFocusable() const { return false; }
    5351
    5452    RefPtr<HTMLElement> m_shadowParent;
  • trunk/WebCore/svg/SVGElement.cpp

    r73432 r73618  
    119119SVGSVGElement* SVGElement::ownerSVGElement() const
    120120{
    121     ContainerNode* n = isShadowNode() ? const_cast<SVGElement*>(this)->shadowParentNode() : parentNode();
     121    ContainerNode* n = parentOrHostNode();
    122122    while (n) {
    123123        if (n->hasTagName(SVGNames::svgTag))
    124124            return static_cast<SVGSVGElement*>(n);
    125125
    126         n = n->isShadowNode() ? n->shadowParentNode() : n->parentNode();
     126        n = n->parentOrHostNode();
    127127    }
    128128
     
    134134    // This function needs shadow tree support - as RenderSVGContainer uses this function
    135135    // to determine the "overflow" property. <use> on <symbol> wouldn't work otherwhise.
    136     ContainerNode* n = isShadowNode() ? const_cast<SVGElement*>(this)->shadowParentNode() : parentNode();
     136    ContainerNode* n = parentOrHostNode();
    137137    while (n) {
    138138        if (n->hasTagName(SVGNames::svgTag) || n->hasTagName(SVGNames::imageTag) || n->hasTagName(SVGNames::symbolTag))
    139139            return static_cast<SVGElement*>(n);
    140140
    141         n = n->isShadowNode() ? n->shadowParentNode() : n->parentNode();
     141        n = n->parentOrHostNode();
    142142    }
    143143
  • trunk/WebCore/svg/SVGLocatable.cpp

    r71103 r73618  
    9898            break;
    9999
    100         current = current->isShadowNode() ? current->shadowParentNode() : current->parentNode();
     100        current = current->parentOrHostNode();
    101101    }
    102102
  • trunk/WebCore/svg/SVGStyledElement.cpp

    r73130 r73618  
    8282    while (parent) {
    8383        if (!parent->isShadowNode()) {
    84             parent = parent->parentNode();
     84            parent = parent->parentNodeGuaranteedHostFree();
    8585            continue;
    8686        }
  • trunk/WebCore/svg/SVGUseElement.cpp

    r73258 r73618  
    497497            return;
    498498
    499         parent = parent->parentNode();
     499        parent = parent->parentNodeGuaranteedHostFree();
    500500    }
    501501 
Note: See TracChangeset for help on using the changeset viewer.