@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.
- package/esm/main/index.d.ts +16 -2
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +264 -37
- package/esm/main/index.js.map +1 -1
- package/esm/renderer/index.d.ts.map +1 -1
- package/esm/renderer/index.js +36 -4
- package/esm/renderer/index.js.map +1 -1
- package/main/index.d.ts +16 -2
- package/main/index.d.ts.map +1 -1
- package/main/index.js +264 -37
- package/main/index.js.map +1 -1
- package/package.json +2 -2
- package/renderer/index.d.ts.map +1 -1
- package/renderer/index.js +36 -4
- package/renderer/index.js.map +1 -1
package/esm/renderer/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
package/main/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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;
|