hi-sass-frame/src/main/hook/browserHook.ts
2024-09-08 23:46:15 +08:00

111 lines
3.0 KiB
TypeScript

import {BrowserView, BrowserWindow} from "electron";
import {IpcChannel} from "../ipc";
import {IsUseSysTitle, BrowserDemoUrl} from "../config/const";
import {otherWindowConfig} from "../config/windowsConfig";
import {browserDemoURL} from "../config/staticPath";
import {openDevTools} from "./devToolHook";
let dragTabOffsetX: number;
let lastDragView: BrowserView;
let emptyWin: BrowserWindow;
let viewFromWin: BrowserWindow;
let useNewWindow: BrowserWindow;
const winList: BrowserWindow[] = [];
const viewList: BrowserView[] = [];
let startScreenY: number;
export function openBrowserDemoWindow() {
let win = new BrowserWindow({
titleBarStyle: IsUseSysTitle ? "default" : "hidden",
...Object.assign(otherWindowConfig, {}),
});
// // 开发模式下自动开启devtools
if (process.env.NODE_ENV === "development") {
openDevTools(win)
}
win.loadURL(browserDemoURL);
win.on("ready-to-show", () => {
win.show();
});
win.on("closed", () => {
const findIndex = winList.findIndex((v) => win === v);
if (findIndex !== -1) {
winList.splice(findIndex, 1);
}
});
winList.push(win);
return win;
}
export function createDefaultBrowserView(
win: BrowserWindow,
defaultUrl = BrowserDemoUrl
) {
const [winWidth, winHeight] = win.getSize();
const bv = new BrowserView();
win.addBrowserView(bv);
// title-bar 30px tabbar 40px searchbar 40px
bv.setBounds({x: 0, y: 110, width: winWidth, height: winHeight - 110});
bv.setAutoResize({
width: true,
height: true,
});
bv.webContents.on('did-finish-load', () => {
console.log(bv.webContents.getURL())
})
bv.webContents.loadURL(defaultUrl);
bv.webContents.on("page-title-updated", (event, title) => {
const parentBw = BrowserWindow.fromBrowserView(bv);
if (parentBw) {
freshTabData(parentBw, bv, 1)
}
});
bv.webContents.on("destroyed", () => {
const findIndex = viewList.findIndex((v) => v === bv);
if (findIndex !== -1) {
viewList.splice(findIndex, 1);
}
});
bv.webContents.setWindowOpenHandler((details) => {
const parentBw = BrowserWindow.fromBrowserView(bv);
createDefaultBrowserView(parentBw, details.url);
return {action: "deny"};
});
freshTabData(win, bv, 1)
viewList.push(bv);
return bv;
}
export function addBrowserView(win: BrowserWindow, view: BrowserView) {
if (BrowserWindow.fromBrowserView(view) !== win) {
win.addBrowserView(view);
win.show();
win.setAlwaysOnTop(true);
}
freshTabData(win, view, 1)
}
export function removeBrowserView(win: BrowserWindow, view: BrowserView) {
if (BrowserWindow.fromBrowserView(view) === win) {
win.removeBrowserView(view);
}
freshTabData(win, view, -1)
}
export function freshTabData(win: BrowserWindow, bv: BrowserView, status: -1 | 1) {
win.webContents.send(IpcChannel.BrowserViewTabDataUpdate, {
bvWebContentsId: bv.webContents.id,
title: bv.webContents.getTitle(),
url: bv.webContents.getURL(),
status: status,
});
}
export const useHookBrowser = {
openBrowserDemoWindow,
createDefaultBrowserView,
addBrowserView,
removeBrowserView,
freshTabData,
}