1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-12-22 16:29:09 +01:00

[PM-5189] Reworking how we handle updating the inline menu position

This commit is contained in:
Cesar Gonzalez 2024-06-18 17:07:16 -05:00
parent 3e74eb7606
commit 6802cc8957
No known key found for this signature in database
GPG Key ID: 3381A5457F8CCECF

View File

@ -67,7 +67,8 @@ export class OverlayBackground implements OverlayBackgroundInterface {
private delayedCloseTimeout: number | NodeJS.Timeout; private delayedCloseTimeout: number | NodeJS.Timeout;
private startInlineMenuFadeInSubject = new Subject<void>(); private startInlineMenuFadeInSubject = new Subject<void>();
private cancelInlineMenuFadeInSubject = new Subject<boolean>(); private cancelInlineMenuFadeInSubject = new Subject<boolean>();
private repositionInlineMenuSubject = new Subject<chrome.runtime.MessageSender>(); private calculateInlineMenuPositionSubject = new Subject<chrome.runtime.MessageSender>();
private updateInlineMenuPositionSubject = new Subject<chrome.runtime.MessageSender>();
private rebuildSubFrameOffsetsSubject = new Subject<chrome.runtime.MessageSender>(); private rebuildSubFrameOffsetsSubject = new Subject<chrome.runtime.MessageSender>();
private focusedFieldData: FocusedFieldData; private focusedFieldData: FocusedFieldData;
private isFieldCurrentlyFocused: boolean = false; private isFieldCurrentlyFocused: boolean = false;
@ -155,12 +156,18 @@ export class OverlayBackground implements OverlayBackgroundInterface {
} }
private initOverlayObservables() { private initOverlayObservables() {
this.repositionInlineMenuSubject this.calculateInlineMenuPositionSubject
.pipe( .pipe(
debounceTime(500), debounceTime(500),
switchMap((sender) => this.repositionInlineMenu(sender)), switchMap((sender) => this.repositionInlineMenu(sender)),
) )
.subscribe(); .subscribe();
this.updateInlineMenuPositionSubject
.pipe(
debounceTime(250),
switchMap((sender) => this.updateInlineMenuPositionAfterRepositionEvent(sender)),
)
.subscribe();
this.rebuildSubFrameOffsetsSubject this.rebuildSubFrameOffsetsSubject
.pipe( .pipe(
throttleTime(600), throttleTime(600),
@ -448,6 +455,13 @@ export class OverlayBackground implements OverlayBackgroundInterface {
return; return;
} }
if (!(await this.checkIsInlineMenuButtonVisible(sender))) {
await this.toggleInlineMenuHidden(
{ isInlineMenuHidden: false, setTransparentInlineMenu: true },
sender,
);
}
void this.updateInlineMenuPosition({ overlayElement: AutofillOverlayElement.Button }, sender); void this.updateInlineMenuPosition({ overlayElement: AutofillOverlayElement.Button }, sender);
const mostRecentlyFocusedFieldHasValue = await BrowserApi.tabSendMessage( const mostRecentlyFocusedFieldHasValue = await BrowserApi.tabSendMessage(
@ -1331,13 +1345,13 @@ export class OverlayBackground implements OverlayBackgroundInterface {
private async triggerOverlayReposition(sender: chrome.runtime.MessageSender) { private async triggerOverlayReposition(sender: chrome.runtime.MessageSender) {
if (await this.checkShouldRepositionInlineMenu(sender)) { if (await this.checkShouldRepositionInlineMenu(sender)) {
await this.toggleInlineMenuHidden({ isInlineMenuHidden: true }, sender); await this.toggleInlineMenuHidden({ isInlineMenuHidden: true }, sender);
this.repositionInlineMenuSubject.next(sender); this.calculateInlineMenuPositionSubject.next(sender);
} }
} }
private async triggerSubFrameFocusInRebuild(sender: chrome.runtime.MessageSender) { private async triggerSubFrameFocusInRebuild(sender: chrome.runtime.MessageSender) {
this.rebuildSubFrameOffsetsSubject.next(sender); this.rebuildSubFrameOffsetsSubject.next(sender);
this.repositionInlineMenuSubject.next(sender); this.calculateInlineMenuPositionSubject.next(sender);
} }
private repositionInlineMenu = async (sender: chrome.runtime.MessageSender) => { private repositionInlineMenu = async (sender: chrome.runtime.MessageSender) => {
@ -1360,7 +1374,7 @@ export class OverlayBackground implements OverlayBackgroundInterface {
this.rebuildSubFrameOffsetsSubject.next(sender); this.rebuildSubFrameOffsetsSubject.next(sender);
} }
await this.updateInlineMenuPositionAfterRepositionEvent(sender); this.updateInlineMenuPositionSubject.next(sender);
}; };
private async closeInlineMenuAfterReposition(sender: chrome.runtime.MessageSender) { private async closeInlineMenuAfterReposition(sender: chrome.runtime.MessageSender) {