From 963489606b5b21bf3b0c571c5f985708e1faddf8 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 24 Dec 2021 23:17:12 +0100 Subject: feat: Shim userAgentData in all frames and workers Not good enough for google, we'll need a different approach. --- packages/main/src/index.ts | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'packages/main') diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index 70acb15..02d6c97 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -18,7 +18,12 @@ * SPDX-License-Identifier: AGPL-3.0-only */ -import { app, BrowserView, BrowserWindow } from 'electron'; +import { + app, + BrowserView, + BrowserWindow, + IpcMainEvent, +} from 'electron'; import { readFile, readFileSync } from 'fs'; import { autorun } from 'mobx'; import { getSnapshot, onPatch } from 'mobx-state-tree'; @@ -91,7 +96,6 @@ if (!isDevelopment) { let serviceInjectRelativePath = '../../service-inject/dist/index.cjs'; let serviceInjectPath = join(__dirname, serviceInjectRelativePath); -let serviceInjectUrl = new URL(serviceInjectRelativePath, `file://${__dirname}`).toString(); let serviceInject: string = readFileSync(serviceInjectPath, 'utf8'); if (isDevelopment) { @@ -105,7 +109,6 @@ const store = createRootStore(); function createWindow(): Promise { mainWindow = new BrowserWindow({ show: false, - autoHideMenuBar: true, webPreferences: { sandbox: true, preload: join(__dirname, '../../preload/dist/index.cjs'), @@ -113,7 +116,7 @@ function createWindow(): Promise { }); if (isDevelopment) { - //openDevToolsWhenReady(mainWindow); + // openDevToolsWhenReady(mainWindow); } mainWindow.on('ready-to-show', () => { @@ -127,18 +130,29 @@ function createWindow(): Promise { const browserView = new BrowserView({ webPreferences: { sandbox: true, - partition: 'persist:service', + nodeIntegrationInSubFrames: true, preload: join(__dirname, '../../service-preload/dist/index.cjs'), + partition: 'persist:service', }, }); browserView.webContents.userAgent = userAgent; - browserView.setBackgroundColor('#fff'); autorun(() => { browserView.setBounds(store.shared.browserViewBounds); }); mainWindow.setBrowserView(browserView); + browserView.webContents.on( + 'did-frame-navigate', + (_event, _url, _statusCode, _statusText, isMainFrame, _processId, routingId) => { + const { webContents: { mainFrame } } = browserView; + const frame = isMainFrame + ? mainFrame + : mainFrame.framesInSubtree.find((f) => f.routingId === routingId); + frame?.executeJavaScript(serviceInject).catch((err) => console.log(err)); + } + ); + webContents.on('ipc-message', (_event, channel, ...args) => { try { switch (channel) { @@ -178,14 +192,6 @@ function createWindow(): Promise { try { switch (channel) { case ServiceToMainIpcMessage.ApiExposedInMainWorld: - browserView.webContents.executeJavaScriptInIsolatedWorld(0, [ - { - code: serviceInject, - url: serviceInjectUrl, - } - ]).catch((err) => { - console.error('Cannot inject script:', err); - }); break; case ServiceToMainIpcMessage.SetUnreadCount: console.log('Unread count:', unreadCount.parse(args[0])); @@ -210,7 +216,12 @@ function createWindow(): Promise { ); }); - browserView.webContents.session.webRequest.onBeforeSendHeaders(({ requestHeaders }, callback) => { + browserView.webContents.session.webRequest.onBeforeSendHeaders(({ url, requestHeaders }, callback) => { + if (url.match(/accounts\.google/)) { + requestHeaders['User-Agent'] = userAgent.replace(/ Chrome\/\S+/, ''); + } else { + requestHeaders['User-Agent'] = userAgent; + } requestHeaders['User-Agent'] = userAgent; requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`; requestHeaders['Sec-CH-UA-Mobile'] = '?0'; -- cgit v1.2.3-70-g09d2