11import windowState from "electron-window-state"
2- import { app , BrowserWindow , nativeImage , nativeTheme } from "electron"
3- import { dirname , join } from "node:path"
4- import { fileURLToPath } from "node:url"
2+ import { app , BrowserWindow , net , nativeImage , nativeTheme , protocol } from "electron"
3+ import { dirname , isAbsolute , join , relative , resolve } from "node:path"
4+ import { fileURLToPath , pathToFileURL } from "node:url"
55import type { TitlebarTheme } from "../preload/types"
66
77type Globals = {
@@ -10,6 +10,20 @@ type Globals = {
1010}
1111
1212const root = dirname ( fileURLToPath ( import . meta. url ) )
13+ const rendererRoot = join ( root , "../renderer" )
14+ const rendererProtocol = "oc"
15+ const rendererHost = "renderer"
16+
17+ protocol . registerSchemesAsPrivileged ( [
18+ {
19+ scheme : rendererProtocol ,
20+ privileges : {
21+ secure : true ,
22+ standard : true ,
23+ supportFetchAPI : true ,
24+ } ,
25+ } ,
26+ ] )
1327
1428let backgroundColor : string | undefined
1529
@@ -131,6 +145,25 @@ export function createLoadingWindow(globals: Globals) {
131145 return win
132146}
133147
148+ export function registerRendererProtocol ( ) {
149+ if ( protocol . isProtocolHandled ( rendererProtocol ) ) return
150+
151+ protocol . handle ( rendererProtocol , ( request ) => {
152+ const url = new URL ( request . url )
153+ if ( url . host !== rendererHost ) {
154+ return new Response ( "Not found" , { status : 404 } )
155+ }
156+
157+ const file = resolve ( rendererRoot , `.${ decodeURIComponent ( url . pathname ) } ` )
158+ const rel = relative ( rendererRoot , file )
159+ if ( rel . startsWith ( ".." ) || isAbsolute ( rel ) ) {
160+ return new Response ( "Not found" , { status : 404 } )
161+ }
162+
163+ return net . fetch ( pathToFileURL ( file ) . toString ( ) )
164+ } )
165+ }
166+
134167function loadWindow ( win : BrowserWindow , html : string ) {
135168 const devUrl = process . env . ELECTRON_RENDERER_URL
136169 if ( devUrl ) {
@@ -139,7 +172,7 @@ function loadWindow(win: BrowserWindow, html: string) {
139172 return
140173 }
141174
142- void win . loadFile ( join ( root , `../renderer /${ html } `) )
175+ void win . loadURL ( ` ${ rendererProtocol } :/ /${ rendererHost } / ${ html } `)
143176}
144177
145178function injectGlobals ( win : BrowserWindow , globals : Globals ) {
0 commit comments