const { app, BrowserWindow, session, ipcMain } = require('electron'); const path = require('node:path'); const { ElectronBlocker } = require('@ghostery/adblocker-electron'); const fetch = require('cross-fetch'); const androidUA = 'Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.164 Mobile Safari/537.36'; let historyWindow = null; async function setupBlocker(sess) { try { const blocker = await ElectronBlocker.fromPrebuiltAdsAndTracking(fetch); blocker.enableBlockingInSession(sess); console.log('Adblocker enabled'); } catch (err) { console.error('Failed to load adblocker:', err); } } const createWindow = () => { const win = new BrowserWindow({ width: 1280, height: 800, webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: false, nodeIntegration: true, webSecurity: false, webviewTag: true, } }); win.maximize(); win.loadFile('src/index.html'); }; function createHistoryWindow() { // Focus if already opened if (historyWindow) { historyWindow.focus(); return; } historyWindow = new BrowserWindow({ width: 500, height: 650, title: 'Browsing History', autoHideMenuBar: true, webPreferences: { contextIsolation: false, nodeIntegration: true, } }); historyWindow.loadFile('src/history.html'); historyWindow.on('closed', () => { historyWindow = null; }); } // IPC Listener to handle popup creation ipcMain.on('open-history-window', () => { createHistoryWindow(); }); app.whenReady().then(async () => { const sess = session.defaultSession; sess.setUserAgent(androidUA); await setupBlocker(sess); sess.webRequest.onBeforeSendHeaders((details, callback) => { details.requestHeaders['User-Agent'] = androidUA; details.requestHeaders['Sec-CH-UA-Mobile'] = '?1'; details.requestHeaders['Sec-CH-UA-Platform'] = '"Android"'; callback({ requestHeaders: details.requestHeaders }); }); sess.webRequest.onHeadersReceived((details, callback) => { const responseHeaders = { ...details.responseHeaders }; Object.keys(responseHeaders).forEach((key) => { if (['x-frame-options', 'content-security-policy'].includes(key.toLowerCase())) { delete responseHeaders[key]; } }); callback({ cancel: false, responseHeaders: responseHeaders }); }); createWindow(); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit(); });