This reverts commit 15e397816f98ec16839c30fd5c1ea01c7444fb84. Reason: it broke an internal g3 app. PR Close #31344
This commit is contained in:
parent
f57e77eeb4
commit
0de5d79bf6
@ -739,26 +739,10 @@ export class Router {
|
|||||||
const navCancel =
|
const navCancel =
|
||||||
new NavigationCancel(t.id, this.serializeUrl(t.extractedUrl), e.message);
|
new NavigationCancel(t.id, this.serializeUrl(t.extractedUrl), e.message);
|
||||||
eventsSubject.next(navCancel);
|
eventsSubject.next(navCancel);
|
||||||
|
t.resolve(false);
|
||||||
|
|
||||||
// When redirecting, we need to delay resolving the navigation promise and push
|
if (redirecting) {
|
||||||
// it to the redirect navigation
|
this.navigateByUrl(e.url);
|
||||||
if (!redirecting) {
|
|
||||||
t.resolve(false);
|
|
||||||
} else {
|
|
||||||
// setTimeout is required so this navigation finishes with the return EMPTY
|
|
||||||
// below. If it isn't allowed to finish processing, there can be multiple
|
|
||||||
// navigations to the same URL.
|
|
||||||
setTimeout(() => {
|
|
||||||
const mergedTree = this.urlHandlingStrategy.merge(e.url, this.rawUrlTree);
|
|
||||||
const extras = {
|
|
||||||
skipLocationChange: t.extras.skipLocationChange,
|
|
||||||
replaceUrl: this.urlUpdateStrategy === 'eager'
|
|
||||||
};
|
|
||||||
|
|
||||||
return this.scheduleNavigation(
|
|
||||||
mergedTree, 'imperative', null, extras,
|
|
||||||
{resolve: t.resolve, reject: t.reject, promise: t.promise});
|
|
||||||
}, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All other errors should reset to the router's internal URL reference to the
|
/* All other errors should reset to the router's internal URL reference to the
|
||||||
@ -1072,8 +1056,7 @@ export class Router {
|
|||||||
|
|
||||||
private scheduleNavigation(
|
private scheduleNavigation(
|
||||||
rawUrl: UrlTree, source: NavigationTrigger, restoredState: RestoredState|null,
|
rawUrl: UrlTree, source: NavigationTrigger, restoredState: RestoredState|null,
|
||||||
extras: NavigationExtras,
|
extras: NavigationExtras): Promise<boolean> {
|
||||||
priorPromise?: {resolve: any, reject: any, promise: Promise<boolean>}): Promise<boolean> {
|
|
||||||
const lastNavigation = this.getTransition();
|
const lastNavigation = this.getTransition();
|
||||||
// If the user triggers a navigation imperatively (e.g., by using navigateByUrl),
|
// If the user triggers a navigation imperatively (e.g., by using navigateByUrl),
|
||||||
// and that navigation results in 'replaceState' that leads to the same URL,
|
// and that navigation results in 'replaceState' that leads to the same URL,
|
||||||
@ -1098,20 +1081,13 @@ export class Router {
|
|||||||
return Promise.resolve(true); // return value is not used
|
return Promise.resolve(true); // return value is not used
|
||||||
}
|
}
|
||||||
|
|
||||||
let resolve: any;
|
let resolve: any = null;
|
||||||
let reject: any;
|
let reject: any = null;
|
||||||
let promise: Promise<boolean>;
|
|
||||||
if (priorPromise) {
|
|
||||||
resolve = priorPromise.resolve;
|
|
||||||
reject = priorPromise.reject;
|
|
||||||
promise = priorPromise.promise;
|
|
||||||
|
|
||||||
} else {
|
const promise = new Promise<boolean>((res, rej) => {
|
||||||
promise = new Promise<boolean>((res, rej) => {
|
resolve = res;
|
||||||
resolve = res;
|
reject = rej;
|
||||||
reject = rej;
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const id = ++this.navigationId;
|
const id = ++this.navigationId;
|
||||||
this.setTransition({
|
this.setTransition({
|
||||||
|
@ -2464,39 +2464,6 @@ describe('Integration', () => {
|
|||||||
[NavigationEnd, '/'],
|
[NavigationEnd, '/'],
|
||||||
]);
|
]);
|
||||||
})));
|
})));
|
||||||
|
|
||||||
it('replaces URL when URL is updated eagerly so back button can still work',
|
|
||||||
fakeAsync(inject([Router, Location], (router: Router, location: SpyLocation) => {
|
|
||||||
router.urlUpdateStrategy = 'eager';
|
|
||||||
router.resetConfig([
|
|
||||||
{path: '', component: SimpleCmp},
|
|
||||||
{path: 'one', component: RouteCmp, canActivate: ['returnUrlTree']},
|
|
||||||
{path: 'redirected', component: SimpleCmp}
|
|
||||||
]);
|
|
||||||
const fixture = createRoot(router, RootCmp);
|
|
||||||
router.navigateByUrl('/one');
|
|
||||||
|
|
||||||
tick();
|
|
||||||
|
|
||||||
expect(location.path()).toEqual('/redirected');
|
|
||||||
expect(location.urlChanges).toEqual(['replace: /', '/one', 'replace: /redirected']);
|
|
||||||
})));
|
|
||||||
|
|
||||||
it('should resolve navigateByUrl promise after redirect finishes',
|
|
||||||
fakeAsync(inject([Router, Location], (router: Router, location: SpyLocation) => {
|
|
||||||
let resolvedPath = '';
|
|
||||||
router.urlUpdateStrategy = 'eager';
|
|
||||||
router.resetConfig([
|
|
||||||
{path: '', component: SimpleCmp},
|
|
||||||
{path: 'one', component: RouteCmp, canActivate: ['returnUrlTree']},
|
|
||||||
{path: 'redirected', component: SimpleCmp}
|
|
||||||
]);
|
|
||||||
const fixture = createRoot(router, RootCmp);
|
|
||||||
router.navigateByUrl('/one').then(v => { resolvedPath = location.path(); });
|
|
||||||
|
|
||||||
tick();
|
|
||||||
expect(resolvedPath).toBe('/redirected');
|
|
||||||
})));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('runGuardsAndResolvers', () => {
|
describe('runGuardsAndResolvers', () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user