From de59e3bd22d0998a9dbeda2d0281ad74ef1deace Mon Sep 17 00:00:00 2001 From: Alexander Drozdov Date: Fri, 18 Feb 2022 12:48:30 +0200 Subject: [PATCH] back to iframes --- src/background.ts | 2 - src/ipc/ipc-event.ts | 12 ----- src/ipc/types.ts | 37 ++++----------- src/main/builtin-browser.ts | 52 ---------------------- src/main/config.ts | 6 ++- src/main/overlay-window.ts | 18 +++++--- src/web/overlay/OverlayWindow.vue | 47 ------------------- src/web/overlay/interfaces.ts | 5 +-- src/web/price-check/BackgroundInfo.vue | 9 ++-- src/web/price-check/PriceCheckWindow.vue | 26 +++++++++-- src/web/price-check/trade/TradeBulk.vue | 7 +-- src/web/price-check/trade/TradeListing.vue | 7 +-- 12 files changed, 60 insertions(+), 168 deletions(-) delete mode 100644 src/main/builtin-browser.ts diff --git a/src/background.ts b/src/background.ts index 6ed9adf1..362bef30 100644 --- a/src/background.ts +++ b/src/background.ts @@ -10,7 +10,6 @@ import { checkForUpdates } from './main/updates' import os from 'os' import { createOverlayWindow } from './main/overlay-window' import { setupAltVisibility } from './main/alt-visibility' -import { setupBuiltinBrowser } from './main/builtin-browser' import { createFileProtocol } from './main/app-file-protocol' import { LogWatcher } from './main/LogWatcher' import { loadAndCache as loadAndCacheGameCfg } from './main/game-config' @@ -38,7 +37,6 @@ app.on('ready', async () => { setupConfigEvents() createTray() setupShowHide() - setupBuiltinBrowser() loadAndCacheGameCfg() setTimeout( diff --git a/src/ipc/ipc-event.ts b/src/ipc/ipc-event.ts index 47e22767..fe5df135 100644 --- a/src/ipc/ipc-event.ts +++ b/src/ipc/ipc-event.ts @@ -13,8 +13,6 @@ export type IpcEvent = IpcStashSearch | IpcOverlayReady | IpcCloseOverlay | - IpcShowBrowser | - IpcHideBrowser | IpcVisibility | IpcOpenWiki | IpcOpenCraftOfExile | @@ -77,16 +75,6 @@ export type IpcOverlayReady = export type IpcCloseOverlay = Event<'OVERLAY->MAIN::close-overlay'> -export type IpcShowBrowser = - Event<'OVERLAY->MAIN::show-browser', { - url?: string - }> - -export type IpcHideBrowser = - Event<'OVERLAY->MAIN::hide-browser', { - close?: boolean - }> - export type IpcVisibility = Event<'MAIN->OVERLAY::visibility', { isVisible: boolean diff --git a/src/ipc/types.ts b/src/ipc/types.ts index 1f48b088..bf2971fb 100644 --- a/src/ipc/types.ts +++ b/src/ipc/types.ts @@ -1,4 +1,4 @@ -import type { ItemCheckWidget, PriceCheckWidget } from '@/web/overlay/interfaces' +import * as widget from '@/web/overlay/interfaces' import type { IpcEvent } from './ipc-event' export interface PreloadExposed { @@ -33,32 +33,11 @@ export interface Config { accountName: string stashScroll: boolean language: 'en' | 'ru' - widgets: Widget[] + widgets: widget.Widget[] fontSize: number disableUpdateDownload: boolean } -interface Widget { - wmId: number - wmType: string - wmTitle: string - wmWants: 'show' | 'hide' - wmZorder: number | 'exclusive' | null - wmFlags: Array - // --------------- - [key: string]: any -} - -type WidgetWellKnownFlag = - 'uninitialized' | - 'skip-menu' | - 'has-browser' | - 'invisible-on-blur' | - 'hide-on-blur' | - 'hide-on-blur(close)' | - 'hide-on-focus' | - 'ignore-ui-visibility' - export const defaultConfig = (): Config => ({ configVersion: 11, wikiKey: 'Alt + W', @@ -120,7 +99,7 @@ export const defaultConfig = (): Config => ({ y: 5 }, alwaysShow: false - }, + } as widget.WidgetMenu, { wmId: 2, wmType: 'price-check', @@ -142,7 +121,7 @@ export const defaultConfig = (): Config => ({ searchStatRange: 10, showCursor: true, requestPricePrediction: false - } as PriceCheckWidget, + } as widget.PriceCheckWidget, { wmId: 3, wmType: 'item-check', @@ -175,7 +154,7 @@ export const defaultConfig = (): Config => ({ } ] } - } as ItemCheckWidget, + } as widget.ItemCheckWidget, { wmId: 4, wmType: 'delve-grid', @@ -211,7 +190,7 @@ export const defaultConfig = (): Config => ({ { id: 3, text: '"Cannot Leech Life"' }, { id: 4, text: '"Cannot Leech Mana"' } ] - }, + } as widget.StashSearchWidget, { wmId: 102, wmType: 'stash-search', @@ -232,7 +211,7 @@ export const defaultConfig = (): Config => ({ { id: 5, text: '"Map Device" "Rarity: Normal"' }, { id: 6, text: 'Tane Laboratory' } ] - }, + } as widget.StashSearchWidget, { wmId: 103, wmType: 'image-strip', @@ -248,6 +227,6 @@ export const defaultConfig = (): Config => ({ images: [ { id: 1, url: 'syndicate.jpg' } ] - } + } as widget.ImageStripWidget ] }) diff --git a/src/main/builtin-browser.ts b/src/main/builtin-browser.ts deleted file mode 100644 index 14753dba..00000000 --- a/src/main/builtin-browser.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { BrowserView, screen, shell } from 'electron' -import { DPR, overlayWindow, handleExtraCommands, overlayOnEvent } from './overlay-window' -import { PoeWindow } from './PoeWindow' -import { logger } from './logger' -import { config } from './config' - -const WIDTH_96DPI = 460 / 16 - -let browserViewExternal: BrowserView | undefined - -export function setupBuiltinBrowser () { - overlayOnEvent('OVERLAY->MAIN::show-browser', (_, opts) => { - logger.debug('Show', { source: 'builtin-browser', opts }) - if (!browserViewExternal) { - browserViewExternal = new BrowserView() - browserViewExternal.webContents.on('did-navigate', () => { - browserViewExternal!.webContents.zoomFactor = config.get('fontSize') / 16 - }) - // hopefully someday this will enable subpixel AA - // browserViewExternal.setBackgroundColor('#2d3748') // gray-800 - browserViewExternal.webContents.on('before-input-event', handleExtraCommands) - } - - overlayWindow!.setBrowserView(browserViewExternal) - let browserBounds = { - x: 0, - y: 0, - width: PoeWindow.bounds.width - Math.floor(WIDTH_96DPI * DPR * config.get('fontSize')), - height: PoeWindow.bounds.height - } - if (process.platform === 'win32') { - browserBounds = screen.screenToDipRect(overlayWindow!, browserBounds) - } - browserViewExternal.setBounds(browserBounds) - if (opts.url) { - browserViewExternal.webContents.loadURL(opts.url) - } - }) - - overlayOnEvent('OVERLAY->MAIN::hide-browser', (_, opts) => { - logger.debug('Hide', { source: 'builtin-browser', close: opts.close || false }) - if (browserViewExternal) { - overlayWindow!.removeBrowserView(browserViewExternal) - // uncomment to trade performance for less memory usage (1 process & 13 MB) - // browserViewExternal.destroy() - // browserViewExternal = undefined - if (opts.close) { - browserViewExternal.webContents.loadURL('about:blank') - } - } - }) -} diff --git a/src/main/config.ts b/src/main/config.ts index ae5898a1..11beb304 100644 --- a/src/main/config.ts +++ b/src/main/config.ts @@ -53,7 +53,9 @@ export function batchUpdateConfig (newCfg: Config) { } } -function upgradeConfig (config: Config): Config { +function upgradeConfig (_config: Config): Config { + const config = _config as Omit & { widgets: Array> } + if (config.configVersion < 3) { config.widgets.push({ ...defaultConfig().widgets.find(w => w.wmType === 'image-strip')!, @@ -182,5 +184,5 @@ function upgradeConfig (config: Config): Config { config.configVersion = 11 } - return config + return config as unknown as Config } diff --git a/src/main/overlay-window.ts b/src/main/overlay-window.ts index 844701a4..81f85736 100644 --- a/src/main/overlay-window.ts +++ b/src/main/overlay-window.ts @@ -1,13 +1,13 @@ import path from 'path' import assert from 'assert' -import { BrowserWindow, ipcMain, dialog, shell, Menu, systemPreferences, IpcMainEvent } from 'electron' +import { BrowserWindow, ipcMain, dialog, shell, Menu, systemPreferences, IpcMainEvent, WebContents } from 'electron' import { PoeWindow } from './PoeWindow' import { logger } from './logger' import * as ipc from '@/ipc/ipc-event' import { OverlayWindow as OW } from 'electron-overlay-window' import { config } from './config' -export let overlayWindow: BrowserWindow | undefined +let overlayWindow: BrowserWindow | undefined export let isInteractable = false export let DPR = 1 @@ -64,7 +64,7 @@ export async function createOverlayWindow () { ])) overlayWindow.webContents.on('before-input-event', handleExtraCommands) - setupCfProtection() + modifyResponseHeaders(overlayWindow.webContents) overlayWindow.webContents.setWindowOpenHandler((details) => { shell.openExternal(details.url) @@ -163,7 +163,7 @@ function handleDprChange (devicePixelRatio: number) { } } -export function handleExtraCommands (event: Electron.Event, input: Electron.Input) { +function handleExtraCommands (event: Electron.Event, input: Electron.Input) { if (input.type !== 'keyDown') return let { code, control: ctrlKey, shift: shiftKey, alt: altKey } = input @@ -196,10 +196,16 @@ export function handleExtraCommands (event: Electron.Event, input: Electron.Inpu } } -function setupCfProtection () { - overlayWindow!.webContents.session.webRequest.onHeadersReceived({ +function modifyResponseHeaders (webContents: WebContents) { + webContents.session.webRequest.onHeadersReceived({ urls: ['https://*.pathofexile.com/*'] }, (details, next) => { + // 1) allow embedding in iframe + if (details.responseHeaders) { + delete details.responseHeaders['x-frame-options'] + } + + // 2) store cookies from Cloudflare const cookies = details.responseHeaders?.['set-cookie'] if (cookies) { details.responseHeaders!['set-cookie'] = cookies.map(cookie => { diff --git a/src/web/overlay/OverlayWindow.vue b/src/web/overlay/OverlayWindow.vue index 6c6f970e..ad166bc8 100644 --- a/src/web/overlay/OverlayWindow.vue +++ b/src/web/overlay/OverlayWindow.vue @@ -151,35 +151,6 @@ export default defineComponent({ widgets.value = widgets.value.filter(_ => _.wmId !== wmId) } - function showBrowser (wmId: WMID, url?: string) { - setFlag(wmId, 'has-browser', true) - MainProcess.sendEvent({ - name: 'OVERLAY->MAIN::show-browser', - payload: { url } - }) - } - - function closeBrowser (wmId: WMID) { - const widget = AppConfig().widgets.find(_ => _.wmId === wmId)! - if (widget.wmFlags.includes('has-browser')) { - setFlag(wmId, 'has-browser', false) - MainProcess.sendEvent({ - name: 'OVERLAY->MAIN::hide-browser', - payload: { close: true } - }) - } - } - - function hideBrowser (wmId: WMID) { - const widget = AppConfig().widgets.find(_ => _.wmId === wmId)! - if (widget.wmFlags.includes('has-browser')) { - MainProcess.sendEvent({ - name: 'OVERLAY->MAIN::hide-browser', - payload: { close: false } - }) - } - } - function setFlag (wmId: WMID, flag: Widget['wmFlags'][number], state: boolean) { const widget = AppConfig().widgets.find(_ => _.wmId === wmId)! const hasFlag = widget.wmFlags.includes(flag) @@ -231,22 +202,6 @@ export default defineComponent({ })) }) - watch(visibilityState, (stateNow, stateOld) => { - for (const w of AppConfig().widgets) { - if (w.wmFlags.includes('has-browser')) { - const vNow = stateNow.find(_ => _.wmId === w.wmId)! - const vOld = stateOld.find(_ => _.wmId === w.wmId)! - if (vNow.isVisible === (vOld && vOld.isVisible)) return - - if (vNow.isVisible) { - showBrowser(w.wmId) - } else { - hideBrowser(w.wmId) - } - } - } - }) - const topmostWidget = computed(() => { // guaranteed to always exist because of the 'widget-menu' return AppConfig().widgets @@ -277,8 +232,6 @@ export default defineComponent({ remove, bringToTop, create, - showBrowser, - closeBrowser, setFlag }) diff --git a/src/web/overlay/interfaces.ts b/src/web/overlay/interfaces.ts index 8203479e..b31dbc2d 100644 --- a/src/web/overlay/interfaces.ts +++ b/src/web/overlay/interfaces.ts @@ -16,7 +16,8 @@ export type WellKnownFlag = 'invisible-on-blur' | 'hide-on-blur' | 'hide-on-blur(close)' | - 'hide-on-focus' + 'hide-on-focus' | + 'ignore-ui-visibility' export interface Anchor { pos: string @@ -34,8 +35,6 @@ export interface WidgetManager { remove: (wmId: number) => void bringToTop: (wmId: number) => void create: (wmType: string) => void - showBrowser: (wmId: number, url: string) => void - closeBrowser: (wmId: number) => void setFlag: (wmId: number, flag: string, state: boolean) => void } diff --git a/src/web/price-check/BackgroundInfo.vue b/src/web/price-check/BackgroundInfo.vue index a12db809..e02568b3 100644 --- a/src/web/price-check/BackgroundInfo.vue +++ b/src/web/price-check/BackgroundInfo.vue @@ -24,17 +24,14 @@