[FIX] qweb: fix crash when component only renders empty slot

This commit is contained in:
Samuel Degueldre
2021-11-10 09:04:22 +01:00
committed by Aaron Bohy
parent c03042b44d
commit 7ffb9afbd9
3 changed files with 29 additions and 2 deletions
+2 -2
View File
@@ -18,7 +18,7 @@ function callSlot(
name: string,
defaultSlot?: (ctx: any, key: string) => BDom,
dynamic?: boolean
): BDom | null {
): BDom {
const slots = ctx.__owl__.slots;
const slotFn = slots[name];
const slotBDom = slotFn ? slotFn(parent, key) : null;
@@ -33,7 +33,7 @@ function callSlot(
}
return multi([child1, child2]);
}
return slotBDom;
return slotBDom || text("");
}
function capture(ctx: any): any {
@@ -43,6 +43,18 @@ exports[`slots can define and call slots 2`] = `
}"
`;
exports[`slots can render only empty slot 1`] = `
"function anonymous(bdom, helpers
) {
let { text, createBlock, list, multi, html, toggler, component } = bdom;
let { withDefault, getTemplate, prepareList, withKey, zero, call, callSlot, capture, isBoundary, shallowEqual, setContextValue, toNumber } = helpers;
return function template(ctx, node, key = \\"\\") {
return callSlot(ctx, node, key, 'default');
}
}"
`;
exports[`slots content is the default slot (variation) 1`] = `
"function anonymous(bdom, helpers
) {
+15
View File
@@ -1332,4 +1332,19 @@ describe("slots", () => {
expect(fixture.innerHTML).toBe("<div><div><p>Ablip</p><div><p>Bblip</p></div></div></div>");
});
test("can render only empty slot", async () => {
class Parent extends Component {
static template = xml`<t t-slot="default"/>`;
}
let error = null;
try {
await mount(Parent, fixture);
} catch (e) {
error = e;
}
expect(error).toBeNull();
expect(fixture.innerHTML).toEqual("");
});
});