diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-12-24 23:17:12 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-12-24 23:17:12 +0100 |
commit | 963489606b5b21bf3b0c571c5f985708e1faddf8 (patch) | |
tree | 9716bdd4778c55a478293757ef5653307c1dc019 /packages/main | |
parent | feat: User agent data simulator (diff) | |
download | sophie-963489606b5b21bf3b0c571c5f985708e1faddf8.tar.gz sophie-963489606b5b21bf3b0c571c5f985708e1faddf8.tar.zst sophie-963489606b5b21bf3b0c571c5f985708e1faddf8.zip |
feat: Shim userAgentData in all frames and workers
Not good enough for google, we'll need a different approach.
Diffstat (limited to 'packages/main')
-rw-r--r-- | packages/main/src/index.ts | 41 |
1 files changed, 26 insertions, 15 deletions
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 @@ | |||
18 | * SPDX-License-Identifier: AGPL-3.0-only | 18 | * SPDX-License-Identifier: AGPL-3.0-only |
19 | */ | 19 | */ |
20 | 20 | ||
21 | import { app, BrowserView, BrowserWindow } from 'electron'; | 21 | import { |
22 | app, | ||
23 | BrowserView, | ||
24 | BrowserWindow, | ||
25 | IpcMainEvent, | ||
26 | } from 'electron'; | ||
22 | import { readFile, readFileSync } from 'fs'; | 27 | import { readFile, readFileSync } from 'fs'; |
23 | import { autorun } from 'mobx'; | 28 | import { autorun } from 'mobx'; |
24 | import { getSnapshot, onPatch } from 'mobx-state-tree'; | 29 | import { getSnapshot, onPatch } from 'mobx-state-tree'; |
@@ -91,7 +96,6 @@ if (!isDevelopment) { | |||
91 | 96 | ||
92 | let serviceInjectRelativePath = '../../service-inject/dist/index.cjs'; | 97 | let serviceInjectRelativePath = '../../service-inject/dist/index.cjs'; |
93 | let serviceInjectPath = join(__dirname, serviceInjectRelativePath); | 98 | let serviceInjectPath = join(__dirname, serviceInjectRelativePath); |
94 | let serviceInjectUrl = new URL(serviceInjectRelativePath, `file://${__dirname}`).toString(); | ||
95 | let serviceInject: string = readFileSync(serviceInjectPath, 'utf8'); | 99 | let serviceInject: string = readFileSync(serviceInjectPath, 'utf8'); |
96 | 100 | ||
97 | if (isDevelopment) { | 101 | if (isDevelopment) { |
@@ -105,7 +109,6 @@ const store = createRootStore(); | |||
105 | function createWindow(): Promise<unknown> { | 109 | function createWindow(): Promise<unknown> { |
106 | mainWindow = new BrowserWindow({ | 110 | mainWindow = new BrowserWindow({ |
107 | show: false, | 111 | show: false, |
108 | autoHideMenuBar: true, | ||
109 | webPreferences: { | 112 | webPreferences: { |
110 | sandbox: true, | 113 | sandbox: true, |
111 | preload: join(__dirname, '../../preload/dist/index.cjs'), | 114 | preload: join(__dirname, '../../preload/dist/index.cjs'), |
@@ -113,7 +116,7 @@ function createWindow(): Promise<unknown> { | |||
113 | }); | 116 | }); |
114 | 117 | ||
115 | if (isDevelopment) { | 118 | if (isDevelopment) { |
116 | //openDevToolsWhenReady(mainWindow); | 119 | // openDevToolsWhenReady(mainWindow); |
117 | } | 120 | } |
118 | 121 | ||
119 | mainWindow.on('ready-to-show', () => { | 122 | mainWindow.on('ready-to-show', () => { |
@@ -127,18 +130,29 @@ function createWindow(): Promise<unknown> { | |||
127 | const browserView = new BrowserView({ | 130 | const browserView = new BrowserView({ |
128 | webPreferences: { | 131 | webPreferences: { |
129 | sandbox: true, | 132 | sandbox: true, |
130 | partition: 'persist:service', | 133 | nodeIntegrationInSubFrames: true, |
131 | preload: join(__dirname, '../../service-preload/dist/index.cjs'), | 134 | preload: join(__dirname, '../../service-preload/dist/index.cjs'), |
135 | partition: 'persist:service', | ||
132 | }, | 136 | }, |
133 | }); | 137 | }); |
134 | 138 | ||
135 | browserView.webContents.userAgent = userAgent; | 139 | browserView.webContents.userAgent = userAgent; |
136 | browserView.setBackgroundColor('#fff'); | ||
137 | autorun(() => { | 140 | autorun(() => { |
138 | browserView.setBounds(store.shared.browserViewBounds); | 141 | browserView.setBounds(store.shared.browserViewBounds); |
139 | }); | 142 | }); |
140 | mainWindow.setBrowserView(browserView); | 143 | mainWindow.setBrowserView(browserView); |
141 | 144 | ||
145 | browserView.webContents.on( | ||
146 | 'did-frame-navigate', | ||
147 | (_event, _url, _statusCode, _statusText, isMainFrame, _processId, routingId) => { | ||
148 | const { webContents: { mainFrame } } = browserView; | ||
149 | const frame = isMainFrame | ||
150 | ? mainFrame | ||
151 | : mainFrame.framesInSubtree.find((f) => f.routingId === routingId); | ||
152 | frame?.executeJavaScript(serviceInject).catch((err) => console.log(err)); | ||
153 | } | ||
154 | ); | ||
155 | |||
142 | webContents.on('ipc-message', (_event, channel, ...args) => { | 156 | webContents.on('ipc-message', (_event, channel, ...args) => { |
143 | try { | 157 | try { |
144 | switch (channel) { | 158 | switch (channel) { |
@@ -178,14 +192,6 @@ function createWindow(): Promise<unknown> { | |||
178 | try { | 192 | try { |
179 | switch (channel) { | 193 | switch (channel) { |
180 | case ServiceToMainIpcMessage.ApiExposedInMainWorld: | 194 | case ServiceToMainIpcMessage.ApiExposedInMainWorld: |
181 | browserView.webContents.executeJavaScriptInIsolatedWorld(0, [ | ||
182 | { | ||
183 | code: serviceInject, | ||
184 | url: serviceInjectUrl, | ||
185 | } | ||
186 | ]).catch((err) => { | ||
187 | console.error('Cannot inject script:', err); | ||
188 | }); | ||
189 | break; | 195 | break; |
190 | case ServiceToMainIpcMessage.SetUnreadCount: | 196 | case ServiceToMainIpcMessage.SetUnreadCount: |
191 | console.log('Unread count:', unreadCount.parse(args[0])); | 197 | console.log('Unread count:', unreadCount.parse(args[0])); |
@@ -210,7 +216,12 @@ function createWindow(): Promise<unknown> { | |||
210 | ); | 216 | ); |
211 | }); | 217 | }); |
212 | 218 | ||
213 | browserView.webContents.session.webRequest.onBeforeSendHeaders(({ requestHeaders }, callback) => { | 219 | browserView.webContents.session.webRequest.onBeforeSendHeaders(({ url, requestHeaders }, callback) => { |
220 | if (url.match(/accounts\.google/)) { | ||
221 | requestHeaders['User-Agent'] = userAgent.replace(/ Chrome\/\S+/, ''); | ||
222 | } else { | ||
223 | requestHeaders['User-Agent'] = userAgent; | ||
224 | } | ||
214 | requestHeaders['User-Agent'] = userAgent; | 225 | requestHeaders['User-Agent'] = userAgent; |
215 | requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`; | 226 | requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`; |
216 | requestHeaders['Sec-CH-UA-Mobile'] = '?0'; | 227 | requestHeaders['Sec-CH-UA-Mobile'] = '?0'; |