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:
commit
72f315eada
@ -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',
|
||||
|
53
src/popup/services/debounceNavigationService.ts
Normal file
53
src/popup/services/debounceNavigationService.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user