mirror of
https://github.com/bitwarden/browser
synced 2025-12-16 08:13:42 +00:00
[EC-598] fix: user interaction not being awaited sometimes
Only one handler can return a response. That handler needs to return true to indicated it's intention to eventually do so. Our issue was that multiple handlers were returning truthy values, causing a race condition.
This commit is contained in:
@@ -42,18 +42,27 @@ export default class RuntimeBackground {
|
||||
}
|
||||
|
||||
await this.checkOnInstalled();
|
||||
const backgroundMessageListener = async (
|
||||
const backgroundMessageListener = (
|
||||
msg: any,
|
||||
sender: chrome.runtime.MessageSender,
|
||||
sendResponse: any
|
||||
) => {
|
||||
const response = await this.processMessage(msg, sender);
|
||||
sendResponse(response);
|
||||
const messagesWithResponse = ["fido2RegisterCredentialRequest", "fido2GetCredentialRequest"];
|
||||
|
||||
if (messagesWithResponse.includes(msg.command)) {
|
||||
this.processMessage(msg, sender).then(
|
||||
(value) => sendResponse({ result: value }),
|
||||
(error) => sendResponse({ error: { ...error, message: error.message } })
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
this.processMessage(msg, sender);
|
||||
return false;
|
||||
};
|
||||
|
||||
BrowserApi.messageListener("runtime.background", (msg, sender, sendResponse) => {
|
||||
backgroundMessageListener(msg, sender, sendResponse);
|
||||
return true;
|
||||
return backgroundMessageListener(msg, sender, sendResponse);
|
||||
});
|
||||
if (this.main.popupOnlyContext) {
|
||||
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
|
||||
@@ -209,17 +218,9 @@ export default class RuntimeBackground {
|
||||
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
|
||||
break;
|
||||
case "fido2RegisterCredentialRequest":
|
||||
try {
|
||||
return { result: await this.main.fido2Service.createCredential(msg.data) };
|
||||
} catch (error) {
|
||||
return { error: { ...error, message: error.message } };
|
||||
}
|
||||
return await this.main.fido2Service.createCredential(msg.data);
|
||||
case "fido2GetCredentialRequest":
|
||||
try {
|
||||
return { result: await this.main.fido2Service.assertCredential(msg.data) };
|
||||
} catch (error) {
|
||||
return { error: { ...error, message: error.message } };
|
||||
}
|
||||
return await this.main.fido2Service.assertCredential(msg.data);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -139,8 +139,8 @@ export class BrowserApi {
|
||||
callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => unknown
|
||||
) {
|
||||
chrome.runtime.onMessage.addListener(
|
||||
(msg: any, sender: chrome.runtime.MessageSender, response: any) => {
|
||||
return callback(msg, sender, response);
|
||||
(msg: any, sender: chrome.runtime.MessageSender, sendResponse: any) => {
|
||||
return callback(msg, sender, sendResponse) === true;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user