Commit d31f4467 authored by Miko Mynttinen's avatar Miko Mynttinen
Browse files

Bug 1549751 - Part 1: Add nsDisplayList::Iterator r=mattwoodrow

Differential Revision: https://phabricator.services.mozilla.com/D30224

--HG--
extra : moz-landing-system : lando
parent 93f8b75c
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -1538,7 +1538,7 @@ void nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame,
// A non-blank paint is a paint that does not just contain the canvas
// background.
static bool DisplayListIsNonBlank(nsDisplayList* aList) {
  for (nsDisplayItem* i = aList->GetBottom(); i != nullptr; i = i->GetAbove()) {
  for (nsDisplayItem* i : *aList) {
    switch (i->GetType()) {
      case DisplayItemType::TYPE_COMPOSITOR_HITTEST_INFO:
      case DisplayItemType::TYPE_CANVAS_BACKGROUND_COLOR:
@@ -1566,7 +1566,7 @@ static bool DisplayListIsNonBlank(nsDisplayList* aList) {
// includes text with pending webfonts. This is the first time users
// could start consuming page content."
static bool DisplayListIsContentful(nsDisplayList* aList) {
  for (nsDisplayItem* i = aList->GetBottom(); i != nullptr; i = i->GetAbove()) {
  for (nsDisplayItem* i : *aList) {
    DisplayItemType type = i->GetType();
    nsDisplayList* children = i->GetChildren();

@@ -2426,7 +2426,7 @@ static void MoveListTo(nsDisplayList* aList,

nsRect nsDisplayList::GetBounds(nsDisplayListBuilder* aBuilder) const {
  nsRect bounds;
  for (nsDisplayItem* i = GetBottom(); i != nullptr; i = i->GetAbove()) {
  for (nsDisplayItem* i : *this) {
    bounds.UnionRect(bounds, i->GetClippedBounds(aBuilder));
  }
  return bounds;
@@ -2436,7 +2436,7 @@ nsRect nsDisplayList::GetClippedBoundsWithRespectToASR(
    nsDisplayListBuilder* aBuilder, const ActiveScrolledRoot* aASR,
    nsRect* aBuildingRect) const {
  nsRect bounds;
  for (nsDisplayItem* i = GetBottom(); i != nullptr; i = i->GetAbove()) {
  for (nsDisplayItem* i : *this) {
    nsRect r = i->GetClippedBounds(aBuilder);
    if (aASR != i->GetActiveScrolledRoot() && !r.IsEmpty()) {
      if (Maybe<nsRect> clip = i->GetClipWithRespectToASR(aBuilder, aASR)) {
@@ -2453,7 +2453,7 @@ nsRect nsDisplayList::GetClippedBoundsWithRespectToASR(

nsRect nsDisplayList::GetBuildingRect() const {
  nsRect result;
  for (nsDisplayItem* i = GetBottom(); i != nullptr; i = i->GetAbove()) {
  for (nsDisplayItem* i : *this) {
    result.UnionRect(result, i->GetBuildingRect());
  }
  return result;
@@ -3013,7 +3013,7 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,

  if (aState->mInPreserves3D) {
    // Collect leaves of the current 3D rendering context.
    for (item = GetBottom(); item; item = item->GetAbove()) {
    for (nsDisplayItem* item : *this) {
      auto itemType = item->GetType();
      if (itemType != DisplayItemType::TYPE_TRANSFORM ||
          !static_cast<nsDisplayTransform*>(item)->IsLeafOf3DContext()) {
@@ -3027,7 +3027,7 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
  }

  int32_t itemBufferStart = aState->mItemBuffer.Length();
  for (item = GetBottom(); item; item = item->GetAbove()) {
  for (nsDisplayItem* item : *this) {
    aState->mItemBuffer.AppendElement(item);
  }

@@ -5825,7 +5825,7 @@ static LayerState RequiredLayerStateForChildren(
    const ContainerLayerParameters& aParameters, const nsDisplayList& aList,
    AnimatedGeometryRoot* aExpectedAnimatedGeometryRootForChildren) {
  LayerState result = LAYER_INACTIVE;
  for (nsDisplayItem* i = aList.GetBottom(); i; i = i->GetAbove()) {
  for (nsDisplayItem* i : aList) {
    if (result == LAYER_INACTIVE &&
        i->GetAnimatedGeometryRoot() !=
            aExpectedAnimatedGeometryRootForChildren) {
@@ -6065,7 +6065,7 @@ static bool CollectItemsWithOpacity(nsDisplayList* aList,
    return false;
  }

  for (nsDisplayItem* i = aList->GetBottom(); i; i = i->GetAbove()) {
  for (nsDisplayItem* i : *aList) {
    const DisplayItemType type = i->GetType();

    // Descend only into wraplists.
@@ -8420,7 +8420,7 @@ void nsDisplayTransform::ComputeBounds(nsDisplayListBuilder* aBuilder) {

  // Do not dive into another 3D context.
  if (!IsLeafOf3DContext()) {
    for (nsDisplayItem* i = GetChildren()->GetBottom(); i; i = i->GetAbove()) {
    for (nsDisplayItem* i : *GetChildren()) {
      i->DoUpdateBoundsPreserves3D(aBuilder);
    }
  }
+37 −2
Original line number Diff line number Diff line
@@ -3180,6 +3180,41 @@ class nsDisplayList {
  typedef mozilla::layers::LayerManager LayerManager;
  typedef mozilla::layers::PaintedLayer PaintedLayer;

  template <typename T>
  class Iterator {
   public:
    Iterator() : mItem(nullptr) {}
    ~Iterator() = default;
    Iterator(const Iterator& aOther) = default;
    Iterator& operator=(const Iterator& aOther) = default;

    explicit Iterator(const nsDisplayList* aList) : mItem(aList->GetBottom()) {}
    explicit Iterator(const nsDisplayItem* aItem) : mItem(aItem) {}

    Iterator& operator++() {
      mItem = mItem ? mItem->GetAbove() : mItem;
      return *this;
    }

    bool operator==(const Iterator& aOther) const {
      return mItem == aOther.mItem;
    }

    bool operator!=(const Iterator& aOther) const {
      return !operator==(aOther);
    }

    T* operator*() { return mItem; }

   private:
    T* mItem;
  };

  using DisplayItemIterator = Iterator<nsDisplayItem>;

  DisplayItemIterator begin() const { return DisplayItemIterator(this); }
  DisplayItemIterator end() const { return DisplayItemIterator(); }

  /**
   * Create an empty list.
   */
@@ -3491,7 +3526,7 @@ class nsDisplayList {
  nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder) {
    nsRegion result;
    bool snap;
    for (nsDisplayItem* item = GetBottom(); item; item = item->GetAbove()) {
    for (nsDisplayItem* item : *this) {
      result.OrWith(item->GetOpaqueRegion(aBuilder, &snap));
    }
    return result;
@@ -3502,7 +3537,7 @@ class nsDisplayList {
   */
  nsRect GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder) const {
    nsRect bounds;
    for (nsDisplayItem* item = GetBottom(); item; item = item->GetAbove()) {
    for (nsDisplayItem* item : *this) {
      bounds.UnionRect(bounds, item->GetComponentAlphaBounds(aBuilder));
    }
    return bounds;