mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
wip
This commit is contained in:
@@ -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)) {
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
@@ -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,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", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user