| Index: Source/core/dom/shadow/ElementShadow.cpp
|
| diff --git a/Source/core/dom/shadow/ElementShadow.cpp b/Source/core/dom/shadow/ElementShadow.cpp
|
| index 158addd3d0da4180463f8863a020789d291d6a10..249110600fd6d22051ae404d51fa5f4bd6845ab2 100644
|
| --- a/Source/core/dom/shadow/ElementShadow.cpp
|
| +++ b/Source/core/dom/shadow/ElementShadow.cpp
|
| @@ -40,26 +40,34 @@ namespace WebCore {
|
|
|
| class DistributionPool {
|
| public:
|
| - explicit DistributionPool(const ContainerNode*);
|
| + explicit DistributionPool(const ContainerNode&);
|
| + void clear();
|
| ~DistributionPool();
|
| void distributeTo(InsertionPoint*, ElementShadow*);
|
| + void populateChildren(const ContainerNode&);
|
|
|
| private:
|
| - void populateChildren(const ContainerNode*);
|
| void detachNonDistributedNodes();
|
| Vector<Node*, 32> m_nodes;
|
| Vector<bool, 32> m_distributed;
|
| };
|
|
|
| -inline DistributionPool::DistributionPool(const ContainerNode* parent)
|
| +inline DistributionPool::DistributionPool(const ContainerNode& parent)
|
| {
|
| - if (parent)
|
| - populateChildren(parent);
|
| + populateChildren(parent);
|
| }
|
|
|
| -inline void DistributionPool::populateChildren(const ContainerNode* parent)
|
| +inline void DistributionPool::clear()
|
| {
|
| - for (Node* child = parent->firstChild(); child; child = child->nextSibling()) {
|
| + detachNonDistributedNodes();
|
| + m_nodes.clear();
|
| + m_distributed.clear();
|
| +}
|
| +
|
| +inline void DistributionPool::populateChildren(const ContainerNode& parent)
|
| +{
|
| + clear();
|
| + for (Node* child = parent.firstChild(); child; child = child->nextSibling()) {
|
| if (isActiveInsertionPoint(*child)) {
|
| InsertionPoint* insertionPoint = toInsertionPoint(child);
|
| for (size_t i = 0; i < insertionPoint->size(); ++i)
|
| @@ -255,13 +263,10 @@ const DestinationInsertionPoints* ElementShadow::destinationInsertionPointsFor(c
|
| void ElementShadow::distribute()
|
| {
|
| host()->setNeedsStyleRecalc();
|
| -
|
| - const ContainerNode* poolContainer = host();
|
| -
|
| Vector<HTMLShadowElement*, 32> shadowInsertionPoints;
|
| - for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
|
| - DistributionPool pool(poolContainer);
|
| + DistributionPool pool(*host());
|
|
|
| + for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
|
| HTMLShadowElement* shadowInsertionPoint = 0;
|
| const Vector<RefPtr<InsertionPoint> >& insertionPoints = root->descendantInsertionPoints();
|
| for (size_t i = 0; i < insertionPoints.size(); ++i) {
|
| @@ -277,9 +282,13 @@ void ElementShadow::distribute()
|
| shadow->setNeedsDistributionRecalc();
|
| }
|
| }
|
| - if (shadowInsertionPoint)
|
| + if (shadowInsertionPoint) {
|
| shadowInsertionPoints.append(shadowInsertionPoint);
|
| - poolContainer = shadowInsertionPoint;
|
| + if (shadowInsertionPoint->hasChildNodes())
|
| + pool.populateChildren(*shadowInsertionPoint);
|
| + } else if (!root->isOldest()) {
|
| + pool.clear();
|
| + }
|
| }
|
|
|
| for (size_t i = shadowInsertionPoints.size(); i > 0; --i) {
|
| @@ -292,7 +301,8 @@ void ElementShadow::distribute()
|
| distributeNodeChildrenTo(shadowInsertionPoint, root->olderShadowRoot());
|
| root->olderShadowRoot()->setShadowInsertionPointOfYoungerShadowRoot(shadowInsertionPoint);
|
| } else if (root->isOldest()) {
|
| - DistributionPool pool(shadowInsertionPoint);
|
| + if (shadowInsertionPoint->hasChildNodes())
|
| + pool.populateChildren(*shadowInsertionPoint);
|
| pool.distributeTo(shadowInsertionPoint, this);
|
| }
|
| if (ElementShadow* shadow = shadowWhereNodeCanBeDistributed(*shadowInsertionPoint))
|
| @@ -308,7 +318,7 @@ void ElementShadow::didDistributeNode(const Node* node, InsertionPoint* insertio
|
|
|
| void ElementShadow::distributeNodeChildrenTo(InsertionPoint* insertionPoint, ContainerNode* containerNode)
|
| {
|
| - DistributionPool pool(containerNode);
|
| + DistributionPool pool(*containerNode);
|
| pool.distributeTo(insertionPoint, this);
|
| }
|
|
|
|
|