Title: [136098] trunk/Source/WebCore
- Revision
- 136098
- Author
- shin...@chromium.org
- Date
- 2012-11-28 22:23:58 -0800 (Wed, 28 Nov 2012)
Log Message
[Shadow] ShadowRoot should cache InsertionPointList.
https://bugs.webkit.org/show_bug.cgi?id=103212
Reviewed by Hajime Morita.
When distributing or invalidating distribution, we used to traverse all descendent nodes in Shadow DOM.
If ShadowRoot has a InsertionPoint list, we can just traverse the list.
No new tests, should be covered by existing tests.
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::insertionPointList):
(WebCore):
* dom/ShadowRoot.h:
(ShadowRoot):
* html/shadow/ContentDistributor.cpp:
(WebCore::ShadowRootContentDistributionData::ShadowRootContentDistributionData):
(WebCore::ShadowRootContentDistributionData::invalidateInsertionPointList):
(WebCore):
(WebCore::ShadowRootContentDistributionData::ensureInsertionPointList): Creates InsertionPoint list
if it's not created and return it.
(WebCore::ContentDistributor::distribute): Traverse InsertionPointList instead of all descendent nodes in Shadow DOM.
(WebCore::ContentDistributor::invalidate): ditto.
* html/shadow/ContentDistributor.h:
(WebCore::ShadowRootContentDistributionData::incrementNumberOfShadowElementChildren): Invalidate InsertionPointList cache.
(WebCore::ShadowRootContentDistributionData::decrementNumberOfShadowElementChildren): ditto.
(WebCore::ShadowRootContentDistributionData::incrementNumberOfContentElementChildren): ditto.
(WebCore::ShadowRootContentDistributionData::decrementNumberOfContentElementChildren): ditto.
(ShadowRootContentDistributionData):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (136097 => 136098)
--- trunk/Source/WebCore/ChangeLog 2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/ChangeLog 2012-11-29 06:23:58 UTC (rev 136098)
@@ -1,3 +1,35 @@
+2012-11-28 Shinya Kawanaka <shin...@chromium.org>
+
+ [Shadow] ShadowRoot should cache InsertionPointList.
+ https://bugs.webkit.org/show_bug.cgi?id=103212
+
+ Reviewed by Hajime Morita.
+
+ When distributing or invalidating distribution, we used to traverse all descendent nodes in Shadow DOM.
+ If ShadowRoot has a InsertionPoint list, we can just traverse the list.
+
+ No new tests, should be covered by existing tests.
+
+ * dom/ShadowRoot.cpp:
+ (WebCore::ShadowRoot::insertionPointList):
+ (WebCore):
+ * dom/ShadowRoot.h:
+ (ShadowRoot):
+ * html/shadow/ContentDistributor.cpp:
+ (WebCore::ShadowRootContentDistributionData::ShadowRootContentDistributionData):
+ (WebCore::ShadowRootContentDistributionData::invalidateInsertionPointList):
+ (WebCore):
+ (WebCore::ShadowRootContentDistributionData::ensureInsertionPointList): Creates InsertionPoint list
+ if it's not created and return it.
+ (WebCore::ContentDistributor::distribute): Traverse InsertionPointList instead of all descendent nodes in Shadow DOM.
+ (WebCore::ContentDistributor::invalidate): ditto.
+ * html/shadow/ContentDistributor.h:
+ (WebCore::ShadowRootContentDistributionData::incrementNumberOfShadowElementChildren): Invalidate InsertionPointList cache.
+ (WebCore::ShadowRootContentDistributionData::decrementNumberOfShadowElementChildren): ditto.
+ (WebCore::ShadowRootContentDistributionData::incrementNumberOfContentElementChildren): ditto.
+ (WebCore::ShadowRootContentDistributionData::decrementNumberOfContentElementChildren): ditto.
+ (ShadowRootContentDistributionData):
+
2012-11-28 Michael Pruett <mich...@68k.org>
IndexedDB: Remove duplicate toWireString() and createFromWire() methods in JSC SerializedScriptValue
Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (136097 => 136098)
--- trunk/Source/WebCore/dom/ShadowRoot.cpp 2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp 2012-11-29 06:23:58 UTC (rev 136098)
@@ -312,6 +312,14 @@
owner()->invalidateDistribution();
}
+const Vector<InsertionPoint*>& ShadowRoot::insertionPointList()
+{
+ typedef Vector<InsertionPoint*> InsertionPointVector;
+ DEFINE_STATIC_LOCAL(InsertionPointVector, emptyVector, ());
+
+ return distributionData() ? distributionData()->ensureInsertionPointList(this) : emptyVector;
+}
+
void ShadowRoot::registerScopedHTMLStyleChild()
{
++m_numberOfStyles;
Modified: trunk/Source/WebCore/dom/ShadowRoot.h (136097 => 136098)
--- trunk/Source/WebCore/dom/ShadowRoot.h 2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/dom/ShadowRoot.h 2012-11-29 06:23:58 UTC (rev 136098)
@@ -104,6 +104,8 @@
bool hasElementShadow() const;
unsigned countElementShadow() const;
+ const Vector<InsertionPoint*>& insertionPointList();
+
virtual void registerScopedHTMLStyleChild() OVERRIDE;
virtual void unregisterScopedHTMLStyleChild() OVERRIDE;
Modified: trunk/Source/WebCore/html/shadow/ContentDistributor.cpp (136097 => 136098)
--- trunk/Source/WebCore/html/shadow/ContentDistributor.cpp 2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/html/shadow/ContentDistributor.cpp 2012-11-29 06:23:58 UTC (rev 136098)
@@ -63,10 +63,35 @@
, m_numberOfShadowElementChildren(0)
, m_numberOfContentElementChildren(0)
, m_numberOfElementShadowChildren(0)
+ , m_insertionPointListIsValid(false)
{
}
+void ShadowRootContentDistributionData::invalidateInsertionPointList()
+{
+ m_insertionPointListIsValid = false;
+ m_insertionPointList.clear();
+}
+const Vector<InsertionPoint*>& ShadowRootContentDistributionData::ensureInsertionPointList(ShadowRoot* shadowRoot)
+{
+ if (m_insertionPointListIsValid)
+ return m_insertionPointList;
+
+ m_insertionPointListIsValid = true;
+ ASSERT(m_insertionPointList.isEmpty());
+
+ if (!shadowRoot->hasInsertionPoint())
+ return m_insertionPointList;
+
+ for (Node* node = shadowRoot; node; node = node->traverseNextNode(shadowRoot)) {
+ if (node->isInsertionPoint())
+ m_insertionPointList.append(toInsertionPoint(node));
+ }
+
+ return m_insertionPointList;
+}
+
ContentDistributor::ContentDistributor()
: m_validity(Undetermined)
{
@@ -116,17 +141,18 @@
for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) {
HTMLShadowElement* firstActiveShadowInsertionPoint = 0;
- for (Node* node = root; node; node = node->traverseNextNode(root)) {
- if (!isActiveInsertionPoint(node))
+ const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList();
+ for (size_t i = 0; i < insertionPoints.size(); ++i) {
+ InsertionPoint* point = insertionPoints[i];
+ if (!point->isActive())
continue;
- InsertionPoint* point = toInsertionPoint(node);
- if (isHTMLShadowElement(node)) {
+ if (isHTMLShadowElement(point)) {
if (!firstActiveShadowInsertionPoint)
- firstActiveShadowInsertionPoint = toHTMLShadowElement(node);
+ firstActiveShadowInsertionPoint = toHTMLShadowElement(point);
} else {
distributeSelectionsTo(point, pool, distributed);
- if (ElementShadow* shadow = node->parentNode()->isElementNode() ? toElement(node->parentNode())->shadow() : 0)
+ if (ElementShadow* shadow = point->parentNode()->isElementNode() ? toElement(point->parentNode())->shadow() : 0)
shadow->invalidateDistribution();
}
}
@@ -157,13 +183,10 @@
for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) {
root->setAssignedTo(0);
-
- for (Node* node = root; node; node = node->traverseNextNode(root)) {
- if (!node->isInsertionPoint())
- continue;
+ const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList();
+ for (size_t i = 0; i < insertionPoints.size(); ++i) {
needsReattach = needsReattach || true;
- InsertionPoint* point = toInsertionPoint(node);
- point->clearDistribution();
+ insertionPoints[i]->clearDistribution();
}
}
Modified: trunk/Source/WebCore/html/shadow/ContentDistributor.h (136097 => 136098)
--- trunk/Source/WebCore/html/shadow/ContentDistributor.h 2012-11-29 06:21:20 UTC (rev 136097)
+++ trunk/Source/WebCore/html/shadow/ContentDistributor.h 2012-11-29 06:23:58 UTC (rev 136098)
@@ -75,12 +75,12 @@
InsertionPoint* insertionPointAssignedTo() const { return m_insertionPointAssignedTo; }
void setInsertionPointAssignedTo(InsertionPoint* insertionPoint) { m_insertionPointAssignedTo = insertionPoint; }
- void incrementNumberOfShadowElementChildren() { ++m_numberOfShadowElementChildren; }
- void decrementNumberOfShadowElementChildren() { ASSERT(m_numberOfShadowElementChildren > 0); --m_numberOfShadowElementChildren; }
+ void incrementNumberOfShadowElementChildren() { ++m_numberOfShadowElementChildren; invalidateInsertionPointList(); }
+ void decrementNumberOfShadowElementChildren() { ASSERT(m_numberOfShadowElementChildren > 0); --m_numberOfShadowElementChildren; invalidateInsertionPointList(); }
bool hasShadowElementChildren() const { return m_numberOfShadowElementChildren > 0; }
- void incrementNumberOfContentElementChildren() { ++m_numberOfContentElementChildren; }
- void decrementNumberOfContentElementChildren() { ASSERT(m_numberOfContentElementChildren > 0); --m_numberOfContentElementChildren; }
+ void incrementNumberOfContentElementChildren() { ++m_numberOfContentElementChildren; invalidateInsertionPointList(); }
+ void decrementNumberOfContentElementChildren() { ASSERT(m_numberOfContentElementChildren > 0); --m_numberOfContentElementChildren; invalidateInsertionPointList(); }
bool hasContentElementChildren() const { return m_numberOfContentElementChildren > 0; }
void incrementNumberOfElementShadowChildren() { ++m_numberOfElementShadowChildren; }
@@ -88,11 +88,16 @@
unsigned numberOfElementShadowChildren() const { return m_numberOfElementShadowChildren; }
bool hasElementShadowChildren() const { return m_numberOfElementShadowChildren > 0; }
+ void invalidateInsertionPointList();
+ const Vector<InsertionPoint*>& ensureInsertionPointList(ShadowRoot*);
+
private:
InsertionPoint* m_insertionPointAssignedTo;
unsigned m_numberOfShadowElementChildren;
unsigned m_numberOfContentElementChildren;
unsigned m_numberOfElementShadowChildren;
+ bool m_insertionPointListIsValid;
+ Vector<InsertionPoint*> m_insertionPointList;
};
class ContentDistributor {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes