Skip to content
Open
Show file tree
Hide file tree
Changes from 8 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
@@ -1,6 +1,7 @@
{
"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
45 changes: 40 additions & 5 deletions src/app/views/MattermostWebContentsView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,16 @@ import {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 {getInstalledBrowsers, openLinkInBrowser} 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 @@ -94,6 +94,8 @@ export class MattermostWebContentsView extends EventEmitter {
this.webContentsView.webContents.on('did-navigate-in-page', () => this.handlePageTitleUpdated(this.webContentsView.webContents.getTitle()));
this.webContentsView.webContents.on('page-title-updated', (_, newTitle) => this.handlePageTitleUpdated(newTitle));

this.loadBrowserList();

if (!DeveloperMode.get('disableContextMenu')) {
this.contextMenu = new ContextMenu(this.generateContextMenu(), this.webContentsView.webContents);
}
Expand Down Expand Up @@ -493,7 +495,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 @@ -514,8 +520,37 @@ export class MattermostWebContentsView extends EventEmitter {
},
];
}
return [];

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

private generateOpenInBrowserMenuItems = (url: string): Electron.MenuItemConstructorOptions[] => {
const browsers = this.cachedBrowsers;
if (!browsers || browsers.length === 0) {
return [];
}

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

private isURLForConfiguredServer = (url: URL): boolean => {
return ServerManager.getAllServers().some((s) => isInternalURL(url, s.url));
};

private cachedBrowsers: Awaited<ReturnType<typeof getInstalledBrowsers>> | null = null;

private loadBrowserList = async () => {
this.cachedBrowsers = await getInstalledBrowsers();
};
}
Loading
Loading