mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] concurrency: do not render delayed fibers when cancelled
Previously, if a fiber was delayed because one of its ancestors was rendering, and that fiber was not a root fiber, it would be rendered after all its ancestors had finished rendering even if one of those ancestor renderings cancelled it. This commit fixes that by simply checking that a delayed fiber is still its component node's current fiber before rendering it.
This commit is contained in:
committed by
Géry Debongnie
parent
41344ef4ec
commit
41f1262eb7
@@ -42,6 +42,10 @@ export function makeRootFiber(node: ComponentNode): Fiber {
|
||||
return fiber;
|
||||
}
|
||||
|
||||
function throwOnRender() {
|
||||
throw new Error("Attempted to render cancelled fiber");
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns number of not-yet rendered fibers cancelled
|
||||
*/
|
||||
@@ -49,6 +53,7 @@ function cancelFibers(fibers: Fiber[]): number {
|
||||
let result = 0;
|
||||
for (let fiber of fibers) {
|
||||
let node = fiber.node;
|
||||
fiber.render = throwOnRender;
|
||||
if (node.status === STATUS.NEW) {
|
||||
node.destroy();
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ export class Scheduler {
|
||||
let renders = this.delayedRenders;
|
||||
this.delayedRenders = [];
|
||||
for (let f of renders) {
|
||||
if (f.root && f.node.status !== STATUS.DESTROYED) {
|
||||
if (f.root && f.node.status !== STATUS.DESTROYED && f.node.fiber === f) {
|
||||
f.render();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user