diff --git a/apps/modal-views-demo/login-page.ts b/apps/modal-views-demo/login-page.ts index ee1d6deb6..a7d6c9345 100644 --- a/apps/modal-views-demo/login-page.ts +++ b/apps/modal-views-demo/login-page.ts @@ -1,6 +1,7 @@ import observable = require("data/observable"); import pages = require("ui/page"); import textField = require("ui/text-field"); +import frame = require("ui/frame"); var context: any; var closeCallback: Function; @@ -13,6 +14,11 @@ export function onShownModally(args: pages.ShownModallyData) { console.log("login-page.onShownModally, context: " + args.context); context = args.context; closeCallback = args.closeCallback; + var modalPage = args.object; + + if (frame.topmost().currentPage.modal !== args.object) { + throw new Error(`frame.topmost().currentPage.modal.id: ${frame.topmost().currentPage.modal.id}; modalPage.id: ${modalPage.id}`); + } } export function onLoaded(args: observable.EventData) { diff --git a/apps/tests/ui/page/modal-page.ts b/apps/tests/ui/page/modal-page.ts index 8a619d444..6b1d20eb0 100644 --- a/apps/tests/ui/page/modal-page.ts +++ b/apps/tests/ui/page/modal-page.ts @@ -1,8 +1,12 @@ import {ShownModallyData} from "ui/page"; import TKUnit = require("../../TKUnit"); +import frame = require("ui/frame"); +import page = require("ui/page"); export function onShownModally(args: ShownModallyData) { - TKUnit.wait(0.350); + TKUnit.wait(0.100); + var modalPage = args.object; args.context.shownModally = true; + TKUnit.assert(frame.topmost().currentPage.modal = modalPage, "frame.topmost().currentPage.modal should be equal to the page instance on page.shownModally event handler."); args.closeCallback("return value"); } \ No newline at end of file diff --git a/apps/tests/ui/page/page-tests.ios.ts b/apps/tests/ui/page/page-tests.ios.ts index 3189b3002..d8f535088 100644 --- a/apps/tests/ui/page/page-tests.ios.ts +++ b/apps/tests/ui/page/page-tests.ios.ts @@ -4,6 +4,7 @@ import TKUnit = require("../../TKUnit"); import LabelModule = require("ui/label"); import helper = require("../helper"); import view = require("ui/core/view"); +import frame = require("ui/frame"); global.moduleMerge(PageTestCommon, exports); @@ -35,11 +36,13 @@ export function test_WhenPageIsLoadedItCanShowAnotherPageAsModal() { var modalCloseCallback = function (returnValue: any) { TKUnit.assert(ctx.shownModally, "Modal-page must be shown!"); TKUnit.assert(returnValue === "return value", "Modal-page must return value!"); - TKUnit.wait(0.350); + TKUnit.assert(!frame.topmost().currentPage.modal, "frame.topmost().currentPage.modal should be undefined when no modal page is shown!"); + TKUnit.wait(0.100); modalClosed = true; } var loadedEventHandler = function (args) { + TKUnit.assert(!frame.topmost().currentPage.modal, "frame.topmost().currentPage.modal should be undefined when no modal page is shown!"); var basePath = "ui/page/"; args.object.showModal(basePath + "modal-page", ctx, modalCloseCallback, false); }; diff --git a/ui/page/page-common.ts b/ui/page/page-common.ts index b3875b830..debcaadd1 100644 --- a/ui/page/page-common.ts +++ b/ui/page/page-common.ts @@ -44,6 +44,8 @@ export class Page extends ContentView implements dts.Page { private _styleScope: styleScope.StyleScope = new styleScope.StyleScope(); private _actionBar: ActionBar; + private _modal: Page; + constructor(options?: dts.Options) { super(options); this.actionBar = new ActionBar(); @@ -217,6 +219,10 @@ export class Page extends ContentView implements dts.Page { } } + public get modal(): Page { + return this._modal; + } + public _addChildFromBuilder(name: string, value: any) { if (value instanceof ActionBar) { this.actionBar = value; @@ -227,6 +233,7 @@ export class Page extends ContentView implements dts.Page { } protected _showNativeModalView(parent: Page, context: any, closeCallback: Function, fullscreen?: boolean) { + parent._modal = this; var that = this; this._closeModalCallback = function () { if (that._closeModalCallback) { @@ -240,7 +247,7 @@ export class Page extends ContentView implements dts.Page { } protected _hideNativeModalView(parent: Page) { - // + parent._modal = undefined; } protected _raiseShownModallyEvent(parent: Page, context: any, closeCallback: Function) { diff --git a/ui/page/page.android.ts b/ui/page/page.android.ts index 72712ffae..c2267c50a 100644 --- a/ui/page/page.android.ts +++ b/ui/page/page.android.ts @@ -137,6 +137,8 @@ export class Page extends pageCommon.Page { this.onUnloaded(); this._isAddedToNativeVisualTree = false; this._onDetached(true); + + super._hideNativeModalView(parent); } public _updateActionBar(hidden: boolean) { diff --git a/ui/page/page.d.ts b/ui/page/page.d.ts index 87e1939e9..eb9dc86e2 100644 --- a/ui/page/page.d.ts +++ b/ui/page/page.d.ts @@ -173,9 +173,14 @@ declare module "ui/page" { showModal(); /** - * Closes the current modal dialog that this page is showing. + * Closes the current modal view that this page is showing. */ closeModal(); + + /** + * Returns the current modal view that this page is showing (is parent of), if any. + */ + modal: Page; //@private diff --git a/ui/page/page.ios.ts b/ui/page/page.ios.ts index 90fc227a8..c951ff7d0 100644 --- a/ui/page/page.ios.ts +++ b/ui/page/page.ios.ts @@ -226,6 +226,8 @@ export class Page extends pageCommon.Page { this._UIModalPresentationFormSheet = false; parent.requestLayout(); parent._ios.dismissModalViewControllerAnimated(false); + + super._hideNativeModalView(parent); } public _updateActionBar(hidden: boolean) {