text: // Copyright 2014 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef CompositingInputsUpdater_h
  #define CompositingInputsUpdater_h
  
  #include "core/layout/LayoutGeometryMap.h"
  #include "wtf/Allocator.h"
  
  namespace blink {
  
  class PaintLayer;
  
  class CompositingInputsUpdater {
      STACK_ALLOCATED();
  public:
      explicit CompositingInputsUpdater(PaintLayer* rootLayer);
      ~CompositingInputsUpdater();
  
      void update();
  
  #if ENABLE(ASSERT)
      static void assertNeedsCompositingInputsUpdateBitsCleared(PaintLayer*);
  #endif
  
  private:
      enum UpdateType {
          DoNotForceUpdate,
          ForceUpdate,
      };
  
      struct AncestorInfo {
          AncestorInfo()
              : ancestorStackingContext(nullptr)
              , enclosingCompositedLayer(nullptr)
              , lastScrollingAncestor(nullptr)
              , hasAncestorWithClipRelatedProperty(false)
              , hasAncestorWithClipPath(false)
          {
          }
  
          PaintLayer* ancestorStackingContext;
          PaintLayer* enclosingCompositedLayer;
          // Notice that lastScrollingAncestor isn't the same thing as
          // ancestorScrollingLayer. The former is just the nearest scrolling
          // along the PaintLayer::parent() chain. The latter is the layer that
          // actually controls the scrolling of this layer, which we find on the
          // containing block chain.
          PaintLayer* lastScrollingAncestor;
          bool hasAncestorWithClipRelatedProperty;
          bool hasAncestorWithClipPath;
      };
  
      void updateRecursive(PaintLayer*, UpdateType, AncestorInfo);
  
      LayoutGeometryMap m_geometryMap;
      PaintLayer* m_rootLayer;
  };
  
  } // namespace blink
  
  #endif // CompositingInputsUpdater_h
  