Title: [88908] trunk/Source/WebCore
Revision
88908
Author
morr...@google.com
Date
2011-06-14 23:24:15 -0700 (Tue, 14 Jun 2011)

Log Message

2011-06-09  MORITA Hajime  <morr...@google.com>

        Reviewed by Dimitri Glazkov.

        ShadowContentElement should detach its inclusions before attaching them.
        https://bugs.webkit.org/show_bug.cgi?id=62428

        - On ShadowContentElement::attach(), changed inclusion attach scheme
          from per-node reattach() to detach()-all-and-attach()-them.  This
          eliminates attach() order problems which ShadowContentElement
          possibly has.
        - Changed ShadowContentElement to have m_inclusions as a member variable,
          which will be used by upcoming changes.
        - Moved attach() code from ShadowContentSelector to ShadowContentElement
          because the element now owns the inclusion list.

        No new tests. No visible behavioral change yet.

        * dom/ShadowContentElement.cpp:
        (WebCore::ShadowContentElement::attach):
        (WebCore::ShadowContentElement::detach): Added.
        * dom/ShadowContentElement.h:
        (WebCore::ShadowContentElement::inclusionAt): Added.
        (WebCore::ShadowContentElement::inclusionCount): Added.
        (WebCore::toShadowContentElement):
        * dom/ShadowContentSelector.cpp: Removed attachChildrenFor()
        (WebCore::ShadowContentSelector::selectInclusion): Extracted from attachChildrenFor()
        (WebCore::ShadowContentSelector::willAttachContentFor): Extracted from attachChildrenFor()
        (WebCore::ShadowContentSelector::didAttachContent): Extracted from attachChildrenFor()
        (WebCore::ShadowContentSelector::activeElement):
        * dom/ShadowContentSelector.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (88907 => 88908)


--- trunk/Source/WebCore/ChangeLog	2011-06-15 06:13:05 UTC (rev 88907)
+++ trunk/Source/WebCore/ChangeLog	2011-06-15 06:24:15 UTC (rev 88908)
@@ -1,3 +1,35 @@
+2011-06-09  MORITA Hajime  <morr...@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        ShadowContentElement should detach its inclusions before attaching them.
+        https://bugs.webkit.org/show_bug.cgi?id=62428
+
+        - On ShadowContentElement::attach(), changed inclusion attach scheme
+          from per-node reattach() to detach()-all-and-attach()-them.  This
+          eliminates attach() order problems which ShadowContentElement
+          possibly has.
+        - Changed ShadowContentElement to have m_inclusions as a member variable,
+          which will be used by upcoming changes.
+        - Moved attach() code from ShadowContentSelector to ShadowContentElement
+          because the element now owns the inclusion list.
+        
+        No new tests. No visible behavioral change yet.
+
+        * dom/ShadowContentElement.cpp:
+        (WebCore::ShadowContentElement::attach):
+        (WebCore::ShadowContentElement::detach): Added.
+        * dom/ShadowContentElement.h:
+        (WebCore::ShadowContentElement::inclusionAt): Added.
+        (WebCore::ShadowContentElement::inclusionCount): Added.
+        (WebCore::toShadowContentElement):
+        * dom/ShadowContentSelector.cpp: Removed attachChildrenFor()
+        (WebCore::ShadowContentSelector::selectInclusion): Extracted from attachChildrenFor()
+        (WebCore::ShadowContentSelector::willAttachContentFor): Extracted from attachChildrenFor()
+        (WebCore::ShadowContentSelector::didAttachContent): Extracted from attachChildrenFor()
+        (WebCore::ShadowContentSelector::activeElement):
+        * dom/ShadowContentSelector.h:
+
 2011-06-14  David Kilzer  <ddkil...@apple.com>
 
         <http://webkit.org/b/62677> Part 2/2: Remove duplicate header entries in WebCore project file

Modified: trunk/Source/WebCore/dom/ShadowContentElement.cpp (88907 => 88908)


--- trunk/Source/WebCore/dom/ShadowContentElement.cpp	2011-06-15 06:13:05 UTC (rev 88907)
+++ trunk/Source/WebCore/dom/ShadowContentElement.cpp	2011-06-15 06:24:15 UTC (rev 88908)
@@ -34,9 +34,22 @@
 void ShadowContentElement::attach()
 {
     ASSERT(!firstChild()); // Currently doesn't support any light child.
-    Element::attach();
-    if (ShadowContentSelector* selector = ShadowContentSelector::currentInstance())
-        selector->attachChildrenFor(this);
+    StyledElement::attach();
+    if (ShadowContentSelector* selector = ShadowContentSelector::currentInstance()) {
+        selector->willAttachContentFor(this);
+        selector->selectInclusion(m_inclusions);
+        for (size_t i = 0; i < m_inclusions.size(); ++i)
+            m_inclusions[i]->detach();
+        for (size_t i = 0; i < m_inclusions.size(); ++i)
+            m_inclusions[i]->attach();
+        selector->didAttachContent();
+    }
 }
 
