From be556a970e2093798eceaae4fc5498f1518cb171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Tue, 22 Oct 2019 20:20:07 +0200 Subject: [PATCH] [FIX] qweb: properly calls directive finalizers closes #382 --- src/component/directive.ts | 4 --- src/qweb/base_directives.ts | 4 --- src/qweb/qweb.ts | 15 +++++++--- tests/qweb/__snapshots__/qweb.test.ts.snap | 35 ++++++++++++++++++++++ tests/qweb/qweb.test.ts | 10 +++++++ 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/component/directive.ts b/src/component/directive.ts index 032ad9e0..d37adbcf 100644 --- a/src/component/directive.ts +++ b/src/component/directive.ts @@ -511,10 +511,6 @@ QWeb.addDirective({ ctx.addLine(`extra.promises.push(def${defID});`); } - if (node.hasAttribute("t-if") || node.hasAttribute("t-else") || node.hasAttribute("t-elif")) { - ctx.closeIf(); - } - return true; } }); diff --git a/src/qweb/base_directives.ts b/src/qweb/base_directives.ts index c0e0b773..a44e6e32 100644 --- a/src/qweb/base_directives.ts +++ b/src/qweb/base_directives.ts @@ -258,10 +258,6 @@ QWeb.addDirective({ ctx.addLine("}"); } - if (node.hasAttribute("t-if") || node.hasAttribute("t-else") || node.hasAttribute("t-elif")) { - ctx.closeIf(); - } - return true; } }); diff --git a/src/qweb/qweb.ts b/src/qweb/qweb.ts index 40ea36e4..b638bada 100644 --- a/src/qweb/qweb.ts +++ b/src/qweb/qweb.ts @@ -452,6 +452,8 @@ export class QWeb extends EventBus { fullName: string; }[] = []; + const finalizers: typeof validDirectives = []; + // maybe this is not optimal: we iterate on all attributes here, and again // just after for each directive. for (let i = 0; i < attributes.length; i++) { @@ -496,7 +498,11 @@ export class QWeb extends EventBus { } } } + for (let { directive, value, fullName } of validDirectives) { + if (directive.finalize) { + finalizers.push({ directive, value, fullName }); + } if (directive.atNodeEncounter) { const isDone = directive.atNodeEncounter({ node, @@ -506,6 +512,9 @@ export class QWeb extends EventBus { value }); if (isDone) { + for (let { directive, value, fullName } of finalizers) { + directive.finalize!({ node, qweb: this, ctx, fullName, value }); + } return; } } @@ -564,10 +573,8 @@ export class QWeb extends EventBus { ctx.addLine(`utils.addNameSpace(vn${ctx.parentNode});`); } - for (let { directive, value, fullName } of validDirectives) { - if (directive.finalize) { - directive.finalize({ node, qweb: this, ctx, fullName, value }); - } + for (let { directive, value, fullName } of finalizers) { + directive.finalize!({ node, qweb: this, ctx, fullName, value }); } } diff --git a/tests/qweb/__snapshots__/qweb.test.ts.snap b/tests/qweb/__snapshots__/qweb.test.ts.snap index 67d1be36..b7767f3d 100644 --- a/tests/qweb/__snapshots__/qweb.test.ts.snap +++ b/tests/qweb/__snapshots__/qweb.test.ts.snap @@ -1467,6 +1467,41 @@ exports[`t-if can use some boolean operators in expressions 1`] = ` }" `; +exports[`t-if t-esc with t-elif 1`] = ` +"function anonymous(context,extra +) { + var h = this.h; + let c1 = [], p1 = {key:1}; + var vn1 = h('div', p1, c1); + if (false) { + c1.push({text: \`abc\`}); + } + else { + var _2 = 'x'; + if (_2 || _2 === 0) { + c1.push({text: _2}); + } + } + return vn1; +}" +`; + +exports[`t-if t-esc with t-if 1`] = ` +"function anonymous(context,extra +) { + var h = this.h; + let c1 = [], p1 = {key:1}; + var vn1 = h('div', p1, c1); + if (true) { + var _2 = 'x'; + if (_2 || _2 === 0) { + c1.push({text: _2}); + } + } + return vn1; +}" +`; + exports[`t-key can use t-key directive on a node 1`] = ` "function anonymous(context,extra ) { diff --git a/tests/qweb/qweb.test.ts b/tests/qweb/qweb.test.ts index cbc5daaf..e3e62969 100644 --- a/tests/qweb/qweb.test.ts +++ b/tests/qweb/qweb.test.ts @@ -328,6 +328,16 @@ describe("t-if", () => { }; expect(normalize(renderToString(qweb, "test", context))).toBe("
andormgtnlt
"); }); + + test("t-esc with t-if", () => { + qweb.addTemplate("test", `
`); + expect(renderToString(qweb, "test")).toBe("
x
"); + }); + + test("t-esc with t-elif", () => { + qweb.addTemplate("test", `
abc
`); + expect(renderToString(qweb, "test")).toBe("
x
"); + }); }); describe("attributes", () => {