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
--HG--
extra : rebase_source : 016d3c37e0679df7037dacd3366d3fa7748d0703
extra : amend_source : 089c4a62bd4716be087669742bb542c39a9f97c6
- 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
--HG--
extra : commitid : JSMoSuDetUL
extra : rebase_source : 6ef99b1d6dac841eb94d99feb605ca235d9086c9
extra : amend_source : 518a636ee5a5162bca83dde6b90cb1a3b5304a3b
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).
--HG--
extra : source : 6d2572c274363c7544c4f96f0016fead098b157e
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.
--HG--
extra : rebase_source : e7a740a9833ba49b1d41849bb43ce9077d42bc07
extra : source : ef6f195f2259e103f0c1979a5f4ebb5a8601b15d