diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:35:37 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:35:37 +0000 |
commit | a90a5cba08fdf6c0ceb95101c275108a152a3aed (patch) | |
tree | 532507288f3defd7f4dcf1af49698bcb76034855 /layout/base/RestyleManager.cpp | |
parent | Adding debian version 126.0.1-1. (diff) | |
download | firefox-a90a5cba08fdf6c0ceb95101c275108a152a3aed.tar.xz firefox-a90a5cba08fdf6c0ceb95101c275108a152a3aed.zip |
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/base/RestyleManager.cpp')
-rw-r--r-- | layout/base/RestyleManager.cpp | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 81ffebf89a..e00493467f 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -3246,6 +3246,12 @@ void RestyleManager::DoProcessPendingRestyles(ServoTraversalFlags aFlags) { // construction). nsTArray<RefPtr<Element>> anchorsToSuppress; + // Unfortunately, the frame constructor and ProcessPostTraversal can + // generate new change hints while processing existing ones. We redirect + // those into a secondary queue and iterate until there's nothing left. + ReentrantChangeList newChanges; + mReentrantChanges = &newChanges; + { DocumentStyleRootIterator iter(doc->GetServoRestyleRoot()); while (Element* root = iter.GetNextStyleRoot()) { @@ -3271,34 +3277,26 @@ void RestyleManager::DoProcessPendingRestyles(ServoTraversalFlags aFlags) { doc->ClearServoRestyleRoot(); ClearSnapshots(); - // Process the change hints. - // - // Unfortunately, the frame constructor can generate new change hints while - // processing existing ones. We redirect those into a secondary queue and - // iterate until there's nothing left. - { - ReentrantChangeList newChanges; - mReentrantChanges = &newChanges; - while (!currentChanges.IsEmpty()) { - ProcessRestyledFrames(currentChanges); - MOZ_ASSERT(currentChanges.IsEmpty()); - for (ReentrantChange& change : newChanges) { - if (!(change.mHint & nsChangeHint_ReconstructFrame) && - !change.mContent->GetPrimaryFrame()) { - // SVG Elements post change hints without ensuring that the primary - // frame will be there after that (see bug 1366142). - // - // Just ignore those, since we can't really process them. - continue; - } - currentChanges.AppendChange(change.mContent->GetPrimaryFrame(), - change.mContent, change.mHint); + while (!currentChanges.IsEmpty()) { + ProcessRestyledFrames(currentChanges); + MOZ_ASSERT(currentChanges.IsEmpty()); + for (ReentrantChange& change : newChanges) { + if (!(change.mHint & nsChangeHint_ReconstructFrame) && + !change.mContent->GetPrimaryFrame()) { + // SVG Elements post change hints without ensuring that the primary + // frame will be there after that (see bug 1366142). + // + // Just ignore those, since we can't really process them. + continue; } - newChanges.Clear(); + currentChanges.AppendChange(change.mContent->GetPrimaryFrame(), + change.mContent, change.mHint); } - mReentrantChanges = nullptr; + newChanges.Clear(); } + mReentrantChanges = nullptr; + // Suppress adjustments in the after-change scroll anchors if needed, now // that we're done reframing everything. for (Element* element : anchorsToSuppress) { |