[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

dglazkov at chromium.org dglazkov at chromium.org
Wed Dec 22 17:53:56 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 5db261d58133bda589827f18242d4359322433b9
Author: dglazkov at chromium.org <dglazkov at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Dec 2 09:15:00 2010 +0000

    2010-12-02  Dimitri Glazkov  <dglazkov at chromium.org>
    
            Reviewed by Kent Tamura.
    
            Provide means to store shadow DOM nodes on Element
            https://bugs.webkit.org/show_bug.cgi?id=48697
    
            Adds shadow DOM awareness to the standard Node attach/detach,
            document and tree insertion and removal cycle.
    
            No new tests, because the code is not yet used.
    
            * dom/Element.cpp:
            (WebCore::Element::insertedIntoDocument): Added logic to cascade down to shadow DOM, if present.
            (WebCore::Element::removedFromDocument): Ditto.
            (WebCore::Element::insertedIntoTree): Ditto.
            (WebCore::Element::removedFromTree): Ditto.
            (WebCore::Element::attach): Ditto.
            (WebCore::Element::detach): Ditto.
            (WebCore::Element::recalcStyle):
            (WebCore::Element::shadowRoot): Added.
            (WebCore::Element::setShadowRoot): Added.
            (WebCore::Element::clearShadowRoot): Added.
            * dom/Element.h: Added decls.
            * dom/ElementRareData.h: Added a member to hold a RefPtr to the shadow DOM root for the element.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73114 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 5ddc688..a5d2ec0 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,29 @@
+2010-12-02  Dimitri Glazkov  <dglazkov at chromium.org>
+
+        Reviewed by Kent Tamura.
+
+        Provide means to store shadow DOM nodes on Element
+        https://bugs.webkit.org/show_bug.cgi?id=48697
+
+        Adds shadow DOM awareness to the standard Node attach/detach,
+        document and tree insertion and removal cycle.
+
+        No new tests, because the code is not yet used.
+
+        * dom/Element.cpp:
+        (WebCore::Element::insertedIntoDocument): Added logic to cascade down to shadow DOM, if present.
+        (WebCore::Element::removedFromDocument): Ditto.
+        (WebCore::Element::insertedIntoTree): Ditto.
+        (WebCore::Element::removedFromTree): Ditto.
+        (WebCore::Element::attach): Ditto.
+        (WebCore::Element::detach): Ditto.
+        (WebCore::Element::recalcStyle):
+        (WebCore::Element::shadowRoot): Added.
+        (WebCore::Element::setShadowRoot): Added.
+        (WebCore::Element::clearShadowRoot): Added.
+        * dom/Element.h: Added decls.
+        * dom/ElementRareData.h: Added a member to hold a RefPtr to the shadow DOM root for the element.
+
 2010-12-02  Adam Barth  <abarth at webkit.org>
 
         Reviewed by Eric Seidel.
diff --git a/WebCore/dom/Element.cpp b/WebCore/dom/Element.cpp
index 8581e69..be400b8 100644
--- a/WebCore/dom/Element.cpp
+++ b/WebCore/dom/Element.cpp
@@ -856,6 +856,8 @@ void Element::insertedIntoDocument()
     // need to do superclass processing first so inDocument() is true
     // by the time we reach updateId
     ContainerNode::insertedIntoDocument();
+    if (Node* shadow = shadowRoot())
+        shadow->insertedIntoDocument();
 
     if (hasID()) {
         if (m_attributeMap) {
@@ -877,6 +879,26 @@ void Element::removedFromDocument()
     }
 
     ContainerNode::removedFromDocument();
+    if (Node* shadow = shadowRoot())
+        shadow->removedFromDocument();
+}
+
+void Element::insertedIntoTree(bool deep)
+{
+    ContainerNode::insertedIntoTree(deep);
+    if (!deep)
+        return;
+    if (Node* shadow = shadowRoot())
+        shadow->insertedIntoTree(true);
+}
+
+void Element::removedFromTree(bool deep)
+{
+    ContainerNode::removedFromTree(deep);
+    if (!deep)
+        return;
+    if (Node* shadow = shadowRoot())
+        shadow->removedFromTree(true);
 }
 
 void Element::attach()
@@ -886,6 +908,8 @@ void Element::attach()
 
     createRendererIfNeeded();
     ContainerNode::attach();
+    if (Node* shadow = shadowRoot())
+        shadow->attach();
     if (hasRareData()) {   
         ElementRareData* data = rareData();
         if (data->needsFocusAppearanceUpdateSoonAfterAttach()) {
@@ -907,6 +931,8 @@ void Element::detach()
     if (hasRareData())
         rareData()->resetComputedStyle();
     ContainerNode::detach();
+    if (Node* shadow = shadowRoot())
+        shadow->detach();
 
     RenderWidget::resumeWidgetHierarchyUpdates();
 }
@@ -960,10 +986,8 @@ void Element::recalcStyle(StyleChange change)
     bool hasPositionalRules = needsStyleRecalc() && currentStyle && currentStyle->childrenAffectedByPositionalRules();
     bool hasDirectAdjacentRules = currentStyle && currentStyle->childrenAffectedByDirectAdjacentRules();
 
-#if ENABLE(SVG)
-    if (!hasParentStyle && isShadowNode() && isSVGElement())
+    if (!hasParentStyle && isShadowNode())
         hasParentStyle = true;
-#endif
 
     if ((change > NoChange || needsStyleRecalc())) {
         if (hasRareData())
@@ -1042,11 +1066,43 @@ void Element::recalcStyle(StyleChange change)
         if (n->isElementNode())
             forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
     }
+    // FIXME: This does not care about sibling combinators. Will be necessary in XBL2 world.
+    if (Node* shadow = shadowRoot()) {
+        if (change >= Inherit || shadow->isTextNode() || shadow->childNeedsStyleRecalc() || shadow->needsStyleRecalc())
+            shadow->recalcStyle(change);
+    }
 
     clearNeedsStyleRecalc();
     clearChildNeedsStyleRecalc();
 }
 
+Node* Element::shadowRoot()
+{
+    return hasRareData() ? rareData()->m_shadowRoot.get() : 0;
+}
+
+void Element::setShadowRoot(PassRefPtr<Node> node)
+{
+    ASSERT(node);
+
+    // FIXME: Once all instances of shadow DOM are converted to use this code, add setting of shadow host (shadowParent) on node.
+    ensureRareData()->m_shadowRoot = node;
+}
+
+void Element::clearShadowRoot()
+{
+    if (!hasRareData())
+        return;
+
+    RefPtr<Node> shadowRoot = rareData()->m_shadowRoot.release();
+    document()->removeFocusedNodeOfSubtree(shadowRoot.get());
+    // FIXME: Once all instances of shadow DOM are converted to use this code, add clearing of shadow host (shadowParent).
+    if (shadowRoot->inDocument())
+        shadowRoot->removedFromDocument();
+    else
+        shadowRoot->removedFromTree(true);
+}
+
 bool Element::childTypeAllowed(NodeType type)
 {
     switch (type) {
diff --git a/WebCore/dom/Element.h b/WebCore/dom/Element.h
index 7d4b94c..8432f82 100644
--- a/WebCore/dom/Element.h
+++ b/WebCore/dom/Element.h
@@ -225,6 +225,10 @@ public:
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
     virtual void recalcStyle(StyleChange = NoChange);
 
+    Node* shadowRoot();
+    void setShadowRoot(PassRefPtr<Node>);
+    void clearShadowRoot();
+
     RenderStyle* computedStyle(PseudoId = NOPSEUDO);
 
     AtomicString computeInheritedLanguage() const;
@@ -337,6 +341,8 @@ protected:
 
     virtual void insertedIntoDocument();
     virtual void removedFromDocument();
+    virtual void insertedIntoTree(bool);
+    virtual void removedFromTree(bool);
     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
 
     // The implementation of Element::attributeChanged() calls the following two functions.
diff --git a/WebCore/dom/ElementRareData.h b/WebCore/dom/ElementRareData.h
index 06bfe0c..f7f30bb 100644
--- a/WebCore/dom/ElementRareData.h
+++ b/WebCore/dom/ElementRareData.h
@@ -41,6 +41,7 @@ public:
 
     IntSize m_minimumSizeForResizing;
     RefPtr<RenderStyle> m_computedStyle;
+    RefPtr<Node> m_shadowRoot;
 
     OwnPtr<DatasetDOMStringMap> m_datasetDOMStringMap;
     OwnPtr<ClassList> m_classList;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list