Skip to content
Open
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
1 change: 1 addition & 0 deletions i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"app.menus.contextMenu.copyEmailAddress": "Copy Email Address",
"app.menus.contextMenu.openInNewTab": "Open in new tab",
"app.menus.contextMenu.openInNewWindow": "Open in new window",
"app.menus.contextMenu.openLinkInBrowser": "Open Link in Browser",
"app.navigationManager.invalidLinkDescription": "The link you clicked appears to be malformed and cannot be opened. Please check the URL for errors before trying again.",
"app.navigationManager.invalidLinkTitle": "Invalid Link",
"app.navigationManager.viewLimitReached": "View limit reached",
Expand Down
44 changes: 38 additions & 6 deletions src/app/views/MattermostWebContentsView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,20 @@ import {
import type {Logger} from 'common/log';
import ServerManager from 'common/servers/serverManager';
import {RELOAD_INTERVAL, MAX_SERVER_RETRIES, SECOND, MAX_LOADING_SCREEN_SECONDS} from 'common/utils/constants';
import {isInternalURL, parseURL} from 'common/utils/url';
import {isHttpLink, isInternalURL, parseURL} from 'common/utils/url';
import {type MattermostView} from 'common/views/MattermostView';
import ViewManager from 'common/views/viewManager';
import {updateServerInfos} from 'main/app/utils';
import ExternalBrowserManager from 'main/browserManager';
import ContextMenu from 'main/contextMenu';
import DeveloperMode from 'main/developerMode';
import {localizeMessage} from 'main/i18nManager';
import performanceMonitor from 'main/performanceMonitor';
import {getServerAPI} from 'main/server/serverAPI';
import {getWindowBoundaries, getLocalPreload, composeUserAgent} from 'main/utils';

import WebContentsEventManager from './webContentEvents';

import ContextMenu from '../../main/contextMenu';
import {getWindowBoundaries, getLocalPreload, composeUserAgent} from '../../main/utils';

enum Status {
LOADING,
READY,
Expand Down Expand Up @@ -497,7 +497,11 @@ export class MattermostWebContentsView extends EventEmitter {
return {
append: (_, parameters) => {
const parsedURL = parseURL(parameters.linkURL);
if (parsedURL && isInternalURL(parsedURL, server.url)) {
if (!parsedURL) {
return [];
}

if (this.isURLForConfiguredServer(parsedURL)) {
return [
{
type: 'separator' as const,
Expand All @@ -518,8 +522,36 @@ export class MattermostWebContentsView extends EventEmitter {
},
];
}
return [];

return this.generateOpenInBrowserMenuItems(parsedURL.toString());
},
};
};

private generateOpenInBrowserMenuItems = (url: string): Electron.MenuItemConstructorOptions[] => {
const browsers = ExternalBrowserManager.getCachedBrowsers();
if (browsers.length === 0) {
return [];
}

// Only allow http/https URLs to be opened in external browsers
if (!isHttpLink(url)) {
return [];
}

return [
{type: 'separator'},
{
label: localizeMessage('app.menus.contextMenu.openLinkInBrowser', 'Open Link in Browser'),
submenu: browsers.map((browser) => ({
label: browser.name,
click: () => ExternalBrowserManager.openLinkInBrowser(url, browser),
})),
},
];
};

private isURLForConfiguredServer = (url: URL): boolean => {
return ServerManager.getAllServers().some((s) => isInternalURL(url, s.url));
};
}
2 changes: 2 additions & 0 deletions src/main/app/initialize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import {ipcValidate} from 'common/Validator';
import ViewManager from 'common/views/viewManager';
import AppVersionManager from 'main/AppVersionManager';
import AutoLauncher from 'main/AutoLauncher';
import ExternalBrowserManager from 'main/browserManager';
import {configPath, updatePaths} from 'main/constants';
import CriticalErrorHandler from 'main/CriticalErrorHandler';
import DeveloperMode from 'main/developerMode';
Expand Down Expand Up @@ -327,6 +328,7 @@ async function initializeAfterAppReady() {
handleUpdateTheme();
}

ExternalBrowserManager.init();
MainWindow.show();

const updateServerInfo = (serverId: string) => {
Expand Down
Loading
Loading