| Index: third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp b/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp
 | 
| index fca3fa5350e6904cfe7b4fb92341a08506f50ccc..44274a29c1a4add2cce6e37d51527076f286a0a9 100644
 | 
| --- a/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp
 | 
| +++ b/third_party/WebKit/Source/core/dom/shadow/SlotAssignment.cpp
 | 
| @@ -35,7 +35,8 @@ void SlotAssignment::resolveAssignment(ShadowRoot& shadowRoot)
 | 
|      const HeapVector<Member<HTMLSlotElement>>& slots = shadowRoot.descendantSlots();
 | 
|  
 | 
|      for (Member<HTMLSlotElement> slot : slots) {
 | 
| -        slot->willUpdateDistribution();
 | 
| +        slot->willUpdateAssignment();
 | 
| +        slot->willUpdateFallback();
 | 
|          name2slot.add(slot->name(), slot.get());
 | 
|      }
 | 
|  
 | 
| @@ -57,6 +58,27 @@ void SlotAssignment::resolveAssignment(ShadowRoot& shadowRoot)
 | 
|              detachNotAssignedNode(child);
 | 
|      }
 | 
|  
 | 
| +    for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot)
 | 
| +        (*slot)->updateFallbackNodes();
 | 
| +
 | 
| +    // For each slot, check if assigned nodes have changed
 | 
| +    // If so, call fireSlotchange function
 | 
| +    for (const auto& slot : slots)
 | 
| +        slot->didUpdateAssignment();
 | 
| +}
 | 
| +
 | 
| +void SlotAssignment::resolveDistribution(ShadowRoot& shadowRoot)
 | 
| +{
 | 
| +    const HeapVector<Member<HTMLSlotElement>>& slots = shadowRoot.descendantSlots();
 | 
| +    for (Member<HTMLSlotElement> slot : slots) {
 | 
| +        slot->willUpdateDistribution();
 | 
| +    }
 | 
| +
 | 
| +    for (auto slot : slots) {
 | 
| +        for (auto node : slot->assignedNodes())
 | 
| +            distribute(*node, *slot);
 | 
| +    }
 | 
| +
 | 
|      // Update each slot's distribution in reverse tree order so that a child slot is visited before its parent slot.
 | 
|      for (auto slot = slots.rbegin(); slot != slots.rend(); ++slot)
 | 
|          (*slot)->updateDistributedNodesWithFallback();
 | 
| @@ -69,10 +91,16 @@ void SlotAssignment::assign(Node& hostChild, HTMLSlotElement& slot)
 | 
|      DCHECK(hostChild.isSlotAssignable());
 | 
|      m_assignment.add(&hostChild, &slot);
 | 
|      slot.appendAssignedNode(hostChild);
 | 
| +}
 | 
| +
 | 
| +void SlotAssignment::distribute(Node& hostChild, HTMLSlotElement& slot)
 | 
| +{
 | 
| +    DCHECK(hostChild.isSlotAssignable());
 | 
|      if (isHTMLSlotElement(hostChild))
 | 
|          slot.appendDistributedNodesFrom(toHTMLSlotElement(hostChild));
 | 
|      else
 | 
|          slot.appendDistributedNode(hostChild);
 | 
| +
 | 
|      if (slot.isChildOfV1ShadowHost())
 | 
|          slot.parentElementShadow()->setNeedsDistributionRecalc();
 | 
|  }
 | 
| 
 |