diff --git a/src/main/views/modalManager.test.js b/src/main/views/modalManager.test.js index 76a33a9e..ce33263d 100644 --- a/src/main/views/modalManager.test.js +++ b/src/main/views/modalManager.test.js @@ -15,6 +15,14 @@ jest.mock('electron', () => ({ }, })); +jest.mock('common/config', () => ({ + teams: [], +})); + +jest.mock('main/views/webContentEvents', () => ({ + addWebContentsEventListeners: jest.fn(), +})); + jest.mock('./modalView', () => ({ ModalView: jest.fn(), })); diff --git a/src/main/views/modalManager.ts b/src/main/views/modalManager.ts index 3019fa5d..c36ce31a 100644 --- a/src/main/views/modalManager.ts +++ b/src/main/views/modalManager.ts @@ -19,8 +19,10 @@ import { GET_MODAL_UNCLOSEABLE, RESIZE_MODAL, } from 'common/communication'; +import Config from 'common/config'; import {getAdjustedWindowBoundaries} from 'main/utils'; +import WebContentsEventManager from 'main/views/webContentEvents'; import WindowManager from 'main/windows/windowManager'; import {ModalView} from './modalView'; @@ -87,6 +89,7 @@ export class ModalManager { if (index === 0) { WindowManager.sendToRenderer(MODAL_OPEN); modal.show(undefined, Boolean(withDevTools)); + WebContentsEventManager.addWebContentsEventListeners(modal.view.webContents, () => Config.teams.concat()); } else { WindowManager.sendToRenderer(MODAL_CLOSE); modal.hide(); diff --git a/src/main/views/viewManager.ts b/src/main/views/viewManager.ts index 83b50c29..da85d9e9 100644 --- a/src/main/views/viewManager.ts +++ b/src/main/views/viewManager.ts @@ -277,7 +277,7 @@ export class ViewManager { log.error(`Couldn't find a view with the name ${viewName}`); return; } - WebContentsEventManager.addWebContentsEventListeners(view, this.getServers); + WebContentsEventManager.addMattermostViewEventListeners(view, this.getServers); } finishLoading = (server: string) => { diff --git a/src/main/views/webContentEvents.test.js b/src/main/views/webContentEvents.test.js index a480a2a4..7fc2a385 100644 --- a/src/main/views/webContentEvents.test.js +++ b/src/main/views/webContentEvents.test.js @@ -32,6 +32,10 @@ jest.mock('../windows/windowManager', () => ({ showMainWindow: jest.fn(), })); +jest.mock('common/config', () => ({ + spellcheck: true, +})); + jest.mock('common/utils/url', () => ({ parseURL: (url) => { try { diff --git a/src/main/views/webContentEvents.ts b/src/main/views/webContentEvents.ts index 675a52bc..22ec4cd5 100644 --- a/src/main/views/webContentEvents.ts +++ b/src/main/views/webContentEvents.ts @@ -6,6 +6,7 @@ import log from 'electron-log'; import {TeamWithTabs} from 'types/config'; +import Config from 'common/config'; import urlUtils from 'common/utils/url'; import ContextMenu from 'main/contextMenu'; @@ -221,9 +222,31 @@ export class WebContentsEventManager { } }; - addWebContentsEventListeners = (mmview: MattermostView, getServersFunction: () => TeamWithTabs[]) => { - const contents = mmview.view.webContents; + addMattermostViewEventListeners = (mmview: MattermostView, getServersFunction: () => TeamWithTabs[]) => { + this.addWebContentsEventListeners( + mmview.view.webContents, + getServersFunction, + (contents: WebContents) => { + contents.on('page-title-updated', mmview.handleTitleUpdate); + contents.on('page-favicon-updated', mmview.handleFaviconUpdate); + contents.on('update-target-url', mmview.handleUpdateTarget); + contents.on('did-navigate', mmview.handleDidNavigate); + }, + (contents: WebContents) => { + contents.removeListener('page-title-updated', mmview.handleTitleUpdate); + contents.removeListener('page-favicon-updated', mmview.handleFaviconUpdate); + contents.removeListener('update-target-url', mmview.handleUpdateTarget); + contents.removeListener('did-navigate', mmview.handleDidNavigate); + }, + ); + }; + addWebContentsEventListeners = ( + contents: WebContents, + getServersFunction: () => TeamWithTabs[], + addListeners?: (contents: WebContents) => void, + removeListeners?: (contents: WebContents) => void, + ) => { // initialize custom login tracking this.customLogins[contents.id] = { inProgress: false, @@ -244,34 +267,28 @@ export class WebContentsEventManager { const didStartNavigation = this.generateDidStartNavigation(getServersFunction); contents.on('did-start-navigation', didStartNavigation as (e: Event, u: string) => void); - const spellcheck = mmview.options.webPreferences?.spellcheck; + const spellcheck = Config.useSpellChecker; const newWindow = this.generateNewWindowListener(getServersFunction, spellcheck); contents.setWindowOpenHandler(newWindow); - contents.on('page-title-updated', mmview.handleTitleUpdate); - contents.on('page-favicon-updated', mmview.handleFaviconUpdate); - contents.on('update-target-url', mmview.handleUpdateTarget); - contents.on('did-navigate', mmview.handleDidNavigate); + addListeners?.(contents); - const removeListeners = () => { + const removeWebContentsListeners = () => { try { contents.removeListener('will-navigate', willNavigate as (e: Event, u: string) => void); contents.removeListener('did-start-navigation', didStartNavigation as (e: Event, u: string) => void); - contents.removeListener('page-title-updated', mmview.handleTitleUpdate); - contents.removeListener('page-favicon-updated', mmview.handleFaviconUpdate); - contents.removeListener('update-target-url', mmview.handleUpdateTarget); - contents.removeListener('did-navigate', mmview.handleDidNavigate); + removeListeners?.(contents); } catch (e) { log.error(`Error while trying to detach listeners, this might be ok if the process crashed: ${e}`); } }; - this.listeners[contents.id] = removeListeners; + this.listeners[contents.id] = removeWebContentsListeners; contents.once('render-process-gone', (event, details) => { if (details.reason !== 'clean-exit') { log.error('Renderer process for a webcontent is no longer available:', details.reason); } - removeListeners(); + removeWebContentsListeners(); }); }; }