diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 42a89f13..ad902615 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -336,10 +336,10 @@ function parseDOMNode(node: Element, ctx: ParsingContext): AST | null { for (let attr of nodeAttrsNames) { const value = node.getAttribute(attr)!; - if (attr.startsWith("t-on")) { - if (attr === "t-on") { - throw new OwlError("Missing event name with t-on directive"); - } + if (attr === "t-on" || attr === "t-on-") { + throw new OwlError("Missing event name with t-on directive"); + } + if (attr.startsWith("t-on-")) { on = on || {}; on[attr.slice(5)] = value; } else if (attr.startsWith("t-model")) { diff --git a/tests/compiler/parser.test.ts b/tests/compiler/parser.test.ts index cdbbcace..d261f020 100644 --- a/tests/compiler/parser.test.ts +++ b/tests/compiler/parser.test.ts @@ -1147,6 +1147,24 @@ describe("qweb parser", () => { }); }); + test("t-onclick without dash", async () => { + expect(() => parse(``)).toThrowError( + "Unknown QWeb directive: 't-onclick'" + ); + }); + + test("t-on without event", async () => { + expect(() => parse(``)).toThrowError( + "Missing event name with t-on directive" + ); + }); + + test("t-on- without event", async () => { + expect(() => parse(``)).toThrowError( + "Missing event name with t-on directive" + ); + }); + // --------------------------------------------------------------------------- // t-model // --------------------------------------------------------------------------- @@ -1275,6 +1293,12 @@ describe("qweb parser", () => { }); }); + test("component with event handler", async () => { + expect(() => parse(``)).toThrowError( + "unsupported directive on Component: t-onclick" + ); + }); + test("component with t-ref", async () => { expect(() => parse(``)).toThrow( "t-ref is no longer supported on components. Consider exposing only the public part of the component's API through a callback prop."