From cc1eb02337976eb053f5235c4530bbd466b82426 Mon Sep 17 00:00:00 2001 From: "Manu Mtz.-Almeida" Date: Mon, 24 Apr 2017 15:19:34 +0200 Subject: [PATCH] fix(navcontrollerbase): fixes crash when it is destroyed fixes #11338 --- src/navigation/nav-controller-base.ts | 12 ++++++++++++ src/navigation/test/nav-controller.spec.ts | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/navigation/nav-controller-base.ts b/src/navigation/nav-controller-base.ts index 2b957182581..99f8c209c02 100644 --- a/src/navigation/nav-controller-base.ts +++ b/src/navigation/nav-controller-base.ts @@ -216,6 +216,10 @@ export class NavControllerBase extends Ion implements NavController { } _success(result: NavResult, ti: TransitionInstruction) { + if (this._queue === null) { + this._fireError('nav controller was destroyed', ti); + return; + } this._init = true; this._trnsId = null; @@ -237,6 +241,10 @@ export class NavControllerBase extends Ion implements NavController { } _failed(rejectReason: any, ti: TransitionInstruction) { + if (this._queue === null) { + this._fireError('nav controller was destroyed', ti); + return; + } this._trnsId = null; this._queue.length = 0; @@ -245,6 +253,10 @@ export class NavControllerBase extends Ion implements NavController { this._swipeBackCheck(); this._nextTrns(); + this._fireError(rejectReason, ti); + } + + _fireError(rejectReason: any, ti: TransitionInstruction) { if (ti.done) { ti.done(false, false, rejectReason); } diff --git a/src/navigation/test/nav-controller.spec.ts b/src/navigation/test/nav-controller.spec.ts index 641f6388e96..4feaacdbbcb 100644 --- a/src/navigation/test/nav-controller.spec.ts +++ b/src/navigation/test/nav-controller.spec.ts @@ -1068,6 +1068,23 @@ describe('NavController', () => { }); + describe('destroy', () => { + + it('should not crash when destroyed while transitioning', (done) => { + let view1 = mockView(MockView1); + nav.push(view1).then(() => { + fail('it should not succeed'); + done(); + }).catch((err: any) => { + expect(err).toEqual('nav controller was destroyed'); + done(); + }); + nav.destroy(); + }, 10000); + + }); + + let nav: NavControllerBase; let trnsDone: jasmine.Spy;