diff --git a/web/static/src/ts/core/qweb_vdom.ts b/web/static/src/ts/core/qweb_vdom.ts
index 4ea5588c..1635ff2b 100644
--- a/web/static/src/ts/core/qweb_vdom.ts
+++ b/web/static/src/ts/core/qweb_vdom.ts
@@ -194,6 +194,7 @@ export class QWeb {
const ctx = new Context();
// this is necessary to prevent some directives (t-forach for ex) to
// pollute the rendering context by adding some keys in it.
+ ctx.addLine("let owner = context");
ctx.addLine("context = Object.create(context)");
const mainNode = doc.firstChild!;
this._compileNode(mainNode, ctx);
@@ -652,7 +653,7 @@ const onDirective: Directive = {
return "";
});
ctx.addLine(
- `p${nodeID}.on = {${eventName}: context['${handler}'].bind(context${
+ `p${nodeID}.on = {${eventName}: context['${handler}'].bind(owner${
extraArgs ? ", " + qweb._formatExpression(extraArgs) : ""
})}`
);
diff --git a/web/static/tests/qweb_vdom.test.ts b/web/static/tests/qweb_vdom.test.ts
index 839dc66c..f15cf817 100644
--- a/web/static/tests/qweb_vdom.test.ts
+++ b/web/static/tests/qweb_vdom.test.ts
@@ -1,10 +1,23 @@
-import { QWeb, EvalContext } from "../src/ts/core/qweb_vdom";
-import { init } from "../libs/snabbdom/src/snabbdom";
import sdAttributes from "../libs/snabbdom/src/modules/attributes";
import sdListeners from "../libs/snabbdom/src/modules/eventlisteners";
+import { init } from "../libs/snabbdom/src/snabbdom";
+import { EvalContext, QWeb } from "../src/ts/core/qweb_vdom";
+
+//------------------------------------------------------------------------------
+// Setup and helpers
+//------------------------------------------------------------------------------
+
+// We create before each test:
+// - qweb: a new QWeb instance
const patch = init([sdAttributes, sdListeners]);
+let qweb: QWeb;
+
+beforeEach(() => {
+ qweb = new QWeb();
+});
+
function trim(str: string): string {
return str.replace(/\s/g, "");
}
@@ -32,27 +45,27 @@ function renderToString(
return node instanceof Text ? node.textContent! : node.outerHTML;
}
+//------------------------------------------------------------------------------
+// Tests
+//------------------------------------------------------------------------------
+
describe("static templates", () => {
test("simple string", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", "
`);
const result = renderToString(qweb, "test");
expect(result).toBe(`
`);
});
test("dynamic attributes", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test");
expect(result).toBe(``);
});
test("fixed variable", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", { value: "ok" });
expect(result).toBe(``);
});
test("dynamic attribute falsy variable ", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", { value: false });
expect(result).toBe(``);
});
test("tuple literal", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test");
expect(result).toBe(``);
});
test("tuple variable", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", { value: ["foo", "bar"] });
expect(result).toBe(``);
});
test("object", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", {
value: { a: 1, b: 2, c: 3 }
@@ -347,28 +325,24 @@ describe("attributes", () => {
});
test("format literal", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test");
expect(result).toBe(``);
});
test("format value", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", { value: "a" });
expect(result).toBe(``);
});
test("format expression", () => {
- const qweb = new QWeb();
qweb.addTemplate("test", ``);
const result = renderToString(qweb, "test", { value: 5 });
expect(result).toBe(``);
});
test("format multiple", () => {
- const qweb = new QWeb();
qweb.addTemplate(
"test",
``
@@ -383,7 +357,6 @@ describe("attributes", () => {
test.skip("various escapes", () => {
// not needed??
- const qweb = new QWeb();
qweb.addTemplate(
"test",
`
@@ -405,7 +378,6 @@ describe("attributes", () => {
describe("t-call (template calling", () => {
test("basic caller", () => {
- const qweb = new QWeb();
qweb.addTemplate("_basic-callee", "