From 451589dbd63c89408a258232648c12d2f9fe674b Mon Sep 17 00:00:00 2001 From: Manol Donev Date: Thu, 26 Apr 2018 00:19:44 +0300 Subject: [PATCH] fix(modal): exception when calling ViewBase.showModal(...) (#5737) --- tests/app/ui/page/page-tests-common.ts | 104 ++++++++++++++++++ .../ui/core/view-base/view-base.ts | 4 +- 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/tests/app/ui/page/page-tests-common.ts b/tests/app/ui/page/page-tests-common.ts index 6efd3e5f8..1a6b5b000 100644 --- a/tests/app/ui/page/page-tests-common.ts +++ b/tests/app/ui/page/page-tests-common.ts @@ -421,6 +421,110 @@ export function test_WhenPageIsNavigatedToFrameCurrentPageIsNowTheSameAsThePage( page.off(Label.loadedEvent, navigatedEventHandler); } +export function test_WhenViewBaseCallsShowModal_WithArguments_ShouldOpenModal() { + let modalClosed = false; + + const modalCloseCallback = function (returnValue: any) { + modalClosed = true; + } + + const createTabItems = function(count: number) { + var items = new Array(); + + for (var i = 0; i < count; i++) { + var label = new Label(); + label.text = "Tab " + i; + var tabEntry = new TabViewItem(); + tabEntry.title = "Tab " + i; + tabEntry.view = label; + + items.push(tabEntry); + } + + return items; + } + + const modalPageShownModallyEventHandler = function(args: ShownModallyData) { + const page = args.object; + page.off(View.shownModallyEvent, modalPageShownModallyEventHandler); + args.closeCallback(); + } + + const hostNavigatedToEventHandler = function(args) { + const page = args.object; + page.off(Page.navigatedToEvent, hostNavigatedToEventHandler); + + const modalPage = new Page(); + modalPage.id = "modalPage_test_WhenViewBaseCallsShowModal_WithArguments_ShouldOpenModal"; + modalPage.on(View.shownModallyEvent, modalPageShownModallyEventHandler); + const tabViewItem = (page.content).items[0]; + tabViewItem.showModal(modalPage, {}, modalCloseCallback, false, false); + } + + const masterPageFactory = function(): Page { + const masterPage = new Page(); + masterPage.id = "masterPage_test_WhenViewBaseCallsShowModal_WithArguments_ShouldOpenModal"; + masterPage.on(Page.navigatedToEvent, hostNavigatedToEventHandler) + + const tabView = new TabView(); + tabView.items = createTabItems(2); + masterPage.content = tabView; + + return masterPage; + }; + + helper.navigate(masterPageFactory); + + TKUnit.waitUntilReady(() => modalClosed); +} + +export function test_WhenViewBaseCallsShowModal_WithoutArguments_ShouldThrow() { + let navigatedTo = false; + + const createTabItems = function(count: number) { + var items = new Array(); + + for (var i = 0; i < count; i++) { + var label = new Label(); + label.text = "Tab " + i; + var tabEntry = new TabViewItem(); + tabEntry.title = "Tab " + i; + tabEntry.view = label; + + items.push(tabEntry); + } + + return items; + } + + const hostNavigatedToEventHandler = function(args) { + const page = args.object; + page.off(Page.navigatedToEvent, hostNavigatedToEventHandler); + + const hostPage = args.object; + const tabViewItem = (page.content).items[0]; + TKUnit.assertThrows(() => tabViewItem.showModal()); + + navigatedTo = true; + } + + const masterPageFactory = function(): Page { + const masterPage = new Page(); + masterPage.id = "masterPage_test_WhenViewBaseCallsShowModal_WithoutArguments_ShouldThrow"; + masterPage.on(Page.navigatedToEvent, hostNavigatedToEventHandler) + + const tabView = new TabView(); + tabView.items = createTabItems(2); + masterPage.content = tabView; + + return masterPage; + }; + + helper.navigate(masterPageFactory); + + TKUnit.waitUntilReady(() => navigatedTo); +} + export function test_WhenNavigatingForwardAndBack_IsBackNavigationIsCorrect() { let page1; let page2; diff --git a/tns-core-modules/ui/core/view-base/view-base.ts b/tns-core-modules/ui/core/view-base/view-base.ts index 75233bcfa..525459bca 100644 --- a/tns-core-modules/ui/core/view-base/view-base.ts +++ b/tns-core-modules/ui/core/view-base/view-base.ts @@ -946,9 +946,9 @@ export abstract class ViewBase extends Observable implements ViewBaseDefinition } } - public showModal(): ViewBase { + public showModal(...args): ViewBase { const parent = this.parent; - return parent && parent.showModal(); + return parent && parent.showModal(...args); } public closeModal(): void {