[IMP] component: better coordination for errors in rendering

part of #410
This commit is contained in:
Géry Debongnie
2019-11-18 15:28:47 +01:00
committed by aab-odoo
parent c7773bfd2a
commit f44b9a38ae
3 changed files with 10 additions and 22 deletions
+5 -1
View File
@@ -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);
}
} }
/** /**
+1 -4
View File
@@ -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
+4 -17
View File
@@ -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;
}); });