diff --git a/apps/tests/ui/page/page-tests-common.ts b/apps/tests/ui/page/page-tests-common.ts index 6e2b621ab..f7872467f 100644 --- a/apps/tests/ui/page/page-tests-common.ts +++ b/apps/tests/ui/page/page-tests-common.ts @@ -28,6 +28,9 @@ import stackLayoutModule = require("ui/layouts/stack-layout"); import helper = require("../helper"); import view = require("ui/core/view"); import observable = require("data/observable"); +import {Page, ShownModallyData} from "ui/page"; +import {Label} from "ui/label"; +import {EventData} from "data/observable"; export function addLabelToPage(page: PageModule.Page, text?: string) { var label = new LabelModule.Label(); @@ -440,6 +443,76 @@ export function test_WhenNavigatingForwardAndBack_IsBackNavigationIsCorrect() { helper.goBack(); } +export function test_WhenPageIsNavigatedToItCanShowAnotherPageAsModal() { + var masterPage; + var ctx = { + shownModally: false + }; + + var modalClosed = false; + var modalCloseCallback = function (returnValue: any) { + TKUnit.assertTrue(ctx.shownModally, "Modal-page must be shown!"); + TKUnit.assertEqual(returnValue, "return value", "Modal-page must return value!"); + modalClosed = true; + } + + let modalPage: Page; + + let shownModally = 0; + var onShownModal = function (args: ShownModallyData) { + shownModally++; + modalPage.off(Page.shownModallyEvent, onShownModal); + } + + let modalLoaded = 0; + var onModalLoaded = function (args: EventData) { + modalLoaded++; + modalPage.off(Page.loadedEvent, onModalLoaded); + } + + let modalUnloaded = 0; + var onModalUnloaded = function (args: EventData) { + modalUnloaded++; + modalPage.off(Page.unloadedEvent, onModalUnloaded); + TKUnit.assertNull(masterPage.modal, "currentPage.modal should be undefined when no modal page is shown!"); + } + + var navigatedToEventHandler = function (args) { + let page = args.object; + TKUnit.assertNull(page.modal, "currentPage.modal should be undefined when no modal page is shown!"); + let basePath = "ui/page/"; + modalPage = page.showModal(basePath + "modal-page", ctx, modalCloseCallback, false); + TKUnit.assertTrue((modalPage).showingModally, "showingModally"); + modalPage.on(Page.shownModallyEvent, onShownModal); + modalPage.on(Page.loadedEvent, onModalLoaded); + modalPage.on(Page.unloadedEvent, onModalUnloaded); + }; + + var masterPageFactory = function (): Page { + masterPage = new Page(); + masterPage.id = "newPage"; + masterPage.on(Page.navigatedToEvent, navigatedToEventHandler); + var label = new Label(); + label.text = "Text"; + masterPage.content = label; + return masterPage; + }; + + try { + helper.navigate(masterPageFactory); + + TKUnit.waitUntilReady(() => { return modalUnloaded > 0; }); + TKUnit.assertEqual(shownModally, 1, "shownModally"); + TKUnit.assertEqual(modalLoaded, 1, "modalLoaded"); + TKUnit.assertEqual(modalUnloaded, 1, "modalUnloaded"); + + masterPage.off(Page.navigatedToEvent, navigatedToEventHandler); + } + finally { + helper.goBack(); + } +} + //export function test_ModalPage_Layout_is_Correct() { // var testPage: PageModule.Page; // var label: LabelModule.Label; diff --git a/apps/tests/ui/page/page-tests.ios.ts b/apps/tests/ui/page/page-tests.ios.ts index 22e09744a..0758e5959 100644 --- a/apps/tests/ui/page/page-tests.ios.ts +++ b/apps/tests/ui/page/page-tests.ios.ts @@ -1,5 +1,5 @@ import PageTestCommon = require("./page-tests-common"); -import {Page, ShownModallyData} from "ui/page"; +import {Page} from "ui/page"; import TKUnit = require("../../TKUnit"); import {Label} from "ui/label"; import helper = require("../helper"); @@ -27,76 +27,6 @@ export function test_NavigateToNewPage_InnerControl() { TKUnit.assertFalse(label.isLoaded, "label.isLoaded should become false after navigating back"); } -export function test_WhenPageIsNavigatedToItCanShowAnotherPageAsModal() { - var masterPage; - var ctx = { - shownModally: false - }; - - var modalClosed = false; - var modalCloseCallback = function (returnValue: any) { - TKUnit.assertTrue(ctx.shownModally, "Modal-page must be shown!"); - TKUnit.assertEqual(returnValue, "return value", "Modal-page must return value!"); - modalClosed = true; - } - - let modalPage: Page; - - let shownModally = 0; - var onShownModal = function (args: ShownModallyData) { - shownModally++; - modalPage.off(Page.shownModallyEvent, onShownModal); - } - - let modalLoaded = 0; - var onModalLoaded = function (args: EventData) { - modalLoaded++; - modalPage.off(Page.loadedEvent, onModalLoaded); - } - - let modalUnloaded = 0; - var onModalUnloaded = function (args: EventData) { - modalUnloaded++; - modalPage.off(Page.unloadedEvent, onModalUnloaded); - TKUnit.assertNull(masterPage.modal, "currentPage.modal should be undefined when no modal page is shown!"); - } - - var navigatedToEventHandler = function (args) { - let page = args.object; - TKUnit.assertNull(page.modal, "currentPage.modal should be undefined when no modal page is shown!"); - let basePath = "ui/page/"; - modalPage = page.showModal(basePath + "modal-page", ctx, modalCloseCallback, false); - TKUnit.assertTrue((modalPage).showingModally, "showingModally"); - modalPage.on(Page.shownModallyEvent, onShownModal); - modalPage.on(Page.loadedEvent, onModalLoaded); - modalPage.on(Page.unloadedEvent, onModalUnloaded); - }; - - var masterPageFactory = function (): Page { - masterPage = new Page(); - masterPage.id = "newPage"; - masterPage.on(Page.navigatedToEvent, navigatedToEventHandler); - var label = new Label(); - label.text = "Text"; - masterPage.content = label; - return masterPage; - }; - - try { - helper.navigate(masterPageFactory); - - TKUnit.waitUntilReady(() => { return modalUnloaded > 0; }); - TKUnit.assertEqual(shownModally, 1, "shownModally"); - TKUnit.assertEqual(modalLoaded, 1,"modalLoaded"); - TKUnit.assertEqual(modalUnloaded,1 , "modalUnloaded"); - - masterPage.off(Page.navigatedToEvent, navigatedToEventHandler); - } - finally { - helper.goBack(); - } -} - export function test_WhenShowingModalPageUnloadedIsNotFiredForTheMasterPage() { let masterPage: Page; let masterPageUnloaded = false; diff --git a/ui/page/page.android.ts b/ui/page/page.android.ts index 896714288..0216c1314 100644 --- a/ui/page/page.android.ts +++ b/ui/page/page.android.ts @@ -68,8 +68,23 @@ function ensureDialogFragmentClass() { public onStart() { super.onStart(); + if (!this._owner.isLoaded) { + this._owner.onLoaded(); + } this._shownCallback(); } + + public onDestroyView() { + super.onDestroyView(); + + if (this._owner.isLoaded) { + this._owner.onUnloaded(); + } + + this._owner._isAddedToNativeVisualTree = false; + this._owner._onDetached(true); + + } public onDismiss(dialog: android.content.IDialogInterface) { super.onDismiss(dialog); @@ -150,11 +165,10 @@ export class Page extends pageCommon.Page { this._onAttached(parent._context); this._isAddedToNativeVisualTree = true; - this.onLoaded(); ensureDialogFragmentClass(); - this._dialogFragment = new DialogFragmentClass(this, !!fullscreen, () => this._raiseShownModallyEvent, () => this.closeModal()); + this._dialogFragment = new DialogFragmentClass(this, !!fullscreen, () => this._raiseShownModallyEvent(), () => this.closeModal()); super._raiseShowingModallyEvent(); @@ -165,9 +179,6 @@ export class Page extends pageCommon.Page { this._dialogFragment.dismissAllowingStateLoss(); this._dialogFragment = null; - this.onUnloaded(); - this._isAddedToNativeVisualTree = false; - this._onDetached(true); parent._modal = undefined; super._hideNativeModalView(parent);