From 559fadb62a1e397762960d6c3403369ca61391ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Wed, 22 Apr 2020 09:20:54 +0200 Subject: [PATCH] [FIX] component: properly handle mounting a destroyed component part of #685 --- src/component/component.ts | 3 +++ tests/component/component.test.ts | 8 ++++---- tests/component/un_mounting.test.ts | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/component/component.ts b/src/component/component.ts index ed3ae310..84a8dd3b 100644 --- a/src/component/component.ts +++ b/src/component/component.ts @@ -316,6 +316,9 @@ export class Component { return Promise.resolve(); } } + if (__owl__.isDestroyed) { + throw new Error("Cannot mount a destroyed component"); + } if (__owl__.currentFiber) { const currentFiber = __owl__.currentFiber; if (currentFiber.target === target && currentFiber.position === position) { diff --git a/tests/component/component.test.ts b/tests/component/component.test.ts index 4be2df77..96df72a2 100644 --- a/tests/component/component.test.ts +++ b/tests/component/component.test.ts @@ -1,16 +1,16 @@ import { Component, Env } from "../../src/component/component"; +import { EventBus } from "../../src/core/event_bus"; +import { useRef, useState } from "../../src/hooks"; import { QWeb } from "../../src/qweb/qweb"; import { xml } from "../../src/tags"; -import { useState, useRef } from "../../src/hooks"; -import { EventBus } from "../../src/core/event_bus"; import { + editInput, makeDeferred, - makeTestFixture, makeTestEnv, + makeTestFixture, nextMicroTick, nextTick, normalize, - editInput, } from "../helpers"; //------------------------------------------------------------------------------ diff --git a/tests/component/un_mounting.test.ts b/tests/component/un_mounting.test.ts index 5a848938..3c6730c8 100644 --- a/tests/component/un_mounting.test.ts +++ b/tests/component/un_mounting.test.ts @@ -2,6 +2,7 @@ import { Component, Env } from "../../src/component/component"; import { useState } from "../../src/hooks"; import { xml } from "../../src/tags"; import { makeDeferred, makeTestEnv, makeTestFixture, nextTick, nextMicroTick } from "../helpers"; +import { scheduler } from "../../src/component/scheduler"; //------------------------------------------------------------------------------ // Setup and helpers @@ -490,4 +491,22 @@ describe("unmounting and remounting", () => { expect(steps).toEqual(["1 resolved", "2 resolved"]); expect(fixture.innerHTML).toBe("
Hey
"); }); + + test("mounting a destroyed widget", async () => { + class MyWidget extends Component { + static template = xml`
Hey
`; + } + const w = new MyWidget(); + w.destroy(); // because, why not + + let error; + try { + await w.mount(fixture); + } catch (e) { + error = e; + } + expect(scheduler.tasks.length).toBe(0); + expect(error).toBeDefined(); + expect(error.message).toBe("Cannot mount a destroyed component"); + }); });