[IMP] Allow app to be mounted in shadow DOM

This commit allow owl Apps to be mounted into a shadow DOM.
This commit is contained in:
tsm-odoo
2023-04-06 10:41:01 +02:00
committed by Géry Debongnie
parent 606421776b
commit c0c40c0387
5 changed files with 94 additions and 7 deletions
+67
View File
@@ -0,0 +1,67 @@
import { App, Component, useRef, xml } from "../../src";
import { status } from "../../src/runtime/status";
import { makeTestFixture, snapshotEverything } from "../helpers";
let fixture: HTMLElement;
snapshotEverything();
beforeEach(() => {
fixture = makeTestFixture();
});
describe("shadow_dom", () => {
test("can mount app", async () => {
class SomeComponent extends Component {
static template = xml`<div class="my-div"/>`;
}
const container = document.createElement("div");
fixture.appendChild(container);
const shadow = container.attachShadow({ mode: "open" });
const app = new App(SomeComponent);
const comp = await app.mount(shadow);
const div = shadow.querySelector(".my-div");
expect(div).not.toBe(null);
expect(shadow.contains(div)).toBe(true);
app.destroy();
expect(shadow.contains(div)).toBe(false);
expect(status(comp)).toBe("destroyed");
});
test("can bind event handler", async () => {
let a = 1;
class SomeComponent extends Component {
static template = xml`<button t-on-click="add">Click</button>`;
add() {
a = 3;
}
}
const container = document.createElement("div");
fixture.appendChild(container);
const shadow = container.attachShadow({ mode: "open" });
await new App(SomeComponent).mount(shadow);
expect(a).toBe(1);
shadow.querySelector("button")!.click();
expect(a).toBe(3);
});
test("useRef hook", async () => {
let comp: SomeComponent;
class SomeComponent extends Component {
static template = xml`<div t-ref="refName" class="my-div"/>`;
div = useRef("refName");
setup() {
comp = this;
}
}
const container = document.createElement("div");
fixture.appendChild(container);
const shadow = container.attachShadow({ mode: "open" });
const mountedProm = new App(SomeComponent).mount(shadow);
expect(comp!.div.el).toBe(null);
await mountedProm;
expect(comp!.div.el).toBe(shadow.querySelector(".my-div"));
});
});