Create an Iterator type with classes ForwardIterator and ReverseIterator,
having GetFirstChild/GetNextSibling and GetLastChild/GetPrevSibling
methods, respectively. Specify the iterator type for each call to
ForEachNode. With this, we can support trees with forward and reverse
sibling structures.
Additionally, apply these algorithms to all Layer recursive traversals,
where applicable. Update tests to ensure both directions yield expected
results.
MozReview-Commit-ID: iYpX22XHTa
- Introduce a more general version of ForEachNode that takes two actions
(pre-action and post-action).
- Express the one-action version of ForEachNode in terms of the two-action
version.
- Add TraversalFlag::Abort, which stops traversal immediately.
- Express DepthFirstSearch in terms of ForEachNode.
- Add ForEachNodePostOrder and DepthFirstSearchPostOrder.
- The new functions are all recursive, and traverse children in the order
provided by the node accessors. Adjust tests to reflect this.
- Refactor two APZCTreeManager functions, FindTargetNode and GetAPZCAtPoint,
to use the algorithms.
MozReview-Commit-ID: 83Y7psjkUWG
Move queue and stack includes outside of mozilla namespace.
Test the following for searches:
- Null root returns null.
- Needle is root returns root.
- No needle results in full traversal.
- Needle node in middle returns that needle, and stops traversing.
Test the following for ForEachNode:
- Null root still runs correctly.
- No skips results in traversal of entire tree.
- Root skip results in only changing the root.
- First skips are still included (whether leaf or parent).
Extend the tree traversal algorithms in TreeTraversal.h, and use them
instead of manual loops in APZCTreeManager.
- Create function ForEachNode(), which calls a function on each node
of a tree. The function must return a TraversalFlag to indicate
whether the node's children should be visited or skipped.
- Modify DepthFirstSearch() and BreadthFirstSearch() to operate on
pointers that are not (necessarily) const. This makes them more
general.
- Refactor functions in APZCTreeManager: Collect, FlushRepaints,
FlushRepaintsRecursively, FlushPendingRepaint,
FlushPendingRepaintRecursively, UpdateZoomConstraints,
UpdateZoomConstraintsRecursively, ClearTree, FindScrollNode.