@lynker-desktop/electron-window-manager 0.0.5-alpha.0 → 0.0.5-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,6 +34,35 @@ const getAllBv = () => {
34
34
  });
35
35
  return allBrowserViews;
36
36
  };
37
+ const getBVByWebContent = (webContent) => {
38
+ const allBv = getAllBv();
39
+ const win = allBv.find(i => i.webContents === webContent);
40
+ // win不存在时,但webContent存在时,说明bv没有挂载到window上,需要手动创建
41
+ if (!win && !webContent?.isDestroyed?.()) {
42
+ // @ts-ignore
43
+ return {
44
+ id: webContent.id,
45
+ _id: webContent.id,
46
+ _type: 'BV',
47
+ _name: '',
48
+ _extraData: '',
49
+ webContents: webContent,
50
+ getBounds: async () => {
51
+ return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'borrowView_getBounds', data: { webContentId: webContent.id, options: {} } });
52
+ },
53
+ setBounds: async (bounds) => {
54
+ return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'borrowView_setBounds', data: { webContentId: webContent.id, options: bounds } });
55
+ },
56
+ setAutoResize: async (autoResize) => {
57
+ return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'borrowView_setAutoResize', data: { webContentId: webContent.id, options: autoResize } });
58
+ },
59
+ setBackgroundColor: async (color) => {
60
+ return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'borrowView_setBackgroundColor', data: { webContentId: webContent.id, options: color } });
61
+ },
62
+ };
63
+ }
64
+ return win;
65
+ };
37
66
  async function create(options) {
38
67
  const remote = getRemote();
39
68
  const data = await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'create', data: options });
