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