mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[FIX] component, error_handling: do not cancel the error fiber twice
This commit is contained in:
committed by
Aaron Bohy
parent
dfd0dcedb8
commit
a2e8abc243
@@ -780,6 +780,71 @@ exports[`can catch errors catching error, rethrow, render parent -- a main comp
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`can catch errors catching in child makes parent render 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { prepareList, capture, withKey } = helpers;
|
||||
|
||||
function slot1(ctx, node, key = \\"\\") {
|
||||
let Comp1 = ctx['elem'][1];
|
||||
return toggler(Comp1, component(Comp1, {id: ctx['elem'][0]}, key + \`__1\`, node, ctx));
|
||||
}
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
ctx = Object.create(ctx);
|
||||
const [k_block1, v_block1, l_block1, c_block1] = prepareList(Object.entries(this.elements));
|
||||
for (let i1 = 0; i1 < l_block1; i1++) {
|
||||
ctx[\`elem\`] = v_block1[i1];
|
||||
let key1 = ctx['elem'][0];
|
||||
const v1 = ctx['elem'];
|
||||
const ctx1 = capture(ctx);
|
||||
c_block1[i1] = withKey(component(\`Catch\`, {onError: (error)=>this.onError(v1[0],error),slots: {'default': {__render: slot1, __ctx: ctx1}}}, key + \`__2__\${key1}\`, node, ctx), key1);
|
||||
}
|
||||
return list(c_block1);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`can catch errors catching in child makes parent render 2`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
let { callSlot } = helpers;
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return callSlot(ctx, node, key, 'default', false, {});
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`can catch errors catching in child makes parent render 3`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
let block1 = createBlock(\`<div/>\`);
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
return block1();
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`can catch errors catching in child makes parent render 4`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
let { text, createBlock, list, multi, html, toggler, component, comment } = bdom;
|
||||
|
||||
let block1 = createBlock(\`<div><block-text-0/></div>\`);
|
||||
|
||||
return function template(ctx, node, key = \\"\\") {
|
||||
let txt1 = 'Child '+ctx['props'].id;
|
||||
return block1([txt1]);
|
||||
}
|
||||
}"
|
||||
`;
|
||||
|
||||
exports[`can catch errors error in mounted on a component with a sibling (properly mounted) 1`] = `
|
||||
"function anonymous(bdom, helpers
|
||||
) {
|
||||
|
||||
@@ -1033,4 +1033,56 @@ describe("can catch errors", () => {
|
||||
await nextTick();
|
||||
expect(fixture.innerHTML).toBe("<div>Sibling</div>");
|
||||
});
|
||||
|
||||
test("catching in child makes parent render", async () => {
|
||||
class Child extends Component {
|
||||
static template = xml`<div t-esc="'Child ' + props.id" />`;
|
||||
}
|
||||
|
||||
class ErrorComp extends Component {
|
||||
static template = xml`<div />`;
|
||||
setup() {
|
||||
throw new Error("Error Component");
|
||||
}
|
||||
}
|
||||
|
||||
class Catch extends Component {
|
||||
static template = xml`<t t-slot="default" />`;
|
||||
setup() {
|
||||
onError((error) => {
|
||||
this.props.onError(error);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const steps: any[] = [];
|
||||
class Parent extends Component {
|
||||
static components = { Catch };
|
||||
static template = xml`
|
||||
<t t-foreach="Object.entries(this.elements)" t-as="elem" t-key="elem[0]">
|
||||
<Catch onError="(error) => this.onError(elem[0], error)">
|
||||
<t t-component="elem[1]" id="elem[0]" />
|
||||
</Catch>
|
||||
</t>
|
||||
`;
|
||||
|
||||
elements: any = {};
|
||||
|
||||
onError(id: any, error: Error) {
|
||||
steps.push(error.message);
|
||||
delete this.elements[id];
|
||||
this.elements[2] = Child;
|
||||
this.render();
|
||||
}
|
||||
}
|
||||
|
||||
const parent = await mount(Parent, fixture);
|
||||
expect(fixture.innerHTML).toBe("");
|
||||
|
||||
parent.elements[1] = ErrorComp;
|
||||
parent.render();
|
||||
await nextTick();
|
||||
expect(fixture.innerHTML).toBe("<div>Child 2</div>");
|
||||
expect(steps).toEqual(["Error Component"]);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user