From d7bed966677a8af856082d016a2a7dcdd62c7c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Sun, 14 Apr 2019 10:40:36 +0200 Subject: [PATCH] [IMP] qweb: crashes if unknown directive closes #22 --- src/qweb.ts | 26 ++++++++++++++++++++++++-- tests/qweb.test.ts | 10 ++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/qweb.ts b/src/qweb.ts index dc2935d4..a588e8a7 100644 --- a/src/qweb.ts +++ b/src/qweb.ts @@ -184,8 +184,19 @@ export class QWeb { processedTemplates: { [name: string]: ProcessedTemplate } = {}; templates: { [name: string]: CompiledTemplate } = {}; directives: Directive[] = []; + directiveNames: { [key: string]: 1 }; constructor(data?: string) { + this.directiveNames = { + as: 1, + name: 1, + value: 1, + att: 1, + attf: 1, + props: 1, + key: 1, + keep: 1 // todo: rename keep-alive to keepalive + }; [ forEachDirective, escDirective, @@ -199,7 +210,6 @@ export class QWeb { refDirective, widgetDirective ].forEach(d => this.addDirective(d)); - if (data) { this.loadTemplates(data); } @@ -225,6 +235,7 @@ export class QWeb { addDirective(dir: Directive) { this.directives.push(dir); + this.directiveNames[dir.name] = 1; this.directives.sort((d1, d2) => d1.priority - d2.priority); } @@ -422,8 +433,19 @@ export class QWeb { let withHandlers = false; + // 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++) { + let attrName = attributes[i].name; + if (attrName.startsWith("t-")) { + let dName = attrName.slice(2).split("-")[0]; + if (!(dName in this.directiveNames)) { + throw new Error(`Unknown QWeb directive: '${attrName}'`); + } + } + } + for (let directive of this.directives) { - // const value = attributes[i].textContent!; let fullName; let value; for (let i = 0; i < attributes.length; i++) { diff --git a/tests/qweb.test.ts b/tests/qweb.test.ts index 9c4c60f1..1eac6c8c 100644 --- a/tests/qweb.test.ts +++ b/tests/qweb.test.ts @@ -124,6 +124,16 @@ describe("error handling", () => { "Invalid generated code while compiling template 'templatename': Unexpected token }" ); }); + + test("error when unknown directive", () => { + qweb.addTemplate( + "templatename", + `
test
` + ); + expect(() => qweb.render("templatename")).toThrow( + "Unknown QWeb directive: 't-best-beer'" + ); + }); }); describe("t-esc", () => {