[IMP] component: error when mounted on invalid target

This commit is contained in:
Géry Debongnie
2019-11-02 19:45:28 +01:00
committed by aab-odoo
parent bd3c1265d3
commit 8d1dd06340
3 changed files with 24 additions and 2 deletions
+1 -1
View File
@@ -448,7 +448,7 @@ The root component does not have a parent nor `props` (see note below). It will
default empty environment). default empty environment).
Note: a root component can however be given a `props` object in its constructor, Note: a root component can however be given a `props` object in its constructor,
like this: `new App(null, {some: 'object'});`. It will not be a true `props` like this: `new App(null, {some: 'object'});`. It will not be a true `props`
object, managed by Owl (so, for example, it will never be updated). object, managed by Owl (so, for example, it will never be updated).
### Composition ### Composition
+6 -1
View File
@@ -117,7 +117,7 @@ export class Component<T extends Env, Props extends {}> {
let constr = this.constructor as any; let constr = this.constructor as any;
const defaultProps = constr.defaultProps; const defaultProps = constr.defaultProps;
if (defaultProps) { if (defaultProps) {
props = props || {} as Props; props = props || ({} as Props);
this.__applyDefaultProps(props, defaultProps); this.__applyDefaultProps(props, defaultProps);
} }
this.props = <Props>props; this.props = <Props>props;
@@ -286,6 +286,11 @@ export class Component<T extends Env, Props extends {}> {
} }
return; return;
} }
if (!(target instanceof HTMLElement)) {
let message = `Component '${this.constructor.name}' cannot be mounted: the target is not a valid DOM node.`;
message += `\nMaybe the DOM is not ready yet? (in that case, you can use owl.utils.whenReady)`;
throw new Error(message);
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const fiber = new Fiber(null, this, undefined, undefined, false); const fiber = new Fiber(null, this, undefined, undefined, false);
scheduler.addFiber(fiber, err => { scheduler.addFiber(fiber, err => {
+17
View File
@@ -91,6 +91,23 @@ describe("basic widget properties", () => {
expect(fixture.innerHTML).toBe("<div>content</div>"); expect(fixture.innerHTML).toBe("<div>content</div>");
}); });
test("display a nice message if mounted on a non existing node", async () => {
class SomeWidget extends Component<any, any> {
static template = xml`<div>content</div>`;
}
const widget = new SomeWidget();
let error;
try {
await widget.mount(null as any);
} catch (e) {
error = e;
}
expect(error).toBeDefined();
expect(error.message).toBe(
"Component 'SomeWidget' cannot be mounted: the target is not a valid DOM node.\nMaybe the DOM is not ready yet? (in that case, you can use owl.utils.whenReady)"
);
});
test("crashes if it cannot find a template", async () => { test("crashes if it cannot find a template", async () => {
expect.assertions(1); expect.assertions(1);
class SomeWidget extends Component<any, any> {} class SomeWidget extends Component<any, any> {}