LibWeb: Fix endless spinning in apply_the_history_step()

While waiting for a task that populates a session history entry, we
can't limit the processing of the event loop to the
`NavigationAndTraversal` task source. This is because fetching uses the
`Networking` task source, which also needs to be processed.

Since making a fetch request might take some time, we want to process
everything on the event loop while waiting, to avoid blocking user
interactions.

It is still possible to use `spin_processing_tasks_with_source_until()`
on subsequent steps of `apply_the_history_step()`.

Also modifies test that was flaky.
This commit is contained in:
Aliaksandr Kalenik 2024-03-25 19:08:27 +01:00 committed by Andreas Kling
parent baf589deef
commit 609a72f7c7
3 changed files with 17 additions and 13 deletions

View file

@ -1,12 +1,16 @@
<script src="../include.js"></script>
<div id="foo">
<iframe></iframe>
<script>
setTimeout(function () {
foo.remove();
// Pass (didn't crash)
internals.signalTextTestIsDone();
<script src="../include.js"></script><div id="foo"><iframe></iframe><script>
setTimeout(function () {
foo.remove();
window.done = true;
}, 0);
</script></div><iframe></iframe><script>
asyncTest(function (done) {
let internalId;
internalId = setInterval(function () {
if (window.done) {
clearInterval(internalId);
done();
}
}, 0);
</script>
</div>
<iframe></iframe>
});
</script>PASS: did not crash

View file

@ -572,7 +572,7 @@ TraversableNavigable::HistoryStepResult TraversableNavigable::apply_the_history_
// AD-HOC: Since currently populate_session_history_entry_document does not run in parallel
// we call spin_until to interrupt execution of this function and let document population
// to complete.
main_thread_event_loop().spin_processing_tasks_with_source_until(Task::Source::NavigationAndTraversal, [&] {
main_thread_event_loop().spin_until([&] {
return !changing_navigable_continuations.is_empty() || completed_change_jobs == total_change_jobs;
});