From 3327bd8eab0cf5bfb9a6a21d6ee4a8e081aab630 Mon Sep 17 00:00:00 2001 From: Jason Aden Date: Fri, 26 Apr 2019 15:22:46 -0700 Subject: [PATCH] fix(router): fix a problem with router not responding to back button (#30160) There was a problem with a combination of the `eager` URL update, browser `back` button, and hybrid applications. Details provided in internal ticket http://b/123667227. This fix handles the problem by setting `router.browserUrlTree` when all conditions have failed, meaning the browser doesn't do anything with the navigation other than update internal data structures. Without this change, the problem was an old value was stored in `router.broserUrlTree` causing some new navigations to be compared to an old value and breaking future navigations. PR Close #30160 --- packages/router/src/router.ts | 1 + packages/router/test/integration.spec.ts | 27 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index fdf385220e..248d06d0c2 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -555,6 +555,7 @@ export class Router { * way the next navigation will be coming from the current URL in the browser. */ this.rawUrlTree = t.rawUrl; + this.browserUrlTree = t.urlAfterRedirects; t.resolve(null); return EMPTY; } diff --git a/packages/router/test/integration.spec.ts b/packages/router/test/integration.spec.ts index e95386f18c..60082eb634 100644 --- a/packages/router/test/integration.spec.ts +++ b/packages/router/test/integration.spec.ts @@ -661,6 +661,33 @@ describe('Integration', () => { expect(location.path()).toEqual('/login'); }))); + it('should set browserUrlTree with urlUpdateStrategy="eagar" and false `shouldProcessUrl`', + fakeAsync(inject([Router, Location], (router: Router, location: Location) => { + const fixture = TestBed.createComponent(RootCmp); + advance(fixture); + + router.urlUpdateStrategy = 'eager'; + + router.resetConfig([ + {path: 'team/:id', component: SimpleCmp}, + {path: 'login', component: AbsoluteSimpleLinkCmp} + ]); + + router.navigateByUrl('/team/22'); + advance(fixture, 1); + + expect((router as any).browserUrlTree.toString()).toBe('/team/22'); + + // Force to not process URL changes + router.urlHandlingStrategy.shouldProcessUrl = (url: UrlTree) => false; + + router.navigateByUrl('/login'); + advance(fixture, 1); + + // Because we now can't process any URL, we will end up back at the root. + expect((router as any).browserUrlTree.toString()).toBe('/'); + }))); + it('should eagerly update URL after redirects are applied with urlUpdateStrategy="eagar"', fakeAsync(inject([Router, Location], (router: Router, location: Location) => { const fixture = TestBed.createComponent(RootCmp);