[FIX] qweb: add better support for template with only strings

This commit is contained in:
Géry Debongnie
2019-06-12 11:36:36 +02:00
parent 4c41f62364
commit 45a2b0122d
4 changed files with 50 additions and 6 deletions
+5 -2
View File
@@ -329,13 +329,15 @@ export class QWeb {
}
if (ctx.parentNode) {
ctx.addLine(`c${ctx.parentNode}.push({text: \`${text}\`});`);
} else if (ctx.parentTextNode) {
ctx.addLine(`vn${ctx.parentTextNode}.text += \`${text}\`;`);
} else {
// this is an unusual situation: this text node is the result of the
// template rendering.
let nodeID = ctx.generateID();
ctx.addLine(`var vn${nodeID} = {text: \`${text}\`};`);
ctx.rootContext.rootNode = nodeID;
ctx.rootContext.parentNode = nodeID;
ctx.rootContext.parentTextNode = nodeID;
}
return;
}
@@ -620,6 +622,7 @@ export class Context {
variables: { [key: string]: QWebVar } = {};
escaping: boolean = false;
parentNode: number | null = null;
parentTextNode: number | null = null;
rootNode: number | null = null;
indentLevel: number = 0;
rootContext: Context;
@@ -644,7 +647,7 @@ export class Context {
}
withParent(node: number): Context {
if (this === this.rootContext && this.parentNode) {
if (this === this.rootContext && (this.parentNode || this.parentTextNode)) {
throw new Error("A template should not have more than one root node");
}
if (!this.rootContext.rootNode) {
+10 -4
View File
@@ -44,11 +44,17 @@ function compileValueNode(value: any, node: Element, qweb: QWeb, ctx: Context) {
exprID = value.id;
}
ctx.addIf(`${exprID} || ${exprID} === 0`);
if (!ctx.parentNode) {
throw new Error("Should not have a text node without a parent");
}
if (ctx.escaping) {
ctx.addLine(`c${ctx.parentNode}.push({text: ${exprID}});`);
if (ctx.parentTextNode) {
ctx.addLine(`vn${ctx.parentTextNode}.text += ${exprID};`);
} else if (ctx.parentNode) {
ctx.addLine(`c${ctx.parentNode}.push({text: ${exprID}});`);
} else {
let nodeID = ctx.generateID();
ctx.rootContext.rootNode = nodeID;
ctx.rootContext.parentTextNode = nodeID;
ctx.addLine(`var vn${nodeID} = {text: ${exprID}};`);
}
} else {
let fragID = ctx.generateID();
ctx.addLine(`var frag${fragID} = this.utils.getFragment(${exprID})`);
+25
View File
@@ -726,6 +726,18 @@ exports[`static templates empty div 1`] = `
}"
`;
exports[`static templates simple dynamic value 1`] = `
"function anonymous(context,extra
) {
var h = this.utils.h;
var _1 = context['text'];
if (_1 || _1 === 0) {
var vn2 = {text: _1};
}
return vn2;
}"
`;
exports[`static templates simple string 1`] = `
"function anonymous(context,extra
) {
@@ -735,6 +747,19 @@ exports[`static templates simple string 1`] = `
}"
`;
exports[`static templates simple string, with some dynamic value 1`] = `
"function anonymous(context,extra
) {
var h = this.utils.h;
var vn1 = {text: \`hello \`};
var _2 = context['text'];
if (_2 || _2 === 0) {
vn1.text += _2;
}
return vn1;
}"
`;
exports[`t-call (template calling basic caller 1`] = `
"function anonymous(context,extra
) {
+10
View File
@@ -24,6 +24,16 @@ describe("static templates", () => {
expect(renderToString(qweb, "test")).toBe("hello vdom");
});
test("simple dynamic value", () => {
qweb.addTemplate("test", "<t><t t-esc=\"text\"/></t>");
expect(renderToString(qweb, "test", {text: "hello vdom"})).toBe("hello vdom");
});
test("simple string, with some dynamic value", () => {
qweb.addTemplate("test", "<t>hello <t t-esc=\"text\"/></t>");
expect(renderToString(qweb, "test", {text: "vdom"})).toBe("hello vdom");
});
test("empty div", () => {
qweb.addTemplate("test", "<div></div>");
expect(renderToString(qweb, "test")).toBe("<div></div>");