11import { mkdirSync } from 'node:fs' ;
22import { dirname , join } from 'node:path' ;
3- import { fileURLToPath } from 'node:url' ;
3+ import { fileURLToPath , pathToFileURL } from 'node:url' ;
44import { BRAND } from '@open-codesign/shared' ;
55import type { BrowserWindow as ElectronBrowserWindow } from 'electron' ;
66import { autoUpdater } from 'electron-updater' ;
@@ -21,6 +21,7 @@ import { getPendingUpdate, setupAutoUpdater } from './ipc/update';
2121import { registerLocaleIpc } from './locale-ipc' ;
2222import { getLogger , initLogger } from './logger' ;
2323import { registerMemoryIpc } from './memory-ipc' ;
24+ import { isTrustedMainWindowNavigationUrl } from './navigation-policy' ;
2425import { loadConfigOnBoot , registerOnboardingIpc } from './onboarding-ipc' ;
2526import { isAllowedExternalUrl } from './open-external' ;
2627import { readPersisted as readPreferences , registerPreferencesIpc } from './preferences-ipc' ;
@@ -63,7 +64,23 @@ if (storageLocations.dataDir !== undefined) {
6364 app . setPath ( 'userData' , storageLocations . dataDir ) ;
6465}
6566
67+ type NavigationEvent = { preventDefault : ( ) => void } ;
68+
69+ function handleMainWindowNavigation (
70+ event : NavigationEvent ,
71+ url : string ,
72+ trustedAppUrl : string ,
73+ ) : void {
74+ if ( isTrustedMainWindowNavigationUrl ( url , trustedAppUrl ) ) return ;
75+
76+ event . preventDefault ( ) ;
77+ }
78+
6679function createWindow ( ) : void {
80+ const rendererEntryPath = join ( __dirname , '../renderer/index.html' ) ;
81+ const rendererUrlOverride = process . env [ 'ELECTRON_RENDERER_URL' ] ;
82+ const rendererEntryUrl = rendererUrlOverride || pathToFileURL ( rendererEntryPath ) . href ;
83+
6784 mainWindow = new BrowserWindow ( {
6885 width : 1280 ,
6986 height : 820 ,
@@ -101,6 +118,17 @@ function createWindow(): void {
101118 return { action : 'deny' } ;
102119 } ) ;
103120
121+ mainWindow . webContents . on ( 'will-navigate' , ( event : NavigationEvent , url : string ) => {
122+ handleMainWindowNavigation ( event , url , rendererEntryUrl ) ;
123+ } ) ;
124+
125+ mainWindow . webContents . on (
126+ 'will-redirect' ,
127+ ( event : NavigationEvent , url : string , _isInPlace : boolean , isMainFrame : boolean ) => {
128+ if ( isMainFrame ) handleMainWindowNavigation ( event , url , rendererEntryUrl ) ;
129+ } ,
130+ ) ;
131+
104132 // Replay any update event that fired before this window was ready
105133 // (macOS: user closed window, triggered a manual Check for Updates from
106134 // the app menu, then reopened — the event would otherwise be lost).
@@ -111,10 +139,10 @@ function createWindow(): void {
111139 }
112140 } ) ;
113141
114- if ( process . env [ 'ELECTRON_RENDERER_URL' ] ) {
115- void mainWindow . loadURL ( process . env [ 'ELECTRON_RENDERER_URL' ] ) ;
142+ if ( rendererUrlOverride ) {
143+ void mainWindow . loadURL ( rendererEntryUrl ) ;
116144 } else {
117- void mainWindow . loadFile ( join ( __dirname , '../renderer/index.html' ) ) ;
145+ void mainWindow . loadFile ( rendererEntryPath ) ;
118146 }
119147}
120148
0 commit comments