mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] component: better coordination for errors in rendering
part of #410
This commit is contained in:
@@ -572,6 +572,7 @@ export class Component<T extends Env, Props extends {}> {
|
|||||||
if (__owl__.observer) {
|
if (__owl__.observer) {
|
||||||
__owl__.observer.allowMutations = false;
|
__owl__.observer.allowMutations = false;
|
||||||
}
|
}
|
||||||
|
let error;
|
||||||
try {
|
try {
|
||||||
let vnode = __owl__.renderFn!(this, {
|
let vnode = __owl__.renderFn!(this, {
|
||||||
handlers: __owl__.boundHandlers,
|
handlers: __owl__.boundHandlers,
|
||||||
@@ -582,7 +583,7 @@ export class Component<T extends Env, Props extends {}> {
|
|||||||
}
|
}
|
||||||
fiber.vnode = vnode;
|
fiber.vnode = vnode;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
fiber.handleError(e);
|
error = e;
|
||||||
}
|
}
|
||||||
if (__owl__.observer) {
|
if (__owl__.observer) {
|
||||||
__owl__.observer.allowMutations = true;
|
__owl__.observer.allowMutations = true;
|
||||||
@@ -597,6 +598,9 @@ export class Component<T extends Env, Props extends {}> {
|
|||||||
}
|
}
|
||||||
fiber.root.counter--;
|
fiber.root.counter--;
|
||||||
fiber.isRendered = true;
|
fiber.isRendered = true;
|
||||||
|
if (error) {
|
||||||
|
fiber.handleError(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -253,10 +253,7 @@ export class Fiber {
|
|||||||
qweb.trigger("error", error);
|
qweb.trigger("error", error);
|
||||||
|
|
||||||
if (canCatch) {
|
if (canCatch) {
|
||||||
setTimeout(() => {
|
component.catchError!(error);
|
||||||
console.error(error);
|
|
||||||
component.catchError!(error);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
// the 3 next lines aim to mark the root fiber as being in error, and
|
// the 3 next lines aim to mark the root fiber as being in error, and
|
||||||
// to force it to end, without waiting for its children
|
// to force it to end, without waiting for its children
|
||||||
|
|||||||
@@ -4401,11 +4401,9 @@ describe("component error handling (catchError)", () => {
|
|||||||
expect(fixture.innerHTML).toBe("<div><div><div>hey</div></div></div>");
|
expect(fixture.innerHTML).toBe("<div><div><div>hey</div></div></div>");
|
||||||
app.state.flag = true;
|
app.state.flag = true;
|
||||||
await nextTick();
|
await nextTick();
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
||||||
|
|
||||||
expect(console.error).toBeCalledTimes(1);
|
expect(console.error).toBeCalledTimes(0);
|
||||||
console.error = consoleError;
|
console.error = consoleError;
|
||||||
expect(handler).toBeCalledTimes(1);
|
expect(handler).toBeCalledTimes(1);
|
||||||
});
|
});
|
||||||
@@ -4438,8 +4436,6 @@ describe("component error handling (catchError)", () => {
|
|||||||
expect(fixture.innerHTML).toBe("<div><div>hey</div></div>");
|
expect(fixture.innerHTML).toBe("<div><div>hey</div></div>");
|
||||||
app.state.flag = true;
|
app.state.flag = true;
|
||||||
await nextTick();
|
await nextTick();
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
expect(fixture.innerHTML).toBe("");
|
expect(fixture.innerHTML).toBe("");
|
||||||
|
|
||||||
expect(console.error).toBeCalledTimes(0);
|
expect(console.error).toBeCalledTimes(0);
|
||||||
@@ -4477,12 +4473,9 @@ describe("component error handling (catchError)", () => {
|
|||||||
}
|
}
|
||||||
const app = new App();
|
const app = new App();
|
||||||
await app.mount(fixture);
|
await app.mount(fixture);
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
||||||
|
|
||||||
expect(console.error).toBeCalledTimes(1);
|
expect(console.error).toBeCalledTimes(0);
|
||||||
console.error = consoleError;
|
console.error = consoleError;
|
||||||
expect(handler).toBeCalledTimes(1);
|
expect(handler).toBeCalledTimes(1);
|
||||||
});
|
});
|
||||||
@@ -4521,12 +4514,9 @@ describe("component error handling (catchError)", () => {
|
|||||||
}
|
}
|
||||||
const app = new App();
|
const app = new App();
|
||||||
await app.mount(fixture);
|
await app.mount(fixture);
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
||||||
|
|
||||||
expect(console.error).toBeCalledTimes(1);
|
expect(console.error).toBeCalledTimes(0);
|
||||||
console.error = consoleError;
|
console.error = consoleError;
|
||||||
expect(handler).toBeCalledTimes(1);
|
expect(handler).toBeCalledTimes(1);
|
||||||
});
|
});
|
||||||
@@ -4560,12 +4550,9 @@ describe("component error handling (catchError)", () => {
|
|||||||
}
|
}
|
||||||
const app = new App();
|
const app = new App();
|
||||||
await app.mount(fixture);
|
await app.mount(fixture);
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
await nextTick();
|
|
||||||
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
expect(fixture.innerHTML).toBe("<div><div>Error handled</div></div>");
|
||||||
|
|
||||||
expect(console.error).toBeCalledTimes(1);
|
expect(console.error).toBeCalledTimes(0);
|
||||||
console.error = consoleError;
|
console.error = consoleError;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user