@@ -72,7 +101,9 @@ const get = async (idOrName) => {
72
101
  let win = remote.BrowserWindow.fromId(data.winId);
73
102
  if (!win) {
74
103
  const webContent = remote.webContents.fromId(data.winId);
75
- win = getAllBv().find(i => i.webContents === webContent);
104
+ if (webContent) {
105
+ win = getBVByWebContent(webContent);
106
+ }
76
107
  }
77
108
  if (win) {
78
109
  // @ts-ignore
@@ -89,7 +120,6 @@ async function getAll(type) {
89
120
  const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'getAll', data: undefined });
90
121
  const wins = new Map();
91
122
  const allW = remote.BrowserWindow.getAllWindows();
92
- const allV = getAllBv();
93
123
  const bwWindows = new Map();
94
124
  const bvWindows = new Map();
95
125
  for (const key in data) {
@@ -99,8 +129,10 @@ async function getAll(type) {
99
129
  });
100
130
  if (!win) {
101
131
  const webContent = remote.webContents.fromId(element.winId);
102
- // @ts-ignore
103
- win = allV.find(i => i.webContents === webContent);
132
+ if (webContent) {
133
+ // @ts-ignore
134
+ win = getBVByWebContent(webContent);
135
+ }
104
136
  }
105
137
  if (win) {
106
138
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/** Used in Renderer process */\nimport type {BrowserView, BrowserWindow, IpcRenderer} from 'electron'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions } from '../common';\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\n\nconst getIpc = (): IpcRenderer => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer || window?.require('electron').ipcRenderer\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\nconst getRemote = (): typeof RemoteType => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.remote || window?.require('@electron/remote')\n } catch (error) {\n console.error('getIpc error: ', error)\n return {} as typeof RemoteType;\n }\n}\n\n/**\n * 一次性获取所有窗口的 BrowserView\n */\nconst getAllBv = () => {\n const remote = getRemote()\n // 一次性获取所有窗口的 BrowserView\n const allWindows = remote.BrowserWindow.getAllWindows();\n let allBrowserViews: Array<BrowserView> = [];\n\n allWindows.forEach(window => {\n const views = window.getBrowserViews();\n allBrowserViews = allBrowserViews.concat(views);\n });\n return allBrowserViews;\n}\n\n/**\n * 创建窗口\n * @param options\n * @returns\n */\nexport function create(options: Omit<ElectronWindowsManagerOptions, 'type'> & { type?: 'BW' }): Promise<BWItem>;\nexport function create(options: ElectronWindowsManagerOptions & { type: 'BV' }): Promise<BVItem>;\nexport function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem>;\n\nexport async function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem> {\n const remote = getRemote()\n const data: {winId: number; winName: string} = await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'create', data: options})\n let win = remote.BrowserWindow.fromId(data.winId)! as BWItem | BVItem;\n if (!win) {\n const webContent = remote.webContents.fromId(data.winId);\n win = getAllBv().find(i => i.webContents === webContent) as BVItem;\n }\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName}`);\n // @ts-ignore\n win && (win['_type'] = `${data?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData || ''}`);\n }\n\n return win;\n}\n\n/**\n * 获取当前窗口实例\n */\nexport const getCurrentWindow = async () => {\n const remote = getRemote();\n const winId = remote.getCurrentWindow().id;\n let win = await get(winId);\n return win;\n}\n\n/**\n * 获取窗口\n * @param idOrName id或者名字\n * @returns\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote()\n const data: {winId: number; winName: string, winExtraData: string} = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'get', data: idOrName})\n let win = remote.BrowserWindow.fromId(data.winId)! as BWItem | BVItem;\n if (!win) {\n const webContent = remote.webContents.fromId(data.winId);\n win = getAllBv().find(i => i.webContents === webContent) as BVItem;\n }\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName || ''}`);\n // @ts-ignore\n win && (win['_type'] = `${data?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData|| ''}`);\n }\n return win;\n}\n\n/**\n * 获取所有窗口\n * @returns\n */\nexport function getAll(type: 'BW'): Promise<Map<number, BWItem>>;\nexport function getAll(type: 'BV'): Promise<Map<number, BVItem>>;\nexport function getAll(): Promise<Map<number, BWItem | BVItem>>;\n\nexport async function getAll(type?: 'BW' | 'BV'): Promise<Map<number, BWItem | BVItem>> {\n const remote = getRemote()\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'getAll', data: undefined})\n const wins = new Map();\n const allW = remote.BrowserWindow.getAllWindows()\n const allV = getAllBv();\n const bwWindows = new Map<number, BWItem>();\n const bvWindows = new Map<number, BVItem>();\n for (const key in data) {\n const element = data[key];\n let win = allW.find(i => {\n return `${i.id}` === `${element?.winId}`\n })\n if (!win) {\n const webContent = remote.webContents.fromId(element.winId);\n // @ts-ignore\n win = allV.find(i => i.webContents === webContent) as BVItem;\n }\n if (win) {\n try {\n // @ts-ignore\n win && (win['id'] = Number(`${element?.winId}`));\n } catch (error) {\n }\n // @ts-ignore\n win && (win['_id'] = Number(`${element?.winId}`));\n // @ts-ignore\n win && (win['_name'] = `${element?.winName || ''}`);\n // @ts-ignore\n win && (win['_type'] = `${element?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${element?.winExtraData|| ''}`);\n // @ts-ignore\n wins.set(win.id || win._id, win)\n // @ts-ignore\n if (win?._type === 'BW') {\n // @ts-ignore\n bwWindows.set(win.id || win._id, win);\n }\n // @ts-ignore\n if (win?._type === 'BV') {\n // @ts-ignore\n bvWindows.set(win.id || win._id, win);\n }\n }\n }\n if (type === 'BW') {\n return bwWindows;\n }\n if (type === 'BV') {\n return bvWindows;\n }\n return wins;\n}\n\n/**\n * 关闭窗口\n * @param name\n * @returns\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'close', data: idOrName})\n return true;\n}\n\nexport const closeAll = async (): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'closeAll', data: undefined})\n return true;\n}\n\n/**\n * 用webContentIds查找到window\n*/\nexport const getWindowForWebContentId = async (webContentId: number) => {\n const winId = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'getWindowForWebContentId', data: webContentId})\n return get(winId);\n}\n\n/**\n * 获取 preload\n * @returns\n */\nexport const getPreload = (() => {\n let cachePreload: undefined | string = undefined;\n return async (): Promise<string | undefined> => {\n if (cachePreload) {\n return cachePreload;\n }\n const data: string | undefined = await getIpc().invoke(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'getPreload',\n data: undefined,\n }\n )\n cachePreload = data;\n return data;\n }\n})()\n\ngetPreload();\n\n// const handleOpenDevTools = (e: HTMLElement, ev: KeyboardEvent): any => {\n// const remote = getRemote()\n// const webContents = remote.getCurrentWebContents()\n// webContents.openDevTools({\n// mode: 'detach'\n// })\n// return '';\n// }\n\n// export const registerDevTools = () => {\n// document.body.removeEventListener('keydown', handleOpenDevTools)\n// document.body.addEventListener('keydown', handleOpenDevTools)\n// }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/** Used in Renderer process */\nimport type {BrowserView, BrowserWindow, IpcRenderer, WebContents} from 'electron'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions } from '../common';\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\n\nconst getIpc = (): IpcRenderer => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer || window?.require('electron').ipcRenderer\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\nconst getRemote = (): typeof RemoteType => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.remote || window?.require('@electron/remote')\n } catch (error) {\n console.error('getIpc error: ', error)\n return {} as typeof RemoteType;\n }\n}\n\n/**\n * 一次性获取所有窗口的 BrowserView\n */\nconst getAllBv = () => {\n const remote = getRemote()\n // 一次性获取所有窗口的 BrowserView\n const allWindows = remote.BrowserWindow.getAllWindows();\n let allBrowserViews: Array<BrowserView> = [];\n\n allWindows.forEach(window => {\n const views = window.getBrowserViews();\n allBrowserViews = allBrowserViews.concat(views);\n });\n return allBrowserViews;\n}\n\nconst getBVByWebContent = (webContent: WebContents) : BVItem => {\n const allBv = getAllBv();\n const win = allBv.find(i => i.webContents === webContent) as BVItem;\n // win不存在时,但webContent存在时,说明bv没有挂载到window上,需要手动创建\n if (!win && !webContent?.isDestroyed?.()) {\n // @ts-ignore\n return {\n id: webContent.id,\n _id: webContent.id,\n _type: 'BV',\n _name: '',\n _extraData: '',\n webContents: webContent,\n getBounds: async () => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'borrowView_getBounds', data: {webContentId: webContent.id, options: {}}})\n },\n setBounds: async (bounds: any) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'borrowView_setBounds', data: {webContentId: webContent.id, options: bounds}})\n },\n setAutoResize: async (autoResize: boolean) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'borrowView_setAutoResize', data: {webContentId: webContent.id, options: autoResize}})\n },\n setBackgroundColor: async (color: string) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'borrowView_setBackgroundColor', data: {webContentId: webContent.id, options: color}})\n },\n } as BVItem;;\n }\n return win;\n}\n\n/**\n * 创建窗口\n * @param options\n * @returns\n */\nexport function create(options: Omit<ElectronWindowsManagerOptions, 'type'> & { type?: 'BW' }): Promise<BWItem>;\nexport function create(options: ElectronWindowsManagerOptions & { type: 'BV' }): Promise<BVItem>;\nexport function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem>;\n\nexport async function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem> {\n const remote = getRemote()\n const data: {winId: number; winName: string} = await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'create', data: options})\n let win = remote.BrowserWindow.fromId(data.winId)! as BWItem | BVItem;\n if (!win) {\n const webContent = remote.webContents.fromId(data.winId);\n win = getAllBv().find(i => i.webContents === webContent) as BVItem;\n }\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName}`);\n // @ts-ignore\n win && (win['_type'] = `${data?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData || ''}`);\n }\n\n return win;\n}\n\n/**\n * 获取当前窗口实例\n */\nexport const getCurrentWindow = async () => {\n const remote = getRemote();\n const winId = remote.getCurrentWindow().id;\n let win = await get(winId);\n return win;\n}\n\n/**\n * 获取窗口\n * @param idOrName id或者名字\n * @returns\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote()\n const data: {winId: number; winName: string, winExtraData: string} = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'get', data: idOrName})\n let win = remote.BrowserWindow.fromId(data.winId)! as BWItem | BVItem;\n if (!win) {\n const webContent = remote.webContents.fromId(data.winId);\n if (webContent) {\n win = getBVByWebContent(webContent) as BVItem;\n }\n }\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName || ''}`);\n // @ts-ignore\n win && (win['_type'] = `${data?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData|| ''}`);\n }\n return win;\n}\n\n/**\n * 获取所有窗口\n * @returns\n */\nexport function getAll(type: 'BW'): Promise<Map<number, BWItem>>;\nexport function getAll(type: 'BV'): Promise<Map<number, BVItem>>;\nexport function getAll(): Promise<Map<number, BWItem | BVItem>>;\n\nexport async function getAll(type?: 'BW' | 'BV'): Promise<Map<number, BWItem | BVItem>> {\n const remote = getRemote()\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'getAll', data: undefined})\n const wins = new Map();\n const allW = remote.BrowserWindow.getAllWindows()\n const bwWindows = new Map<number, BWItem>();\n const bvWindows = new Map<number, BVItem>();\n for (const key in data) {\n const element = data[key];\n let win = allW.find(i => {\n return `${i.id}` === `${element?.winId}`\n })\n if (!win) {\n const webContent = remote.webContents.fromId(element.winId);\n if (webContent) {\n // @ts-ignore\n win = getBVByWebContent(webContent) as BVItem;\n }\n }\n if (win) {\n try {\n // @ts-ignore\n win && (win['id'] = Number(`${element?.winId}`));\n } catch (error) {\n }\n // @ts-ignore\n win && (win['_id'] = Number(`${element?.winId}`));\n // @ts-ignore\n win && (win['_name'] = `${element?.winName || ''}`);\n // @ts-ignore\n win && (win['_type'] = `${element?.winType || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${element?.winExtraData|| ''}`);\n // @ts-ignore\n wins.set(win.id || win._id, win)\n // @ts-ignore\n if (win?._type === 'BW') {\n // @ts-ignore\n bwWindows.set(win.id || win._id, win);\n }\n // @ts-ignore\n if (win?._type === 'BV') {\n // @ts-ignore\n bvWindows.set(win.id || win._id, win);\n }\n }\n }\n if (type === 'BW') {\n return bwWindows;\n }\n if (type === 'BV') {\n return bvWindows;\n }\n return wins;\n}\n\n/**\n * 关闭窗口\n * @param name\n * @returns\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'close', data: idOrName})\n return true;\n}\n\nexport const closeAll = async (): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'closeAll', data: undefined})\n return true;\n}\n\n/**\n * 用webContentIds查找到window\n*/\nexport const getWindowForWebContentId = async (webContentId: number) => {\n const winId = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'getWindowForWebContentId', data: webContentId})\n return get(winId);\n}\n\n/**\n * 获取 preload\n * @returns\n */\nexport const getPreload = (() => {\n let cachePreload: undefined | string = undefined;\n return async (): Promise<string | undefined> => {\n if (cachePreload) {\n return cachePreload;\n }\n const data: string | undefined = await getIpc().invoke(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'getPreload',\n data: undefined,\n }\n )\n cachePreload = data;\n return data;\n }\n})()\n\ngetPreload();\n\n// const handleOpenDevTools = (e: HTMLElement, ev: KeyboardEvent): any => {\n// const remote = getRemote()\n// const webContents = remote.getCurrentWebContents()\n// webContents.openDevTools({\n// mode: 'detach'\n// })\n// return '';\n// }\n\n// export const registerDevTools = () => {\n// document.body.removeEventListener('keydown', handleOpenDevTools)\n// document.body.addEventListener('keydown', handleOpenDevTools)\n// }\n"],"names":[],"mappings":"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"}
package/main/index.d.ts CHANGED
@@ -6,8 +6,20 @@ export declare class WindowsManager {
6
6
  loadingViewUrl: string | undefined;
7
7
  errorViewUrl: string | undefined;
8
8
  preload?: string;
9
+ preloadWebContentsUrl?: string;
9
10
  windows: Map<number, BWItem | BVItem>;
10
- constructor(preload?: string, loadingViewUrl?: string, errorViewUrl?: string);
11
+ preloadedBW: BWItem | null;
12
+ preloadedBV: BVItem | null;
13
+ preloading: boolean;
14
+ constructor(preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadUrl?: string);
15
+ private _preloadInstances;
16
+ private _createPreloadBW;
17
+ private _createPreloadBV;
18
+ /**
19
+ * 预加载webContents
20
+ * @param url
21
+ */
22
+ preloadWebContents(url: string): void;
11
23
  create(options: Omit<ElectronWindowsManagerOptions, 'type'> & {
12
24
  type?: 'BW';
13
25
  }): BWItem;
@@ -23,7 +35,9 @@ export declare class WindowsManager {
23
35
  close(idOrName: string | number): boolean;
24
36
  closeAll(): void;
25
37
  getPreload(): string | undefined;
38
+ private _applyBrowserWindowOptions;
39
+ private _applyBrowserViewOptions;
26
40
  }
27
41
  export declare let isInitialized: boolean;
28
- export declare const initialize: (preload?: string, loadingViewUrl?: string, errorViewUrl?: string) => WindowsManager;
42
+ export declare const initialize: (preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsUrl?: string) => WindowsManager;
29
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,WAAW,EAAkE,MAAM,UAAU,CAAA;AAGvI,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE/E,eAAO,MAAM,gBAAgB,wBAQzB,CAAC;AAUL,eAAO,MAAM,MAAM,QAAS,WAAW,SAEtC,CAAA;AAED,qBAAa,cAAc;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;gBAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAQ5E,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,MAAM;IACtF,MAAM,CAAC,OAAO,EAAE,6BAA6B,GAAG;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,MAAM;IACvE,MAAM,CAAC,OAAO,EAAE,6BAA6B,GAAG,MAAM,GAAG,MAAM;IA+K/D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,6BAA6B;IAmF5E,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IA6B3D,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IA0BtC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAqC/B,QAAQ;IA0BR,UAAU;CAIX;AAID,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,MAAM,UAAU,aAAc,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,KAAG,cA0I7F,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,WAAW,EAAkE,MAAM,UAAU,CAAA;AAGvI,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE/E,eAAO,MAAM,gBAAgB,wBAQzB,CAAC;AAUL,eAAO,MAAM,MAAM,QAAS,WAAW,SAEtC,CAAA;AAED,qBAAa,cAAc;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,UAAU,EAAE,OAAO,CAAS;gBAChB,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;YAWnF,iBAAiB;IAc/B,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,gBAAgB;IAiCxB;;;OAGG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM;IAK9B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,MAAM;IACtF,MAAM,CAAC,OAAO,EAAE,6BAA6B,GAAG;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,MAAM;IACvE,MAAM,CAAC,OAAO,EAAE,6BAA6B,GAAG,MAAM,GAAG,MAAM;IAmP/D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,6BAA6B;IAmF5E,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IA6B3D,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAyBtC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAqC/B,QAAQ;IA0BR,UAAU;IAKV,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,wBAAwB;CAejC;AAID,eAAO,IAAI,aAAa,SAAQ,CAAC;AAEjC,eAAO,MAAM,UAAU,aAAc,MAAM,mBAAmB,MAAM,iBAAiB,MAAM,0BAA0B,MAAM,KAAG,cA6M7H,CAAA"}
package/main/index.js CHANGED
@@ -35,17 +35,141 @@ const enable = (win) => {
35
35
  remote__namespace.enable(win);
36
36
  };
37
37
  class WindowsManager {
38
- constructor(preload, loadingViewUrl, errorViewUrl) {
38
+ constructor(preload, loadingViewUrl, errorViewUrl, preloadUrl) {
39
+ this.preloadedBW = null;
40
+ this.preloadedBV = null;
41
+ this.preloading = false;
39
42
  this.preload = preload;
40
43
  this.windows = new Map();
41
44
  this.loadingViewUrl = `${loadingViewUrl ?? ''}`;
42
45
  this.errorViewUrl = `${errorViewUrl ?? ''}`;
46
+ this.preloadWebContentsUrl = `${preloadUrl ?? ''}`;
47
+ if (this.preloadWebContentsUrl) {
48
+ this._preloadInstances();
49
+ }
50
+ }
51
+ async _preloadInstances() {
52
+ if (this.preloading)
53
+ return;
54
+ this.preloading = true;
55
+ try {
56
+ if (this.preloadWebContentsUrl) {
57
+ this.preloadedBW = await this._createPreloadBW();
58
+ this.preloadedBV = await this._createPreloadBV();
59
+ }
60
+ }
61
+ catch (e) {
62
+ log('error', '预创建实例失败', e);
63
+ }
64
+ this.preloading = false;
65
+ }
66
+ _createPreloadBW() {
67
+ return new Promise((resolve) => {
68
+ const preload = this.preload;
69
+ const url = this.preloadWebContentsUrl;
70
+ const instance = new electron.BrowserWindow({
71
+ show: false,
72
+ webPreferences: {
73
+ webviewTag: true,
74
+ plugins: true,
75
+ nodeIntegration: true,
76
+ contextIsolation: false,
77
+ backgroundThrottling: false,
78
+ webSecurity: false,
79
+ preload: preload,
80
+ }
81
+ });
82
+ try {
83
+ // @ts-ignore
84
+ instance._id = instance.webContents.id;
85
+ }
86
+ catch (error) {
87
+ log('error', '预加载 BW 设置 _id 失败', error);
88
+ }
89
+ // @ts-ignore
90
+ log('log', '创建预BW: ', instance._id);
91
+ instance.webContents.once('did-finish-load', () => {
92
+ resolve(instance);
93
+ });
94
+ instance.webContents.once('did-fail-load', () => {
95
+ resolve(instance);
96
+ });
97
+ instance.loadURL(url || 'about:blank');
98
+ });
99
+ }
100
+ _createPreloadBV() {
101
+ return new Promise((resolve) => {
102
+ const preload = this.preload;
103
+ const url = this.preloadWebContentsUrl;
104
+ const instance = new electron.BrowserView({
105
+ webPreferences: {
106
+ webviewTag: true,
107
+ plugins: true,
108
+ nodeIntegration: true,
109
+ contextIsolation: false,
110
+ // backgroundThrottling: false,
111
+ webSecurity: false,
112
+ preload: preload,
113
+ }
114
+ });
115
+ try {
116
+ // @ts-ignore
117
+ instance._id = instance.webContents.id;
118
+ }
119
+ catch (error) {
120
+ log('error', '预加载 BV 设置 _id 失败', error);
121
+ }
122
+ // @ts-ignore
123
+ log('log', '创建预BV: ', instance._id);
124
+ instance.webContents.once('did-finish-load', () => {
125
+ resolve(instance);
126
+ });
127
+ instance.webContents.once('did-fail-load', () => {
128
+ resolve(instance);
129
+ });
130
+ instance.webContents.loadURL(url || 'about:blank');
131
+ });
132
+ }
133
+ /**
134
+ * 预加载webContents
135
+ * @param url
136
+ */
137
+ preloadWebContents(url) {
138
+ this.preloadWebContentsUrl = url;
43
139
  }
44
140
  create(options) {
45
141
  let window;
142
+ const { type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, } = options;
143
+ options.type = type;
144
+ // 优先复用预创建实例
145
+ if (options.type === 'BW' && this.preloadedBW) {
146
+ const win = this.preloadedBW;
147
+ log('log', `${name} 使用 preloadedBW`, win._id);
148
+ this.preloadedBW = null;
149
+ setTimeout(() => this._createPreloadBW(), 0);
150
+ win._type = 'BW';
151
+ win._name = options.name || 'anonymous';
152
+ win._extraData = `${options?.extraData || ''}`;
153
+ win.removeAllListeners && win.removeAllListeners();
154
+ win.webContents.removeAllListeners && win.webContents.removeAllListeners();
155
+ this._applyBrowserWindowOptions(win, options);
156
+ win.loadURL(options.url);
157
+ window = win;
158
+ }
159
+ if (options.type === 'BV' && this.preloadedBV) {
160
+ const view = this.preloadedBV;
161
+ log('log', `${name} 使用 preloadedBV`, view._id);
162
+ this.preloadedBV = null;
163
+ setTimeout(() => this._createPreloadBV(), 0);
164
+ view._type = 'BV';
165
+ view._name = options.name || 'anonymous';
166
+ view._extraData = `${options?.extraData || ''}`;
167
+ view.webContents.removeAllListeners && view.webContents.removeAllListeners();
168
+ this._applyBrowserViewOptions(view, options);
169
+ view.webContents.loadURL(options.url);
170
+ window = view;
171
+ }
46
172
  try {
47
- const { type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, } = options;
48
- options.type = type;
49
173
  try {
50
174
  loadingView.url = `${loadingView?.url ?? this.loadingViewUrl}`;
51
175
  lodash.merge(options, {
@@ -76,35 +200,41 @@ class WindowsManager {
76
200
  }
77
201
  log('log', 'create 1: ', options);
78
202
  log('log', 'create 2: ', `parentWin: ${parentWin?.id}`);
79
- window = type === 'BV' ?
80
- new electron.BrowserView(lodash.merge((browserWindowOptions || {}), {
81
- parent: undefined,
82
- webPreferences: {
83
- // session: getCustomSession(),
84
- plugins: true,
85
- nodeIntegration: true,
86
- contextIsolation: false,
87
- backgroundThrottling: false,
88
- nativeWindowOpen: false,
89
- webSecurity: false,
90
- preload: browserWindowOptions?.webPreferences?.preload || this.preload,
91
- }
92
- }))
93
- : new electron.BrowserWindow(lodash.merge({
94
- acceptFirstMouse: true,
95
- }, (browserWindowOptions || {}), {
96
- parent: parentWin,
97
- webPreferences: {
98
- // session: getCustomSession(),
99
- plugins: true,
100
- nodeIntegration: true,
101
- contextIsolation: false,
102
- backgroundThrottling: false,
103
- nativeWindowOpen: false,
104
- webSecurity: false,
105
- preload: browserWindowOptions?.webPreferences?.preload || this.preload,
106
- }
107
- }));
203
+ const preload = browserWindowOptions?.webPreferences?.preload || this.preload;
204
+ if (!window) {
205
+ window = type === 'BV' ?
206
+ new electron.BrowserView(lodash.merge((browserWindowOptions || {}), {
207
+ webPreferences: lodash.merge({
208
+ webviewTag: true,
209
+ // session: getCustomSession(),
210
+ plugins: true,
211
+ nodeIntegration: true,
212
+ contextIsolation: false,
213
+ // fix bv二次挂载会灰屏
214
+ // backgroundThrottling: false,
215
+ nativeWindowOpen: false,
216
+ webSecurity: false,
217
+ preload: preload,
218
+ }, browserWindowOptions?.webPreferences || {})
219
+ }))
220
+ : new electron.BrowserWindow(lodash.merge({
221
+ acceptFirstMouse: true,
222
+ }, (browserWindowOptions || {}), {
223
+ parent: parentWin,
224
+ webPreferences: lodash.merge({
225
+ webviewTag: true,
226
+ // session: getCustomSession(),
227
+ plugins: true,
228
+ nodeIntegration: true,
229
+ contextIsolation: false,
230
+ backgroundThrottling: false,
231
+ nativeWindowOpen: false,
232
+ webSecurity: false,
233
+ preload: preload,
234
+ }, browserWindowOptions?.webPreferences || {})
235
+ }));
236
+ log('log', `${name} 不使用 ${type === 'BV' ? 'preloadedBV' : 'preloadedBW'}`, window?.webContents?.id);
237
+ }
108
238
  try {
109
239
  remote__namespace.enable(window.webContents);
110
240
  }
@@ -152,8 +282,11 @@ class WindowsManager {
152
282
  `);
153
283
  }
154
284
  }, 300);
155
- window.webContents.on('did-fail-load', () => {
156
- showErrorView();
285
+ // @ts-ignore
286
+ window.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame) => {
287
+ if (isMainFrame) {
288
+ showErrorView();
289
+ }
157
290
  });
158
291
  window.webContents.on('did-start-loading', () => {
159
292
  showErrorView.cancel();
@@ -171,6 +304,10 @@ class WindowsManager {
171
304
  }
172
305
  });
173
306
  if (type === 'BW') {
307
+ // @ts-ignore
308
+ if (options.browserWindow?.show !== false) {
309
+ window.show();
310
+ }
174
311
  // @ts-ignore
175
312
  window.on('closed', () => {
176
313
  log('log', 'closed', window.id, window._name);
@@ -187,6 +324,31 @@ class WindowsManager {
187
324
  window.focus ? window.focus() : window.webContents.focus();
188
325
  this.windows.set(window.id || window._id || window.webContents.id, window);
189
326
  log('log', 'create', this.windows.keys());
327
+ const initVal = () => {
328
+ window.webContents.executeJavaScript(`
329
+ try {
330
+ const data = {
331
+ __ELECTRON_WINDOW_MANAGER_WEB_CONTENTS_ID__: ${JSON.stringify(window.webContents.id)},
332
+ __ELECTRON_WINDOW_MANAGER_TYPE__: ${JSON.stringify(window._type)},
333
+ __ELECTRON_WINDOW_MANAGER_NAME__: ${JSON.stringify(window._name)},
334
+ __ELECTRON_WINDOW_MANAGER_EXTRA_DATA__: ${JSON.stringify(window._extraData || '')},
335
+ __ELECTRON_WINDOW_MANAGER_PRELOAD__: ${JSON.stringify(preload)}
336
+ };
337
+ Object.entries(data).forEach(([key, value]) => {
338
+ Object.defineProperty(window, key, {
339
+ value,
340
+ writable: false,
341
+ configurable: false,
342
+ enumerable: true
343
+ });
344
+ });
345
+ } catch (error) {}
346
+ `);
347
+ };
348
+ // 初始化值
349
+ window.webContents.on('did-finish-load', () => {
350
+ initVal();
351
+ });
190
352
  }
191
353
  catch (error) {
192
354
  log('error', 'create', error);
@@ -300,7 +462,6 @@ class WindowsManager {
300
462
  const bwWindows = new Map();
301
463
  const bvWindows = new Map();
302
464
  this.windows.forEach((win, key) => {
303
- log('log', 'getAll', key, win, win?.webContents?.isDestroyed, win?.webContents?.isDestroyed?.());
304
465
  if (!(win && win?.webContents?.isDestroyed && !win?.webContents?.isDestroyed?.())) {
305
466
  this.windows.delete(key);
306
467
  }
@@ -385,11 +546,45 @@ class WindowsManager {
385
546
  log('log', 'getPreload');
386
547
  return this.preload;
387
548
  }
549
+ _applyBrowserWindowOptions(win, options) {
550
+ const browserWindowOptions = options.browserWindow || {};
551
+ // 设置父窗口
552
+ if (typeof browserWindowOptions.parent === 'number') {
553
+ const parentWin = electron.BrowserWindow.fromId(browserWindowOptions.parent);
554
+ if (parentWin) {
555
+ win.setParentWindow(parentWin);
556
+ }
557
+ }
558
+ // 设置窗口大小
559
+ if (typeof browserWindowOptions.width === 'number' && typeof browserWindowOptions.height === 'number') {
560
+ win.setBounds({ width: browserWindowOptions.width, height: browserWindowOptions.height });
561
+ }
562
+ // 置顶
563
+ if (typeof browserWindowOptions.alwaysOnTop === 'boolean') {
564
+ win.setAlwaysOnTop(browserWindowOptions.alwaysOnTop);
565
+ }
566
+ // 可继续扩展其他动态属性
567
+ }
568
+ _applyBrowserViewOptions(view, options) {
569
+ const browserWindowOptions = options.browserWindow || {};
570
+ let parentWin;
571
+ if (typeof browserWindowOptions.parent === 'number') {
572
+ parentWin = electron.BrowserWindow.fromId(browserWindowOptions.parent) || undefined;
573
+ if (parentWin) {
574
+ parentWin.addBrowserView(view);
575
+ }
576
+ }
577
+ // 设置视图大小
578
+ if (typeof browserWindowOptions.width === 'number' && typeof browserWindowOptions.height === 'number') {
579
+ view.setBounds({ x: 0, y: 0, width: browserWindowOptions.width, height: browserWindowOptions.height });
580
+ }
581
+ // 可继续扩展其他动态属性
582
+ }
388
583
  }
389
584
  // @ts-ignore
390
585
  global['__ELECTRON_WINDOWS_MANAGER__'] = undefined;
391
586
  exports.isInitialized = false;
392
- const initialize = (preload, loadingViewUrl, errorViewUrl) => {
587
+ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl) => {
393
588
  // @ts-ignore
394
589
  if (exports.isInitialized && global['__ELECTRON_WINDOWS_MANAGER__']) {
395
590
  // @ts-ignore
@@ -397,7 +592,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl) => {
397
592
  }
398
593
  exports.isInitialized = true;
399
594
  // @ts-ignore
400
- const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl);
595
+ const wm = global['__ELECTRON_WINDOWS_MANAGER__'] = new WindowsManager(preload, loadingViewUrl, errorViewUrl, preloadWebContentsUrl);
401
596
  eIpc.mainIPC.handleRenderer('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', async (data) => {
402
597
  if (data?.type === 'create') {
403
598
  const opt = data;
@@ -492,6 +687,38 @@ const initialize = (preload, loadingViewUrl, errorViewUrl) => {
492
687
  const res = wm.getPreload();
493
688
  return res;
494
689
  }
690
+ if (data?.type === 'borrowView_getBounds') {
691
+ const opt = data;
692
+ const bv = wm.get(opt.data.webContentId);
693
+ if (bv) {
694
+ return bv.getBounds();
695
+ }
696
+ return undefined;
697
+ }
698
+ if (data?.type === 'borrowView_setBounds') {
699
+ const opt = data;
700
+ const bv = wm.get(opt.data.webContentId);
701
+ if (bv) {
702
+ bv.setBounds(opt.data.options);
703
+ }
704
+ return undefined;
705
+ }
706
+ if (data?.type === 'borrowView_setAutoResize') {
707
+ const opt = data;
708
+ const bv = wm.get(opt.data.webContentId);
709
+ if (bv) {
710
+ bv.setAutoResize(opt.data.options);
711
+ }
712
+ return undefined;
713
+ }
714
+ if (data?.type === 'borrowView_setBackgroundColor') {
715
+ const opt = data;
716
+ const bv = wm.get(opt.data.webContentId);
717
+ if (bv) {
718
+ bv.setBackgroundColor(opt.data.options);
719
+ }
720
+ return undefined;
721
+ }
495
722
  return undefined;
496
723
  });
497
724
  return wm;