mirror of
https://github.com/bitwarden/browser
synced 2025-12-16 16:23:44 +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();
|
await this.checkOnInstalled();
|
||||||
const backgroundMessageListener = async (
|
const backgroundMessageListener = (
|
||||||
msg: any,
|
msg: any,
|
||||||
sender: chrome.runtime.MessageSender,
|
sender: chrome.runtime.MessageSender,
|
||||||
sendResponse: any
|
sendResponse: any
|
||||||
) => {
|
) => {
|
||||||
const response = await this.processMessage(msg, sender);
|
const messagesWithResponse = ["fido2RegisterCredentialRequest", "fido2GetCredentialRequest"];
|
||||||
sendResponse(response);
|
|
||||||
|
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) => {
|
BrowserApi.messageListener("runtime.background", (msg, sender, sendResponse) => {
|
||||||
backgroundMessageListener(msg, sender, sendResponse);
|
return backgroundMessageListener(msg, sender, sendResponse);
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
if (this.main.popupOnlyContext) {
|
if (this.main.popupOnlyContext) {
|
||||||
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
|
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
|
||||||
@@ -209,17 +218,9 @@ export default class RuntimeBackground {
|
|||||||
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
|
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
|
||||||
break;
|
break;
|
||||||
case "fido2RegisterCredentialRequest":
|
case "fido2RegisterCredentialRequest":
|
||||||
try {
|
return await this.main.fido2Service.createCredential(msg.data);
|
||||||
return { result: await this.main.fido2Service.createCredential(msg.data) };
|
|
||||||
} catch (error) {
|
|
||||||
return { error: { ...error, message: error.message } };
|
|
||||||
}
|
|
||||||
case "fido2GetCredentialRequest":
|
case "fido2GetCredentialRequest":
|
||||||
try {
|
return await this.main.fido2Service.assertCredential(msg.data);
|
||||||
return { result: await this.main.fido2Service.assertCredential(msg.data) };
|
|
||||||
} catch (error) {
|
|
||||||
return { error: { ...error, message: error.message } };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,8 +139,8 @@ export class BrowserApi {
|
|||||||
callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => unknown
|
callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => unknown
|
||||||
) {
|
) {
|
||||||
chrome.runtime.onMessage.addListener(
|
chrome.runtime.onMessage.addListener(
|
||||||
(msg: any, sender: chrome.runtime.MessageSender, response: any) => {
|
(msg: any, sender: chrome.runtime.MessageSender, sendResponse: any) => {
|
||||||
return callback(msg, sender, response);
|
return callback(msg, sender, sendResponse) === true;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user