+void ShadowContentElement::detach()
+{
+    m_inclusions.clear();
+    StyledElement::detach();
 }
+
+}

Modified: trunk/Source/WebCore/dom/ShadowContentElement.h (88907 => 88908)


--- trunk/Source/WebCore/dom/ShadowContentElement.h	2011-06-15 06:13:05 UTC (rev 88907)
+++ trunk/Source/WebCore/dom/ShadowContentElement.h	2011-06-15 06:24:15 UTC (rev 88908)
@@ -47,13 +47,35 @@
 
     virtual bool shouldInclude(Node*) = 0;
     virtual void attach();
+    virtual void detach();
 
+    Node* inclusionAt(size_t) const;
+    size_t inclusionCount() const;
+
 private:
     virtual bool isContentElement() const { return true; }
     virtual bool rendererIsNeeded(const NodeRenderingContext&) { return false; }
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) { return 0; }
+
+    Vector<RefPtr<Node> > m_inclusions;
 };
 
+inline Node* ShadowContentElement::inclusionAt(size_t index) const
+{
+    return m_inclusions.at(index).get();
 }
 
+inline size_t ShadowContentElement::inclusionCount() const
+{
+    return m_inclusions.size();
+}
+
+inline ShadowContentElement* toShadowContentElement(Node* node)
+{
+    ASSERT(!node || node->isContentElement());
+    return static_cast<ShadowContentElement*>(node);
+}
+
+}
+
 #endif

Modified: trunk/Source/WebCore/dom/ShadowContentSelector.cpp (88907 => 88908)


--- trunk/Source/WebCore/dom/ShadowContentSelector.cpp	2011-06-15 06:13:05 UTC (rev 88907)
+++ trunk/Source/WebCore/dom/ShadowContentSelector.cpp	2011-06-15 06:24:15 UTC (rev 88908)
@@ -51,22 +51,37 @@
     s_currentInstance = m_parent;
 }
 
-void ShadowContentSelector::attachChildrenFor(ShadowContentElement* contentElement)
+void ShadowContentSelector::selectInclusion(Vector<RefPtr<Node> >& inclusions)
 {
-    m_activeElement = contentElement;
+    inclusions.clear();
 
     for (size_t i = 0; i < m_children.size(); ++i) {
         Node* child = m_children[i].get();
         if (!child)
             continue;
-        if (!contentElement->shouldInclude(child))
+        if (!m_activeElement->shouldInclude(child))
             continue;
 
-        child->reattach();
+        inclusions.append(child);
         m_children[i] = 0;
     }
+}
 
+void ShadowContentSelector::willAttachContentFor(ShadowContentElement* element)
+{
+    ASSERT(!m_activeElement);
+    m_activeElement = element;
+}
+
+void ShadowContentSelector::didAttachContent()
+{
+    ASSERT(m_activeElement);
     m_activeElement = 0;
 }
 
+Element* ShadowContentSelector::activeElement() const
+{
+    return m_activeElement;
 }
+
+}

Modified: trunk/Source/WebCore/dom/ShadowContentSelector.h (88907 => 88908)


--- trunk/Source/WebCore/dom/ShadowContentSelector.h	2011-06-15 06:13:05 UTC (rev 88907)
+++ trunk/Source/WebCore/dom/ShadowContentSelector.h	2011-06-15 06:24:15 UTC (rev 88908)
@@ -47,16 +47,19 @@
     explicit ShadowContentSelector(ShadowRoot*);
     ~ShadowContentSelector();
 
-    void attachChildrenFor(ShadowContentElement*);
+    void willAttachContentFor(ShadowContentElement*);
+    void didAttachContent();
+    void selectInclusion(Vector<RefPtr<Node> >& inclusions);
+
     ShadowRoot* shadowRoot() const { return m_shadowRoot; }
-    Element* activeElement() const { return m_activeElement; }
+    Element* activeElement() const;
 
     static ShadowContentSelector* currentInstance() { return s_currentInstance; }
 
 private:
     ShadowContentSelector* m_parent;
     ShadowRoot* m_shadowRoot;
-    Element* m_activeElement;
+    ShadowContentElement* m_activeElement;
     Vector<RefPtr<Node> > m_children;
 
     static ShadowContentSelector* s_currentInstance;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to