From 7229c753d344d308dce73e3b9361a3fad456c7fd Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Sun, 12 Nov 2017 18:02:28 -0500 Subject: [PATCH 01/10] Fix for #4986 I am getting this reported thousands of times in my crash reporter, so thought I might add in the guards. --- tns-core-modules/ui/frame/frame-common.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tns-core-modules/ui/frame/frame-common.ts b/tns-core-modules/ui/frame/frame-common.ts index a4a3407798..9106a32fc8 100644 --- a/tns-core-modules/ui/frame/frame-common.ts +++ b/tns-core-modules/ui/frame/frame-common.ts @@ -414,7 +414,9 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition { this.currentPage.onNavigatingFrom(isBack); } - backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext); + if (backstackEntry && backstackEntry.resolvedPage) { + backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext); + } } public get animated(): boolean { From 452e45282f48d5ed72a6c03d39344a20ce9827a9 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Sun, 12 Nov 2017 22:45:31 -0500 Subject: [PATCH 02/10] After fixing the previous locally and repacking and releasing a new version to my users, I also noticed a few of these as well: ``` com.tns.NativeScriptException: Calling js method run failed TypeError: Cannot read property 'navDepth' of undefined File: "file:///data/data/__REDACTED__/files/app/vendor.js, line: 1, column: 1281638 StackTrace: Frame: function:'t._goBackCore', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 451275 Frame: function:'r.performGoBack', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1165482 Frame: function:'r._processNavigationContext', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1164863 Frame: function:'t._processNavigationContext', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 454543 Frame: function:'r._processNavigationQueue', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1164163 Frame: function:'t.setCurrent', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 449995 Frame: function:'', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1739072 Frame: function:'e.invokeTask', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1286901 Frame: function:'f.runTask', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1282022 Frame: function:'invoke', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1287880 Frame: function:'n', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1303661 Frame: function:'u', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 905520 Frame: function:'e.invoke', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1286200 Frame: function:'f.runGuarded', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1281566 Frame: function:'', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 1281183 Frame: function:'run', file:'file:///data/data/__REDACTED__/files/app/vendor.js', line: 1, column: 905605 ``` --- tns-core-modules/ui/frame/frame-common.ts | 2 +- tns-core-modules/ui/frame/frame.android.ts | 41 ++++++++++++---------- tns-core-modules/ui/frame/frame.ios.ts | 21 ++++++----- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/tns-core-modules/ui/frame/frame-common.ts b/tns-core-modules/ui/frame/frame-common.ts index 9106a32fc8..e68e15a85c 100644 --- a/tns-core-modules/ui/frame/frame-common.ts +++ b/tns-core-modules/ui/frame/frame-common.ts @@ -415,7 +415,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition { } if (backstackEntry && backstackEntry.resolvedPage) { - backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext); + backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext); } } diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index d039fae758..632442fc40 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -173,29 +173,32 @@ export class Frame extends FrameBase { public _goBackCore(backstackEntry: BackstackEntry) { super._goBackCore(backstackEntry); - navDepth = backstackEntry.navDepth; - const activity = this._android.activity; - const manager = activity.getFragmentManager(); - const transaction = manager.beginTransaction(); + if (backstackEntry) { + navDepth = backstackEntry.navDepth; - if (!backstackEntry.fragment) { - // Happens on newer API levels. On older all fragments - // are recreated once activity is created. - // This entry fragment was destroyed by app suspend. - // We need to recreate its animations and then reverse it. - backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag); - _updateTransitions(backstackEntry); - } + const activity = this._android.activity; + const manager = activity.getFragmentManager(); + const transaction = manager.beginTransaction(); - const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry); - if (!transitionReversed) { - // If transition were not reversed then use animations. - transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId); - } + if (!backstackEntry.fragment) { + // Happens on newer API levels. On older all fragments + // are recreated once activity is created. + // This entry fragment was destroyed by app suspend. + // We need to recreate its animations and then reverse it. + backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag); + _updateTransitions(backstackEntry); + } - transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag); - transaction.commit(); + const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry); + if (!transitionReversed) { + // If transition were not reversed then use animations. + transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId); + } + + transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag); + transaction.commit(); + } } public _removeBackstackEntries(removed: BackstackEntry[]): void { diff --git a/tns-core-modules/ui/frame/frame.ios.ts b/tns-core-modules/ui/frame/frame.ios.ts index 3a7ca3632f..875a9876ee 100644 --- a/tns-core-modules/ui/frame/frame.ios.ts +++ b/tns-core-modules/ui/frame/frame.ios.ts @@ -200,18 +200,21 @@ export class Frame extends FrameBase { public _goBackCore(backstackEntry: BackstackEntry) { super._goBackCore(backstackEntry); - navDepth = backstackEntry[NAV_DEPTH]; + if (backstackEntry) { + navDepth = backstackEntry[NAV_DEPTH]; - if (!this._shouldSkipNativePop) { - let controller = backstackEntry.resolvedPage.ios; - let animated = this._currentEntry ? this._getIsAnimatedNavigation(this._currentEntry.entry) : false; + if (!this._shouldSkipNativePop) { + let controller = backstackEntry.resolvedPage.ios; + let animated = this._currentEntry ? this._getIsAnimatedNavigation(this._currentEntry.entry) : false; - this._updateActionBar(backstackEntry.resolvedPage); - if (traceEnabled()) { - traceWrite(`${this}.popToViewControllerAnimated(${controller}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); - } - this._ios.controller.popToViewControllerAnimated(controller, animated); + this._updateActionBar(backstackEntry.resolvedPage); + if (traceEnabled()) { + traceWrite(`${this}.popToViewControllerAnimated(${controller}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + } + this._ios.controller.popToViewControllerAnimated(controller, animated); + } } + } public _updateActionBar(page?: Page, disableNavBarAnimation: boolean = false): void { From 79f0f5519d7a6fda6153e3a43eb85046395cc761 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Sun, 12 Nov 2017 22:49:44 -0500 Subject: [PATCH 03/10] Formatting --- tns-core-modules/ui/frame/frame.ios.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tns-core-modules/ui/frame/frame.ios.ts b/tns-core-modules/ui/frame/frame.ios.ts index 875a9876ee..acfe63b14b 100644 --- a/tns-core-modules/ui/frame/frame.ios.ts +++ b/tns-core-modules/ui/frame/frame.ios.ts @@ -201,17 +201,17 @@ export class Frame extends FrameBase { super._goBackCore(backstackEntry); if (backstackEntry) { - navDepth = backstackEntry[NAV_DEPTH]; + navDepth = backstackEntry[NAV_DEPTH]; - if (!this._shouldSkipNativePop) { - let controller = backstackEntry.resolvedPage.ios; - let animated = this._currentEntry ? this._getIsAnimatedNavigation(this._currentEntry.entry) : false; + if (!this._shouldSkipNativePop) { + let controller = backstackEntry.resolvedPage.ios; + let animated = this._currentEntry ? this._getIsAnimatedNavigation(this._currentEntry.entry) : false; - this._updateActionBar(backstackEntry.resolvedPage); - if (traceEnabled()) { - traceWrite(`${this}.popToViewControllerAnimated(${controller}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); - } - this._ios.controller.popToViewControllerAnimated(controller, animated); + this._updateActionBar(backstackEntry.resolvedPage); + if (traceEnabled()) { + traceWrite(`${this}.popToViewControllerAnimated(${controller}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + } + this._ios.controller.popToViewControllerAnimated(controller, animated); } } From 389e4f212c17dfda74497ab5cd3a6bf32d79372b Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Sun, 19 Nov 2017 16:53:49 -0500 Subject: [PATCH 04/10] Fixes for a low incidence but still possible crash on these: Exception com.tns.NativeScriptException: Calling js method run failed Error: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1438) android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1456) android.app.BackStackRecord.commitInternal(BackStackRecord.java:707) android.app.BackStackRecord.commit(BackStackRecord.java:671) com.tns.Runtime.callJSMethodNative(Native Method) com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1088) com.tns.Runtime.callJSMethodImpl(Runtime.java:970) com.tns.Runtime.callJSMethod(Runtime.java:957) com.tns.Runtime.callJSMethod(Runtime.java:941) com.tns.Runtime.callJSMethod(Runtime.java:933) [REDACTED_DOMAIN_NAME](Runnable.java:10) android.os.Handler.handleCallback(Handler.java:751) android.os.Handler.dispatchMessage(Handler.java:95) android.os.Looper.loop(Looper.java:154) android.app.ActivityThread.main(ActivityThread.java:6692) java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.ZygoteInit$[REDACTED_DOMAIN_NAME](ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) File: "file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js, line: 1, column: 1284818 StackTrace: Frame: function:'t._navigateCore', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 451777 Frame: function:'r.performNavigation', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1168391 Frame: function:'r._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1168070 Frame: function:'t._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 455138 Frame: function:'r._processNavigationQueue', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1167343 Frame: function:'t.setCurrent', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 450583 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1743837 Frame: function:'e.invokeTask', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1290081 Frame: function:'f.runTask', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1285202 Frame: function:'invoke', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1291060 Frame: function:'n', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1306841 Frame: function:'u', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 901375 Frame: function:'e.invoke', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1289380 Frame: function:'f.runGuarded', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1284746 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1284363 Frame: function:'run', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 901460 com.tns.Runtime.callJSMethodNative (Runtime.java) com.tns.Runtime.dispatchCallJSMethodNative (Runtime.java:1088) com.tns.Runtime.callJSMethodImpl (Runtime.java:970) com.tns.Runtime.callJSMethod (Runtime.java:957) com.tns.Runtime.callJSMethod (Runtime.java:941) com.tns.Runtime.callJSMethod (Runtime.java:933) com.tns.gen.java.lang.Runnable.run (Runnable.java:10) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6692) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) arrow_drop_down Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState android.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1438) android.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1456) android.app.BackStackRecord.commitInternal (BackStackRecord.java:707) android.app.BackStackRecord.commit (BackStackRecord.java:671) com.tns.Runtime.callJSMethodNative (Runtime.java) com.tns.Runtime.dispatchCallJSMethodNative (Runtime.java:1088) com.tns.Runtime.callJSMethodImpl (Runtime.java:970) com.tns.Runtime.callJSMethod (Runtime.java:957) com.tns.Runtime.callJSMethod (Runtime.java:941) com.tns.Runtime.callJSMethod (Runtime.java:933) com.tns.gen.java.lang.Runnable.run (Runnable.java:10) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6692) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) ======================================================================================================================= ======================================================================================================================= ======================================================================================================================= Exception com.tns.NativeScriptException: Calling js method run failed Error: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1438) android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1456) android.app.BackStackRecord.commitInternal(BackStackRecord.java:707) android.app.BackStackRecord.commit(BackStackRecord.java:671) com.tns.Runtime.callJSMethodNative(Native Method) com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1088) com.tns.Runtime.callJSMethodImpl(Runtime.java:970) com.tns.Runtime.callJSMethod(Runtime.java:957) com.tns.Runtime.callJSMethod(Runtime.java:941) com.tns.Runtime.callJSMethod(Runtime.java:933) [REDACTED_DOMAIN_NAME](Runnable.java:10) android.os.Handler.handleCallback(Handler.java:751) android.os.Handler.dispatchMessage(Handler.java:95) android.os.Looper.loop(Looper.java:154) android.app.ActivityThread.main(ActivityThread.java:6692) java.lang.reflect.Method.invoke(Native Method) com.android.internal.os.ZygoteInit$[REDACTED_DOMAIN_NAME](ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) File: "file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js, line: 1, column: 1284818 StackTrace: Frame: function:'t._goBackCore', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 452207 Frame: function:'r.performGoBack', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1168662 Frame: function:'r._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1168043 Frame: function:'t._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 455138 Frame: function:'r._processNavigationQueue', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1167343 Frame: function:'t.setCurrent', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 450583 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1743837 Frame: function:'e.invokeTask', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1290081 Frame: function:'f.runTask', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1285202 Frame: function:'invoke', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1291060 Frame: function:'n', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1306841 Frame: function:'u', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 901375 Frame: function:'e.invoke', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1289380 Frame: function:'f.runGuarded', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1284746 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1284363 Frame: function:'run', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 901460 com.tns.Runtime.callJSMethodNative (Runtime.java) com.tns.Runtime.dispatchCallJSMethodNative (Runtime.java:1088) com.tns.Runtime.callJSMethodImpl (Runtime.java:970) com.tns.Runtime.callJSMethod (Runtime.java:957) com.tns.Runtime.callJSMethod (Runtime.java:941) com.tns.Runtime.callJSMethod (Runtime.java:933) com.tns.gen.java.lang.Runnable.run (Runnable.java:10) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6692) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) arrow_drop_down Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState android.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1438) android.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1456) android.app.BackStackRecord.commitInternal (BackStackRecord.java:707) android.app.BackStackRecord.commit (BackStackRecord.java:671) com.tns.Runtime.callJSMethodNative (Runtime.java) com.tns.Runtime.dispatchCallJSMethodNative (Runtime.java:1088) com.tns.Runtime.callJSMethodImpl (Runtime.java:970) com.tns.Runtime.callJSMethod (Runtime.java:957) com.tns.Runtime.callJSMethod (Runtime.java:941) com.tns.Runtime.callJSMethod (Runtime.java:933) com.tns.gen.java.lang.Runnable.run (Runnable.java:10) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6692) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) --- tns-core-modules/ui/frame/frame.android.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index 632442fc40..204ce2036e 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -168,7 +168,7 @@ export class Frame extends FrameBase { } transaction.replace(this.containerViewId, newFragment, newFragmentTag); - transaction.commit(); + transaction.commitAllowingStateLoss(); } public _goBackCore(backstackEntry: BackstackEntry) { @@ -197,7 +197,7 @@ export class Frame extends FrameBase { } transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag); - transaction.commit(); + transaction.commitAllowingStateLoss(); } } From 9fa081395a0228003bb6d4d529d722d8eff4d5f8 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Thu, 30 Nov 2017 12:30:58 -0500 Subject: [PATCH 05/10] Fix for: ```Exception com.tns.NativeScriptException: Calling js method run failed TypeError: Cannot read property 'getFragmentManager' of undefined File: "file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js, line: 1, column: 1290524 StackTrace: Frame: function:'t._goBackCore', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 452769 Frame: function:'r.performGoBack', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1174368 Frame: function:'r._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1173749 Frame: function:'t._processNavigationContext', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 456009 Frame: function:'r.goBack', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1172002 Frame: function:'t.back', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 589098 Frame: function:'e.back', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 471495 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 216780 Frame: function:'u', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 912894 Frame: function:'e.invoke', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1295086 Frame: function:'f.runGuarded', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1290452 Frame: function:'', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 1290069 Frame: function:'run', file:'file:///data/data/com.ugroupmedia.pnp14/files/app/vendor.js', line: 1, column: 912979 com.tns.Runtime.callJSMethodNative (Runtime.java) com.tns.Runtime.dispatchCallJSMethodNative (Runtime.java:1088) com.tns.Runtime.callJSMethodImpl (Runtime.java:970) com.tns.Runtime.callJSMethod (Runtime.java:957) com.tns.Runtime.callJSMethod (Runtime.java:941) com.tns.Runtime.callJSMethod (Runtime.java:933) com.tns.gen.java.lang.Runnable.run (Runnable.java:10) android.os.Handler.handleCallback (Handler.java:751) android.os.Handler.dispatchMessage (Handler.java:95) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6692) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)``` --- tns-core-modules/ui/frame/frame.android.ts | 38 ++++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index 204ce2036e..431f680179 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -178,26 +178,28 @@ export class Frame extends FrameBase { navDepth = backstackEntry.navDepth; const activity = this._android.activity; - const manager = activity.getFragmentManager(); - const transaction = manager.beginTransaction(); - - if (!backstackEntry.fragment) { - // Happens on newer API levels. On older all fragments - // are recreated once activity is created. - // This entry fragment was destroyed by app suspend. - // We need to recreate its animations and then reverse it. - backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag); - _updateTransitions(backstackEntry); - } + if (activity) { + const manager = activity.getFragmentManager(); + const transaction = manager.beginTransaction(); + + if (!backstackEntry.fragment) { + // Happens on newer API levels. On older all fragments + // are recreated once activity is created. + // This entry fragment was destroyed by app suspend. + // We need to recreate its animations and then reverse it. + backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag); + _updateTransitions(backstackEntry); + } - const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry); - if (!transitionReversed) { - // If transition were not reversed then use animations. - transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId); - } + const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry); + if (!transitionReversed) { + // If transition were not reversed then use animations. + transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId); + } - transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag); - transaction.commitAllowingStateLoss(); + transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag); + transaction.commitAllowingStateLoss(); + } } } From 4c98d8e99730b9b6c3b4397b2b0efb672cb58254 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Mon, 4 Dec 2017 01:08:23 -0500 Subject: [PATCH 06/10] Further safety checks based on previous fixes for Android as well as hinted issues in iOS crash logs --- tns-core-modules/ui/frame/frame-common.ts | 56 ++++---- tns-core-modules/ui/frame/frame.ios.ts | 168 +++++++++++----------- 2 files changed, 116 insertions(+), 108 deletions(-) diff --git a/tns-core-modules/ui/frame/frame-common.ts b/tns-core-modules/ui/frame/frame-common.ts index e68e15a85c..ba3e1ad97f 100644 --- a/tns-core-modules/ui/frame/frame-common.ts +++ b/tns-core-modules/ui/frame/frame-common.ts @@ -45,7 +45,7 @@ export function reloadPage(): void { create: currentEntry.create, moduleName: currentEntry.moduleName, backstackVisible: currentEntry.backstackVisible - } + }; frame.navigate(newEntry); } @@ -72,7 +72,7 @@ const moduleCreatePage = profile("module.createPage", (moduleNamePath: string, m if (traceEnabled()) { traceWrite("Calling createPage()", traceCategories.Navigation); } - var page = moduleExports.createPage(); + const page = moduleExports.createPage(); let cssFileName = resolveFileName(moduleNamePath, "css"); // If there is no cssFile only appCss will be applied at loaded. @@ -204,7 +204,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition { const navigationContext: NavigationContext = { entry: backstackEntry, isBackNavigation: true - } + }; this._navigationQueue.push(navigationContext); @@ -273,7 +273,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition { const navigationContext: NavigationContext = { entry: backstackEntry, isBackNavigation: false - } + }; this._navigationQueue.push(navigationContext); @@ -367,34 +367,38 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition { @profile private performNavigation(navigationContext: NavigationContext) { - let navContext = navigationContext.entry; + if (navigationContext) { + let navContext = navigationContext.entry; + + // TODO: This should happen once navigation is completed. + if (navContext && navContext.entry && navContext.entry.clearHistory) { + // Don't clear backstack immediately or we can't remove pages from frame. + } else if (FrameBase._isEntryBackstackVisible(this._currentEntry)) { + this._backStack.push(this._currentEntry); + } - // TODO: This should happen once navigation is completed. - if (navigationContext.entry.entry.clearHistory) { - // Don't clear backstack immediately or we can't remove pages from frame. - } else if (FrameBase._isEntryBackstackVisible(this._currentEntry)) { - this._backStack.push(this._currentEntry); + this._onNavigatingTo(navContext, navigationContext.isBackNavigation); + this._navigateCore(navContext); } - - this._onNavigatingTo(navContext, navigationContext.isBackNavigation); - this._navigateCore(navContext); } @profile private performGoBack(navigationContext: NavigationContext) { - let backstackEntry = navigationContext.entry; - if (!backstackEntry) { - backstackEntry = this._backStack.pop(); - navigationContext.entry = backstackEntry; - } else { - const index = this._backStack.indexOf(backstackEntry); - const removed = this._backStack.splice(index + 1); - this._backStack.pop(); - this._removeBackstackEntries(removed); - } - - this._onNavigatingTo(backstackEntry, true); - this._goBackCore(backstackEntry); + if (navigationContext) { + let backstackEntry = navigationContext.entry; + if (!backstackEntry) { + backstackEntry = this._backStack.pop(); + navigationContext.entry = backstackEntry; + } else { + const index = this._backStack.indexOf(backstackEntry); + const removed = this._backStack.splice(index + 1); + this._backStack.pop(); + this._removeBackstackEntries(removed); + } + + this._onNavigatingTo(backstackEntry, true); + this._goBackCore(backstackEntry); + } } public _goBackCore(backstackEntry: BackstackEntry) { diff --git a/tns-core-modules/ui/frame/frame.ios.ts b/tns-core-modules/ui/frame/frame.ios.ts index acfe63b14b..acd713f5eb 100644 --- a/tns-core-modules/ui/frame/frame.ios.ts +++ b/tns-core-modules/ui/frame/frame.ios.ts @@ -30,7 +30,9 @@ class NotificationObserver2 extends NSObject { } public onReceive(notification: NSNotification): void { - this._onReceiveCallback(notification); + if (this._onReceiveCallback) { + this._onReceiveCallback(notification); + } } public static ObjCExposedMethods = { @@ -96,104 +98,106 @@ export class Frame extends FrameBase { public _navigateCore(backstackEntry: BackstackEntry) { super._navigateCore(backstackEntry); - let viewController: UIViewController = backstackEntry.resolvedPage.ios; - if (!viewController) { - throw new Error("Required page does not have a viewController created."); - } - - let clearHistory = backstackEntry.entry.clearHistory; - if (clearHistory) { - this._clearBackStack(); - navDepth = -1; - } - navDepth++; + if (backstackEntry) { + let viewController: UIViewController = backstackEntry.resolvedPage.ios; + if (!viewController) { + throw new Error("Required page does not have a viewController created."); + } - let navigationTransition: NavigationTransition; - let animated = this.currentPage ? this._getIsAnimatedNavigation(backstackEntry.entry) : false; - if (animated) { - navigationTransition = this._getNavigationTransition(backstackEntry.entry); - if (navigationTransition) { - viewController[TRANSITION] = navigationTransition; + let clearHistory = backstackEntry.entry.clearHistory; + if (clearHistory) { + this._clearBackStack(); + navDepth = -1; + } + navDepth++; + + let navigationTransition: NavigationTransition; + let animated = this.currentPage ? this._getIsAnimatedNavigation(backstackEntry.entry) : false; + if (animated) { + navigationTransition = this._getNavigationTransition(backstackEntry.entry); + if (navigationTransition) { + viewController[TRANSITION] = navigationTransition; + } + } + else { + //https://github.com/NativeScript/NativeScript/issues/1787 + viewController[TRANSITION] = { name: "non-animated" }; } - } - else { - //https://github.com/NativeScript/NativeScript/issues/1787 - viewController[TRANSITION] = { name: "non-animated" }; - } - let nativeTransition = _getNativeTransition(navigationTransition, true); - if (!nativeTransition && navigationTransition) { - this._ios.controller.delegate = this._animatedDelegate; - viewController[DELEGATE] = this._animatedDelegate; - } - else { - viewController[DELEGATE] = null; - this._ios.controller.delegate = null; - } + let nativeTransition = _getNativeTransition(navigationTransition, true); + if (!nativeTransition && navigationTransition) { + this._ios.controller.delegate = this._animatedDelegate; + viewController[DELEGATE] = this._animatedDelegate; + } + else { + viewController[DELEGATE] = null; + this._ios.controller.delegate = null; + } - backstackEntry[NAV_DEPTH] = navDepth; - viewController[ENTRY] = backstackEntry; + backstackEntry[NAV_DEPTH] = navDepth; + viewController[ENTRY] = backstackEntry; - // First navigation. - if (!this._currentEntry) { - // Update action-bar with disabled animations before the initial navigation. - this._updateActionBar(backstackEntry.resolvedPage, true); - this._ios.controller.pushViewControllerAnimated(viewController, animated); - if (traceEnabled()) { - traceWrite(`${this}.pushViewControllerAnimated(${viewController}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + // First navigation. + if (!this._currentEntry) { + // Update action-bar with disabled animations before the initial navigation. + this._updateActionBar(backstackEntry.resolvedPage, true); + this._ios.controller.pushViewControllerAnimated(viewController, animated); + if (traceEnabled()) { + traceWrite(`${this}.pushViewControllerAnimated(${viewController}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + } + return; } - return; - } - // We should clear the entire history. - if (clearHistory) { - viewController.navigationItem.hidesBackButton = true; - const newControllers = NSMutableArray.alloc().initWithCapacity(1); - newControllers.addObject(viewController); + // We should clear the entire history. + if (clearHistory) { + viewController.navigationItem.hidesBackButton = true; + const newControllers = NSMutableArray.alloc().initWithCapacity(1); + newControllers.addObject(viewController); - // Mark all previous ViewControllers as cleared - const oldControllers = this._ios.controller.viewControllers; - for (let i = 0; i < oldControllers.count; i++) { - (oldControllers.objectAtIndex(i)).isBackstackCleared = true; - } + // Mark all previous ViewControllers as cleared + const oldControllers = this._ios.controller.viewControllers; + for (let i = 0; i < oldControllers.count; i++) { + (oldControllers.objectAtIndex(i)).isBackstackCleared = true; + } + + this._ios.controller.setViewControllersAnimated(newControllers, animated); + if (traceEnabled()) { + traceWrite(`${this}.setViewControllersAnimated([${viewController}], ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + } + return; - this._ios.controller.setViewControllersAnimated(newControllers, animated); - if (traceEnabled()) { - traceWrite(`${this}.setViewControllersAnimated([${viewController}], ${animated}); depth = ${navDepth}`, traceCategories.Navigation); } - return; - } + // We should hide the current entry from the back stack. + if (!Frame._isEntryBackstackVisible(this._currentEntry)) { + let newControllers = NSMutableArray.alloc().initWithArray(this._ios.controller.viewControllers); + if (newControllers.count === 0) { + throw new Error("Wrong controllers count."); + } - // We should hide the current entry from the back stack. - if (!Frame._isEntryBackstackVisible(this._currentEntry)) { - let newControllers = NSMutableArray.alloc().initWithArray(this._ios.controller.viewControllers); - if (newControllers.count === 0) { - throw new Error("Wrong controllers count."); - } + // the code below fixes a phantom animation that appears on the Back button in this case + // TODO: investigate why the animation happens at first place before working around it + viewController.navigationItem.hidesBackButton = this.backStack.length === 0; - // the code below fixes a phantom animation that appears on the Back button in this case - // TODO: investigate why the animation happens at first place before working around it - viewController.navigationItem.hidesBackButton = this.backStack.length === 0; + // swap the top entry with the new one + const skippedNavController = newControllers.lastObject; + (skippedNavController).isBackstackSkipped = true; + newControllers.removeLastObject(); + newControllers.addObject(viewController); - // swap the top entry with the new one - const skippedNavController = newControllers.lastObject; - (skippedNavController).isBackstackSkipped = true; - newControllers.removeLastObject(); - newControllers.addObject(viewController); + // replace the controllers instead of pushing directly + this._ios.controller.setViewControllersAnimated(newControllers, animated); + if (traceEnabled()) { + traceWrite(`${this}.setViewControllersAnimated([originalControllers - lastController + ${viewController}], ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + } + return; + } - // replace the controllers instead of pushing directly - this._ios.controller.setViewControllersAnimated(newControllers, animated); + // General case. + this._ios.controller.pushViewControllerAnimated(viewController, animated); if (traceEnabled()) { - traceWrite(`${this}.setViewControllersAnimated([originalControllers - lastController + ${viewController}], ${animated}); depth = ${navDepth}`, traceCategories.Navigation); + traceWrite(`${this}.pushViewControllerAnimated(${viewController}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); } - return; - } - - // General case. - this._ios.controller.pushViewControllerAnimated(viewController, animated); - if (traceEnabled()) { - traceWrite(`${this}.pushViewControllerAnimated(${viewController}, ${animated}); depth = ${navDepth}`, traceCategories.Navigation); } } From f2d1d4f70c2ba7514be6c14c04c12b3e48fdc288 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Tue, 5 Dec 2017 15:05:04 -0500 Subject: [PATCH 07/10] If callback is missing, still handleNotification (layout updated) #5071 --- tns-core-modules/ui/frame/frame.ios.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tns-core-modules/ui/frame/frame.ios.ts b/tns-core-modules/ui/frame/frame.ios.ts index 1fc0d5e47b..f20f49296f 100644 --- a/tns-core-modules/ui/frame/frame.ios.ts +++ b/tns-core-modules/ui/frame/frame.ios.ts @@ -32,6 +32,8 @@ class NotificationObserver2 extends NSObject { public onReceive(notification: NSNotification): void { if (this._onReceiveCallback) { this._onReceiveCallback(notification); + } else { + handleNotification(notification); } } From 2d5015879e0870074fab99fbc4759913de3aeb13 Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Fri, 8 Dec 2017 00:07:34 -0500 Subject: [PATCH 08/10] Crashed: com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000000deaddead keyboard_arrow_up arrow_right 0 NativeScript NativeScript::reportFatalErrorBeforeShutdown(JSC::ExecState*, JSC::Exception*, bool) + 1544 1 NativeScript NativeScript::FFICallback::ffiClosureCallback(ffi_cif*, void*, void**, void*) + 104 2 NativeScript ffi_closure_SYSV_inner + 948 3 NativeScript .Ldo_closure + 20 4 UIKit -[UIGestureRecognizer _touchesEnded:withEvent:] + 168 5 UIKit __55-[UIGestureEnvironment _updateGesturesForEvent:window:]_block_invoke + 708 6 UIKit -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 240 7 UIKit -[UIGestureEnvironment _updateGesturesForEvent:window:] + 276 8 UIKit -[UIWindow sendEvent:] + 3180 9 UIKit -[UIApplication sendEvent:] + 340 10 UIKit __dispatchPreprocessedEventFromEventQueue + 2364 11 UIKit __handleEventQueueInternal + 4760 12 UIKit __handleHIDEventFetcherDrain + 152 13 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 --- tns-core-modules/ui/gestures/gestures.ios.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tns-core-modules/ui/gestures/gestures.ios.ts b/tns-core-modules/ui/gestures/gestures.ios.ts index 45d397e5c6..be85727656 100644 --- a/tns-core-modules/ui/gestures/gestures.ios.ts +++ b/tns-core-modules/ui/gestures/gestures.ios.ts @@ -197,8 +197,12 @@ export class GesturesObserver extends GesturesObserverBase { } public _executeCallback(args: GestureEventData) { - if (this.callback) { - this.callback.call(this.context, args); + try { + if (this.callback && this.context) { + this.callback.call(this.context, args); + } + } catch (e) { + // TODO } } From c6ef60e673f22076867bdf1003b22b96147589ee Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Fri, 8 Dec 2017 11:48:32 -0500 Subject: [PATCH 09/10] Revert "Crashed: com.apple.main-thread" This reverts commit 2d5015879e0870074fab99fbc4759913de3aeb13. --- tns-core-modules/ui/gestures/gestures.ios.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tns-core-modules/ui/gestures/gestures.ios.ts b/tns-core-modules/ui/gestures/gestures.ios.ts index be85727656..45d397e5c6 100644 --- a/tns-core-modules/ui/gestures/gestures.ios.ts +++ b/tns-core-modules/ui/gestures/gestures.ios.ts @@ -197,12 +197,8 @@ export class GesturesObserver extends GesturesObserverBase { } public _executeCallback(args: GestureEventData) { - try { - if (this.callback && this.context) { - this.callback.call(this.context, args); - } - } catch (e) { - // TODO + if (this.callback) { + this.callback.call(this.context, args); } } From 88c94ce93274263f8f4709fb8bcafba0e1196b9e Mon Sep 17 00:00:00 2001 From: Dick Smith Date: Mon, 11 Dec 2017 17:51:28 -0500 Subject: [PATCH 10/10] Try Catching these --- tns-core-modules/timer/timer.ios.ts | 6 +++++- tns-core-modules/ui/gestures/gestures.ios.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tns-core-modules/timer/timer.ios.ts b/tns-core-modules/timer/timer.ios.ts index cf780daa6d..aa88711611 100644 --- a/tns-core-modules/timer/timer.ios.ts +++ b/tns-core-modules/timer/timer.ios.ts @@ -25,7 +25,11 @@ class TimerTargetImpl extends NSObject { public tick(timer): void { if (!this.disposed) { - this.callback(); + try { + this.callback(); + } catch (e) { + // TODO + } } if (!this.shouldRepeat) { diff --git a/tns-core-modules/ui/gestures/gestures.ios.ts b/tns-core-modules/ui/gestures/gestures.ios.ts index 45d397e5c6..afbc0ab712 100644 --- a/tns-core-modules/ui/gestures/gestures.ios.ts +++ b/tns-core-modules/ui/gestures/gestures.ios.ts @@ -198,7 +198,11 @@ export class GesturesObserver extends GesturesObserverBase { public _executeCallback(args: GestureEventData) { if (this.callback) { - this.callback.call(this.context, args); + try { + this.callback.call(this.context, args); + } catch (e) { + // TODO + } } }