Implement widget ReceiveTerminate capability

Signed-off-by: Pauli Virtanen <pav@iki.fi>
pull/21833/head
Pauli Virtanen 2020-04-18 17:04:56 +03:00
parent 94745e9407
commit 352ea29d17
3 changed files with 13 additions and 3 deletions

View File

@ -344,10 +344,18 @@ export default class AppTile extends React.Component {
* @returns {Promise<*>} Resolves when the widget is terminated, or timeout passed.
*/
_endWidgetActions() {
const timeout = 2000;
const messaging = ActiveWidgetStore.getWidgetMessaging(this.props.app.id);
let promise;
return Promise.race([messaging.terminate(), sleep(timeout)]).finally(() => {
if (this._hasCapability('m.receive_terminate')) {
// Wait for widget to terminate within a timeout
const timeout = 2000;
const messaging = ActiveWidgetStore.getWidgetMessaging(this.props.app.id);
promise = Promise.race([messaging.terminate(), sleep(timeout)]);
} else {
promise = Promise.resolve();
}
return promise.finally(() => {
// HACK: This is a really dirty way to ensure that Jitsi cleans up
// its hold on the webcam. Without this, the widget holds a media
// stream open, even after death. See https://github.com/vector-im/riot-web/issues/7351

View File

@ -420,6 +420,7 @@ export default class WidgetUtils {
if (WidgetType.JITSI.matches(appType)) {
capWhitelist.push(Capability.AlwaysOnScreen);
}
capWhitelist.push(Capability.ReceiveTerminate);
return capWhitelist;
}

View File

@ -23,6 +23,7 @@ export enum Capability {
Screenshot = "m.capability.screenshot",
Sticker = "m.sticker",
AlwaysOnScreen = "m.always_on_screen",
ReceiveTerminate = "m.receive_terminate",
}
export enum KnownWidgetActions {