@@ -6,6 +6,7 @@ import { DARK_APP_BACKGROUND_COLOR } from "@posthog/shared/constants";
66import {
77 app ,
88 BrowserWindow ,
9+ session as electronSession ,
910 Menu ,
1011 type MenuItemConstructorOptions ,
1112 screen ,
@@ -17,6 +18,7 @@ import { buildApplicationMenu } from "./menu";
1718import type { ElectronMainWindow } from "./platform-adapters/electron-main-window" ;
1819import { posthogNodeAnalytics } from "./platform-adapters/posthog-analytics" ;
1920import { POSTHOG_SESSION_ID_ARG } from "./posthog-session-arg" ;
21+ import { browserViewService } from "./services/browser-view/service" ;
2022import {
2123 encodeDevFlagsForArg ,
2224 readDevFlagsSync ,
@@ -39,7 +41,7 @@ import {
3941} from "./utils/webview-attach-policy" ;
4042import {
4143 isAllowedWebviewNavigation ,
42- safeProtocol ,
44+ isAllowedWebviewRequest ,
4345} from "./utils/webview-navigation-guard" ;
4446import { isAllowedWebviewPermission } from "./utils/webview-permission-policy" ;
4547import { setupWindowZoom } from "./zoom" ;
@@ -142,20 +144,34 @@ function hardenWebviewSession(session: Electron.Session): void {
142144 session . setPermissionCheckHandler ( ( _wc , permission ) =>
143145 isAllowedWebviewPermission ( permission ) ,
144146 ) ;
147+ session . webRequest . onBeforeRequest ( ( details , callback ) => {
148+ const allowed = isAllowedWebviewRequest ( details . url , details . resourceType ) ;
149+ if ( ! allowed ) {
150+ log . warn ( "Blocked disallowed webview request" , {
151+ resourceType : details . resourceType ,
152+ url : details . url ,
153+ } ) ;
154+ }
155+ callback ( { cancel : ! allowed } ) ;
156+ } ) ;
145157}
146158
147159function setupWebviewHandlers ( window : BrowserWindow ) : void {
148160 window . webContents . on (
149161 "will-attach-webview" ,
150162 ( event , webPreferences , params ) => {
151- if ( ! isAllowedWebviewAttachment ( params ) ) {
163+ if (
164+ ! browserViewService . isEnabled ( ) ||
165+ ! isAllowedWebviewAttachment ( params )
166+ ) {
152167 event . preventDefault ( ) ;
153168 log . warn ( "Blocked disallowed webview attachment" , {
154169 src : params . src ,
155170 partition : params . partition ,
156171 } ) ;
157172 return ;
158173 }
174+ hardenWebviewSession ( electronSession . fromPartition ( params . partition ) ) ;
159175 hardenWebviewPreferences ( webPreferences ) ;
160176 } ,
161177 ) ;
@@ -164,10 +180,10 @@ function setupWebviewHandlers(window: BrowserWindow): void {
164180 hardenWebviewSession ( guest . session ) ;
165181
166182 guest . setWindowOpenHandler ( ( { url } ) => {
167- if ( / ^ h t t p s ? : $ / i . test ( safeProtocol ( url ) ) ) {
168- shell . openExternal ( url ) ;
183+ if ( isAllowedWebviewNavigation ( url ) ) {
184+ void shell . openExternal ( url ) ;
169185 } else {
170- log . warn ( "Blocked webview popup to non-http(s) target " , { url } ) ;
186+ log . warn ( "Blocked disallowed webview popup" , { url } ) ;
171187 }
172188 return { action : "deny" } ;
173189 } ) ;
@@ -318,6 +334,7 @@ export function createWindow(): void {
318334 webPreferences : {
319335 nodeIntegration : false ,
320336 contextIsolation : true ,
337+ webviewTag : true ,
321338 preload : path . join ( __dirname , "preload.js" ) ,
322339 enableBlinkFeatures : "GetDisplayMedia" ,
323340 partition : "persist:main" ,
0 commit comments