1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-11-19 11:15:21 +01:00

Merge pull request #1935 from bitwarden/debounce-navigation

Fix loss of cipher data when using pass generator
This commit is contained in:
Thomas Rittson 2021-07-07 11:49:05 +10:00 committed by GitHub
commit 72f315eada
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 3 deletions

View File

@ -8,6 +8,7 @@ import {
import { AuthGuardService } from 'jslib-angular/services/auth-guard.service';
import { DebounceNavigationService } from './services/debounceNavigationService';
import { LaunchGuardService } from './services/launch-guard.service';
import { LockGuardService } from './services/lock-guard.service';
@ -142,14 +143,16 @@ const routes: Routes = [
{
path: 'add-cipher',
component: AddEditComponent,
canActivate: [AuthGuardService],
canActivate: [AuthGuardService, DebounceNavigationService],
data: { state: 'add-cipher' },
runGuardsAndResolvers: 'always',
},
{
path: 'edit-cipher',
component: AddEditComponent,
canActivate: [AuthGuardService],
canActivate: [AuthGuardService, DebounceNavigationService],
data: { state: 'edit-cipher' },
runGuardsAndResolvers: 'always',
},
{
path: 'share-cipher',

View File

@ -0,0 +1,53 @@
import {
Injectable,
OnDestroy
} from '@angular/core';
import {
CanActivate,
NavigationEnd,
NavigationStart,
Router,
} from '@angular/router';
import { Subscription } from 'rxjs';
import {
filter,
pairwise,
} from 'rxjs/operators';
@Injectable()
export class DebounceNavigationService implements CanActivate, OnDestroy {
navigationStartSub: Subscription;
navigationSuccessSub: Subscription;
private lastNavigation: NavigationStart;
private thisNavigation: NavigationStart;
private lastNavigationSuccessId: number;
constructor(private router: Router) {
this.navigationStartSub = this.router.events
.pipe(filter(event => event instanceof NavigationStart), pairwise())
.subscribe((events: [NavigationStart, NavigationStart]) => [this.lastNavigation, this.thisNavigation] = events);
this.navigationSuccessSub = this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.subscribe((event: NavigationEnd) => this.lastNavigationSuccessId = event.id);
}
async canActivate() {
return !(this.thisNavigation?.navigationTrigger === 'hashchange' &&
this.lastNavigation.navigationTrigger === 'popstate' &&
this.lastNavigationSuccessId === this.lastNavigation.id &&
this.lastNavigation.url === this.thisNavigation?.url);
}
ngOnDestroy() {
if (this.navigationStartSub != null) {
this.navigationStartSub.unsubscribe();
}
if (this.navigationSuccessSub != null) {
this.navigationSuccessSub.unsubscribe();
}
}
}

View File

@ -6,8 +6,9 @@ import {
import { ToasterModule } from 'angular2-toaster';
import { LockGuardService } from './lock-guard.service';
import { DebounceNavigationService } from './debounceNavigationService';
import { LaunchGuardService } from './launch-guard.service';
import { LockGuardService } from './lock-guard.service';
import { UnauthGuardService } from './unauth-guard.service';
import { AuthGuardService } from 'jslib-angular/services/auth-guard.service';
@ -121,6 +122,7 @@ export function initFactory(platformUtilsService: PlatformUtilsService, i18nServ
LockGuardService,
LaunchGuardService,
UnauthGuardService,
DebounceNavigationService,
PopupUtilsService,
BroadcasterService,
{ provide: MessagingService, useValue: messagingService },