Skip to content

Commit cf950e1

Browse files
authored
fix(navigation): fix frame.navigate call inside page.navigatedTo handler (#5649)
1 parent c06d5ba commit cf950e1

2 files changed

Lines changed: 44 additions & 2 deletions

File tree

tests/app/navigation/navigation-tests.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as TKUnit from "../TKUnit";
2-
import { Page, NavigatedData } from "tns-core-modules/ui/page";
2+
import { EventData, Page, NavigatedData } from "tns-core-modules/ui/page";
33
import { topmost as topmostFrame, NavigationTransition } from "tns-core-modules/ui/frame";
44
import { Color } from "tns-core-modules/color";
55
import * as helper from "../ui/helper";
@@ -377,4 +377,41 @@ export function test_NavigationEvents_WithClearHistory() {
377377

378378
export function test_NavigationEvents_WithClearHistory_WithTransition() {
379379
_test_NavigationEvents_WithClearHistory({ name: "fade", duration: 10 });
380+
}
381+
382+
export function test_Navigate_From_Page_Loaded_Handler() {
383+
_test_Navigate_From_Page_Event_Handler(Page.loadedEvent);
384+
}
385+
386+
export function test_Navigate_From_Page_NavigatedTo_Handler() {
387+
_test_Navigate_From_Page_Event_Handler(Page.navigatedToEvent);
388+
}
389+
390+
function _test_Navigate_From_Page_Event_Handler(eventName: string) {
391+
let secondPageNavigatedTo = false;
392+
393+
const firstPageFactory = function (): Page {
394+
const firstPage = new Page();
395+
firstPage.id = "first-page";
396+
firstPage.on(eventName, (args: EventData) => {
397+
const page = <Page>args.object;
398+
const frame = page.frame;
399+
400+
const secondPageFactory = function (): Page {
401+
const secondPage = new Page();
402+
secondPage.id = "second-page";
403+
secondPage.on(Page.navigatedToEvent, () => { secondPageNavigatedTo = true });
404+
405+
return secondPage;
406+
};
407+
408+
frame.navigate(secondPageFactory);
409+
});
410+
411+
return firstPage;
412+
};
413+
414+
helper.navigateWithEntry({ create: firstPageFactory });
415+
416+
TKUnit.waitUntilReady(() => secondPageNavigatedTo);
380417
}

tns-core-modules/ui/frame/frame-common.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,13 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {
216216
}
217217

218218
this._currentEntry = entry;
219-
this._executingEntry = null;
219+
220220
newPage.onNavigatedTo(isBack);
221+
222+
// Reset executing entry after NavigatedTo is raised;
223+
// we do not want to execute two navigations in parallel in case
224+
// additional navigation is triggered from the NavigatedTo handler.
225+
this._executingEntry = null;
221226
}
222227

223228
public _updateBackstack(entry: BackstackEntry, isBack: boolean): void {

0 commit comments

Comments
 (0)