[FIX] mail: No crash from "enumerateDevices" in discuss calls

Before this commit, when accessing the discuss call settings
in non-localhost without SSL, there was the following crash:

```
"Cannot read 'enumerateDevices' of undefined"
```

Odoo uses zxing-js to detect devices within the discuss app.
zxing-js provides methods such as "hasNavigator",
"isMediaDevicesSuported" or "canEnumerateDevices" to check if
features are available. These are not called by Odoo before using
the related features what can result in a JS traceback.

This commit fixes the issue by showing a warning as a toaster
notification and in the dev tools, instead of a traceback.

The zxing-js methods are not exposed, hence the reliance on
truthy mediaDevices.

See also https://github.com/zxing-js/library/issues/225

Closes https://github.com/odoo/odoo/issues/112255
Closes https://github.com/odoo/odoo/pull/112813

closes odoo/odoo#119903

X-original-commit: 32238dd680396c6ccb519aa8b3fb7487c38395f7
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Jan Brodersen (Armitxes)
2023-04-27 12:31:39 +02:00
committed by Alexandre Kühn
parent 3a86405a09
commit 5d5099a0f5
2 changed files with 22 additions and 0 deletions
@@ -4,12 +4,14 @@ import { Component, onWillStart, useExternalListener, useState } from "@odoo/owl
import { useRtc } from "@mail/rtc/rtc_hook";
import { useService } from "@web/core/utils/hooks";
import { browser } from "@web/core/browser/browser";
import { _t } from "@web/core/l10n/translation";
export class CallSettings extends Component {
static template = "mail.CallSettings";
static props = ["thread", "className?"];
setup() {
this.notification = useService("notification");
this.userSettings = useState(useService("mail.user_settings"));
this.rtc = useRtc();
this.state = useState({
@@ -18,6 +20,15 @@ export class CallSettings extends Component {
useExternalListener(browser, "keydown", this._onKeyDown);
useExternalListener(browser, "keyup", this._onKeyUp);
onWillStart(async () => {
if (!browser.navigator.mediaDevices) {
// zxing-js: isMediaDevicesSuported or canEnumerateDevices is false.
this.notification.add(
_t("Media devices unobtainable. SSL might not be set up properly."),
{ type: "warning" }
);
console.warn("Media devices unobtainable. SSL might not be set up properly.");
return;
}
this.state.userDevices = await browser.navigator.mediaDevices.enumerateDevices();
});
}
+11
View File
@@ -0,0 +1,11 @@
Germany, 2023-02-15
I hereby agree to the terms of the Odoo Individual Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Jan Brodersen janbrodersen@armitxes.net https://github.com/Armitxes