111 lines
3.0 KiB
TypeScript
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,
|
|
}
|