This commit is contained in:
Géry Debongnie
2022-06-25 09:15:04 +02:00
parent 3fc50462e6
commit f40ffc59d8
5 changed files with 35 additions and 27 deletions
+3 -4
View File
@@ -164,10 +164,9 @@ export class ComponentNode<P extends Props = any, E = any> implements VNode<Comp
async render(deep: boolean) { async render(deep: boolean) {
let current = this.fiber; let current = this.fiber;
if (current && (current.root!.locked )) { if (current && (current.root!.locked || current as any).bdom === true) {
await Promise.resolve(); this.app.scheduler.requestAnimationFrame(() => this.render(deep));
// situation may have changed after the microtask tick return;
current = this.fiber;
} }
if (current) { if (current) {
if (!current.bdom && !fibersInError.has(current)) { if (!current.bdom && !fibersInError.has(current)) {
+1
View File
@@ -56,6 +56,7 @@ function cancelFibers(fibers: Fiber[]): number {
let node = fiber.node; let node = fiber.node;
fiber.render = throwOnRender; fiber.render = throwOnRender;
if (node.status === STATUS.NEW) { if (node.status === STATUS.NEW) {
console.log('asdfasdfsdf')
node.destroy(); node.destroy();
delete node.parent!.children[node.parentKey!]; delete node.parent!.children[node.parentKey!];
} }
@@ -1730,10 +1730,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 3`] =
) { ) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom; let { text, createBlock, list, multi, html, toggler, comment } = bdom;
let block3 = createBlock(\`<p block-handler-0=\\"click\\"><block-text-1/></p>\`); let block3 = createBlock(\`<span block-handler-0=\\"click\\"><block-text-1/></span>\`);
return function template(ctx, node, key = \\"\\") { return function template(ctx, node, key = \\"\\") {
const b2 = text(\`D\`); const b2 = text(\`C\`);
let hdlr1 = [ctx['increment'], ctx]; let hdlr1 = [ctx['increment'], ctx];
let txt1 = ctx['state'].val; let txt1 = ctx['state'].val;
const b3 = block3([hdlr1, txt1]); const b3 = block3([hdlr1, txt1]);
@@ -1747,10 +1747,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 4`] =
) { ) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom; let { text, createBlock, list, multi, html, toggler, comment } = bdom;
let block3 = createBlock(\`<span block-handler-0=\\"click\\"><block-text-1/></span>\`); let block3 = createBlock(\`<p block-handler-0=\\"click\\"><block-text-1/></p>\`);
return function template(ctx, node, key = \\"\\") { return function template(ctx, node, key = \\"\\") {
const b2 = text(\`C\`); const b2 = text(\`D\`);
let hdlr1 = [ctx['increment'], ctx]; let hdlr1 = [ctx['increment'], ctx];
let txt1 = ctx['state'].val; let txt1 = ctx['state'].val;
const b3 = block3([hdlr1, txt1]); const b3 = block3([hdlr1, txt1]);
+27 -18
View File
@@ -103,15 +103,13 @@ test("destroying/recreating a subwidget with different props (if start is not ov
expect(n).toBe(0); expect(n).toBe(0);
w.state.val = 2; w.state.val = 2;
await nextMicroTick(); await nextTick();
await nextMicroTick();
expect(n).toBe(1); expect(n).toBe(1);
expect(["W:willRender", "Child:setup", "Child:willStart", "W:rendered"]).toBeLogged(); expect(["W:willRender", "Child:setup", "Child:willStart", "W:rendered"]).toBeLogged();
w.state.val = 3; w.state.val = 3;
await nextMicroTick(); await nextTick();
await nextMicroTick();
expect(n).toBe(2); expect(n).toBe(2);
expect([ expect([
@@ -176,14 +174,16 @@ test("destroying/recreating a subcomponent, other scenario", async () => {
"Parent:willRender", "Parent:willRender",
"Child:setup", "Child:setup",
"Child:willStart", "Child:willStart",
"Child:willRender",
"Child:rendered",
"Parent:rendered", "Parent:rendered",
"Child:willDestroy", "Child:willDestroy",
"Parent:willRender", "Parent:willRender",
"Child:setup", "Child:setup",
"Child:willStart", "Child:willStart",
"Parent:rendered",
"Child:willRender", "Child:willRender",
"Child:rendered", "Child:rendered",
"Parent:rendered",
"Parent:willPatch", "Parent:willPatch",
"Child:mounted", "Child:mounted",
"Parent:patched", "Parent:patched",
@@ -319,9 +319,9 @@ test("creating two async components, scenario 2", async () => {
"Parent:willRender", "Parent:willRender",
"ChildA:setup", "ChildA:setup",
"ChildA:willStart", "ChildA:willStart",
"Parent:rendered",
"ChildA:willRender", "ChildA:willRender",
"ChildA:rendered", "ChildA:rendered",
"Parent:rendered",
"ChildA:mounted", "ChildA:mounted",
"Parent:mounted", "Parent:mounted",
]).toBeLogged(); ]).toBeLogged();
@@ -3777,7 +3777,7 @@ test("delayed fiber does not get rendered if it was cancelled", async () => {
]).toBeLogged(); ]).toBeLogged();
}); });
test("destroyed component causes other soon to be destroyed component to rerender, weird stuff happens", async () => { test.only("destroyed component causes other soon to be destroyed component to rerender, weird stuff happens", async () => {
let def = makeDeferred(); let def = makeDeferred();
let c: any = null; let c: any = null;
@@ -3785,6 +3785,9 @@ test("destroyed component causes other soon to be destroyed component to rerende
static template = xml`<t t-esc="props.value"/>`; static template = xml`<t t-esc="props.value"/>`;
setup() { setup() {
useLogLifecycle(); useLogLifecycle();
onWillStart(async () => {
await nextMicroTick();
});
onRendered(() => { onRendered(() => {
def.resolve(); def.resolve();
}); });
@@ -3800,6 +3803,9 @@ test("destroyed component causes other soon to be destroyed component to rerende
setup() { setup() {
c = this; c = this;
useLogLifecycle(); useLogLifecycle();
onWillStart(async () => {
await nextMicroTick();
})
} }
} }
@@ -3814,6 +3820,9 @@ test("destroyed component causes other soon to be destroyed component to rerende
state = useState({ flag: false, valueB: 1, valueC: 2 }); state = useState({ flag: false, valueB: 1, valueC: 2 });
setup() { setup() {
useLogLifecycle(); useLogLifecycle();
onWillStart(async () => {
await nextMicroTick();
})
} }
} }
@@ -3915,17 +3924,17 @@ test("delayed rendering, destruction, stuff happens", async () => {
"A:willRender", "A:willRender",
"B:setup", "B:setup",
"B:willStart", "B:willStart",
"A:rendered",
"B:willRender", "B:willRender",
"C:setup", "C:setup",
"C:willStart", "C:willStart",
"B:rendered",
"C:willRender", "C:willRender",
"D:setup", "D:setup",
"D:willStart", "D:willStart",
"C:rendered",
"D:willRender", "D:willRender",
"D:rendered", "D:rendered",
"C:rendered",
"B:rendered",
"A:rendered",
"D:mounted", "D:mounted",
"C:mounted", "C:mounted",
"B:mounted", "B:mounted",
@@ -3938,10 +3947,10 @@ test("delayed rendering, destruction, stuff happens", async () => {
expect([ expect([
"A:willRender", "A:willRender",
"B:willUpdateProps", "B:willUpdateProps",
"A:rendered",
"B:willRender", "B:willRender",
"C:willUpdateProps", "C:willUpdateProps",
"B:rendered", "B:rendered",
"A:rendered",
]).toBeLogged(); ]).toBeLogged();
// update B => removes child C // update B => removes child C
@@ -4016,19 +4025,19 @@ test("renderings, destruction, patch, stuff, ... yet another variation", async (
"A:willRender", "A:willRender",
"B:setup", "B:setup",
"B:willStart", "B:willStart",
"D:setup",
"D:willStart",
"A:rendered",
"B:willRender", "B:willRender",
"C:setup", "C:setup",
"C:willStart", "C:willStart",
"B:rendered",
"D:willRender",
"D:rendered",
"C:willRender", "C:willRender",
"C:rendered", "C:rendered",
"C:mounted", "B:rendered",
"D:setup",
"D:willStart",
"D:willRender",
"D:rendered",
"A:rendered",
"D:mounted", "D:mounted",
"C:mounted",
"B:mounted", "B:mounted",
"A:mounted", "A:mounted",
]).toBeLogged(); ]).toBeLogged();
-1
View File
@@ -1,5 +1,4 @@
import { EventBus } from "../src/runtime/utils"; import { EventBus } from "../src/runtime/utils";
import { nextMicroTick } from "./helpers";
describe("event bus behaviour", () => { describe("event bus behaviour", () => {
test("can subscribe and be notified", () => { test("can subscribe and be notified", () => {