Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion electron-builder.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"category": "public.app-category.productivity",
"target": ["dmg", "pkg", "zip", "mas"],
"icon": "build/icon.icns",
"bundleVersion": "26107",
"bundleVersion": "26108",
"helperBundleId": "chat.rocket.electron.helper",
"type": "distribution",
"artifactName": "rocketchat-${version}-${os}.${ext}",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"productName": "Rocket.Chat",
"name": "rocketchat",
"description": "Official OSX, Windows, and Linux Desktop Clients for Rocket.Chat",
"version": "4.18.1",
"version": "4.18.2",
"author": "Rocket.Chat Support <support@rocket.chat>",
"copyright": "© 2016-2026, Rocket.Chat",
"homepage": "https://rocket.chat",
Expand Down
5 changes: 4 additions & 1 deletion src/app/PersistableValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ export type PersistableValues = Omit<
/** Current menu-bar default policy for Windows/Linux (auto-hide, Alt reveals). */
export const MENU_BAR_DEFAULT_REVISION = 1;

/** Mac App Store builds stored the internal video call window as off; turn it on once. */
export const MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION = 1;

export const migrations = {
'>=3.1.0': (before: PersistableValues_0_0_0): PersistableValues_3_1_0 => {
const { currentServerUrl, ...rest } = before;
Expand Down Expand Up @@ -189,7 +192,7 @@ export const migrations = {
}),
'>=3.8.4': (before: PersistableValues_3_8_1): PersistableValues_3_8_4 => ({
...before,
isInternalVideoChatWindowEnabled: !process.mas,
isInternalVideoChatWindowEnabled: true,
isAddNewServersEnabled: true,
}),
'>=3.8.7': (before: PersistableValues_3_8_4): PersistableValues_3_8_7 => ({
Expand Down
2 changes: 1 addition & 1 deletion src/app/__tests__/PersistableValues.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ describe('PersistableValues migrations', () => {

setProcessMas(true);
const mas384 = migrations['>=3.8.4'](win37 as any);
expect(mas384.isInternalVideoChatWindowEnabled).toBe(false);
expect(mas384.isInternalVideoChatWindowEnabled).toBe(true);
});

it('applies remaining migration defaults through 4.15.0', () => {
Expand Down
116 changes: 115 additions & 1 deletion src/app/main/data.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import fs from 'fs';

import * as store from '../../store';
import { MENU_BAR_DEFAULT_REVISION } from '../PersistableValues';
import {
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION,
MENU_BAR_DEFAULT_REVISION,
} from '../PersistableValues';
import { APP_SETTINGS_LOADED } from '../actions';
import { mergePersistableValues } from './data';
import {
Expand Down Expand Up @@ -195,6 +198,117 @@ describe('mergePersistableValues', () => {
});
});

describe('Mac App Store internal video call window default', () => {
const processMasDescriptor = Object.getOwnPropertyDescriptor(
process,
'mas'
);

const mockMasRevision = (revision: number) => {
(getPersistedMeta as jest.Mock).mockImplementation(
(key: string, fallback: unknown) => {
if (key === 'masInternalVideoChatWindowDefaultRevision') {
return revision;
}
if (key === 'menuBarDefaultRevision') {
return MENU_BAR_DEFAULT_REVISION;
}
return fallback;
}
);
};

beforeEach(() => {
Object.defineProperty(process, 'mas', {
value: true,
writable: true,
configurable: true,
});
mockSelect.mockReturnValue({
...mockInitialValues,
isInternalVideoChatWindowEnabled: false,
});
});

afterEach(() => {
if (processMasDescriptor) {
Object.defineProperty(process, 'mas', processMasDescriptor);
} else {
delete (process as { mas?: boolean }).mas;
}
});

it('one-shot: turns the internal window on when the revision is stale', async () => {
mockMasRevision(0);

await mergePersistableValues({});

expect(mockDispatch).toHaveBeenCalledWith({
type: APP_SETTINGS_LOADED,
payload: expect.objectContaining({
isInternalVideoChatWindowEnabled: true,
}),
});
expect(setPersistedMeta).toHaveBeenCalledWith(
'masInternalVideoChatWindowDefaultRevision',
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION
);
});

it('one-shot: keeps the user choice after the revision is applied', async () => {
mockMasRevision(MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION);

await mergePersistableValues({});

expect(mockDispatch).toHaveBeenCalledWith({
type: APP_SETTINGS_LOADED,
payload: expect.objectContaining({
isInternalVideoChatWindowEnabled: false,
}),
});
expect(setPersistedMeta).not.toHaveBeenCalled();
});

it('one-shot: keeps an overridden-settings.json value', async () => {
mockMasRevision(0);
(fs.promises.readFile as jest.Mock).mockResolvedValueOnce(
JSON.stringify({ isInternalVideoChatWindowEnabled: false })
);

await mergePersistableValues({});

expect(mockDispatch).toHaveBeenCalledWith({
type: APP_SETTINGS_LOADED,
payload: expect.objectContaining({
isInternalVideoChatWindowEnabled: false,
}),
});
expect(setPersistedMeta).toHaveBeenCalledWith(
'masInternalVideoChatWindowDefaultRevision',
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION
);
});

it('does nothing outside the Mac App Store build', async () => {
Object.defineProperty(process, 'mas', {
value: false,
writable: true,
configurable: true,
});
mockMasRevision(0);

await mergePersistableValues({});

expect(mockDispatch).toHaveBeenCalledWith({
type: APP_SETTINGS_LOADED,
payload: expect.objectContaining({
isInternalVideoChatWindowEnabled: false,
}),
});
expect(setPersistedMeta).not.toHaveBeenCalled();
});
});

describe('legacy localStorage migration', () => {
it('should handle autohideMenu from localStorage', async () => {
const localStorage = {
Expand Down
33 changes: 32 additions & 1 deletion src/app/main/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import { logger } from '../../logging';
import { select, dispatch, watch } from '../../store';
import { getSystemCertificateStatus } from '../../systemCertificates';
import { normalizeNumber } from '../../ui/main/rootWindow';
import { MENU_BAR_DEFAULT_REVISION } from '../PersistableValues';
import {
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION,
MENU_BAR_DEFAULT_REVISION,
} from '../PersistableValues';
import { APP_SETTINGS_LOADED } from '../actions';
import { selectPersistableValues } from '../selectors';
import {
Expand Down Expand Up @@ -178,6 +181,34 @@ export const mergePersistableValues = async (
setPersistedMeta('menuBarDefaultRevision', MENU_BAR_DEFAULT_REVISION);
}

// One-shot policy: Mac App Store builds used to force the internal video
// call window off. Turn it on once; a later user choice or an
// overridden-settings.json value still wins.
if (process.mas) {
const appliedMasVideoCallRevision = getPersistedMeta(
'masInternalVideoChatWindowDefaultRevision',
0
);
if (
appliedMasVideoCallRevision <
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION
) {
const isOverridden =
'isInternalVideoChatWindowEnabled' in userDataPersistableOverrides ||
'isInternalVideoChatWindowEnabled' in appAsarPersistableOverrides;
if (!isOverridden) {
values = {
...values,
isInternalVideoChatWindowEnabled: true,
};
}
setPersistedMeta(
'masInternalVideoChatWindowDefaultRevision',
MAS_INTERNAL_VIDEO_CHAT_WINDOW_DEFAULT_REVISION
);
}
}

const mergedOverrides: Record<string, unknown> = {
...userDataOverriddenSettings,
...appAsarOverriddenSettings,
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/de-DE.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,7 @@
},
"internalVideoChatWindow": {
"title": "Öffnen Sie den Video-Chat mit dem Anwendungsfenster",
"description": "Wenn diese Option aktiviert ist, wird der Video-Chat im Anwendungsfenster anstelle des Standardbrowsers geöffnet. Allerdings wird für <strong>Google Meet</strong> und <strong>Jitsi</strong> die Bildschirmaufzeichnung in Electron-Anwendungen nicht unterstützt, daher werden sie unabhängig von dieser Einstellung immer im Browser geöffnet.",
"masDescription": "Diese Option ist deaktiviert, wenn sie aus dem Mac App Store installiert wird. Aus Sicherheitsgründen wird der Video-Chat standardmäßig über den Browser geöffnet."
"description": "Wenn diese Option aktiviert ist, wird der Video-Chat im Anwendungsfenster anstelle des Standardbrowsers geöffnet. Allerdings wird für <strong>Google Meet</strong> die Bildschirmaufzeichnung in Electron-Anwendungen nicht unterstützt, daher wird es unabhängig von dieser Einstellung immer im Browser geöffnet."
},
"minimizeOnClose": {
"title": "Beim Schließen minimieren",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/en.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,7 @@
},
"internalVideoChatWindow": {
"title": "Video calls inside app",
"description": "Open video calls inside app window instead of browser. Google Meet and Jitsi calls can only open in browser.",
"masDescription": "This option is disabled when installed from the Mac App Store. For security reasons, video calls always open in the browser by default."
"description": "Open video calls inside app window instead of browser. Google Meet calls can only open in browser."
},
"minimizeOnClose": {
"title": "Minimize on close",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/es.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -262,8 +262,7 @@
},
"internalVideoChatWindow": {
"title": "Abrir videollamada en la ventana de la aplicación",
"description": "Si está activado, la videollamada se abrirá en la ventana de la aplicación en lugar del navegador predeterminado. Sin embargo, para <strong>Google Meet</strong> y <strong>Jitsi</strong>, la grabación de pantalla no es compatible en aplicaciones Electron, por lo que siempre se abrirán en el navegador independientemente de esta configuración.",
"masDescription": "Esta opción está desactivada cuando se instala desde la Mac App Store; por razones de seguridad, las videollamadas se abrirán en el navegador de forma predeterminada."
"description": "Si está activado, la videollamada se abrirá en la ventana de la aplicación en lugar del navegador predeterminado. Sin embargo, para <strong>Google Meet</strong>, la grabación de pantalla no es compatible en aplicaciones Electron, por lo que siempre se abrirá en el navegador independientemente de esta configuración."
},
"minimizeOnClose": {
"title": "Minimizar al cerrar",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/fi.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,7 @@
},
"internalVideoChatWindow": {
"title": "Avaa videokeskustelu sovellusikkunaan",
"description": "Jos käytössä, videokeskustelu avautuu sovelluksen ikkunaan oletusselaimen sijaan. Kuitenkin <strong>Google Meet</strong> ja <strong>Jitsi</strong> -palveluissa ruuduntallennus ei ole tuettu Electron-sovelluksissa, joten ne avautuvat aina selaimessa tästä asetuksesta riippumatta.",
"masDescription": "Asetus ei ole käytössä, kun asennus on tehty Macin App Storesta. Suojaussyistä videokeskustelu avautuu oletusarvoisesti selaimeen."
"description": "Jos käytössä, videokeskustelu avautuu sovelluksen ikkunaan oletusselaimen sijaan. Kuitenkin <strong>Google Meet</strong> -palvelussa ruuduntallennus ei ole tuettu Electron-sovelluksissa, joten se avautuu aina selaimessa tästä asetuksesta riippumatta."
},
"minimizeOnClose": {
"title": "Pienennä suljettaessa",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/fr.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,7 @@
},
"internalVideoChatWindow": {
"title": "Ouvrir le chat vidéo à l'aide de la fenêtre de l'application",
"description": "Si cette option est activée, le chat vidéo s'ouvrira dans la fenêtre de l'application au lieu du navigateur par défaut. Cependant, pour <strong>Google Meet</strong> et <strong>Jitsi</strong>, l'enregistrement d'écran n'est pas pris en charge dans les applications Electron, donc ils s'ouvriront toujours dans le navigateur, quel que soit ce paramètre.",
"masDescription": "Cette option est désactivée lorsqu'elle est installée à partir du Mac App Store, pour des raisons de sécurité, elle ouvrira le chat vidéo en utilisant le navigateur par défaut."
"description": "Si cette option est activée, le chat vidéo s'ouvrira dans la fenêtre de l'application au lieu du navigateur par défaut. Cependant, pour <strong>Google Meet</strong>, l'enregistrement d'écran n'est pas pris en charge dans les applications Electron, donc il s'ouvrira toujours dans le navigateur, quel que soit ce paramètre."
},
"minimizeOnClose": {
"title": "Minimiser à la fermeture",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/hu.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,7 @@
},
"internalVideoChatWindow": {
"title": "Videocsevegés megnyitása az alkalmazásablakban",
"description": "Ha engedélyezve van, akkor a videócsevegés az alkalmazás ablakában nyílik meg az alapértelmezett böngésző helyett. Azonban a <strong>Google Meet</strong> és a <strong>Jitsi</strong> esetében a képernyő rögzítése nem támogatott az Electron alkalmazásokban, így azok ettől a beállítástól függetlenül mindig a böngészőben nyílnak meg.",
"masDescription": "Ez a beállítás le van tiltva a Mac App Store-ból történő telepítéskor. Biztonsági okokból a videócsevegés alapértelmezetten mindig a böngészőben nyílik meg."
"description": "Ha engedélyezve van, akkor a videócsevegés az alkalmazás ablakában nyílik meg az alapértelmezett böngésző helyett. Azonban a <strong>Google Meet</strong> esetében a képernyő rögzítése nem támogatott az Electron alkalmazásokban, így az ettől a beállítástól függetlenül mindig a böngészőben nyílik meg."
},
"minimizeOnClose": {
"title": "Kis méret bezáráskor",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/no.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,7 @@
},
"internalVideoChatWindow": {
"title": "Åpne videochat ved hjelp av applikasjonsvinduet",
"description": "Når innstilt, vil Videochat åpnes ved hjelp av et programvindu, ellers vil standardnettleseren brukes. <strong>Google Meet</strong> og <strong>Jitsi</strong> skjermopptak støttes ikke i Electron-applikasjoner, så denne konfigurasjonen endrer ikke anropsadferd, som åpnes i nettleseren.",
"masDescription": "Dette alternativet er deaktivert når det er installert fra Mac App Store, av sikkerhetsgrunner vil det åpne Video Chat ved å bruke nettleseren som standard."
"description": "Når innstilt, vil Videochat åpnes ved hjelp av et programvindu, ellers vil standardnettleseren brukes. <strong>Google Meet</strong> skjermopptak støttes ikke i Electron-applikasjoner, så denne konfigurasjonen endrer ikke anropsadferd, som åpnes i nettleseren."
},
"minimizeOnClose": {
"title": "Minimer på nært hold",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/pt-BR.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,7 @@
},
"internalVideoChatWindow": {
"title": "Abrir chat em video em uma janela da aplicação",
"description": "Se ativado, o Chat de Vídeo será aberto na janela do aplicativo em vez do navegador padrão. No entanto, para <strong>Google Meet</strong> e <strong>Jitsi</strong>, a gravação de tela não é suportada em aplicativos Electron, então eles sempre serão abertos no navegador independentemente desta configuração.",
"masDescription": "Esta opção esta desativada quando for instalado através da Mac App Store, por motivos de segurança o chat em video sera aberto usando o navegador por padrão."
"description": "Se ativado, o Chat de Vídeo será aberto na janela do aplicativo em vez do navegador padrão. No entanto, para <strong>Google Meet</strong>, a gravação de tela não é suportada em aplicativos Electron, então ele sempre será aberto no navegador independentemente desta configuração."
},
"minimizeOnClose": {
"title": "Minimizar ao fechar",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/ru.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,7 @@
},
"internalVideoChatWindow": {
"title": "Открывать видеочат в окне приложения",
"description": "Если этот параметр включен, видеочат будет открываться в окне приложения вместо браузера по умолчанию. Однако для <strong>Google Meet</strong> и <strong>Jitsi</strong> запись экрана не поддерживается в приложениях Electron, поэтому они всегда будут открываться в браузере независимо от этой настройки.",
"masDescription": "Эта опция отключена при установке из Mac App Store, по соображениям безопасности окно видео чата будет открыто в браузере по умолчанию."
"description": "Если этот параметр включен, видеочат будет открываться в окне приложения вместо браузера по умолчанию. Однако для <strong>Google Meet</strong> запись экрана не поддерживается в приложениях Electron, поэтому он всегда будет открываться в браузере независимо от этой настройки."
},
"minimizeOnClose": {
"title": "Свернуть в трей при закрытии",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/sv.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,7 @@
},
"internalVideoChatWindow": {
"title": "Öppna videochatt i programfönstret",
"description": "Om den är aktiverad öppnas videochatten i programmets fönster i stället för i standardwebbläsaren. För <strong>Google Meet</strong> och <strong>Jitsi</strong> stöds dock inte skärminspelning i Electron-applikationer, så de kommer alltid att öppnas i webbläsaren oavsett denna inställning.",
"masDescription": "Detta alternativ är inaktiverat när det installeras från Mac App Store. Av säkerhetsskäl öppnas Video Chat alltid i webbläsaren som standard."
"description": "Om den är aktiverad öppnas videochatten i programmets fönster i stället för i standardwebbläsaren. För <strong>Google Meet</strong> stöds dock inte skärminspelning i Electron-applikationer, så det kommer alltid att öppnas i webbläsaren oavsett denna inställning."
},
"minimizeOnClose": {
"title": "Minimera vid stängning",
Expand Down
3 changes: 1 addition & 2 deletions src/i18n/zh-CN.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,7 @@
},
"internalVideoChatWindow": {
"title": "在程序窗口中打开视频通话",
"description": "如果启用,视频通话将在应用程序窗口中打开,而不是在默认浏览器中打开。但是,对于<strong>Google Meet</strong>和<strong>Jitsi</strong>,Electron应用程序不支持屏幕录制,所以无论此设置如何,它们始终会在浏览器中打开。",
"masDescription": "从Mac App Store安装时此选项被禁用。出于安全原因,视频通话将始终默认在浏览器中打开。"
"description": "如果启用,视频通话将在应用程序窗口中打开,而不是在默认浏览器中打开。但是,对于<strong>Google Meet</strong>,Electron应用程序不支持屏幕录制,所以无论此设置如何,它始终会在浏览器中打开。"
},
"transparentWindow": {
"title": "透明窗口效果",
Expand Down
1 change: 0 additions & 1 deletion src/injected.ts
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,6 @@ const start = async () => {
);
window.open = (url, name, features = '') => {
if (
!process.mas &&
window.RocketChatDesktop.getInternalVideoChatWindowEnabled() &&
typeof url === 'string' &&
jitsiDomain.length > 0 &&
Expand Down
Loading
Loading