From 1b857f743ebb403f72d5e2fa36f2ae2c90e25105 Mon Sep 17 00:00:00 2001 From: javacs3 Date: Sun, 22 Mar 2020 12:56:50 +0800 Subject: [PATCH] fix: addDisposableDomListener dispose() leaking --- src/browser/Lifecycle.test.ts | 40 +++++++++++++++++++++++++++++++++++ src/browser/Lifecycle.ts | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/browser/Lifecycle.test.ts diff --git a/src/browser/Lifecycle.test.ts b/src/browser/Lifecycle.test.ts new file mode 100644 index 00000000..638f5dad --- /dev/null +++ b/src/browser/Lifecycle.test.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { assert } from 'chai'; +import { addDisposableDomListener } from './Lifecycle'; +import jsdom = require('jsdom'); + +describe('addDisposableDomListener', () => { + const dom = new jsdom.JSDOM(); + const document = dom.window.document; + + function createEvent(type: string): Event { + const event = document.createEvent('Event'); + event.initEvent(type); + return event; + } + + it('dispose', () => { + let calledTimes = 0; + const div = document.createElement('div'); + const disposable = addDisposableDomListener(div, 'test', () => { calledTimes++; }); + + assert.equal(calledTimes, 0); + + div.dispatchEvent(createEvent('test')); + assert.equal(calledTimes, 1); + + disposable.dispose(); + + div.dispatchEvent(createEvent('test')); + assert.equal(calledTimes, 1); + + disposable.dispose(); // double disposing + + div.dispatchEvent(createEvent('test')); + assert.equal(calledTimes, 1); + }); +}); diff --git a/src/browser/Lifecycle.ts b/src/browser/Lifecycle.ts index a8172db5..42850d30 100644 --- a/src/browser/Lifecycle.ts +++ b/src/browser/Lifecycle.ts @@ -20,7 +20,7 @@ export function addDisposableDomListener( let disposed = false; return { dispose: () => { - if (!disposed) { + if (disposed) { return; } disposed = true;