@lynker-desktop/electron-window-manager 0.0.9-alpha.50 → 0.0.9-alpha.52

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.
@@ -209,31 +209,58 @@ const setWindowProperties = (window, data) => {
209
209
  }
210
210
  };
211
211
  /**
212
- * 根据窗口 ID 查找窗口实例
213
- * 优先查找 BrowserWindow,如果找不到则查找 BrowserView
212
+ * 根据 webContents ID 查找窗口实例
213
+ * 通过 webContents 查找对应的 BrowserWindow BrowserView
214
+ * 如果是 webview,则找到它的父 BrowserWindow
214
215
  *
215
- * @param winId - 窗口 ID
216
+ * @param webContentsId - webContents ID
216
217
  * @returns 窗口实例或 null
217
218
  */
218
- const findWindowById = (winId) => {
219
- if (!winId || winId <= 0) {
219
+ const findWindowById = (webContentsId) => {
220
+ if (!webContentsId || webContentsId <= 0) {
220
221
  return null;
221
222
  }
222
223
  const remote = getRemote();
223
224
  try {
224
- // 优先查找 BrowserWindow
225
- const browserWindow = remote.BrowserWindow?.fromId?.(winId);
225
+ // 首先通过 webContentsId 获取 webContents
226
+ const webContent = remote.webContents?.fromId?.(webContentsId);
227
+ if (!webContent) {
228
+ return null;
229
+ }
230
+ // Case 1: 查找 BrowserView
231
+ // 遍历所有窗口的 BrowserView,查找匹配的
232
+ const allWindows = remote.BrowserWindow?.getAllWindows?.() || [];
233
+ for (const win of allWindows) {
234
+ try {
235
+ const views = win.getBrowserViews?.() || [];
236
+ for (const view of views) {
237
+ if (view.webContents?.id === webContentsId) {
238
+ return view;
239
+ }
240
+ }
241
+ }
242
+ catch (error) {
243
+ // 忽略获取 views 失败的情况
244
+ }
245
+ }
246
+ // Case 2: WebView
247
+ // webview 有 hostWebContents,指向它所在的 BrowserWindow 的 webContents
248
+ if (webContent.hostWebContents) {
249
+ const parentWindow = remote.BrowserWindow?.fromWebContents?.(webContent.hostWebContents);
250
+ if (parentWindow) {
251
+ return parentWindow;
252
+ }
253
+ }
254
+ // Case 3: 普通 BrowserWindow 本身
255
+ const browserWindow = remote.BrowserWindow?.fromWebContents?.(webContent);
226
256
  if (browserWindow) {
227
257
  return browserWindow;
228
258
  }
229
- // 如果不是 BrowserWindow,尝试查找 BrowserView
230
- const webContent = remote.webContents?.fromId?.(winId);
231
- if (webContent) {
232
- return getBrowserViewByWebContent(webContent);
233
- }
259
+ // Case 4: 如果找不到已挂载的 BrowserView,尝试创建虚拟 BrowserView
260
+ return getBrowserViewByWebContent(webContent);
234
261
  }
235
262
  catch (error) {
236
- console.error(`查找窗口失败 [${winId}]:`, error);
263
+ console.error(`查找窗口失败 [${webContentsId}]:`, error);
237
264
  }
238
265
  return null;
239
266
  };
@@ -269,7 +296,7 @@ async function create(options) {
269
296
  const getCurrentWindow = async () => {
270
297
  const remote = getRemote();
271
298
  const currentWindow = remote.getCurrentWindow();
272
- return await get(currentWindow.id);
299
+ return await get(currentWindow?.webContents?.id);
273
300
  };
274
301
  /**
275
302
  * 根据 ID 或名称获取窗口
@@ -326,7 +353,8 @@ async function getAll(type) {
326
353
  if (window) {
327
354
  // 设置窗口属性
328
355
  setWindowProperties(window, element);
329
- const windowId = window.id || window._id;
356
+ // 统一使用 webContents.id 作为键
357
+ const windowId = window.webContents?.id || element.winId;
330
358
  allWindows.set(windowId, window);
331
359
  // 按类型分类
332
360
  if (window._type === 'BW') {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/**\n * Electron 窗口管理器 - 渲染进程模块\n * 提供窗口创建、管理、查询等功能\n *\n * @author Lynker Desktop Team\n * @version 1.0.0\n */\n\nimport type { BrowserView, IpcRenderer, WebContents } from 'electron'\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions, PreloadWebContentsConfig } from '../common';\n\n// ==================== 工具函数 ====================\n\n/**\n * 窗口数据类型定义\n */\ninterface WindowData {\n winId: number;\n winName: string;\n winType?: string;\n winExtraData?: string;\n winInitUrl?: string;\n winZIndex?: number;\n}\n\n/**\n * 通用获取函数:从全局变量或 require 获取模块\n * @param globalKey 全局对象中的键名\n * @param requirePath require 路径\n * @param errorMessage 错误提示信息\n * @returns 获取到的模块或空对象\n */\nconst getModule = <T>(\n globalKey: string,\n requirePath: string,\n errorMessage: string\n): T => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalValue = (window as any)?.__ELECTRON_WINDOW_MANAGER__?.[globalKey];\n if (globalValue) {\n return globalValue;\n }\n\n // 回退到 require 方式\n return window?.require?.(requirePath);\n } catch (error) {\n console.error(errorMessage, error);\n return {} as T;\n }\n};\n\n/**\n * 获取 IPC 渲染器实例\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns IpcRenderer 实例或空对象\n */\nconst getIpc = (): IpcRenderer => {\n return getModule<IpcRenderer>(\n 'ipcRenderer',\n 'electron',\n '当前非桌面端环境, 请在桌面端中调用'\n );\n};\n\n/**\n * 获取 Electron Remote 模块\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns RemoteType 实例或空对象\n */\nconst getRemote = (): typeof RemoteType => {\n return getModule<typeof RemoteType>(\n 'remote',\n '@electron/remote',\n '获取 Remote 模块失败'\n );\n}\n\n/**\n * 获取所有窗口的 BrowserView 列表\n * 遍历所有窗口并收集其 BrowserView(带缓存优化)\n *\n * @param forceRefresh 是否强制刷新缓存\n * @returns BrowserView 数组\n */\nconst getAllBrowserViews = (() => {\n let cachedViews: BrowserView[] | null = null;\n let cacheTime = 0;\n const CACHE_DURATION = 100; // 缓存 100ms\n\n return (forceRefresh = false): BrowserView[] => {\n const now = Date.now();\n if (!forceRefresh && cachedViews && (now - cacheTime < CACHE_DURATION)) {\n return cachedViews;\n }\n\n const remote = getRemote();\n try {\n const allWindows = remote.BrowserWindow?.getAllWindows?.() || [];\n const allBrowserViews: BrowserView[] = [];\n\n allWindows.forEach(window => {\n try {\n const views = window.getBrowserViews?.() || [];\n allBrowserViews.push(...views);\n } catch (error) {\n // 忽略获取 views 失败的情况\n }\n });\n\n cachedViews = allBrowserViews;\n cacheTime = now;\n return allBrowserViews;\n } catch (error) {\n console.error('获取 BrowserView 列表失败:', error);\n return cachedViews || [];\n }\n };\n})();\n\n/**\n * 通过 WebContents 查找对应的 BrowserView\n * 如果找不到已挂载的 BrowserView,则创建虚拟的 BrowserView 对象\n *\n * @param webContent - WebContents 实例\n * @returns BVItem 实例或 null\n */\nconst getBrowserViewByWebContent = (webContent: WebContents | null | undefined): BVItem | null => {\n if (!webContent) {\n return null;\n }\n\n try {\n // 检查 webContents 是否已销毁\n if (webContent.isDestroyed?.()) {\n return null;\n }\n\n // 查找已挂载的 BrowserView\n const allBrowserViews = getAllBrowserViews();\n const existingView = allBrowserViews.find(view => view.webContents === webContent) as BVItem | undefined;\n\n if (existingView) {\n return existingView;\n }\n\n // 如果 WebContents 存在但未挂载到窗口,创建虚拟 BrowserView\n return createVirtualBrowserView(webContent);\n } catch (error) {\n console.error('获取 BrowserView 失败:', error);\n return null;\n }\n}\n\n/**\n * 统一的 IPC 调用封装\n * @param type IPC 消息类型\n * @param data IPC 消息数据\n * @returns Promise<T> IPC 调用结果\n */\nconst invokeIpc = async <T = any>(type: string, data: any): Promise<T> => {\n try {\n const ipc = getIpc();\n if (!ipc || !ipc.invoke) {\n throw new Error('IPC 不可用');\n }\n return await ipc.invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type, data });\n } catch (error) {\n console.error(`IPC 调用失败 [${type}]:`, error);\n throw error;\n }\n};\n\n/**\n * 创建虚拟的 BrowserView 对象\n * 用于处理未挂载到窗口的 WebContents\n *\n * @param webContent - WebContents 实例\n * @returns 虚拟的 BVItem 对象\n */\nconst createVirtualBrowserView = (webContent: WebContents): BVItem => {\n const webContentId = webContent.id;\n\n const virtualView = {\n id: webContentId,\n _id: webContentId,\n _type: 'BV' as const,\n _name: '',\n _extraData: '',\n webContents: webContent,\n\n // 代理方法,通过 IPC 调用主进程\n getBounds: async () => {\n return invokeIpc('borrowView_getBounds', {\n webContentId,\n options: {}\n });\n },\n\n setBounds: async (bounds: { x: number; y: number; width: number; height: number }) => {\n return invokeIpc('borrowView_setBounds', {\n webContentId,\n options: bounds\n });\n },\n\n setAutoResize: async (autoResize: { width: boolean; height: boolean; horizontal: boolean; vertical: boolean }) => {\n return invokeIpc('borrowView_setAutoResize', {\n webContentId,\n options: autoResize\n });\n },\n\n setBackgroundColor: async (color: string) => {\n return invokeIpc('borrowView_setBackgroundColor', {\n webContentId,\n options: color\n });\n },\n } as unknown as BVItem;\n\n return virtualView;\n}\n\n/**\n * 为窗口对象设置扩展属性\n *\n * @param window - 窗口对象\n * @param data - 窗口数据\n */\nconst setWindowProperties = (\n window: BWItem | BVItem | null | undefined,\n data: WindowData\n): void => {\n if (!window || !data) return;\n\n try {\n window._name = data.winName || '';\n window._type = (data.winType as 'BW' | 'BV') || '';\n window._extraData = data.winExtraData || '';\n window._initUrl = data.winInitUrl || '';\n window._zIndex = data.winZIndex ?? 0;\n\n // 尝试设置 ID\n if (data.winId) {\n try {\n (window as any).id = Number(data.winId);\n } catch (error) {\n // 忽略设置 ID 失败的情况\n }\n }\n } catch (error) {\n console.error('设置窗口属性失败:', error);\n }\n}\n\n/**\n * 根据窗口 ID 查找窗口实例\n * 优先查找 BrowserWindow,如果找不到则查找 BrowserView\n *\n * @param winId - 窗口 ID\n * @returns 窗口实例或 null\n */\nconst findWindowById = (winId: number): BWItem | BVItem | null => {\n if (!winId || winId <= 0) {\n return null;\n }\n\n const remote = getRemote();\n\n try {\n // 优先查找 BrowserWindow\n const browserWindow = remote.BrowserWindow?.fromId?.(winId) as BWItem | null;\n if (browserWindow) {\n return browserWindow;\n }\n\n // 如果不是 BrowserWindow,尝试查找 BrowserView\n const webContent = remote.webContents?.fromId?.(winId);\n if (webContent) {\n return getBrowserViewByWebContent(webContent);\n }\n } catch (error) {\n console.error(`查找窗口失败 [${winId}]:`, error);\n }\n\n return null;\n}\n\n// ==================== 核心 API ====================\n\n/**\n * 创建窗口\n * 支持创建 BrowserWindow 和 BrowserView\n *\n * @param options - 窗口创建选项\n * @returns Promise<BWItem | BVItem> 创建的窗口实例\n *\n * @example\n * ```typescript\n * // 创建 BrowserWindow\n * const window = await create({\n * type: 'BW',\n * name: 'main-window',\n * url: 'https://example.com'\n * });\n *\n * // 创建 BrowserView\n * const view = await create({\n * type: 'BV',\n * name: 'sidebar-view',\n * url: 'https://example.com/sidebar'\n * });\n * ```\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 try {\n // 通过 IPC 调用主进程创建窗口\n const data = await eIpc.RendererIPC.invokeMain(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'create',\n data: options\n }\n ) as WindowData;\n\n if (!data?.winId) {\n throw new Error('创建窗口失败: 未返回有效的窗口 ID');\n }\n\n // 查找窗口实例\n const window = findWindowById(data.winId);\n\n if (!window) {\n throw new Error(`创建窗口失败: 无法找到窗口实例 [${data.winId}]`);\n }\n\n // 设置窗口属性\n setWindowProperties(window, data);\n\n return window;\n } catch (error) {\n console.error('创建窗口失败:', error);\n throw error;\n }\n}\n\n/**\n * 获取当前窗口实例\n *\n * @returns Promise<BWItem | BVItem | undefined> 当前窗口实例\n */\nexport const getCurrentWindow = async (): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n const currentWindow = remote.getCurrentWindow();\n return await get(currentWindow.id);\n}\n\n/**\n * 根据 ID 或名称获取窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n *\n * @example\n * ```typescript\n * // 通过 ID 获取\n * const window = await get(1);\n *\n * // 通过名称获取\n * const window = await get('main-window');\n * ```\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n try {\n // 通过 IPC 获取窗口信息\n const data = await invokeIpc<WindowData>('get', idOrName);\n\n if (!data?.winId) {\n return undefined;\n }\n\n // 查找窗口实例\n const window = findWindowById(data.winId);\n\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window || undefined;\n } catch (error) {\n console.error('获取窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 获取所有窗口\n * 支持按类型过滤\n *\n * @param type - 窗口类型过滤 ('BW' | 'BV')\n * @returns Promise<Map<number, BWItem | BVItem>> 窗口映射表\n *\n * @example\n * ```typescript\n * // 获取所有窗口\n * const allWindows = await getAll();\n *\n * // 只获取 BrowserWindow\n * const browserWindows = await getAll('BW');\n *\n * // 只获取 BrowserView\n * const browserViews = await getAll('BV');\n * ```\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 try {\n // 通过 IPC 获取所有窗口信息\n const windowData = await invokeIpc<Record<string, WindowData>>('getAll', undefined);\n\n if (!windowData || typeof windowData !== 'object') {\n return new Map();\n }\n\n const allWindows = new Map<number, BWItem | BVItem>();\n const browserWindows = new Map<number, BWItem>();\n const browserViews = new Map<number, BVItem>();\n\n // 遍历窗口数据\n for (const key in windowData) {\n const element = windowData[key];\n if (!element?.winId) {\n continue;\n }\n\n // 查找窗口实例\n const window = findWindowById(element.winId);\n\n if (window) {\n // 设置窗口属性\n setWindowProperties(window, element);\n\n const windowId = window.id || window._id;\n allWindows.set(windowId, window);\n\n // 按类型分类\n if (window._type === 'BW') {\n browserWindows.set(windowId, window as BWItem);\n } else if (window._type === 'BV') {\n browserViews.set(windowId, window as BVItem);\n }\n }\n }\n\n // 根据类型返回对应的映射表\n if (type === 'BW') {\n return browserWindows;\n }\n if (type === 'BV') {\n return browserViews;\n }\n\n return allWindows;\n } catch (error) {\n console.error('获取所有窗口失败:', error);\n return new Map();\n }\n}\n\n/**\n * 关闭指定窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<boolean> 操作是否成功\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n try {\n await invokeIpc('close', idOrName);\n return true;\n } catch (error) {\n console.error('关闭窗口失败:', error);\n return false;\n }\n}\n\n/**\n * 关闭所有窗口\n *\n * @returns Promise<boolean> 操作是否成功\n */\nexport const closeAll = async (): Promise<boolean> => {\n try {\n await invokeIpc('closeAll', undefined);\n return true;\n } catch (error) {\n console.error('关闭所有窗口失败:', error);\n return false;\n }\n}\n\n/**\n * 根据 WebContents ID 查找对应的窗口\n *\n * @param webContentId - WebContents ID\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n */\nexport const getWindowForWebContentsId = async (webContentId: number): Promise<BWItem | BVItem | undefined> => {\n try {\n const winId = await invokeIpc<number>('getWindowForWebContentsId', webContentId);\n if (!winId) {\n return undefined;\n }\n return get(winId);\n } catch (error) {\n console.error('根据 WebContents ID 查找窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 重命名窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @param newName - 新名称\n * @returns Promise<BWItem | BVItem | undefined> 重命名后的窗口实例\n */\nexport const rename = async (idOrName: string | number, newName: string): Promise<BWItem | BVItem | undefined> => {\n try {\n const data = await invokeIpc<WindowData>('rename', { idOrName, newName });\n if (!data?.winId) {\n return undefined;\n }\n return get(data.winId);\n } catch (error) {\n console.error('重命名窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 重置窗口初始化URL\n *\n * @param idOrName - 窗口 ID 或名称\n * @param url - 新URL\n * @returns Promise<BWItem | BVItem | undefined> 重置后的窗口实例\n */\nexport const reInitUrl = async (idOrName: string | number, url: string): Promise<BWItem | BVItem | undefined> => {\n try {\n const data = await invokeIpc<WindowData>('reInitUrl', { idOrName, url });\n if (!data?.winId) {\n return undefined;\n }\n return get(data.winId);\n } catch (error) {\n console.error('重置窗口 URL 失败:', error);\n return undefined;\n }\n}\n\n/**\n * 设置预加载 WebContents 配置\n *\n * @param preloadWebContentsConfig - 预加载配置\n */\nexport const setPreloadWebContentsConfig = async (preloadWebContentsConfig: PreloadWebContentsConfig): Promise<void> => {\n try {\n await invokeIpc('setPreloadWebContentsConfig', preloadWebContentsConfig);\n } catch (error) {\n console.error('设置预加载配置失败:', error);\n throw error;\n }\n}\n\n/**\n * 获取预加载脚本路径\n * 使用缓存机制避免重复请求\n *\n * @returns Promise<string | undefined> 预加载脚本路径\n */\nexport const getPreload = (() => {\n let cachedPreload: string | undefined | null = null;\n let isLoading = false;\n let loadPromise: Promise<string | undefined> | null = null;\n\n return async (): Promise<string | undefined> => {\n // 如果已有缓存,直接返回\n if (cachedPreload !== null) {\n return cachedPreload;\n }\n\n // 如果正在加载,返回同一个 Promise\n if (isLoading && loadPromise) {\n return loadPromise;\n }\n\n // 开始加载\n isLoading = true;\n loadPromise = (async () => {\n try {\n // 通过 IPC 获取预加载脚本路径\n const data = await invokeIpc<string | undefined>('getPreload', undefined);\n\n // 缓存结果(即使是 undefined 也缓存,避免重复请求)\n cachedPreload = data;\n return data;\n } catch (error) {\n console.error('获取预加载脚本路径失败:', error);\n // 失败时也缓存 null,避免重复请求\n cachedPreload = undefined;\n return undefined;\n } finally {\n isLoading = false;\n loadPromise = null;\n }\n })();\n\n return loadPromise;\n };\n})();\n\n// 初始化时异步获取预加载脚本(不阻塞)\ngetPreload().catch(() => {\n // 静默处理初始化失败\n});\n\n// ==================== 开发工具相关(已注释) ====================\n\n/*\n * 开发工具相关功能(已注释,可根据需要启用)\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 */\n"],"names":[],"mappings":";;AAAA;;;;;;AAMG;AAqBH;;;;;;AAMG;AACH,MAAM,SAAS,GAAG,CAChB,SAAiB,EACjB,WAAmB,EACnB,YAAoB,KACf;AACL,IAAA,IAAI;;QAEF,MAAM,WAAW,GAAI,MAAc,EAAE,2BAA2B,GAAG,SAAS,CAAC,CAAC;QAC9E,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,WAAW,CAAC;SACpB;;AAGD,QAAA,OAAO,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC;KACvC;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACnC,QAAA,OAAO,EAAO,CAAC;KAChB;AACH,CAAC,CAAC;AAEF;;;;;AAKG;AACH,MAAM,MAAM,GAAG,MAAkB;IAC/B,OAAO,SAAS,CACd,aAAa,EACb,UAAU,EACV,oBAAoB,CACrB,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;AAKG;AACH,MAAM,SAAS,GAAG,MAAwB;IACxC,OAAO,SAAS,CACd,QAAQ,EACR,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;AACJ,CAAC,CAAA;AAED;;;;;;AAMG;AACH,MAAM,kBAAkB,GAAG,CAAC,MAAK;IAC/B,IAAI,WAAW,GAAyB,IAAI,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAA,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,IAAA,OAAO,CAAC,YAAY,GAAG,KAAK,KAAmB;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,IAAI,WAAW,KAAK,GAAG,GAAG,SAAS,GAAG,cAAc,CAAC,EAAE;AACtE,YAAA,OAAO,WAAW,CAAC;SACpB;AAED,QAAA,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;YACjE,MAAM,eAAe,GAAkB,EAAE,CAAC;AAE1C,YAAA,UAAU,CAAC,OAAO,CAAC,MAAM,IAAG;AAC1B,gBAAA,IAAI;oBACF,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;AAC/C,oBAAA,eAAe,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;iBAChC;gBAAC,OAAO,KAAK,EAAE;;iBAEf;AACH,aAAC,CAAC,CAAC;YAEH,WAAW,GAAG,eAAe,CAAC;YAC9B,SAAS,GAAG,GAAG,CAAC;AAChB,YAAA,OAAO,eAAe,CAAC;SACxB;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,WAAW,IAAI,EAAE,CAAC;SAC1B;AACH,KAAC,CAAC;AACJ,CAAC,GAAG,CAAC;AAEL;;;;;;AAMG;AACH,MAAM,0BAA0B,GAAG,CAAC,UAA0C,KAAmB;IAC/F,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,IAAI;;AAEF,QAAA,IAAI,UAAU,CAAC,WAAW,IAAI,EAAE;AAC9B,YAAA,OAAO,IAAI,CAAC;SACb;;AAGD,QAAA,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;AAC7C,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,CAAuB,CAAC;QAEzG,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,YAAY,CAAC;SACrB;;AAGD,QAAA,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;KAC7C;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AAC3C,QAAA,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAA;AAED;;;;;AAKG;AACH,MAAM,SAAS,GAAG,OAAgB,IAAY,EAAE,IAAS,KAAgB;AACvE,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5B;AACD,QAAA,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,yCAAyC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KACpF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,CAAA,UAAA,EAAa,IAAI,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC,CAAC;AAC5C,QAAA,MAAM,KAAK,CAAC;KACb;AACH,CAAC,CAAC;AAEF;;;;;;AAMG;AACH,MAAM,wBAAwB,GAAG,CAAC,UAAuB,KAAY;AACnE,IAAA,MAAM,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC;AAEnC,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,EAAE,EAAE,YAAY;AAChB,QAAA,GAAG,EAAE,YAAY;AACjB,QAAA,KAAK,EAAE,IAAa;AACpB,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,WAAW,EAAE,UAAU;;QAGvB,SAAS,EAAE,YAAW;YACpB,OAAO,SAAS,CAAC,sBAAsB,EAAE;gBACvC,YAAY;AACZ,gBAAA,OAAO,EAAE,EAAE;AACZ,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,SAAS,EAAE,OAAO,MAA+D,KAAI;YACnF,OAAO,SAAS,CAAC,sBAAsB,EAAE;gBACvC,YAAY;AACZ,gBAAA,OAAO,EAAE,MAAM;AAChB,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,aAAa,EAAE,OAAO,UAAuF,KAAI;YAC/G,OAAO,SAAS,CAAC,0BAA0B,EAAE;gBAC3C,YAAY;AACZ,gBAAA,OAAO,EAAE,UAAU;AACpB,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,kBAAkB,EAAE,OAAO,KAAa,KAAI;YAC1C,OAAO,SAAS,CAAC,+BAA+B,EAAE;gBAChD,YAAY;AACZ,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA,CAAC,CAAC;SACJ;KACmB,CAAC;AAEvB,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC,CAAA;AAED;;;;;AAKG;AACH,MAAM,mBAAmB,GAAG,CAC1B,MAA0C,EAC1C,IAAgB,KACR;AACR,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO;AAE7B,IAAA,IAAI;QACF,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,GAAI,IAAI,CAAC,OAAuB,IAAI,EAAE,CAAC;QACnD,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;;AAGrC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI;gBACD,MAAc,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzC;YAAC,OAAO,KAAK,EAAE;;aAEf;SACF;KACF;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;KACnC;AACH,CAAC,CAAA;AAED;;;;;;AAMG;AACH,MAAM,cAAc,GAAG,CAAC,KAAa,KAA4B;AAC/D,IAAA,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE;AACxB,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAE3B,IAAA,IAAI;;QAEF,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,KAAK,CAAkB,CAAC;QAC7E,IAAI,aAAa,EAAE;AACjB,YAAA,OAAO,aAAa,CAAC;SACtB;;QAGD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;QACvD,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,0BAA0B,CAAC,UAAU,CAAC,CAAC;SAC/C;KACF;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,CAAA,QAAA,EAAW,KAAK,CAAI,EAAA,CAAA,EAAE,KAAK,CAAC,CAAC;KAC5C;AAED,IAAA,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAgCM,eAAe,MAAM,CAAC,OAAsC,EAAA;AACjE,IAAA,IAAI;;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAC5C,yCAAyC,EACzC;AACE,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,IAAI,EAAE,OAAO;AACd,SAAA,CACY,CAAC;AAEhB,QAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;SACxC;;QAGD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAC,KAAK,CAAG,CAAA,CAAA,CAAC,CAAC;SACrD;;AAGD,QAAA,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAElC,QAAA,OAAO,MAAM,CAAC;KACf;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChC,QAAA,MAAM,KAAK,CAAC;KACb;AACH,CAAC;AAED;;;;AAIG;AACU,MAAA,gBAAgB,GAAG,YAAiD;AAC/E,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAChD,IAAA,OAAO,MAAM,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACrC,EAAC;AAED;;;;;;;;;;;;;;AAcG;MACU,GAAG,GAAG,OAAO,QAAyB,KAA0C;AAC3F,IAAA,IAAI;;QAEF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,KAAK,EAAE,QAAQ,CAAC,CAAC;AAE1D,QAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;AAChB,YAAA,OAAO,SAAS,CAAC;SAClB;;QAGD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,MAAM,EAAE;AACV,YAAA,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;SACnC;QAED,OAAO,MAAM,IAAI,SAAS,CAAC;KAC5B;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChC,QAAA,OAAO,SAAS,CAAC;KAClB;AACH,EAAC;AAyBM,eAAe,MAAM,CAAC,IAAkB,EAAA;AAC7C,IAAA,IAAI;;QAEF,MAAM,UAAU,GAAG,MAAM,SAAS,CAA6B,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEpF,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YACjD,OAAO,IAAI,GAAG,EAAE,CAAC;SAClB;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;AACtD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;AACjD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;;AAG/C,QAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;AAChC,YAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;gBACnB,SAAS;aACV;;YAGD,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAE7C,IAAI,MAAM,EAAE;;AAEV,gBAAA,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC;AACzC,gBAAA,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;AAGjC,gBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AACzB,oBAAA,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAgB,CAAC,CAAC;iBAChD;AAAM,qBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AAChC,oBAAA,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAgB,CAAC,CAAC;iBAC9C;aACF;SACF;;AAGD,QAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,OAAO,cAAc,CAAC;SACvB;AACD,QAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,OAAO,YAAY,CAAC;SACrB;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClC,OAAO,IAAI,GAAG,EAAE,CAAC;KAClB;AACH,CAAC;AAED;;;;;AAKG;MACU,KAAK,GAAG,OAAO,QAAyB,KAAsB;AACzE,IAAA,IAAI;AACF,QAAA,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnC,QAAA,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChC,QAAA,OAAO,KAAK,CAAC;KACd;AACH,EAAC;AAED;;;;AAIG;AACU,MAAA,QAAQ,GAAG,YAA6B;AACnD,IAAA,IAAI;AACF,QAAA,MAAM,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACvC,QAAA,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,QAAA,OAAO,KAAK,CAAC;KACd;AACH,EAAC;AAED;;;;;AAKG;MACU,yBAAyB,GAAG,OAAO,YAAoB,KAA0C;AAC5G,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAS,2BAA2B,EAAE,YAAY,CAAC,CAAC;QACjF,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS,CAAC;SAClB;AACD,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;KACnB;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;AAClD,QAAA,OAAO,SAAS,CAAC;KAClB;AACH,EAAC;AAED;;;;;;AAMG;AACU,MAAA,MAAM,GAAG,OAAO,QAAyB,EAAE,OAAe,KAA0C;AAC/G,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;AAChB,YAAA,OAAO,SAAS,CAAC;SAClB;AACD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACxB;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACjC,QAAA,OAAO,SAAS,CAAC;KAClB;AACH,EAAC;AAED;;;;;;AAMG;AACU,MAAA,SAAS,GAAG,OAAO,QAAyB,EAAE,GAAW,KAA0C;AAC9G,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,WAAW,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;AAChB,YAAA,OAAO,SAAS,CAAC;SAClB;AACD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACxB;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACrC,QAAA,OAAO,SAAS,CAAC;KAClB;AACH,EAAC;AAED;;;;AAIG;MACU,2BAA2B,GAAG,OAAO,wBAAkD,KAAmB;AACrH,IAAA,IAAI;AACF,QAAA,MAAM,SAAS,CAAC,6BAA6B,EAAE,wBAAwB,CAAC,CAAC;KAC1E;IAAC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACnC,QAAA,MAAM,KAAK,CAAC;KACb;AACH,EAAC;AAED;;;;;AAKG;AACU,MAAA,UAAU,GAAG,CAAC,MAAK;IAC9B,IAAI,aAAa,GAA8B,IAAI,CAAC;IACpD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,WAAW,GAAuC,IAAI,CAAC;IAE3D,OAAO,YAAwC;;AAE7C,QAAA,IAAI,aAAa,KAAK,IAAI,EAAE;AAC1B,YAAA,OAAO,aAAa,CAAC;SACtB;;AAGD,QAAA,IAAI,SAAS,IAAI,WAAW,EAAE;AAC5B,YAAA,OAAO,WAAW,CAAC;SACpB;;QAGD,SAAS,GAAG,IAAI,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,YAAW;AACxB,YAAA,IAAI;;gBAEF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAqB,YAAY,EAAE,SAAS,CAAC,CAAC;;gBAG1E,aAAa,GAAG,IAAI,CAAC;AACrB,gBAAA,OAAO,IAAI,CAAC;aACb;YAAC,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;;gBAErC,aAAa,GAAG,SAAS,CAAC;AAC1B,gBAAA,OAAO,SAAS,CAAC;aAClB;oBAAS;gBACR,SAAS,GAAG,KAAK,CAAC;gBAClB,WAAW,GAAG,IAAI,CAAC;aACpB;SACF,GAAG,CAAC;AAEL,QAAA,OAAO,WAAW,CAAC;AACrB,KAAC,CAAC;AACJ,CAAC,IAAI;AAEL;AACA,UAAU,EAAE,CAAC,KAAK,CAAC,MAAK;;AAExB,CAAC,CAAC,CAAC;AAEH;AAEA;;;;;;;;;;;;;;;;AAgBG;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/**\n * Electron 窗口管理器 - 渲染进程模块\n * 提供窗口创建、管理、查询等功能\n *\n * @author Lynker Desktop Team\n * @version 1.0.0\n */\n\nimport type { BrowserView, IpcRenderer, WebContents } from 'electron'\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions, PreloadWebContentsConfig } from '../common';\n\n// ==================== 工具函数 ====================\n\n/**\n * 窗口数据类型定义\n */\ninterface WindowData {\n winId: number;\n winName: string;\n winType?: string;\n winExtraData?: string;\n winInitUrl?: string;\n winZIndex?: number;\n}\n\n/**\n * 通用获取函数:从全局变量或 require 获取模块\n * @param globalKey 全局对象中的键名\n * @param requirePath require 路径\n * @param errorMessage 错误提示信息\n * @returns 获取到的模块或空对象\n */\nconst getModule = <T>(\n globalKey: string,\n requirePath: string,\n errorMessage: string\n): T => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalValue = (window as any)?.__ELECTRON_WINDOW_MANAGER__?.[globalKey];\n if (globalValue) {\n return globalValue;\n }\n\n // 回退到 require 方式\n return window?.require?.(requirePath);\n } catch (error) {\n console.error(errorMessage, error);\n return {} as T;\n }\n};\n\n/**\n * 获取 IPC 渲染器实例\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns IpcRenderer 实例或空对象\n */\nconst getIpc = (): IpcRenderer => {\n return getModule<IpcRenderer>(\n 'ipcRenderer',\n 'electron',\n '当前非桌面端环境, 请在桌面端中调用'\n );\n};\n\n/**\n * 获取 Electron Remote 模块\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns RemoteType 实例或空对象\n */\nconst getRemote = (): typeof RemoteType => {\n return getModule<typeof RemoteType>(\n 'remote',\n '@electron/remote',\n '获取 Remote 模块失败'\n );\n}\n\n/**\n * 获取所有窗口的 BrowserView 列表\n * 遍历所有窗口并收集其 BrowserView(带缓存优化)\n *\n * @param forceRefresh 是否强制刷新缓存\n * @returns BrowserView 数组\n */\nconst getAllBrowserViews = (() => {\n let cachedViews: BrowserView[] | null = null;\n let cacheTime = 0;\n const CACHE_DURATION = 100; // 缓存 100ms\n\n return (forceRefresh = false): BrowserView[] => {\n const now = Date.now();\n if (!forceRefresh && cachedViews && (now - cacheTime < CACHE_DURATION)) {\n return cachedViews;\n }\n\n const remote = getRemote();\n try {\n const allWindows = remote.BrowserWindow?.getAllWindows?.() || [];\n const allBrowserViews: BrowserView[] = [];\n\n allWindows.forEach(window => {\n try {\n const views = window.getBrowserViews?.() || [];\n allBrowserViews.push(...views);\n } catch (error) {\n // 忽略获取 views 失败的情况\n }\n });\n\n cachedViews = allBrowserViews;\n cacheTime = now;\n return allBrowserViews;\n } catch (error) {\n console.error('获取 BrowserView 列表失败:', error);\n return cachedViews || [];\n }\n };\n})();\n\n/**\n * 通过 WebContents 查找对应的 BrowserView\n * 如果找不到已挂载的 BrowserView,则创建虚拟的 BrowserView 对象\n *\n * @param webContent - WebContents 实例\n * @returns BVItem 实例或 null\n */\nconst getBrowserViewByWebContent = (webContent: WebContents | null | undefined): BVItem | null => {\n if (!webContent) {\n return null;\n }\n\n try {\n // 检查 webContents 是否已销毁\n if (webContent.isDestroyed?.()) {\n return null;\n }\n\n // 查找已挂载的 BrowserView\n const allBrowserViews = getAllBrowserViews();\n const existingView = allBrowserViews.find(view => view.webContents === webContent) as BVItem | undefined;\n\n if (existingView) {\n return existingView;\n }\n\n // 如果 WebContents 存在但未挂载到窗口,创建虚拟 BrowserView\n return createVirtualBrowserView(webContent);\n } catch (error) {\n console.error('获取 BrowserView 失败:', error);\n return null;\n }\n}\n\n/**\n * 统一的 IPC 调用封装\n * @param type IPC 消息类型\n * @param data IPC 消息数据\n * @returns Promise<T> IPC 调用结果\n */\nconst invokeIpc = async <T = any>(type: string, data: any): Promise<T> => {\n try {\n const ipc = getIpc();\n if (!ipc || !ipc.invoke) {\n throw new Error('IPC 不可用');\n }\n return await ipc.invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type, data });\n } catch (error) {\n console.error(`IPC 调用失败 [${type}]:`, error);\n throw error;\n }\n};\n\n/**\n * 创建虚拟的 BrowserView 对象\n * 用于处理未挂载到窗口的 WebContents\n *\n * @param webContent - WebContents 实例\n * @returns 虚拟的 BVItem 对象\n */\nconst createVirtualBrowserView = (webContent: WebContents): BVItem => {\n const webContentId = webContent.id;\n\n const virtualView = {\n id: webContentId,\n _id: webContentId,\n _type: 'BV' as const,\n _name: '',\n _extraData: '',\n webContents: webContent,\n\n // 代理方法,通过 IPC 调用主进程\n getBounds: async () => {\n return invokeIpc('borrowView_getBounds', {\n webContentId,\n options: {}\n });\n },\n\n setBounds: async (bounds: { x: number; y: number; width: number; height: number }) => {\n return invokeIpc('borrowView_setBounds', {\n webContentId,\n options: bounds\n });\n },\n\n setAutoResize: async (autoResize: { width: boolean; height: boolean; horizontal: boolean; vertical: boolean }) => {\n return invokeIpc('borrowView_setAutoResize', {\n webContentId,\n options: autoResize\n });\n },\n\n setBackgroundColor: async (color: string) => {\n return invokeIpc('borrowView_setBackgroundColor', {\n webContentId,\n options: color\n });\n },\n } as unknown as BVItem;\n\n return virtualView;\n}\n\n/**\n * 为窗口对象设置扩展属性\n *\n * @param window - 窗口对象\n * @param data - 窗口数据\n */\nconst setWindowProperties = (\n window: BWItem | BVItem | null | undefined,\n data: WindowData\n): void => {\n if (!window || !data) return;\n\n try {\n window._name = data.winName || '';\n window._type = (data.winType as 'BW' | 'BV') || '';\n window._extraData = data.winExtraData || '';\n window._initUrl = data.winInitUrl || '';\n window._zIndex = data.winZIndex ?? 0;\n\n // 尝试设置 ID\n if (data.winId) {\n try {\n (window as any).id = Number(data.winId);\n } catch (error) {\n // 忽略设置 ID 失败的情况\n }\n }\n } catch (error) {\n console.error('设置窗口属性失败:', error);\n }\n}\n\n/**\n * 根据 webContents ID 查找窗口实例\n * 通过 webContents 查找对应的 BrowserWindow 或 BrowserView\n * 如果是 webview,则找到它的父 BrowserWindow\n *\n * @param webContentsId - webContents ID\n * @returns 窗口实例或 null\n */\nconst findWindowById = (webContentsId: number): BWItem | BVItem | null => {\n if (!webContentsId || webContentsId <= 0) {\n return null;\n }\n\n const remote = getRemote();\n\n try {\n // 首先通过 webContentsId 获取 webContents\n const webContent = remote.webContents?.fromId?.(webContentsId);\n if (!webContent) {\n return null;\n }\n\n // Case 1: 查找 BrowserView\n // 遍历所有窗口的 BrowserView,查找匹配的\n const allWindows = remote.BrowserWindow?.getAllWindows?.() || [];\n for (const win of allWindows) {\n try {\n const views = win.getBrowserViews?.() || [];\n for (const view of views) {\n if (view.webContents?.id === webContentsId) {\n return view as BVItem;\n }\n }\n } catch (error) {\n // 忽略获取 views 失败的情况\n }\n }\n\n // Case 2: WebView\n // webview 有 hostWebContents,指向它所在的 BrowserWindow 的 webContents\n if (webContent.hostWebContents) {\n const parentWindow = remote.BrowserWindow?.fromWebContents?.(webContent.hostWebContents) as BWItem | null;\n if (parentWindow) {\n return parentWindow;\n }\n }\n\n // Case 3: 普通 BrowserWindow 本身\n const browserWindow = remote.BrowserWindow?.fromWebContents?.(webContent) as BWItem | null;\n if (browserWindow) {\n return browserWindow;\n }\n\n // Case 4: 如果找不到已挂载的 BrowserView,尝试创建虚拟 BrowserView\n return getBrowserViewByWebContent(webContent);\n } catch (error) {\n console.error(`查找窗口失败 [${webContentsId}]:`, error);\n }\n\n return null;\n}\n\n// ==================== 核心 API ====================\n\n/**\n * 创建窗口\n * 支持创建 BrowserWindow 和 BrowserView\n *\n * @param options - 窗口创建选项\n * @returns Promise<BWItem | BVItem> 创建的窗口实例\n *\n * @example\n * ```typescript\n * // 创建 BrowserWindow\n * const window = await create({\n * type: 'BW',\n * name: 'main-window',\n * url: 'https://example.com'\n * });\n *\n * // 创建 BrowserView\n * const view = await create({\n * type: 'BV',\n * name: 'sidebar-view',\n * url: 'https://example.com/sidebar'\n * });\n * ```\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 try {\n // 通过 IPC 调用主进程创建窗口\n const data = await eIpc.RendererIPC.invokeMain(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'create',\n data: options\n }\n ) as WindowData;\n\n if (!data?.winId) {\n throw new Error('创建窗口失败: 未返回有效的窗口 ID');\n }\n\n // 查找窗口实例\n const window = findWindowById(data.winId);\n\n if (!window) {\n throw new Error(`创建窗口失败: 无法找到窗口实例 [${data.winId}]`);\n }\n\n // 设置窗口属性\n setWindowProperties(window, data);\n\n return window;\n } catch (error) {\n console.error('创建窗口失败:', error);\n throw error;\n }\n}\n\n/**\n * 获取当前窗口实例\n *\n * @returns Promise<BWItem | BVItem | undefined> 当前窗口实例\n */\nexport const getCurrentWindow = async (): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n const currentWindow = remote.getCurrentWindow();\n return await get(currentWindow?.webContents?.id);\n}\n\n/**\n * 根据 ID 或名称获取窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n *\n * @example\n * ```typescript\n * // 通过 ID 获取\n * const window = await get(1);\n *\n * // 通过名称获取\n * const window = await get('main-window');\n * ```\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n try {\n // 通过 IPC 获取窗口信息\n const data = await invokeIpc<WindowData>('get', idOrName);\n\n if (!data?.winId) {\n return undefined;\n }\n\n // 查找窗口实例\n const window = findWindowById(data.winId);\n\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window || undefined;\n } catch (error) {\n console.error('获取窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 获取所有窗口\n * 支持按类型过滤\n *\n * @param type - 窗口类型过滤 ('BW' | 'BV')\n * @returns Promise<Map<number, BWItem | BVItem>> 窗口映射表\n *\n * @example\n * ```typescript\n * // 获取所有窗口\n * const allWindows = await getAll();\n *\n * // 只获取 BrowserWindow\n * const browserWindows = await getAll('BW');\n *\n * // 只获取 BrowserView\n * const browserViews = await getAll('BV');\n * ```\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 try {\n // 通过 IPC 获取所有窗口信息\n const windowData = await invokeIpc<Record<string, WindowData>>('getAll', undefined);\n\n if (!windowData || typeof windowData !== 'object') {\n return new Map();\n }\n\n const allWindows = new Map<number, BWItem | BVItem>();\n const browserWindows = new Map<number, BWItem>();\n const browserViews = new Map<number, BVItem>();\n\n // 遍历窗口数据\n for (const key in windowData) {\n const element = windowData[key];\n if (!element?.winId) {\n continue;\n }\n\n // 查找窗口实例\n const window = findWindowById(element.winId);\n\n if (window) {\n // 设置窗口属性\n setWindowProperties(window, element);\n\n // 统一使用 webContents.id 作为键\n const windowId = window.webContents?.id || element.winId;\n allWindows.set(windowId, window);\n\n // 按类型分类\n if (window._type === 'BW') {\n browserWindows.set(windowId, window as BWItem);\n } else if (window._type === 'BV') {\n browserViews.set(windowId, window as BVItem);\n }\n }\n }\n\n // 根据类型返回对应的映射表\n if (type === 'BW') {\n return browserWindows;\n }\n if (type === 'BV') {\n return browserViews;\n }\n\n return allWindows;\n } catch (error) {\n console.error('获取所有窗口失败:', error);\n return new Map();\n }\n}\n\n/**\n * 关闭指定窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<boolean> 操作是否成功\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n try {\n await invokeIpc('close', idOrName);\n return true;\n } catch (error) {\n console.error('关闭窗口失败:', error);\n return false;\n }\n}\n\n/**\n * 关闭所有窗口\n *\n * @returns Promise<boolean> 操作是否成功\n */\nexport const closeAll = async (): Promise<boolean> => {\n try {\n await invokeIpc('closeAll', undefined);\n return true;\n } catch (error) {\n console.error('关闭所有窗口失败:', error);\n return false;\n }\n}\n\n/**\n * 根据 WebContents ID 查找对应的窗口\n *\n * @param webContentId - WebContents ID\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n */\nexport const getWindowForWebContentsId = async (webContentId: number): Promise<BWItem | BVItem | undefined> => {\n try {\n const winId = await invokeIpc<number>('getWindowForWebContentsId', webContentId);\n if (!winId) {\n return undefined;\n }\n return get(winId);\n } catch (error) {\n console.error('根据 WebContents ID 查找窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 重命名窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @param newName - 新名称\n * @returns Promise<BWItem | BVItem | undefined> 重命名后的窗口实例\n */\nexport const rename = async (idOrName: string | number, newName: string): Promise<BWItem | BVItem | undefined> => {\n try {\n const data = await invokeIpc<WindowData>('rename', { idOrName, newName });\n if (!data?.winId) {\n return undefined;\n }\n return get(data.winId);\n } catch (error) {\n console.error('重命名窗口失败:', error);\n return undefined;\n }\n}\n\n/**\n * 重置窗口初始化URL\n *\n * @param idOrName - 窗口 ID 或名称\n * @param url - 新URL\n * @returns Promise<BWItem | BVItem | undefined> 重置后的窗口实例\n */\nexport const reInitUrl = async (idOrName: string | number, url: string): Promise<BWItem | BVItem | undefined> => {\n try {\n const data = await invokeIpc<WindowData>('reInitUrl', { idOrName, url });\n if (!data?.winId) {\n return undefined;\n }\n return get(data.winId);\n } catch (error) {\n console.error('重置窗口 URL 失败:', error);\n return undefined;\n }\n}\n\n/**\n * 设置预加载 WebContents 配置\n *\n * @param preloadWebContentsConfig - 预加载配置\n */\nexport const setPreloadWebContentsConfig = async (preloadWebContentsConfig: PreloadWebContentsConfig): Promise<void> => {\n try {\n await invokeIpc('setPreloadWebContentsConfig', preloadWebContentsConfig);\n } catch (error) {\n console.error('设置预加载配置失败:', error);\n throw error;\n }\n}\n\n/**\n * 获取预加载脚本路径\n * 使用缓存机制避免重复请求\n *\n * @returns Promise<string | undefined> 预加载脚本路径\n */\nexport const getPreload = (() => {\n let cachedPreload: string | undefined | null = null;\n let isLoading = false;\n let loadPromise: Promise<string | undefined> | null = null;\n\n return async (): Promise<string | undefined> => {\n // 如果已有缓存,直接返回\n if (cachedPreload !== null) {\n return cachedPreload;\n }\n\n // 如果正在加载,返回同一个 Promise\n if (isLoading && loadPromise) {\n return loadPromise;\n }\n\n // 开始加载\n isLoading = true;\n loadPromise = (async () => {\n try {\n // 通过 IPC 获取预加载脚本路径\n const data = await invokeIpc<string | undefined>('getPreload', undefined);\n\n // 缓存结果(即使是 undefined 也缓存,避免重复请求)\n cachedPreload = data;\n return data;\n } catch (error) {\n console.error('获取预加载脚本路径失败:', error);\n // 失败时也缓存 null,避免重复请求\n cachedPreload = undefined;\n return undefined;\n } finally {\n isLoading = false;\n loadPromise = null;\n }\n })();\n\n return loadPromise;\n };\n})();\n\n// 初始化时异步获取预加载脚本(不阻塞)\ngetPreload().catch(() => {\n // 静默处理初始化失败\n});\n\n// ==================== 开发工具相关(已注释) ====================\n\n/*\n * 开发工具相关功能(已注释,可根据需要启用)\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 */\n"],"names":[],"mappings":"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"}
package/main/index.d.ts CHANGED
@@ -76,6 +76,11 @@ export declare class WindowsManager {
76
76
  * 检查窗口是否已销毁
77
77
  */
78
78
  private _isWindowDestroyed;
79
+ /**
80
+ * 安全地获取窗口的 webContents.id
81
+ * 如果 webContents 已销毁,返回 undefined
82
+ */
83
+ _getWebContentsId(win: BWItem | BVItem | null | undefined): number | undefined;
79
84
  /**
80
85
  * 判断是否本地/内网IP
81
86
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"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"}