[PS-2303] MV3 Service Cache Enhancements (#4507)

* Add Should Listen Gate

* Fixed ServiceCache Being Sent to Wrong Arg

* Await Combined Listener
This commit is contained in:
Justin Baur 2023-01-20 12:33:41 -05:00 committed by GitHub
parent c5e99b807e
commit 9a98e8eb70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 10 deletions

View File

@ -21,7 +21,12 @@ if (BrowserApi.manifestVersion === 3) {
chrome.tabs.onReplaced.addListener(tabsOnReplacedListener);
chrome.tabs.onUpdated.addListener(tabsOnUpdatedListener);
chrome.contextMenus.onClicked.addListener(contextMenusClickedListener);
BrowserApi.messageListener("runtime.background", runtimeMessageListener);
BrowserApi.messageListener(
"runtime.background",
(message: { command: string }, sender, sendResponse) => {
runtimeMessageListener(message, sender);
}
);
} else {
const bitwardenMain = ((window as any).bitwardenMain = new MainBackground());
bitwardenMain.bootstrap().then(() => {

View File

@ -120,13 +120,24 @@ export class CipherContextMenuHandler {
await cipherContextMenuHandler.update(tab.url);
}
static async messageListener(message: { command: string }, cachedServices: CachedServices) {
static async messageListener(
message: { command: string },
sender: chrome.runtime.MessageSender,
cachedServices: CachedServices
) {
if (!CipherContextMenuHandler.shouldListen(message)) {
return;
}
const cipherContextMenuHandler = await CipherContextMenuHandler.create(cachedServices);
await cipherContextMenuHandler.messageListener(message);
}
async messageListener(message: { command: string }) {
if (!LISTENED_TO_COMMANDS.includes(message.command)) {
private static shouldListen(message: { command: string }) {
return LISTENED_TO_COMMANDS.includes(message.command);
}
async messageListener(message: { command: string }, sender?: chrome.runtime.MessageSender) {
if (!CipherContextMenuHandler.shouldListen(message)) {
return;
}

View File

@ -126,6 +126,7 @@ export class ContextMenuClickedHandler {
static async messageListener(
message: { command: string; data: LockedVaultPendingNotificationsItem },
sender: chrome.runtime.MessageSender,
cachedServices: CachedServices
) {
if (

View File

@ -1,22 +1,24 @@
import { combine } from "./combine";
describe("combine", () => {
it("runs", () => {
it("runs", async () => {
const combined = combine([
(arg: Record<string, unknown>, serviceCache: Record<string, unknown>) => {
arg["one"] = true;
serviceCache["one"] = true;
return Promise.resolve();
},
(arg: Record<string, unknown>, serviceCache: Record<string, unknown>) => {
if (serviceCache["one"] !== true) {
throw new Error("One should have ran.");
}
arg["two"] = true;
return Promise.resolve();
},
]);
const arg: Record<string, unknown> = {};
combined(arg);
await combined(arg);
expect(arg["one"]).toBeTruthy();

View File

@ -1,15 +1,15 @@
import { CachedServices } from "../background/service_factories/factory-options";
type Listener<T extends unknown[]> = (...args: [...T, CachedServices]) => void;
type Listener<T extends unknown[]> = (...args: [...T, CachedServices]) => Promise<void>;
export const combine = <T extends unknown[]>(
listeners: Listener<T>[],
startingServices: CachedServices = {}
) => {
return (...args: T) => {
return async (...args: T) => {
const cachedServices = { ...startingServices };
for (const listener of listeners) {
listener(...[...args, cachedServices]);
await listener(...[...args, cachedServices]);
}
};
};

View File

@ -23,7 +23,10 @@ const tabsOnUpdatedListener = combine([
const contextMenusClickedListener = ContextMenuClickedHandler.onClickedListener;
const runtimeMessageListener = combine([
// TODO: All message listeners should be RuntimeMessage in Notifications follow up then this type annotation can be inferred
const runtimeMessageListener = combine<
[message: { command: string }, sender: chrome.runtime.MessageSender]
>([
UpdateBadge.messageListener,
CipherContextMenuHandler.messageListener,
ContextMenuClickedHandler.messageListener,