From 570597a3c30ceab867edf1a98a5e8ac50c1336b5 Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Tue, 21 Nov 2023 11:47:30 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E6=89=93=E5=BC=80=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/utils.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/utils.ts b/src/main/utils.ts index 1f18ca76..57151f01 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -32,8 +32,6 @@ export function setUtilsListeners(manager: WindowManager) { } }) contents.on("will-navigate", (event, url) => { - event.preventDefault() - if (contents.getType() === "webview") openExternal(url) }) }) From 70ffaf1e37bdee56cd21d98c07f881e8621f7dac Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Tue, 21 Nov 2023 12:06:33 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=86=85=E7=BD=AE=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E4=B8=AD=E7=A6=81=E6=AD=A2=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 以防影响网页登录之类功能, --- src/components/article.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/article.tsx b/src/components/article.tsx index 18a640ab..b2351b2f 100644 --- a/src/components/article.tsx +++ b/src/components/article.tsx @@ -212,6 +212,10 @@ class Article extends React.Component { } keyDownHandler = (input: Electron.Input) => { + if (this.state.loadWebpage) { + // 内置网页中禁止快捷键以防影响网页登录之类功能, + return; + } if (input.type === "keyDown") { switch (input.key) { case "Escape": From 6a04157d800f1859b8ae4fb4ffe1bdf3ca5577b4 Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Tue, 21 Nov 2023 14:29:53 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=80=E5=85=B3?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=86=85=E7=BD=AE=E6=B5=8F=E8=A7=88=E5=99=A8?= =?UTF-8?q?=E4=B8=AD=E6=89=93=E5=BC=80=E7=BD=91=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bridges/settings.ts | 7 +++++++ src/components/settings/app.tsx | 21 +++++++++++++++++++++ src/main/settings.ts | 14 ++++++++++++++ src/main/utils.ts | 7 +++++++ src/schema-types.ts | 1 + src/scripts/i18n/en-US.json | 1 + src/scripts/i18n/zh-CN.json | 1 + 7 files changed, 52 insertions(+) diff --git a/src/bridges/settings.ts b/src/bridges/settings.ts index c20c4597..92ab09d3 100644 --- a/src/bridges/settings.ts +++ b/src/bridges/settings.ts @@ -23,6 +23,13 @@ const settingsBridge = { ipcRenderer.invoke("set-menu", state) }, + getWebViewOpenUrlStatus: (): boolean => { + return ipcRenderer.sendSync("get-webview-open-url-status") + }, + toggleWebViewOpenUrlStatus: () => { + ipcRenderer.send("toggle-webview-open-url-status") + }, + getProxyStatus: (): boolean => { return ipcRenderer.sendSync("get-proxy-status") }, diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 5a018e3d..1a71d835 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -34,6 +34,7 @@ type AppTabProps = { } type AppTabState = { + webViewOpenUrlStatus: boolean pacStatus: boolean pacUrl: string themeSettings: ThemeSettings @@ -46,6 +47,7 @@ class AppTab extends React.Component { constructor(props) { super(props) this.state = { + webViewOpenUrlStatus: window.settings.getWebViewOpenUrlStatus(), pacStatus: window.settings.getProxyStatus(), pacUrl: window.settings.getProxy(), themeSettings: getThemeSettings(), @@ -148,6 +150,13 @@ class AppTab extends React.Component { { key: "zh-TW", text: "中文(繁體)" }, ] + toggleWebViewOpenUrlStatus = () => { + window.settings.toggleWebViewOpenUrlStatus() + this.setState({ + webViewOpenUrlStatus: window.settings.getWebViewOpenUrlStatus(), + }) + } + toggleStatus = () => { window.settings.toggleProxyStatus() this.setState({ @@ -220,6 +229,18 @@ class AppTab extends React.Component { + + + + + + + + + diff --git a/src/main/settings.ts b/src/main/settings.ts index e6e6a029..ba42fb15 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -30,6 +30,20 @@ ipcMain.handle("set-menu", (_, state: boolean) => { store.set(MENU_STORE_KEY, state) }) +const WEBVIEW_OPEN_URL_STATUS_KEY = "webViewOpenUrlStatus" +export function getWebViewOpenUrlStatus() { + return store.get(WEBVIEW_OPEN_URL_STATUS_KEY, false) +} +function toggleWebViewOpenUrlStatus() { + store.set(WEBVIEW_OPEN_URL_STATUS_KEY, !getWebViewOpenUrlStatus()) +} +ipcMain.on("get-webview-open-url-status", event => { + event.returnValue = getWebViewOpenUrlStatus() +}) +ipcMain.on("toggle-webview-open-url-status", () => { + toggleWebViewOpenUrlStatus() +}) + const PAC_STORE_KEY = "pac" const PAC_STATUS_KEY = "pacOn" function getProxyStatus() { diff --git a/src/main/utils.ts b/src/main/utils.ts index 57151f01..5c2def23 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -4,6 +4,8 @@ import fs = require("fs") import { ImageCallbackTypes, TouchBarTexts } from "../schema-types" import { initMainTouchBar } from "./touchbar" import fontList = require("font-list") +import settingsBridge from "../bridges/settings" +import { getWebViewOpenUrlStatus } from "./settings" export function setUtilsListeners(manager: WindowManager) { async function openExternal(url: string, background = false) { @@ -32,6 +34,11 @@ export function setUtilsListeners(manager: WindowManager) { } }) contents.on("will-navigate", (event, url) => { + if (getWebViewOpenUrlStatus()) { + return; + } + event.preventDefault() + if (contents.getType() === "webview") openExternal(url) }) }) diff --git a/src/schema-types.ts b/src/schema-types.ts index d295f9a0..cc2e6c57 100644 --- a/src/schema-types.ts +++ b/src/schema-types.ts @@ -86,6 +86,7 @@ export type SchemaTypes = { theme: ThemeSettings pac: string pacOn: boolean + webViewOpenUrlStatus: boolean view: ViewType locale: string sourceGroups: SourceGroup[] diff --git a/src/scripts/i18n/en-US.json b/src/scripts/i18n/en-US.json index fad7eacd..a2778899 100644 --- a/src/scripts/i18n/en-US.json +++ b/src/scripts/i18n/en-US.json @@ -231,6 +231,7 @@ "theme": "Theme", "lightTheme": "Light mode", "darkTheme": "Dark mode", + "enableWebViewOpenUrl": "Enable WebView open url", "enableProxy": "Enable Proxy", "badUrl": "Invalid URL", "pac": "PAC Address", diff --git a/src/scripts/i18n/zh-CN.json b/src/scripts/i18n/zh-CN.json index bbe9a25c..c1c649d8 100644 --- a/src/scripts/i18n/zh-CN.json +++ b/src/scripts/i18n/zh-CN.json @@ -229,6 +229,7 @@ "theme": "应用主题", "lightTheme": "浅色模式", "darkTheme": "深色模式", + "enableWebViewOpenUrl": "允许内置浏览器打开网页", "enableProxy": "启用代理", "badUrl": "请正确输入URL", "pac": "PAC地址", From 107ea3ff5ce024a9e4fe191161c3f569cfa6f09c Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Tue, 21 Nov 2023 16:57:09 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E6=89=93=E5=BC=80=E7=BD=91=E9=A1=B5?= =?UTF-8?q?=E6=97=B6=E4=BF=9D=E5=AD=98cookies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 以便支持登录或者过js防火墙之类的, --- src/components/settings/app.tsx | 3 +++ src/electron.ts | 13 ++++++++----- src/main/cookies.ts | 29 +++++++++++++++++++++++++++++ src/main/utils.ts | 7 +++++++ src/scripts/i18n/en-US.json | 1 + src/scripts/i18n/zh-CN.json | 1 + 6 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 src/main/cookies.ts diff --git a/src/components/settings/app.tsx b/src/components/settings/app.tsx index 1a71d835..6acfc931 100644 --- a/src/components/settings/app.tsx +++ b/src/components/settings/app.tsx @@ -240,6 +240,9 @@ class AppTab extends React.Component { /> + + {intl.get("app.webViewOpenUrlHint")} + diff --git a/src/electron.ts b/src/electron.ts index af353bb4..eb94fdb2 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -1,8 +1,9 @@ import { app, ipcMain, Menu, nativeTheme } from "electron" import { ThemeSettings, SchemaTypes } from "./schema-types" -import { store } from "./main/settings" +import { getWebViewOpenUrlStatus, store } from "./main/settings" import performUpdate from "./main/update-scripts" import { WindowManager } from "./main/window" +import { saveCookies } from "./main/cookies" if (!process.mas) { const locked = app.requestSingleInstanceLock() @@ -106,10 +107,12 @@ if (process.platform === "darwin") { const winManager = new WindowManager() app.on("window-all-closed", () => { - if (winManager.hasWindow()) { - winManager.mainWindow.webContents.session.clearStorageData({ - storages: ["cookies", "localstorage"], - }) + if (!getWebViewOpenUrlStatus()) { + if (winManager.hasWindow()) { + winManager.mainWindow.webContents.session.clearStorageData({ + storages: ["cookies", "localstorage"], + }) + } } winManager.mainWindow = null if (restarting) { diff --git a/src/main/cookies.ts b/src/main/cookies.ts new file mode 100644 index 00000000..63d9b9c1 --- /dev/null +++ b/src/main/cookies.ts @@ -0,0 +1,29 @@ +import Store = require("electron-store") +import { getWebViewOpenUrlStatus } from "./settings" +import { BrowserWindow, WebContents } from "electron" + +const cookieStore = new Store() +const COOKIES_KEY = "cookiesKey" +export async function saveCookies(webContents: WebContents) { + console.log('save cookie') + const currentSession = webContents.session + await currentSession.cookies.flushStore() + let cookies = await currentSession.cookies.get({}) + let customCookies = cookies.map(cookie => ({ + ...cookie, + url:(cookie.secure ? 'https://' : 'http://') + cookie.domain.replace(/^\./, '') + cookie.path + })) + console.log('save cookie: ' + JSON.stringify(customCookies)) + cookieStore.set(COOKIES_KEY, customCookies) +} +export async function loadCookies(webContents: WebContents) { + const savedCookies = cookieStore.get(COOKIES_KEY) + cookieStore.get + console.log('load cookie: ' + JSON.stringify(savedCookies)) + if (savedCookies && savedCookies.length > 0) { + const currentSession = webContents.session + savedCookies.forEach(cookie => { + currentSession.cookies.set(cookie) + }) + } +} \ No newline at end of file diff --git a/src/main/utils.ts b/src/main/utils.ts index 5c2def23..2e81cd92 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -6,6 +6,7 @@ import { initMainTouchBar } from "./touchbar" import fontList = require("font-list") import settingsBridge from "../bridges/settings" import { getWebViewOpenUrlStatus } from "./settings" +import { loadCookies, saveCookies } from "./cookies" export function setUtilsListeners(manager: WindowManager) { async function openExternal(url: string, background = false) { @@ -242,6 +243,12 @@ export function setUtilsListeners(manager: WindowManager) { contents.send("webview-keydown", input) } }) + if (getWebViewOpenUrlStatus()) { + loadCookies(contents) + contents.on('did-finish-load', () => { + saveCookies(contents) + }) + } } }) diff --git a/src/scripts/i18n/en-US.json b/src/scripts/i18n/en-US.json index a2778899..da378dfd 100644 --- a/src/scripts/i18n/en-US.json +++ b/src/scripts/i18n/en-US.json @@ -232,6 +232,7 @@ "lightTheme": "Light mode", "darkTheme": "Dark mode", "enableWebViewOpenUrl": "Enable WebView open url", + "webViewOpenUrlHint": "Enabling this switch will save cookies data for the built-in browser.", "enableProxy": "Enable Proxy", "badUrl": "Invalid URL", "pac": "PAC Address", diff --git a/src/scripts/i18n/zh-CN.json b/src/scripts/i18n/zh-CN.json index c1c649d8..a51cd7ed 100644 --- a/src/scripts/i18n/zh-CN.json +++ b/src/scripts/i18n/zh-CN.json @@ -230,6 +230,7 @@ "lightTheme": "浅色模式", "darkTheme": "深色模式", "enableWebViewOpenUrl": "允许内置浏览器打开网页", + "webViewOpenUrlHint": "开启后会保存内置浏览器的cookie数据。", "enableProxy": "启用代理", "badUrl": "请正确输入URL", "pac": "PAC地址", From 0deb012570060b9a2e049f77260536153b0a926d Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Wed, 22 Nov 2023 13:07:41 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=88=A0=E9=99=A4cookies=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/cookies.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/cookies.ts b/src/main/cookies.ts index 63d9b9c1..70d0f0e0 100644 --- a/src/main/cookies.ts +++ b/src/main/cookies.ts @@ -5,7 +5,6 @@ import { BrowserWindow, WebContents } from "electron" const cookieStore = new Store() const COOKIES_KEY = "cookiesKey" export async function saveCookies(webContents: WebContents) { - console.log('save cookie') const currentSession = webContents.session await currentSession.cookies.flushStore() let cookies = await currentSession.cookies.get({}) @@ -13,13 +12,11 @@ export async function saveCookies(webContents: WebContents) { ...cookie, url:(cookie.secure ? 'https://' : 'http://') + cookie.domain.replace(/^\./, '') + cookie.path })) - console.log('save cookie: ' + JSON.stringify(customCookies)) cookieStore.set(COOKIES_KEY, customCookies) } export async function loadCookies(webContents: WebContents) { const savedCookies = cookieStore.get(COOKIES_KEY) cookieStore.get - console.log('load cookie: ' + JSON.stringify(savedCookies)) if (savedCookies && savedCookies.length > 0) { const currentSession = webContents.session savedCookies.forEach(cookie => { From b4087c3e3c73d9d29262b28121d99ba24be9efea Mon Sep 17 00:00:00 2001 From: AoEiuV020 Date: Wed, 22 Nov 2023 14:15:52 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=86=85=E7=BD=AE=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E6=96=B0=E7=AA=97=E5=8F=A3=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=9A=84=E9=93=BE=E6=8E=A5=E4=B9=9F=E5=BC=BA=E5=88=B6=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E7=AA=97=E5=8F=A3=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/utils.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/utils.ts b/src/main/utils.ts index 2e81cd92..230fb808 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -25,11 +25,16 @@ export function setUtilsListeners(manager: WindowManager) { app.on("web-contents-created", (_, contents) => { contents.setWindowOpenHandler(details => { - if (contents.getType() === "webview") - openExternal( - details.url, - details.disposition === "background-tab" - ) + if (contents.getType() === "webview") { + if (getWebViewOpenUrlStatus()) { + contents.loadURL(details.url) + } else { + openExternal( + details.url, + details.disposition === "background-tab" + ) + } + } return { action: manager.hasWindow() ? "deny" : "allow", }