| Index: third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h
 | 
| diff --git a/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h b/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h
 | 
| index db4a10fc8ac59c823deef4a039b0a67c18121fa2..3edd1f32d6b37c239d1f80a7101749210b99f7b3 100644
 | 
| --- a/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h
 | 
| +++ b/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h
 | 
| @@ -5,14 +5,16 @@
 | 
|  #ifndef StyleInvalidator_h
 | 
|  #define StyleInvalidator_h
 | 
|  
 | 
| +#include "core/css/invalidation/PendingInvalidations.h"
 | 
|  #include "platform/heap/Handle.h"
 | 
|  #include "wtf/Noncopyable.h"
 | 
|  
 | 
|  namespace blink {
 | 
|  
 | 
| -class InvalidationSet;
 | 
|  class Document;
 | 
|  class Element;
 | 
| +class InvalidationSet;
 | 
| +
 | 
|  
 | 
|  class StyleInvalidator {
 | 
|      DISALLOW_ALLOCATION();
 | 
| @@ -21,11 +23,9 @@ public:
 | 
|      StyleInvalidator();
 | 
|      ~StyleInvalidator();
 | 
|      void invalidate(Document&);
 | 
| -    void scheduleInvalidation(PassRefPtr<InvalidationSet>, Element&);
 | 
| +    void scheduleInvalidationSetsForElement(const InvalidationLists&, Element&);
 | 
|      void clearInvalidation(Element&);
 | 
|  
 | 
| -    void clearPendingInvalidations();
 | 
| -
 | 
|      DECLARE_TRACE();
 | 
|  
 | 
|  private:
 | 
| @@ -37,8 +37,8 @@ private:
 | 
|              , m_insertionPointCrossing(false)
 | 
|          { }
 | 
|  
 | 
| -        void pushInvalidationSet(const InvalidationSet&);
 | 
| -        bool matchesCurrentInvalidationSets(Element&);
 | 
| +        void pushInvalidationSet(const DescendantInvalidationSet&);
 | 
| +        bool matchesCurrentInvalidationSets(Element&) const;
 | 
|          bool hasInvalidationSets() const { return !wholeSubtreeInvalid() && m_invalidationSets.size(); }
 | 
|  
 | 
|          bool wholeSubtreeInvalid() const { return m_wholeSubtreeInvalid; }
 | 
| @@ -47,17 +47,45 @@ private:
 | 
|          bool treeBoundaryCrossing() const { return m_treeBoundaryCrossing; }
 | 
|          bool insertionPointCrossing() const { return m_insertionPointCrossing; }
 | 
|  
 | 
| -        using InvalidationSets = Vector<const InvalidationSet*, 16>;
 | 
| -        InvalidationSets m_invalidationSets;
 | 
| +        using DescendantInvalidationSets = Vector<const DescendantInvalidationSet*, 16>;
 | 
| +        DescendantInvalidationSets m_invalidationSets;
 | 
|          bool m_invalidateCustomPseudo;
 | 
|          bool m_wholeSubtreeInvalid;
 | 
|          bool m_treeBoundaryCrossing;
 | 
|          bool m_insertionPointCrossing;
 | 
|      };
 | 
|  
 | 
| -    bool invalidate(Element&, RecursionData&);
 | 
| +    class SiblingData {
 | 
| +        STACK_ALLOCATED();
 | 
| +    public:
 | 
| +        SiblingData()
 | 
| +            : m_elementIndex(0)
 | 
| +        { }
 | 
| +
 | 
| +        void pushInvalidationSet(const SiblingInvalidationSet&);
 | 
| +        bool matchCurrentInvalidationSets(Element&, RecursionData&);
 | 
| +
 | 
| +        void advance() { m_elementIndex++; }
 | 
| +
 | 
| +    private:
 | 
| +        struct Entry {
 | 
| +            ALLOW_ONLY_INLINE_ALLOCATION();
 | 
| +            Entry(const SiblingInvalidationSet* invalidationSet, unsigned invalidationLimit)
 | 
| +                : m_invalidationSet(invalidationSet)
 | 
| +                , m_invalidationLimit(invalidationLimit)
 | 
| +            {}
 | 
| +
 | 
| +            const SiblingInvalidationSet* m_invalidationSet;
 | 
| +            unsigned m_invalidationLimit;
 | 
| +        };
 | 
| +
 | 
| +        Vector<Entry, 16> m_invalidationEntries;
 | 
| +        unsigned m_elementIndex;
 | 
| +    };
 | 
| +
 | 
| +    bool invalidate(Element&, RecursionData&, SiblingData&);
 | 
|      bool invalidateChildren(Element&, RecursionData&);
 | 
| -    bool checkInvalidationSetsAgainstElement(Element&, RecursionData&);
 | 
| +    bool checkInvalidationSetsAgainstElement(Element&, RecursionData&, SiblingData&);
 | 
|  
 | 
|      class RecursionCheckpoint {
 | 
|      public:
 | 
| @@ -87,10 +115,9 @@ private:
 | 
|          RecursionData* m_data;
 | 
|      };
 | 
|  
 | 
| -    using InvalidationList = Vector<RefPtr<InvalidationSet>>;
 | 
| -    using PendingInvalidationMap = WillBeHeapHashMap<RawPtrWillBeMember<Element>, OwnPtr<InvalidationList>>;
 | 
| +    using PendingInvalidationMap = WillBeHeapHashMap<RawPtrWillBeMember<Element>, OwnPtr<PendingInvalidations>>;
 | 
|  
 | 
| -    InvalidationList& ensurePendingInvalidationList(Element&);
 | 
| +    PendingInvalidations& ensurePendingInvalidations(Element&);
 | 
|  
 | 
|      PendingInvalidationMap m_pendingInvalidationMap;
 | 
|  };
 | 
| 
 |