[MM-37379] Add "Clear Data" options in the menu to allow users to force Electron to blow away session data. (#3185)

* [MM-37379] Add "Clear Data" options in the menu to allow users to force Electron to blow away session data.

* Fix i18n

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
This commit is contained in:
Devin Binnie
2024-11-26 10:03:25 -05:00
committed by GitHub
parent 057572e847
commit 723fda8abb
4 changed files with 73 additions and 0 deletions

View File

@@ -32,6 +32,12 @@
"main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "Certificate Not Trusted", "main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "Certificate Not Trusted",
"main.app.app.handleAppCertificateError.dialog.extraDetail": "Certificate is different from previous one.\n\n", "main.app.app.handleAppCertificateError.dialog.extraDetail": "Certificate is different from previous one.\n\n",
"main.app.initialize.downloadBox.allFiles": "All files", "main.app.initialize.downloadBox.allFiles": "All files",
"main.app.utils.clearAllData.cancel": "Cancel",
"main.app.utils.clearAllData.confirm": "Clear All Data",
"main.app.utils.clearAllData.message": "This action will erase all session, cache, cookie and storage data for all server. Performing this action will restart the application. Are you sure you want to clear all data?",
"main.app.utils.clearDataForServer.cancel": "Cancel",
"main.app.utils.clearDataForServer.confirm": "Clear Data",
"main.app.utils.clearDataForServer.message": "This action will erase all session, cache, cookie and storage data for the server \"{serverName}\". Are you sure you want to clear data for this server?",
"main.app.utils.migrateMacAppStore.button.dontImport": "Don't Import", "main.app.utils.migrateMacAppStore.button.dontImport": "Don't Import",
"main.app.utils.migrateMacAppStore.button.selectAndImport": "Select Directory and Import", "main.app.utils.migrateMacAppStore.button.selectAndImport": "Select Directory and Import",
"main.app.utils.migrateMacAppStore.dialog.detail": "It appears that an existing {appName} configuration exists, would you like to import it? You will be asked to pick the correct configuration directory.", "main.app.utils.migrateMacAppStore.dialog.detail": "It appears that an existing {appName} configuration exists, would you like to import it? You will be asked to pick the correct configuration directory.",
@@ -82,7 +88,9 @@
"main.menus.app.history.forward": "Forward", "main.menus.app.history.forward": "Forward",
"main.menus.app.view": "&View", "main.menus.app.view": "&View",
"main.menus.app.view.actualSize": "Actual Size", "main.menus.app.view.actualSize": "Actual Size",
"main.menus.app.view.clearAllData": "Clear All Data",
"main.menus.app.view.clearCacheAndReload": "Clear Cache and Reload", "main.menus.app.view.clearCacheAndReload": "Clear Cache and Reload",
"main.menus.app.view.clearDataForServer": "Clear Data for Current Server",
"main.menus.app.view.developerModeBrowserOnly": "Browser Only Mode", "main.menus.app.view.developerModeBrowserOnly": "Browser Only Mode",
"main.menus.app.view.developerModeDisableContextMenu": "Disable Context Menu", "main.menus.app.view.developerModeDisableContextMenu": "Disable Context Menu",
"main.menus.app.view.developerModeDisableNotificationStorage": "Disable Notification Storage", "main.menus.app.view.developerModeDisableNotificationStorage": "Disable Notification Storage",

View File

@@ -258,3 +258,54 @@ export async function updateServerInfos(servers: MattermostServer[]) {
})); }));
ServerManager.updateRemoteInfos(map); ServerManager.updateRemoteInfos(map);
} }
export async function clearDataForServer(server: MattermostServer) {
const mainWindow = MainWindow.get();
if (!mainWindow) {
return;
}
const response = await dialog.showMessageBox(mainWindow, {
type: 'warning',
buttons: [
localizeMessage('main.app.utils.clearDataForServer.confirm', 'Clear Data'),
localizeMessage('main.app.utils.clearDataForServer.cancel', 'Cancel'),
],
defaultId: 1,
message: localizeMessage('main.app.utils.clearDataForServer.message', 'This action will erase all session, cache, cookie and storage data for the server "{serverName}". Are you sure you want to clear data for this server?', {serverName: server.name}),
});
if (response.response === 0) {
await session.defaultSession.clearData({
origins: [server.url.origin],
});
ViewManager.reload();
}
}
export async function clearAllData() {
const mainWindow = MainWindow.get();
if (!mainWindow) {
return;
}
const response = await dialog.showMessageBox(mainWindow, {
title: app.name,
type: 'warning',
buttons: [
localizeMessage('main.app.utils.clearAllData.confirm', 'Clear All Data'),
localizeMessage('main.app.utils.clearAllData.cancel', 'Cancel'),
],
defaultId: 1,
message: localizeMessage('main.app.utils.clearAllData.message', 'This action will erase all session, cache, cookie and storage data for all server. Performing this action will restart the application. Are you sure you want to clear all data?'),
});
if (response.response === 0) {
await session.defaultSession.clearAuthCache();
await session.defaultSession.clearCodeCaches({});
await session.defaultSession.clearHostResolverCache();
await session.defaultSession.clearData();
app.relaunch();
app.exit();
}
}

View File

@@ -74,6 +74,7 @@ jest.mock('app/serverViewState', () => ({
switchServer: jest.fn(), switchServer: jest.fn(),
getCurrentServer: jest.fn(), getCurrentServer: jest.fn(),
})); }));
jest.mock('main/app/utils', () => ({}));
jest.mock('main/diagnostics', () => ({})); jest.mock('main/diagnostics', () => ({}));
jest.mock('main/downloadsManager', () => ({ jest.mock('main/downloadsManager', () => ({
hasDownloads: jest.fn(), hasDownloads: jest.fn(),

View File

@@ -15,6 +15,7 @@ import ServerManager from 'common/servers/serverManager';
import {t} from 'common/utils/util'; import {t} from 'common/utils/util';
import {getViewDisplayName} from 'common/views/View'; import {getViewDisplayName} from 'common/views/View';
import type {ViewType} from 'common/views/View'; import type {ViewType} from 'common/views/View';
import {clearAllData, clearDataForServer} from 'main/app/utils';
import type {UpdateManager} from 'main/autoUpdater'; import type {UpdateManager} from 'main/autoUpdater';
import DeveloperMode from 'main/developerMode'; import DeveloperMode from 'main/developerMode';
import Diagnostics from 'main/diagnostics'; import Diagnostics from 'main/diagnostics';
@@ -274,6 +275,18 @@ export function createTemplate(config: Config, updateManager: UpdateManager) {
click() { click() {
return downloadsManager.openDownloadsDropdown(); return downloadsManager.openDownloadsDropdown();
}, },
}, separatorItem, {
id: 'clear-data-for-server',
label: localizeMessage('main.menus.app.view.clearDataForServer', 'Clear Data for Current Server'),
async click() {
return clearDataForServer(ServerViewState.getCurrentServer());
},
}, {
id: 'clear-data',
label: localizeMessage('main.menus.app.view.clearAllData', 'Clear All Data'),
async click() {
return clearAllData();
},
}, separatorItem, { }, separatorItem, {
label: localizeMessage('main.menus.app.view.devToolsSubMenu', 'Developer Tools'), label: localizeMessage('main.menus.app.view.devToolsSubMenu', 'Developer Tools'),
submenu: devToolsSubMenu, submenu: devToolsSubMenu,