From 55882500c8657a95e6177dfea3b8c2d411e4b3f7 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Fri, 8 May 2015 16:03:25 +0300 Subject: [PATCH] Fix tabs when pageCache is enabled --- apps/tests/ui/tab-view/tab-view-tests.ts | 111 ++++++++++++++--------- ui/tab-view/tab-view.android.ts | 5 + 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/apps/tests/ui/tab-view/tab-view-tests.ts b/apps/tests/ui/tab-view/tab-view-tests.ts index 9ffb814867..e4b089448b 100644 --- a/apps/tests/ui/tab-view/tab-view-tests.ts +++ b/apps/tests/ui/tab-view/tab-view-tests.ts @@ -408,62 +408,89 @@ export function testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelected }); } -export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack() { +export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_NoPageCaching() { + testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(false); +} +export function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBack_WithPageCaching() { + testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(true); +} + +function testLoadedAndUnloadedAreFired_WhenNavigatingAwayAndBackg(enablePageCache: boolean) { var i: number; var itemCount = 3; var loadedItems = [0, 0, 0]; var unloadedItems = [0, 0, 0]; - var tabView = _createTabView(); - var items = _createItems(itemCount); - tabView.items = items; + var topFrame = frameModule.topmost(); + var oldChache; - function createLoadedFor(itemIndex: number) { - return function () { - loadedItems[itemIndex] = loadedItems[itemIndex] + 1; - } + if (topFrame.android) { + oldChache = topFrame.android.cachePagesOnNavigate; + topFrame.android.cachePagesOnNavigate = enablePageCache; } - function createUnloadedFor(itemIndex: number) { - return function () { - unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1; + try { + var tabView = _createTabView(); + var items = _createItems(itemCount); + tabView.items = items; + + function createLoadedFor(itemIndex: number) { + return function () { + loadedItems[itemIndex] = loadedItems[itemIndex] + 1; + } } - } - helper.buildUIAndRunTest(tabView, function () { - try { - // Attach to loaded/unloaded events - for (i = 0; i < itemCount; i++) { - items[i].view.on("loaded", createLoadedFor(i)); - items[i].view.on("unloaded", createUnloadedFor(i)); + function createUnloadedFor(itemIndex: number) { + return function () { + unloadedItems[itemIndex] = unloadedItems[itemIndex] + 1; } + } - var detailsPageFactory = function (): pageModule.Page { - var detailsPage = new pageModule.Page(); - detailsPage.content = new labelModule.Label(); - return detailsPage; - }; + helper.buildUIAndRunTest(tabView, function () { + try { + TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC); - helper.navigate(detailsPageFactory); - } - finally { - // Go back to the test page. - helper.goBack(); - } - - //console.log("loaded items: " + loadedItems.join(", ")); - //console.log("unloadedItems items: " + unloadedItems.join(", ")); - - // Check that at least the first item is loaded and unloaded - TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item"); - TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item"); - - // Check that loaded/unloaded coutns are equal for all tabs - for (i = 0; i < itemCount; i++) { - TKUnit.assert(loadedItems[i] === unloadedItems[i], - "Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]); + // Attach to loaded/unloaded events + for (i = 0; i < itemCount; i++) { + items[i].view.on("loaded", createLoadedFor(i)); + items[i].view.on("unloaded", createUnloadedFor(i)); + } + + var detailsPageFactory = function (): pageModule.Page { + var detailsPage = new pageModule.Page(); + detailsPage.content = new labelModule.Label(); + return detailsPage; + }; + + helper.navigate(detailsPageFactory); + } + finally { + // Go back to the test page. + helper.goBack(); + } + TKUnit.waitUntilReady(() => { return items[0].view.isLoaded; }, ASYNC); + + //console.log("loaded items: " + loadedItems.join(", ")); + //console.log("unloadedItems items: " + unloadedItems.join(", ")); + + // Check that at least the first item is loaded and unloaded + TKUnit.assert(items[0].view.isLoaded, "Thecontent of the first tab should be loaded."); + TKUnit.assertEqual(loadedItems[0], 1, "loaded count for 1st item"); + TKUnit.assertEqual(unloadedItems[0], 1, "unloaded count for 1st item"); + + // Check that loaded/unloaded coutns are equal for all tabs + for (i = 0; i < itemCount; i++) { + TKUnit.assert(loadedItems[i] === unloadedItems[i], + "Loaded and unloaded calls are not equal for item " + i + " loaded: " + loadedItems[i] + " unloaded: " + unloadedItems[i]); + } + }); + } + finally { + // Return original page cache value + if (topFrame.android) { + topFrame.android.cachePagesOnNavigate = oldChache; } - }); + } } function _clickTheFirstButtonInTheListViewNatively(tabView: tabViewModule.TabView) { diff --git a/ui/tab-view/tab-view.android.ts b/ui/tab-view/tab-view.android.ts index 7a6375a55e..a364c49419 100644 --- a/ui/tab-view/tab-view.android.ts +++ b/ui/tab-view/tab-view.android.ts @@ -273,6 +273,11 @@ export class TabView extends common.TabView { // If we are loading a TabView inside a hidden fragment this check will prevent it from polluting the action bar. if (this.android && this.android.isShown()) { + // Cover the case when pageCacheOnNavigate is enabled - set adapter in loaded as the TabView is already + // attached and _onItemsPropertyChangedSetNativeValue will not be called + if (!this._pagerAdapter && this.items) { + this._setAdapter(this.items); + } this._addTabsIfNeeded(); this._setNativeSelectedIndex(this.selectedIndex); }