1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-12-01 13:13:36 +01:00

[PS-2072] Browser Badge fixes (#4363)

* Force update of badge icon and text on all windows

Affects MV2 and MV3
No longer pass in tab and windowId to setLoggedOut and setLocked

When the vault is locked or the user logs out, all open windows/tabs need to be updated

Iterating over all active tabs like in 2022.10.1 was missing:

488734577f/apps/browser/src/background/main.background.ts (L859-L867)

Create clearBadgeText function to take care of it.

* Only try to retrieve tab in unlocked state

* Remove lock icon when unlocking on all windows

* Only use windowId to retrieve tab when defined

In MV2 the `windowId` isn't passed into updateBage and fails to retrieve the correct tab to update.

This resorted in the badge not showing a match count in another window.

Fixes #4260

Ensure in MV3 that all listener pass on the windowId if present.

* Fix Firefox private mode

Only pass on the windowId if defined and within Firefox

In private mode the main.background bootstrap-method passes in the windowId

Do not refreshBadge when in private mode

Previously 488734577f/apps/browser/src/background/main.background.ts (L575-L586) setIcon would skip in private mode. Calling refreshBadge without this would update the badge on all windows (normal and private ones)
This commit is contained in:
Daniel James Smith 2023-01-03 18:06:21 +01:00 committed by GitHub
parent d41b3b13ea
commit ec19fc7225
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 19 deletions

View File

@ -608,7 +608,9 @@ export default class MainBackground {
return new Promise<void>((resolve) => { return new Promise<void>((resolve) => {
setTimeout(async () => { setTimeout(async () => {
await this.environmentService.setUrlsFromStorage(); await this.environmentService.setUrlsFromStorage();
if (!this.isPrivateMode) {
await this.refreshBadge(); await this.refreshBadge();
}
this.fullSync(true); this.fullSync(true);
setTimeout(() => this.notificationsService.init(), 2500); setTimeout(() => this.notificationsService.init(), 2500);
resolve(); resolve();

View File

@ -44,15 +44,19 @@ export class UpdateBadge {
]; ];
static async tabsOnActivatedListener(activeInfo: chrome.tabs.TabActiveInfo) { static async tabsOnActivatedListener(activeInfo: chrome.tabs.TabActiveInfo) {
await new UpdateBadge(self).run({ tabId: activeInfo.tabId }); await new UpdateBadge(self).run({ tabId: activeInfo.tabId, windowId: activeInfo.windowId });
} }
static async tabsOnReplacedListener(addedTabId: number, removedTabId: number) { static async tabsOnReplacedListener(addedTabId: number, removedTabId: number) {
await new UpdateBadge(self).run({ tabId: addedTabId }); await new UpdateBadge(self).run({ tabId: addedTabId });
} }
static async tabsOnUpdatedListener(tabId: number) { static async tabsOnUpdatedListener(
await new UpdateBadge(self).run({ tabId }); tabId: number,
changeInfo: chrome.tabs.TabChangeInfo,
tab: chrome.tabs.Tab
) {
await new UpdateBadge(self).run({ tabId, windowId: tab.windowId });
} }
static async messageListener( static async messageListener(
@ -81,41 +85,50 @@ export class UpdateBadge {
const authStatus = await this.authService.getAuthStatus(); const authStatus = await this.authService.getAuthStatus();
const tab = await this.getTab(opts?.tabId, opts?.windowId);
const windowId = tab?.windowId;
await this.setBadgeBackgroundColor(); await this.setBadgeBackgroundColor();
switch (authStatus) { switch (authStatus) {
case AuthenticationStatus.LoggedOut: { case AuthenticationStatus.LoggedOut: {
await this.setLoggedOut({ tab, windowId }); await this.setLoggedOut();
break; break;
} }
case AuthenticationStatus.Locked: { case AuthenticationStatus.Locked: {
await this.setLocked({ tab, windowId }); await this.setLocked();
break; break;
} }
case AuthenticationStatus.Unlocked: { case AuthenticationStatus.Unlocked: {
await this.setUnlocked({ tab, windowId }); const tab = await this.getTab(opts?.tabId, opts?.windowId);
await this.setUnlocked({ tab, windowId: tab?.windowId });
break; break;
} }
} }
} }
async setLoggedOut(opts: BadgeOptions): Promise<void> { async setLoggedOut(): Promise<void> {
await this.setBadgeIcon("_gray", opts?.windowId); await this.setBadgeIcon("_gray");
await this.setBadgeText("", opts?.tab?.id); await this.clearBadgeText();
} }
async setLocked(opts: BadgeOptions) { async setLocked() {
await this.setBadgeIcon("_locked", opts?.windowId); await this.setBadgeIcon("_locked");
await this.setBadgeText("", opts?.tab?.id); await this.clearBadgeText();
}
private async clearBadgeText() {
const tabs = await BrowserApi.getActiveTabs();
if (tabs != null) {
tabs.forEach(async (tab) => {
if (tab.id != null) {
await this.setBadgeText("", tab.id);
}
});
}
} }
async setUnlocked(opts: BadgeOptions) { async setUnlocked(opts: BadgeOptions) {
await this.initServices(); await this.initServices();
await this.setBadgeIcon("", opts?.windowId); await this.setBadgeIcon("");
const disableBadgeCounter = await this.stateService.getDisableBadgeCounter(); const disableBadgeCounter = await this.stateService.getDisableBadgeCounter();
if (disableBadgeCounter) { if (disableBadgeCounter) {
@ -151,7 +164,7 @@ export class UpdateBadge {
38: "/images/icon38" + iconSuffix + ".png", 38: "/images/icon38" + iconSuffix + ".png",
}, },
}; };
if (BrowserPlatformUtilsService.isFirefox()) { if (windowId && BrowserPlatformUtilsService.isFirefox()) {
options.windowId = windowId; options.windowId = windowId;
} }
@ -202,7 +215,9 @@ export class UpdateBadge {
private async getTab(tabId?: number, windowId?: number) { private async getTab(tabId?: number, windowId?: number) {
return ( return (
(await BrowserApi.getTab(tabId)) ?? (await BrowserApi.getTab(tabId)) ??
(await BrowserApi.tabsQueryFirst({ active: true, windowId })) ?? (windowId
? await BrowserApi.tabsQueryFirst({ active: true, windowId })
: await BrowserApi.tabsQueryFirst({ active: true, currentWindow: true })) ??
(await BrowserApi.tabsQueryFirst({ active: true, lastFocusedWindow: true })) ?? (await BrowserApi.tabsQueryFirst({ active: true, lastFocusedWindow: true })) ??
(await BrowserApi.tabsQueryFirst({ active: true })) (await BrowserApi.tabsQueryFirst({ active: true }))
); );