blob: a12a5c9c86bd8b35bf2d5703b1d82ae3dc960814 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_DepthOrderedFrameList_h
#define mozilla_DepthOrderedFrameList_h
#include "mozilla/ReverseIterator.h"
#include "nsTArray.h"
class nsIFrame;
namespace mozilla {
class DepthOrderedFrameList {
public:
// Add a dirty root.
void Add(nsIFrame* aFrame);
// Remove this frame if present.
void Remove(nsIFrame* aFrame);
// Remove and return one of the shallowest dirty roots from the list.
// (If two roots are at the same depth, order is indeterminate.)
nsIFrame* PopShallowestRoot();
// Remove all dirty roots.
void Clear() { mList.Clear(); }
// Is this frame one of the elements in the list?
bool Contains(nsIFrame* aFrame) const { return mList.Contains(aFrame); }
// Are there no elements?
bool IsEmpty() const { return mList.IsEmpty(); }
// Is the given frame an ancestor of any dirty root?
bool FrameIsAncestorOfAnyElement(nsIFrame* aFrame) const;
auto IterFromShallowest() const { return Reversed(mList); }
private:
struct FrameAndDepth {
nsIFrame* mFrame;
const uint32_t mDepth;
// Easy conversion to nsIFrame*, as it's the most likely need.
operator nsIFrame*() const { return mFrame; }
// Used to sort by reverse depths, i.e., deeper < shallower.
class CompareByReverseDepth {
public:
bool Equals(const FrameAndDepth& aA, const FrameAndDepth& aB) const {
return aA.mDepth == aB.mDepth;
}
bool LessThan(const FrameAndDepth& aA, const FrameAndDepth& aB) const {
// Reverse depth! So '>' instead of '<'.
return aA.mDepth > aB.mDepth;
}
};
};
// List of all known dirty roots, sorted by decreasing depths.
nsTArray<FrameAndDepth> mList;
};
} // namespace mozilla
#endif
|