Bug 1572084 - Part 1: Add enhanced Browsing Context traversal. r=nika

Make it possible to skip sub-trees in traversals, and abort traversals
entirely.

Differential Revision: https://phabricator.services.mozilla.com/D107813
This commit is contained in:
Andreas Farre
2021-03-25 15:36:37 +00:00
parent b36490588e
commit 4e4e2103dd
2 changed files with 60 additions and 3 deletions

View File

@@ -974,7 +974,7 @@ void BrowsingContext::UnregisterWindowContext(WindowContext* aWindow) {
}
}
void BrowsingContext::PreOrderWalk(
void BrowsingContext::PreOrderWalkVoid(
const std::function<void(BrowsingContext*)>& aCallback) {
aCallback(this);
@@ -982,10 +982,37 @@ void BrowsingContext::PreOrderWalk(
children.AppendElements(Children());
for (auto& child : children) {
child->PreOrderWalk(aCallback);
child->PreOrderWalkVoid(aCallback);
}
}
BrowsingContext::WalkFlag BrowsingContext::PreOrderWalkFlag(
const std::function<WalkFlag(BrowsingContext*)>& aCallback) {
switch (aCallback(this)) {
case WalkFlag::Skip:
return WalkFlag::Next;
case WalkFlag::Stop:
return WalkFlag::Stop;
case WalkFlag::Next:
default:
break;
}
AutoTArray<RefPtr<BrowsingContext>, 8> children;
children.AppendElements(Children());
for (auto& child : children) {
switch (child->PreOrderWalkFlag(aCallback)) {
case WalkFlag::Stop:
return WalkFlag::Stop;
default:
break;
}
}
return WalkFlag::Next;
}
void BrowsingContext::PostOrderWalk(
const std::function<void(BrowsingContext*)>& aCallback) {
AutoTArray<RefPtr<BrowsingContext>, 8> children;